Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit a431fea9 authored by Marvin W.'s avatar Marvin W. 🐿️
Browse files

Fix settings provider being called with wrong identity

Fixes #1503
parent 2d9419a7
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Binder

object SettingsContract {
    const val AUTHORITY = "org.microg.gms.settings"
@@ -103,15 +104,24 @@ object SettingsContract {
        const val CONTENT_TYPE = "vnd.android.cursor.item/vnd.$AUTHORITY.$id"
    }

    fun <T> getSettings(context: Context, uri: Uri, projection: Array<out String>?, f: (Cursor) -> T): T {
    private fun <T> withoutCallingIdentity(f: () -> T): T {
        val identity = Binder.clearCallingIdentity()
        try {
            return f.invoke()
        } finally {
            Binder.restoreCallingIdentity(identity)
        }
    }

    fun <T> getSettings(context: Context, uri: Uri, projection: Array<out String>?, f: (Cursor) -> T): T = withoutCallingIdentity {
        context.contentResolver.query(uri, projection, null, null, null).use { c ->
            require(c != null) { "Cursor for query $uri ${projection?.toList()} was null" }
            if (!c.moveToFirst()) error("Cursor for query $uri ${projection?.toList()} was empty")
            return f.invoke(c)
            f.invoke(c)
        }
    }

    fun setSettings(context: Context, uri: Uri, v: ContentValues.() -> Unit) {
    fun setSettings(context: Context, uri: Uri, v: ContentValues.() -> Unit) = withoutCallingIdentity {
        val values = ContentValues().apply { v.invoke(this) }
        val affected = context.contentResolver.update(uri, values, null, null)
        require(affected == 1) { "Update for $uri with $values affected 0 rows"}