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:
@@ -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" />
|
||||
|
||||
<!--
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user