Adding support for custom signature for grid customization

Bug: 403628674
Flag: EXEMPT flagging not supported
Test: Verified manually
Change-Id: I009cc3814c593b2906acd05cb19391cacc5fbaaa
This commit is contained in:
Sunny Goyal
2025-05-23 16:31:59 -07:00
parent 8697ac2362
commit ca7fe2f56c
3 changed files with 54 additions and 3 deletions
+11 -2
View File
@@ -61,9 +61,14 @@
android:protectionLevel="signatureOrSystem"
android:label="@string/permlab_write_settings"
android:description="@string/permdesc_write_settings"/>
<permission
android:name="${applicationId}.permission.GRID_CONTROL"
android:knownCerts="@array/grid_control_known_signers"
android:protectionLevel="signature|knownSigner"/>
<uses-permission android:name="${applicationId}.permission.READ_SETTINGS" />
<uses-permission android:name="${applicationId}.permission.WRITE_SETTINGS" />
<uses-permission android:name="${applicationId}.permission.GRID_CONTROL" />
<application
android:backupAgent="com.android.launcher3.LauncherBackupAgent"
@@ -131,11 +136,15 @@
android:writePermission="${applicationId}.permission.WRITE_SETTINGS"
android:readPermission="${applicationId}.permission.READ_SETTINGS" />
<!-- The content provider for exposing various launcher grid options. -->
<!--
The content provider for exposing various launcher grid options.
The caller should hold one of the following permissions:
- android.permission.BIND_WALLPAPER
- ${applicationId}.permission.GRID_CONTROL
-->
<provider
android:name="com.android.launcher3.graphics.LauncherCustomizationProvider"
android:authorities="${applicationId}.grid_control"
android:permission="android.permission.BIND_WALLPAPER"
android:exported="true" />
<!--
+2
View File
@@ -221,4 +221,6 @@
<!-- Used to differentiate between desktop and non-desktop devices. -->
<bool name="desktop_form_factor">false</bool>
<string-array name="grid_control_known_signers" translatable="false" />
</resources>
@@ -15,15 +15,55 @@
*/
package com.android.launcher3.graphics
import android.Manifest.permission.BIND_WALLPAPER
import android.content.Context
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Binder
import com.android.launcher3.BuildConfig.APPLICATION_ID
import com.android.launcher3.R
import com.android.launcher3.dagger.LauncherComponentProvider.appComponent
import com.android.launcher3.util.ContentProviderProxy
import java.security.MessageDigest
/** Provider for various Launcher customizations exposed via a ContentProvider API */
class LauncherCustomizationProvider : ContentProviderProxy() {
override fun getProxy(ctx: Context): ProxyProvider? = ctx.appComponent.gridCustomizationsProxy
override fun getProxy(ctx: Context): ProxyProvider? {
// Check if the caller has access
enforceCallerPermission(ctx)
return ctx.appComponent.gridCustomizationsProxy
}
private fun enforceCallerPermission(ctx: Context) {
if (ctx.checkCallingPermission(BIND_WALLPAPER) == PackageManager.PERMISSION_GRANTED) return
if (ctx.checkCallingPermission(PERM_GRID_CONTROL) == PackageManager.PERMISSION_GRANTED)
return
// Temporary change until the clients migrate to the new permission
val source = callingAttributionSource?.packageName ?: throw genericAccessException()
val signatures =
ctx.packageManager.getPackageInfo(source, PackageManager.GET_SIGNATURES)?.signatures
?: throw genericAccessException()
val signature =
MessageDigest.getInstance("SHA-256")
.apply { signatures.forEach { update(it.toByteArray()) } }
.digest()
.joinToString("") { String.format("%02x", it) }
if (ctx.resources.getStringArray(R.array.grid_control_known_signers).contains(signature))
return
throw genericAccessException()
}
private fun genericAccessException() =
SecurityException(
"Permission Denial: opening provider com.android.launcher3.graphics.LauncherCustomizationProvider (pid=${Binder.getCallingPid()}, uid=${Binder.getCallingUid()}) requires $BIND_WALLPAPER or $PERM_GRID_CONTROL"
)
override fun getType(uri: Uri) = "vnd.android.cursor.dir/launcher_grid"
companion object {
private const val PERM_GRID_CONTROL = "$APPLICATION_ID.permission.GRID_CONTROL"
}
}