Loading core/java/android/content/pm/IPackageManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -615,6 +615,10 @@ interface IPackageManager { void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); void grantDefaultPermissionsToEnabledTelephonyDataServices( in String[] packageNames, int userId); void revokeDefaultPermissionsFromDisabledTelephonyDataServices( in String[] packageNames, int userId); boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId); Loading services/core/java/com/android/server/pm/PackageManagerService.java +26 −0 Original line number Diff line number Diff line Loading @@ -24040,6 +24040,32 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } @Override public void grantDefaultPermissionsToEnabledTelephonyDataServices( String[] packageNames, int userId) { enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledTelephonyDataServices"); synchronized (mPackages) { Binder.withCleanCallingIdentity( () -> { mDefaultPermissionPolicy. grantDefaultPermissionsToEnabledTelephonyDataServices( packageNames, userId); }); } } @Override public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( String[] packageNames, int userId) { enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromDisabledTelephonyDataServices"); synchronized (mPackages) { Binder.withCleanCallingIdentity( () -> { mDefaultPermissionPolicy. revokeDefaultPermissionsFromDisabledTelephonyDataServices( packageNames, userId); }); } } private static void enforceSystemOrPhoneCaller(String tag) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) { services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +83 −4 Original line number Diff line number Diff line Loading @@ -976,6 +976,40 @@ public final class DefaultPermissionGrantPolicy { } } public void grantDefaultPermissionsToEnabledTelephonyDataServices( String[] packageNames, int userId) { Log.i(TAG, "Granting permissions to enabled data services for user:" + userId); if (packageNames == null) { return; } for (String packageName : packageNames) { PackageParser.Package dataServicePackage = getSystemPackage(packageName); if (dataServicePackage != null && doesPackageSupportRuntimePermissions(dataServicePackage)) { // Grant these permissions as system-fixed, so that nobody can accidentally // break cellular data. grantRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId); grantRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId); } } } public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( String[] packageNames, int userId) { Log.i(TAG, "Revoking permissions from disabled data services for user:" + userId); if (packageNames == null) { return; } for (String packageName : packageNames) { PackageParser.Package dataServicePackage = getSystemPackage(packageName); if (dataServicePackage != null && doesPackageSupportRuntimePermissions(dataServicePackage)) { revokeRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId); revokeRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId); } } } public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) { Log.i(TAG, "Granting permissions to default browser for user:" + userId); if (packageName == null) { Loading Loading @@ -1078,6 +1112,51 @@ public final class DefaultPermissionGrantPolicy { grantRuntimePermissions(pkg, permissions, systemFixed, false, userId); } private void revokeRuntimePermissions(PackageParser.Package pkg, Set<String> permissions, boolean systemFixed, int userId) { if (pkg.requestedPermissions.isEmpty()) { return; } Set<String> revokablePermissions = new ArraySet<>(pkg.requestedPermissions); for (String permission : permissions) { // We can't revoke what wasn't requested. if (!revokablePermissions.contains(permission)) { continue; } final int flags = mServiceInternal.getPermissionFlagsTEMP( permission, pkg.packageName, userId); // We didn't get this through the default grant policy. Move along. if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) { continue; } // We aren't going to clobber device policy with a DefaultGrant. if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { continue; } // Do not revoke system fixed permissions unless caller set them that way; // there is no refcount for the number of sources of this, so there // should be at most one grantor doing SYSTEM_FIXED for any given package. if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) { continue; } mServiceInternal.revokeRuntimePermission(pkg.packageName, permission, userId, false); if (DEBUG) { Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ") + permission + " to " + pkg.packageName); } // Remove the GRANTED_BY_DEFAULT flag without touching the others. // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains // sticky once set. mServiceInternal.updatePermissionFlagsTEMP(permission, pkg.packageName, PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, userId); } } private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions, boolean systemFixed, boolean ignoreSystemPackage, int userId) { if (pkg.requestedPermissions.isEmpty()) { Loading Loading @@ -1128,10 +1207,10 @@ public final class DefaultPermissionGrantPolicy { // to make sure we can grant the needed permission to the default // sms and phone apps after the user chooses this in the UI. if (flags == 0 || ignoreSystemPackage) { // Never clobber policy or system. final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED | PackageManager.FLAG_PERMISSION_POLICY_FIXED; if ((flags & fixedFlags) != 0) { // Never clobber policy fixed permissions. // We must allow the grant of a system-fixed permission because // system-fixed is sticky, but the permission itself may be revoked. if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { continue; } Loading services/core/java/com/android/server/pm/permission/PermissionManagerService.java +4 −2 Original line number Diff line number Diff line Loading @@ -1457,8 +1457,10 @@ public class PermissionManagerService { final PermissionsState permissionsState = ps.getPermissionsState(); final int flags = permissionsState.getPermissionFlags(permName, userId); if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0) { throw new SecurityException("Cannot revoke system fixed permission " // Only the system may revoke SYSTEM_FIXED permissions. if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && UserHandle.getCallingAppId() != Process.SYSTEM_UID) { throw new SecurityException("Non-System UID cannot revoke system fixed permission " + permName + " for package " + packageName); } if (!overridePolicy && (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { Loading Loading
core/java/android/content/pm/IPackageManager.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -615,6 +615,10 @@ interface IPackageManager { void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); void grantDefaultPermissionsToEnabledTelephonyDataServices( in String[] packageNames, int userId); void revokeDefaultPermissionsFromDisabledTelephonyDataServices( in String[] packageNames, int userId); boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId); Loading
services/core/java/com/android/server/pm/PackageManagerService.java +26 −0 Original line number Diff line number Diff line Loading @@ -24040,6 +24040,32 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } @Override public void grantDefaultPermissionsToEnabledTelephonyDataServices( String[] packageNames, int userId) { enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledTelephonyDataServices"); synchronized (mPackages) { Binder.withCleanCallingIdentity( () -> { mDefaultPermissionPolicy. grantDefaultPermissionsToEnabledTelephonyDataServices( packageNames, userId); }); } } @Override public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( String[] packageNames, int userId) { enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromDisabledTelephonyDataServices"); synchronized (mPackages) { Binder.withCleanCallingIdentity( () -> { mDefaultPermissionPolicy. revokeDefaultPermissionsFromDisabledTelephonyDataServices( packageNames, userId); }); } } private static void enforceSystemOrPhoneCaller(String tag) { int callingUid = Binder.getCallingUid(); if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) {
services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +83 −4 Original line number Diff line number Diff line Loading @@ -976,6 +976,40 @@ public final class DefaultPermissionGrantPolicy { } } public void grantDefaultPermissionsToEnabledTelephonyDataServices( String[] packageNames, int userId) { Log.i(TAG, "Granting permissions to enabled data services for user:" + userId); if (packageNames == null) { return; } for (String packageName : packageNames) { PackageParser.Package dataServicePackage = getSystemPackage(packageName); if (dataServicePackage != null && doesPackageSupportRuntimePermissions(dataServicePackage)) { // Grant these permissions as system-fixed, so that nobody can accidentally // break cellular data. grantRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId); grantRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId); } } } public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( String[] packageNames, int userId) { Log.i(TAG, "Revoking permissions from disabled data services for user:" + userId); if (packageNames == null) { return; } for (String packageName : packageNames) { PackageParser.Package dataServicePackage = getSystemPackage(packageName); if (dataServicePackage != null && doesPackageSupportRuntimePermissions(dataServicePackage)) { revokeRuntimePermissions(dataServicePackage, PHONE_PERMISSIONS, true, userId); revokeRuntimePermissions(dataServicePackage, LOCATION_PERMISSIONS, true, userId); } } } public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) { Log.i(TAG, "Granting permissions to default browser for user:" + userId); if (packageName == null) { Loading Loading @@ -1078,6 +1112,51 @@ public final class DefaultPermissionGrantPolicy { grantRuntimePermissions(pkg, permissions, systemFixed, false, userId); } private void revokeRuntimePermissions(PackageParser.Package pkg, Set<String> permissions, boolean systemFixed, int userId) { if (pkg.requestedPermissions.isEmpty()) { return; } Set<String> revokablePermissions = new ArraySet<>(pkg.requestedPermissions); for (String permission : permissions) { // We can't revoke what wasn't requested. if (!revokablePermissions.contains(permission)) { continue; } final int flags = mServiceInternal.getPermissionFlagsTEMP( permission, pkg.packageName, userId); // We didn't get this through the default grant policy. Move along. if ((flags & PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT) == 0) { continue; } // We aren't going to clobber device policy with a DefaultGrant. if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { continue; } // Do not revoke system fixed permissions unless caller set them that way; // there is no refcount for the number of sources of this, so there // should be at most one grantor doing SYSTEM_FIXED for any given package. if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && !systemFixed) { continue; } mServiceInternal.revokeRuntimePermission(pkg.packageName, permission, userId, false); if (DEBUG) { Log.i(TAG, "revoked " + (systemFixed ? "fixed " : "not fixed ") + permission + " to " + pkg.packageName); } // Remove the GRANTED_BY_DEFAULT flag without touching the others. // Note that we do not revoke FLAG_PERMISSION_SYSTEM_FIXED. That bit remains // sticky once set. mServiceInternal.updatePermissionFlagsTEMP(permission, pkg.packageName, PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, 0, userId); } } private void grantRuntimePermissions(PackageParser.Package pkg, Set<String> permissions, boolean systemFixed, boolean ignoreSystemPackage, int userId) { if (pkg.requestedPermissions.isEmpty()) { Loading Loading @@ -1128,10 +1207,10 @@ public final class DefaultPermissionGrantPolicy { // to make sure we can grant the needed permission to the default // sms and phone apps after the user chooses this in the UI. if (flags == 0 || ignoreSystemPackage) { // Never clobber policy or system. final int fixedFlags = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED | PackageManager.FLAG_PERMISSION_POLICY_FIXED; if ((flags & fixedFlags) != 0) { // Never clobber policy fixed permissions. // We must allow the grant of a system-fixed permission because // system-fixed is sticky, but the permission itself may be revoked. if ((flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { continue; } Loading
services/core/java/com/android/server/pm/permission/PermissionManagerService.java +4 −2 Original line number Diff line number Diff line Loading @@ -1457,8 +1457,10 @@ public class PermissionManagerService { final PermissionsState permissionsState = ps.getPermissionsState(); final int flags = permissionsState.getPermissionFlags(permName, userId); if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0) { throw new SecurityException("Cannot revoke system fixed permission " // Only the system may revoke SYSTEM_FIXED permissions. if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0 && UserHandle.getCallingAppId() != Process.SYSTEM_UID) { throw new SecurityException("Non-System UID cannot revoke system fixed permission " + permName + " for package " + packageName); } if (!overridePolicy && (flags & PackageManager.FLAG_PERMISSION_POLICY_FIXED) != 0) { Loading