Move providers to permission manager

Bug: 135279435
Test: atest PermissionUpdateListenerTest
Test: atest android.content.pm.cts.PackageManagerTest
Test: atest android.permission2.cts.RestrictedPermissionsTest
Test: atest TeleServiceTests
Test: atest DataConnectionTest
Change-Id: Ife563589929b2662c60e1a0ab0ec8f6a2d7e4c12
This commit is contained in:
Todd Kennedy
2019-07-12 06:50:30 -07:00
parent 26f2c379d0
commit 583378df9c
18 changed files with 701 additions and 571 deletions

View File

@@ -2049,7 +2049,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public String getDefaultBrowserPackageNameAsUser(int userId) {
try {
return mPM.getDefaultBrowserPackageName(userId);
return mPermissionManager.getDefaultBrowser(userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2058,7 +2058,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) {
try {
return mPM.setDefaultBrowserPackageName(packageName, userId);
return mPermissionManager.setDefaultBrowser(packageName, userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}

View File

@@ -594,9 +594,6 @@ interface IPackageManager {
ParceledListSlice getIntentFilterVerifications(String packageName);
ParceledListSlice getAllIntentFilters(String packageName);
boolean setDefaultBrowserPackageName(String packageName, int userId);
String getDefaultBrowserPackageName(int userId);
VerifierDeviceIdentity getVerifierDeviceIdentity();
boolean isFirstBoot();
@@ -629,15 +626,6 @@ interface IPackageManager {
boolean isPackageSignedByKeySet(String packageName, in KeySet ks);
boolean isPackageSignedByKeySetExactly(String packageName, in KeySet ks);
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);
void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
boolean isPermissionRevokedByPolicy(String permission, String packageName, int userId);
@UnsupportedAppUsage

View File

@@ -83,139 +83,6 @@ public abstract class PackageManagerInternal {
void onPackageRemoved(@NonNull String packageName, int uid);
}
/**
* Provider for package names.
*/
public interface PackagesProvider {
/**
* Gets the packages for a given user.
* @param userId The user id.
* @return The package names.
*/
public String[] getPackages(int userId);
}
/**
* Provider for package names.
*/
public interface SyncAdapterPackagesProvider {
/**
* Gets the sync adapter packages for given authority and user.
* @param authority The authority.
* @param userId The user id.
* @return The package names.
*/
public String[] getPackages(String authority, int userId);
}
/**
* Provider for default browser
*/
public interface DefaultBrowserProvider {
/**
* Get the package name of the default browser.
*
* @param userId the user id
*
* @return the package name of the default browser, or {@code null} if none
*/
@Nullable
String getDefaultBrowser(@UserIdInt int userId);
/**
* Set the package name of the default browser.
*
* @param packageName package name of the default browser, or {@code null} to remove
* @param userId the user id
*
* @return whether the default browser was successfully set.
*/
boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId);
/**
* Set the package name of the default browser asynchronously.
*
* @param packageName package name of the default browser, or {@code null} to remove
* @param userId the user id
*/
void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId);
}
/**
* Provider for default dialer
*/
public interface DefaultDialerProvider {
/**
* Get the package name of the default dialer.
*
* @param userId the user id
*
* @return the package name of the default dialer, or {@code null} if none
*/
@Nullable
String getDefaultDialer(@UserIdInt int userId);
}
/**
* Provider for default home
*/
public interface DefaultHomeProvider {
/**
* Get the package name of the default home.
*
* @param userId the user id
*
* @return the package name of the default home, or {@code null} if none
*/
@Nullable
String getDefaultHome(@UserIdInt int userId);
/**
* Set the package name of the default home.
*
* @param packageName package name of the default home, or {@code null} to remove
* @param userId the user id
* @param callback the callback made after the default home as been updated
*/
void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId,
@NonNull Consumer<Boolean> callback);
}
/**
* Sets the location provider packages provider.
* @param provider The packages provider.
*/
public abstract void setLocationPackagesProvider(PackagesProvider provider);
/**
* Set the location extra packages provider.
* @param provider The packages provider.
*/
public abstract void setLocationExtraPackagesProvider(PackagesProvider provider);
/**
* Sets the voice interaction packages provider.
* @param provider The packages provider.
*/
public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider);
/**
* Sets the Use Open Wifi packages provider.
* @param provider The packages provider.
*/
public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider);
/**
* Sets the sync adapter packages provider.
* @param provider The provider.
*/
public abstract void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider);
/**
* Called when the package for the default SMS handler changed
*
@@ -232,14 +99,6 @@ public abstract class PackageManagerInternal {
*/
public void onDefaultSimCallManagerAppChanged(String packageName, int userId) {}
/**
* Requests granting of the default permissions to the current default Use Open Wifi app.
* @param packageName The default use open wifi package name.
* @param userId The user for which to grant the permissions.
*/
public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName,
int userId);
/**
* Sets a list of apps to keep in PM's internal data structures and as APKs even if no user has
* currently installed it. The apps are not preloaded.
@@ -871,27 +730,6 @@ public abstract class PackageManagerInternal {
@Nullable
public abstract String removeLegacyDefaultBrowserPackageName(int userId);
/**
* Sets the default browser provider.
*
* @param provider the provider
*/
public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider);
/**
* Sets the default dialer provider.
*
* @param provider the provider
*/
public abstract void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider);
/**
* Sets the default home provider.
*
* @param provider the provider
*/
public abstract void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider);
/**
* Returns {@code true} if given {@code packageName} is an apex package.
*/
@@ -909,15 +747,6 @@ public abstract class PackageManagerInternal {
public abstract void uninstallApex(String packageName, long versionCode, int userId,
IntentSender intentSender);
/**
* Whether default permission grants have been performed for a user
* since the device booted.
*
* @param userId The user id.
* @return true if default permissions
*/
public abstract boolean wereDefaultPermissionsGrantedSinceBoot(int userId);
/**
* Get fingerprint of build that updated the runtime permissions for a user.
*
@@ -960,4 +789,7 @@ public abstract class PackageManagerInternal {
*/
public abstract boolean isCallerInstallerOfRecord(
@NonNull PackageParser.Package pkg, int callingUid);
/** Returns whether or not default runtime permissions are granted for the given user */
public abstract boolean areDefaultRuntimePermissionsGranted(@UserIdInt int userId);
}

View File

@@ -70,4 +70,22 @@ interface IPermissionManager {
void revokeRuntimePermission(String packageName, String permName, int userId);
void resetRuntimePermissions();
boolean setDefaultBrowser(String packageName, int userId);
String getDefaultBrowser(int userId);
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);
void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
}

View File

@@ -42,7 +42,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
import android.content.res.Resources;
@@ -121,6 +120,7 @@ import com.android.server.location.LocationRequestStatistics.PackageStatistics;
import com.android.server.location.MockProvider;
import com.android.server.location.PassiveProvider;
import com.android.server.location.RemoteListenerHelper;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
@@ -282,12 +282,12 @@ public class LocationManagerService extends ILocationManager.Stub {
// Let the package manager query which are the default location
// providers as they get certain permissions granted by default.
PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
packageManagerInternal.setLocationPackagesProvider(
PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
PermissionManagerServiceInternal.class);
permissionManagerInternal.setLocationPackagesProvider(
userId -> mContext.getResources().getStringArray(
com.android.internal.R.array.config_locationProviderPackageNames));
packageManagerInternal.setLocationExtraPackagesProvider(
permissionManagerInternal.setLocationExtraPackagesProvider(
userId -> mContext.getResources().getStringArray(
com.android.internal.R.array.config_locationExtraPackageNames));

View File

@@ -26,7 +26,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.database.ContentObserver;
import android.location.LocationManager;
import android.net.INetworkRecommendationProvider;
@@ -54,15 +53,14 @@ import android.provider.Settings.Global;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.PackageMonitor;
import com.android.internal.os.TransferPipe;
import com.android.internal.telephony.SmsApplication;
import com.android.internal.util.DumpUtils;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -294,7 +292,7 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
String useOpenWifiPackage = Global.getString(mContext.getContentResolver(),
Global.USE_OPEN_WIFI_PACKAGE);
if (!TextUtils.isEmpty(useOpenWifiPackage)) {
LocalServices.getService(PackageManagerInternal.class)
LocalServices.getService(PermissionManagerServiceInternal.class)
.grantDefaultPermissionsToDefaultUseOpenWifiApp(useOpenWifiPackage,
userId);
}
@@ -306,17 +304,14 @@ public class NetworkScoreService extends INetworkScoreService.Stub {
false /*notifyForDescendants*/,
mUseOpenWifiPackageObserver);
// Set a callback for the package manager to query the use open wifi app.
LocalServices.getService(PackageManagerInternal.class).setUseOpenWifiAppPackagesProvider(
new PackageManagerInternal.PackagesProvider() {
@Override
public String[] getPackages(int userId) {
String useOpenWifiPackage = Global.getString(mContext.getContentResolver(),
Global.USE_OPEN_WIFI_PACKAGE);
if (!TextUtils.isEmpty(useOpenWifiPackage)) {
return new String[]{useOpenWifiPackage};
}
return null;
LocalServices.getService(PermissionManagerServiceInternal.class)
.setUseOpenWifiAppPackagesProvider((userId) -> {
String useOpenWifiPackage = Global.getString(mContext.getContentResolver(),
Global.USE_OPEN_WIFI_PACKAGE);
if (!TextUtils.isEmpty(useOpenWifiPackage)) {
return new String[]{useOpenWifiPackage};
}
return null;
});
}

View File

@@ -40,7 +40,6 @@ import android.content.SyncInfo;
import android.content.SyncRequest;
import android.content.SyncStatusInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ProviderInfo;
import android.database.IContentObserver;
import android.database.sqlite.SQLiteException;
@@ -71,6 +70,7 @@ import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -280,15 +280,11 @@ public final class ContentService extends IContentService.Stub {
// Let the package manager query for the sync adapters for a given authority
// as we grant default permissions to sync adapters for specific authorities.
PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
packageManagerInternal.setSyncAdapterPackagesprovider(
new PackageManagerInternal.SyncAdapterPackagesProvider() {
@Override
public String[] getPackages(String authority, int userId) {
return getSyncAdapterPackagesForAuthorityAsUser(authority, userId);
}
});
final PermissionManagerServiceInternal permissionManagerInternal =
LocalServices.getService(PermissionManagerServiceInternal.class);
permissionManagerInternal.setSyncAdapterPackagesProvider((authority, userId) -> {
return getSyncAdapterPackagesForAuthorityAsUser(authority, userId);
});
final IntentFilter packageFilter = new IntentFilter();
packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);

View File

@@ -311,7 +311,6 @@ import com.android.server.pm.dex.DexoptOptions;
import com.android.server.pm.dex.PackageDexUsage;
import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.permission.BasePermission;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.permission.PermissionsState;
@@ -948,8 +947,6 @@ public class PackageManagerService extends IPackageManager.Stub
final SparseArray<IntentFilterVerificationState> mIntentFilterVerificationStates
= new SparseArray<>();
// TODO remove this and go through mPermissonManager directly
final DefaultPermissionGrantPolicy mDefaultPermissionPolicy;
// Internal interface for permission manager
private final PermissionManagerServiceInternal mPermissionManager;
// Public interface for permission manager
@@ -992,15 +989,6 @@ public class PackageManagerService extends IPackageManager.Stub
void receiveVerificationResponse(int verificationId);
}
@GuardedBy("mPackages")
private PackageManagerInternal.DefaultBrowserProvider mDefaultBrowserProvider;
@GuardedBy("mPackages")
private PackageManagerInternal.DefaultDialerProvider mDefaultDialerProvider;
@GuardedBy("mPackages")
private PackageManagerInternal.DefaultHomeProvider mDefaultHomeProvider;
private class IntentVerifierProxy implements IntentFilterVerifier<ActivityIntentInfo> {
private Context mContext;
private ComponentName mIntentFilterVerifierComponent;
@@ -1966,7 +1954,7 @@ public class PackageManagerService extends IPackageManager.Stub
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting.getInstallReason(userId)
!= PackageManager.INSTALL_REASON_DEVICE_RESTORE) {
setDefaultBrowserAsyncLPw(null, userId);
mPermissionManager.setDefaultBrowser(null, true, true, userId);
}
}
}
@@ -2348,7 +2336,6 @@ public class PackageManagerService extends IPackageManager.Stub
mPackages /*externalLock*/);
mPermissionManagerService =
(IPermissionManager) ServiceManager.getService("permissionmgr");
mDefaultPermissionPolicy = mPermissionManager.getDefaultPermissionGrantPolicy();
mSettings = new Settings(Environment.getDataDirectory(),
mPermissionManager.getPermissionSettings(), mPackages);
}
@@ -7286,7 +7273,8 @@ public class PackageManagerService extends IPackageManager.Stub
} else {
// Browser/generic handling case. If there's a default browser, go straight
// to that (but only if there is no other higher-priority match).
final String defaultBrowserPackageName = getDefaultBrowserPackageName(userId);
final String defaultBrowserPackageName =
mPermissionManager.getDefaultBrowser(userId);
int maxMatchPrio = 0;
ResolveInfo defaultBrowserMatch = null;
final int numCandidates = matchAllList.size();
@@ -12826,7 +12814,9 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) {
enforceSystemOrPhoneCaller("setSystemAppHiddenUntilInstalled");
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils
.enforceSystemOrPhoneCaller("setSystemAppHiddenUntilInstalled", callingUid);
synchronized (mPackages) {
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting == null || !pkgSetting.isSystem()) {
@@ -12849,7 +12839,9 @@ public class PackageManagerService extends IPackageManager.Stub
@Override
public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) {
enforceSystemOrPhoneCaller("setSystemAppInstallState");
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils
.enforceSystemOrPhoneCaller("setSystemAppInstallState", callingUid);
synchronized (mPackages) {
final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
// The target app should always be in system
@@ -13421,7 +13413,7 @@ public class PackageManagerService extends IPackageManager.Stub
final long callingId = Binder.clearCallingIdentity();
try {
final String activeLauncherPackageName = getActiveLauncherPackageName(userId);
final String dialerPackageName = getDefaultDialerPackageName(userId);
final String dialerPackageName = mPermissionManager.getDefaultDialer(userId);
for (int i = 0; i < packageNames.length; i++) {
canSuspend[i] = false;
final String packageName = packageNames[i];
@@ -13503,19 +13495,6 @@ public class PackageManagerService extends IPackageManager.Stub
return resolveInfo == null ? null : resolveInfo.activityInfo.packageName;
}
@Nullable
private String getDefaultDialerPackageName(@UserIdInt int userId) {
PackageManagerInternal.DefaultDialerProvider provider;
synchronized (mPackages) {
provider = mDefaultDialerProvider;
}
if (provider == null) {
Slog.e(TAG, "mDefaultDialerProvider is null");
return null;
}
return provider.getDefaultDialer(userId);
}
@Override
public void verifyPendingInstall(int id, int verificationCode) throws RemoteException {
mContext.enforceCallingOrSelfPermission(
@@ -13874,75 +13853,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
@Override
public boolean setDefaultBrowserPackageName(String packageName, int userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
if (UserHandle.getCallingUserId() != userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
}
if (userId == UserHandle.USER_ALL) {
return false;
}
PackageManagerInternal.DefaultBrowserProvider provider;
synchronized (mPackages) {
provider = mDefaultBrowserProvider;
}
if (provider == null) {
Slog.e(TAG, "mDefaultBrowserProvider is null");
return false;
}
boolean successful = provider.setDefaultBrowser(packageName, userId);
if (!successful) {
return false;
}
if (packageName != null) {
synchronized (mPackages) {
mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
userId);
}
}
return true;
}
private void setDefaultBrowserAsyncLPw(@Nullable String packageName, @UserIdInt int userId) {
if (userId == UserHandle.USER_ALL) {
return;
}
if (mDefaultBrowserProvider == null) {
Slog.e(TAG, "mDefaultBrowserProvider is null");
return;
}
mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId);
if (packageName != null) {
synchronized (mPackages) {
mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowser(packageName,
userId);
}
}
}
@Override
public String getDefaultBrowserPackageName(int userId) {
if (UserHandle.getCallingUserId() != userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
}
if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null;
}
PackageManagerInternal.DefaultBrowserProvider provider;
synchronized (mPackages) {
provider = mDefaultBrowserProvider;
}
if (provider == null) {
Slog.e(TAG, "mDefaultBrowserProvider is null");
return null;
}
return provider.getDefaultBrowser(userId);
}
/**
* Get the "allow unknown sources" setting.
*
@@ -19688,10 +19598,10 @@ public class PackageManagerService extends IPackageManager.Stub
}
private void clearDefaultBrowserIfNeededForUser(String packageName, int userId) {
final String defaultBrowserPackageName = getDefaultBrowserPackageName(userId);
final String defaultBrowserPackageName = mPermissionManager.getDefaultBrowser(userId);
if (!TextUtils.isEmpty(defaultBrowserPackageName)) {
if (packageName.equals(defaultBrowserPackageName)) {
setDefaultBrowserPackageName(null, userId);
mPermissionManager.setDefaultBrowser(null, true, true, userId);
}
}
}
@@ -19719,7 +19629,7 @@ public class PackageManagerService extends IPackageManager.Stub
// significant refactoring to keep all default apps in the package
// manager (cleaner but more work) or have the services provide
// callbacks to the package manager to request a default app reset.
setDefaultBrowserPackageName(null, userId);
mPermissionManager.setDefaultBrowser(null, true, true, userId);
resetNetworkPolicies(userId);
synchronized (mPackages) {
scheduleWritePackageRestrictionsLocked(userId);
@@ -19972,17 +19882,14 @@ public class PackageManagerService extends IPackageManager.Stub
parser.setInput(new ByteArrayInputStream(backup), StandardCharsets.UTF_8.name());
restoreFromXml(parser, userId, TAG_DEFAULT_APPS,
(parser1, userId1) -> {
String defaultBrowser;
final String defaultBrowser;
synchronized (mPackages) {
mSettings.readDefaultAppsLPw(parser1, userId1);
defaultBrowser = mSettings.removeDefaultBrowserPackageNameLPw(userId1);
}
if (defaultBrowser != null) {
PackageManagerInternal.DefaultBrowserProvider provider;
synchronized (mPackages) {
provider = mDefaultBrowserProvider;
}
provider.setDefaultBrowser(defaultBrowser, userId1);
mPermissionManager
.setDefaultBrowser(defaultBrowser, false, false, userId1);
}
});
} catch (Exception e) {
@@ -20219,15 +20126,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
allHomeCandidates.addAll(resolveInfos);
PackageManagerInternal.DefaultHomeProvider provider;
synchronized (mPackages) {
provider = mDefaultHomeProvider;
}
if (provider == null) {
Slog.e(TAG, "mDefaultHomeProvider is null");
return null;
}
String packageName = provider.getDefaultHome(userId);
final String packageName = mPermissionManager.getDefaultHome(userId);
if (packageName == null) {
return null;
}
@@ -20280,15 +20179,7 @@ public class PackageManagerService extends IPackageManager.Stub
final String packageName = preferredResolveInfo != null
&& preferredResolveInfo.activityInfo != null
? preferredResolveInfo.activityInfo.packageName : null;
final PackageManagerInternal.DefaultHomeProvider provider;
synchronized (mPackages) {
provider = mDefaultHomeProvider;
}
if (provider == null) {
Slog.e(TAG, "Default home provider has not been set");
return false;
}
final String currentPackageName = provider.getDefaultHome(userId);
final String currentPackageName = mPermissionManager.getDefaultHome(userId);
if (TextUtils.equals(currentPackageName, packageName)) {
return false;
}
@@ -20298,7 +20189,7 @@ public class PackageManagerService extends IPackageManager.Stub
// PermissionController manages default home directly.
return false;
}
provider.setDefaultHomeAsync(packageName, userId, (successful) -> {
mPermissionManager.setDefaultHome(currentPackageName, userId, (successful) -> {
if (successful) {
postPreferredActivityChangedBroadcast(userId);
}
@@ -20854,7 +20745,8 @@ public class PackageManagerService extends IPackageManager.Stub
// Disable any carrier apps. We do this very early in boot to prevent the apps from being
// disabled after already being started.
CarrierAppUtils.disableCarrierAppsUntilPrivileged(mContext.getOpPackageName(), this,
mContext.getContentResolver(), UserHandle.USER_SYSTEM);
mPermissionManagerService, mContext.getContentResolver(),
UserHandle.USER_SYSTEM);
disableSkuSpecificApps();
@@ -20868,8 +20760,6 @@ public class PackageManagerService extends IPackageManager.Stub
Log.d(TAG, "compatibility mode:" + compatibilityModeEnabled);
}
int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
synchronized (mPackages) {
// Verify that all of the preferred activity components actually
// exist. It is possible for applications to be updated and at
@@ -20899,27 +20789,9 @@ public class PackageManagerService extends IPackageManager.Stub
mSettings.mPreferredActivities.keyAt(i));
}
}
for (int userId : UserManagerService.getInstance().getUserIds()) {
if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) {
grantPermissionsUserIds = ArrayUtils.appendInt(
grantPermissionsUserIds, userId);
}
}
}
sUserManager.systemReady();
// If we upgraded grant all default permissions before kicking off.
for (int userId : grantPermissionsUserIds) {
mDefaultPermissionPolicy.grantDefaultPermissions(userId);
}
if (grantPermissionsUserIds == EMPTY_INT_ARRAY) {
// If we did not grant default permissions, we preload from this the
// default permission exceptions lazily to ensure we don't hit the
// disk on a new user creation.
mDefaultPermissionPolicy.scheduleReadDefaultPermissionExceptions();
}
// Now that we've scanned all packages, and granted any default
// permissions, ensure permissions are updated. Beware of dragons if you
@@ -22943,11 +22815,7 @@ public class PackageManagerService extends IPackageManager.Stub
}
void onNewUserCreated(final int userId) {
mDefaultPermissionPolicy.grantDefaultPermissions(userId);
synchronized(mPackages) {
// NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG
mPermissionManager.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, true);
}
mPermissionManager.onNewUserCreated(userId);
}
@Override
@@ -23531,7 +23399,7 @@ public class PackageManagerService extends IPackageManager.Stub
public String getKnownPackageName(int knownPackage, int userId) {
switch(knownPackage) {
case PackageManagerInternal.PACKAGE_BROWSER:
return getDefaultBrowserPackageName(userId);
return mPermissionManager.getDefaultBrowser(userId);
case PackageManagerInternal.PACKAGE_INSTALLER:
return mRequiredInstallerPackage;
case PackageManagerInternal.PACKAGE_SETUP_WIZARD:
@@ -23564,37 +23432,6 @@ public class PackageManagerService extends IPackageManager.Stub
&& mResolveActivity.name.equals(component.name);
}
@Override
public void setLocationPackagesProvider(PackagesProvider provider) {
mDefaultPermissionPolicy.setLocationPackagesProvider(provider);
}
@Override
public void setLocationExtraPackagesProvider(PackagesProvider provider) {
mDefaultPermissionPolicy.setLocationExtraPackagesProvider(provider);
}
@Override
public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
mDefaultPermissionPolicy.setVoiceInteractionPackagesProvider(provider);
}
@Override
public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
mDefaultPermissionPolicy.setUseOpenWifiAppPackagesProvider(provider);
}
@Override
public void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider) {
mDefaultPermissionPolicy.setSyncAdapterPackagesProvider(provider);
}
@Override
public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultUseOpenWifiApp(
packageName, userId);
}
@Override
public void setKeepUninstalledPackages(final List<String> packageList) {
Preconditions.checkNotNull(packageList);
@@ -24107,27 +23944,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
@Override
public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) {
synchronized (mPackages) {
mDefaultBrowserProvider = provider;
}
}
@Override
public void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider) {
synchronized (mPackages) {
mDefaultDialerProvider = provider;
}
}
@Override
public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) {
synchronized (mPackages) {
mDefaultHomeProvider = provider;
}
}
@Override
public boolean isApexPackage(String packageName) {
return PackageManagerService.this.mApexManager.isApexPackage(packageName);
@@ -24173,13 +23989,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
@Override
public boolean wereDefaultPermissionsGrantedSinceBoot(int userId) {
synchronized (mPackages) {
return mDefaultPermissionPolicy.wereDefaultPermissionsGrantedSinceBoot(userId);
}
}
@Override
public void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint,
@UserIdInt int userId) {
@@ -24266,6 +24075,13 @@ public class PackageManagerService extends IPackageManager.Stub
&& UserHandle.isSameApp(installerPackageSetting.appId, callingUid);
}
}
@Override
public boolean areDefaultRuntimePermissionsGranted(int userId) {
synchronized (mPackages) {
return mSettings.areDefaultRuntimePermissionsGrantedLPr(userId);
}
}
}
@GuardedBy("mPackages")
@@ -24334,83 +24150,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
@Override
public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps");
synchronized (mPackages) {
final long identity = Binder.clearCallingIdentity();
try {
mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledCarrierApps(
packageNames, userId);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}
@Override
public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
enforceSystemOrPhoneCaller("grantDefaultPermissionsToEnabledImsServices");
synchronized (mPackages) {
final long identity = Binder.clearCallingIdentity();
try {
mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledImsServices(
packageNames, userId);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}
@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));
}
}
@Override
public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
enforceSystemOrPhoneCaller("grantDefaultPermissionsToActiveLuiApp");
synchronized (mPackages) {
final long identity = Binder.clearCallingIdentity();
try {
mDefaultPermissionPolicy.grantDefaultPermissionsToActiveLuiApp(
packageName, userId);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}
@Override
public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromLuiApps");
synchronized (mPackages) {
final long identity = Binder.clearCallingIdentity();
try {
mDefaultPermissionPolicy.revokeDefaultPermissionsFromLuiApps(packageNames, userId);
} finally {
Binder.restoreCallingIdentity(identity);
}
}
}
void forEachPackage(Consumer<PackageParser.Package> actionLocked) {
synchronized (mPackages) {
int numPackages = mPackages.size();
@@ -24435,14 +24174,6 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
private static void enforceSystemOrPhoneCaller(String tag) {
int callingUid = Binder.getCallingUid();
if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) {
throw new SecurityException(
"Cannot call " + tag + " from UID " + callingUid);
}
}
boolean isHistoricalPackageUsageAvailable() {
return mPackageUsage.isHistoricalPackageUsageAvailable();
}

View File

@@ -389,6 +389,17 @@ public class PackageManagerServiceUtils {
}
}
/**
* Enforces that the caller must be either the system process or the phone process.
* If not, throws a {@link SecurityException}.
*/
public static void enforceSystemOrPhoneCaller(String methodName, int callingUid) {
if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) {
throw new SecurityException(
"Cannot call " + methodName + " from UID " + callingUid);
}
}
/**
* Derive the value of the {@code cpuAbiOverride} based on the provided
* value and an optional stored value from the package settings.

View File

@@ -34,8 +34,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal.PackagesProvider;
import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
@@ -69,6 +67,8 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.XmlUtils;
import com.android.server.LocalServices;
import com.android.server.pm.permission.PermissionManagerServiceInternal.PackagesProvider;
import com.android.server.pm.permission.PermissionManagerServiceInternal.SyncAdapterPackagesProvider;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

View File

@@ -118,6 +118,9 @@ import com.android.server.pm.PackageManagerServiceUtils;
import com.android.server.pm.PackageSetting;
import com.android.server.pm.SharedUserSetting;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultBrowserProvider;
import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultDialerProvider;
import com.android.server.pm.permission.PermissionManagerServiceInternal.DefaultHomeProvider;
import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback;
import com.android.server.pm.permission.PermissionsState.PermissionState;
import com.android.server.policy.SoftRestrictedPermissionPolicy;
@@ -250,6 +253,15 @@ public class PermissionManagerService extends IPermissionManager.Stub {
@GuardedBy("mLock")
private final OnPermissionChangeListeners mOnPermissionChangeListeners;
@GuardedBy("mLock")
private DefaultBrowserProvider mDefaultBrowserProvider;
@GuardedBy("mLock")
private DefaultDialerProvider mDefaultDialerProvider;
@GuardedBy("mLock")
private DefaultHomeProvider mDefaultHomeProvider;
// TODO: Take a look at the methods defined in the callback.
// The callback was initially created to support the split between permission
// manager and the package manager. However, it's started to be used for other
@@ -1609,6 +1621,127 @@ public class PermissionManagerService extends IPermissionManager.Stub {
mPackageManagerInt.writePermissionSettings(asyncUpdatedUsers.toArray(), true);
}
@Override
public String getDefaultBrowser(int userId) {
final int callingUid = Binder.getCallingUid();
if (UserHandle.getUserId(callingUid) != userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
}
if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) {
return null;
}
synchronized (mLock) {
return mDefaultBrowserProvider == null
? null : mDefaultBrowserProvider.getDefaultBrowser(userId);
}
}
@Override
public boolean setDefaultBrowser(String packageName, int userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
if (UserHandle.getCallingUserId() != userId) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
}
return setDefaultBrowserInternal(packageName, false, true, userId);
}
private boolean setDefaultBrowserInternal(String packageName, boolean async,
boolean doGrant, int userId) {
synchronized (mLock) {
if (userId == UserHandle.USER_ALL) {
return false;
}
if (mDefaultBrowserProvider == null) {
return false;
}
if (async) {
mDefaultBrowserProvider.setDefaultBrowserAsync(packageName, userId);
} else {
if (!mDefaultBrowserProvider.setDefaultBrowser(packageName, userId)) {
return false;
}
}
if (doGrant && packageName != null) {
mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToDefaultBrowser(packageName, userId);
}
}
return true;
}
@Override
public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils
.enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId));
}
}
@Override
public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
"grantDefaultPermissionsToEnabledImsServices", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToEnabledImsServices(packageNames, userId));
}
}
@Override
public void grantDefaultPermissionsToEnabledTelephonyDataServices(
String[] packageNames, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
"grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToEnabledTelephonyDataServices(
packageNames, userId));
}
}
@Override
public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
String[] packageNames, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
"revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.revokeDefaultPermissionsFromDisabledTelephonyDataServices(
packageNames, userId));
}
}
@Override
public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils
.enforceSystemOrPhoneCaller("grantDefaultPermissionsToActiveLuiApp", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToActiveLuiApp(packageName, userId));
}
}
@Override
public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
final int callingUid = Binder.getCallingUid();
PackageManagerServiceUtils
.enforceSystemOrPhoneCaller("revokeDefaultPermissionsFromLuiApps", callingUid);
synchronized (mLock) {
Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
.revokeDefaultPermissionsFromLuiApps(packageNames, userId));
}
}
/**
* Get the state of the runtime permissions as xml file.
*
@@ -3714,6 +3847,24 @@ public class PermissionManagerService extends IPermissionManager.Stub {
}
mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class);
int[] grantPermissionsUserIds = EMPTY_INT_ARRAY;
for (int userId : UserManagerService.getInstance().getUserIds()) {
if (!mPackageManagerInt.areDefaultRuntimePermissionsGranted(userId)) {
grantPermissionsUserIds = ArrayUtils.appendInt(
grantPermissionsUserIds, userId);
}
}
// If we upgraded grant all default permissions before kicking off.
for (int userId : grantPermissionsUserIds) {
mDefaultPermissionGrantPolicy.grantDefaultPermissions(userId);
}
if (grantPermissionsUserIds == EMPTY_INT_ARRAY) {
// If we did not grant default permissions, we preload from this the
// default permission exceptions lazily to ensure we don't hit the
// disk on a new user creation.
mDefaultPermissionGrantPolicy.scheduleReadDefaultPermissionExceptions();
}
}
private static String getVolumeUuidForPackage(PackageParser.Package pkg) {
@@ -3882,10 +4033,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
return mSettings;
}
@Override
public DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy() {
return mDefaultPermissionGrantPolicy;
}
@Override
public BasePermission getPermissionTEMP(String permName) {
synchronized (PermissionManagerService.this.mLock) {
return mSettings.getPermissionLocked(permName);
@@ -3956,6 +4103,168 @@ public class PermissionManagerService extends IPermissionManager.Stub {
mCheckPermissionDelegate = delegate;
}
}
@Override
public void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider) {
synchronized (mLock) {
mDefaultBrowserProvider = provider;
}
}
@Override
public void setDefaultBrowser(String packageName, boolean async, boolean doGrant,
int userId) {
setDefaultBrowserInternal(packageName, async, doGrant, userId);
}
@Override
public void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider) {
synchronized (mLock) {
mDefaultDialerProvider = provider;
}
}
@Override
public void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider) {
synchronized (mLock) {
mDefaultHomeProvider = provider;
}
}
@Override
public void setDefaultHome(String packageName, int userId, Consumer<Boolean> callback) {
synchronized (mLock) {
if (userId == UserHandle.USER_ALL) {
return;
}
if (mDefaultHomeProvider == null) {
return;
}
mDefaultHomeProvider.setDefaultHomeAsync(packageName, userId, callback);
}
}
@Override
public void setDialerAppPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setDialerAppPackagesProvider(provider);
}
}
@Override
public void setLocationExtraPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setLocationExtraPackagesProvider(provider);
}
}
@Override
public void setLocationPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setLocationPackagesProvider(provider);
}
}
@Override
public void setSimCallManagerPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setSimCallManagerPackagesProvider(provider);
}
}
@Override
public void setSmsAppPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setSmsAppPackagesProvider(provider);
}
}
@Override
public void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setSyncAdapterPackagesProvider(provider);
}
}
@Override
public void setUseOpenWifiAppPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setUseOpenWifiAppPackagesProvider(provider);
}
}
@Override
public void setVoiceInteractionPackagesProvider(PackagesProvider provider) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.setVoiceInteractionPackagesProvider(provider);
}
}
@Override
public String getDefaultBrowser(int userId) {
synchronized (mLock) {
return mDefaultBrowserProvider == null
? null : mDefaultBrowserProvider.getDefaultBrowser(userId);
}
}
@Override
public String getDefaultDialer(int userId) {
synchronized (mLock) {
return mDefaultDialerProvider == null
? null : mDefaultDialerProvider.getDefaultDialer(userId);
}
}
@Override
public String getDefaultHome(int userId) {
synchronized (mLock) {
return mDefaultHomeProvider == null
? null : mDefaultHomeProvider.getDefaultHome(userId);
}
}
@Override
public void grantDefaultPermissionsToDefaultSimCallManager(String packageName, int userId) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToDefaultSimCallManager(packageName, userId);
}
}
@Override
public void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName, int userId) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToDefaultUseOpenWifiApp(packageName, userId);
}
}
@Override
public void grantDefaultPermissionsToDefaultBrowser(String packageName, int userId) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy
.grantDefaultPermissionsToDefaultBrowser(packageName, userId);
}
}
@Override
public boolean wereDefaultPermissionsGrantedSinceBoot(int userId) {
synchronized (mLock) {
return mDefaultPermissionGrantPolicy.wereDefaultPermissionsGrantedSinceBoot(userId);
}
}
@Override
public void onNewUserCreated(int userId) {
synchronized (mLock) {
mDefaultPermissionGrantPolicy.grantDefaultPermissions(userId);
// NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG
PermissionManagerService.this.updateAllPermissions(
StorageManager.UUID_PRIVATE_INTERNAL, true, mDefaultPermissionCallback);
}
}
@Override
public void notifyPermissionsChangedTEMP(int uid) {
mOnPermissionChangeListeners.onPermissionsChanged(uid);

View File

@@ -27,6 +27,7 @@ import android.permission.PermissionManagerInternal;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* Internal interfaces services.
@@ -34,6 +35,109 @@ import java.util.List;
* TODO: Should be merged into PermissionManagerInternal, but currently uses internal classes.
*/
public abstract class PermissionManagerServiceInternal extends PermissionManagerInternal {
/**
* Provider for package names.
*/
public interface PackagesProvider {
/**
* Gets the packages for a given user.
* @param userId The user id.
* @return The package names.
*/
String[] getPackages(int userId);
}
/**
* Provider for package names.
*/
public interface SyncAdapterPackagesProvider {
/**
* Gets the sync adapter packages for given authority and user.
* @param authority The authority.
* @param userId The user id.
* @return The package names.
*/
String[] getPackages(String authority, int userId);
}
/**
* Provider for default browser
*/
public interface DefaultBrowserProvider {
/**
* Get the package name of the default browser.
*
* @param userId the user id
*
* @return the package name of the default browser, or {@code null} if none
*/
@Nullable
String getDefaultBrowser(@UserIdInt int userId);
/**
* Set the package name of the default browser.
*
* @param packageName package name of the default browser, or {@code null} to remove
* @param userId the user id
*
* @return whether the default browser was successfully set.
*/
boolean setDefaultBrowser(@Nullable String packageName, @UserIdInt int userId);
/**
* Set the package name of the default browser asynchronously.
*
* @param packageName package name of the default browser, or {@code null} to remove
* @param userId the user id
*/
void setDefaultBrowserAsync(@Nullable String packageName, @UserIdInt int userId);
}
/**
* Provider for default dialer
*/
public interface DefaultDialerProvider {
/**
* Get the package name of the default dialer.
*
* @param userId the user id
*
* @return the package name of the default dialer, or {@code null} if none
*/
@Nullable
String getDefaultDialer(@UserIdInt int userId);
}
/**
* Provider for default home
*/
public interface DefaultHomeProvider {
/**
* Get the package name of the default home.
*
* @param userId the user id
*
* @return the package name of the default home, or {@code null} if none
*/
@Nullable
String getDefaultHome(@UserIdInt int userId);
/**
* Set the package name of the default home.
*
* @param packageName package name of the default home, or {@code null} to remove
* @param userId the user id
* @param callback the callback made after the default home as been updated
*/
void setDefaultHomeAsync(@Nullable String packageName, @UserIdInt int userId,
@NonNull Consumer<Boolean> callback);
}
/**
* Callbacks invoked when interesting actions have been taken on a permission.
* <p>
@@ -189,7 +293,10 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
public abstract void enforceGrantRevokeRuntimePermissionPermissions(@NonNull String message);
public abstract @NonNull PermissionSettings getPermissionSettings();
public abstract @NonNull DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy();
/** Grants default browser permissions to the given package */
public abstract void grantDefaultPermissionsToDefaultBrowser(
@NonNull String packageName, @UserIdInt int userId);
/** HACK HACK methods to allow for partial migration of data to the PermissionManager class */
public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName);
@@ -214,4 +321,142 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
* @param delegate A delegate instance or {@code null} to clear.
*/
public abstract void setCheckPermissionDelegate(@Nullable CheckPermissionDelegate delegate);
/**
* Sets the dialer application packages provider.
* @param provider The provider.
*/
public abstract void setDialerAppPackagesProvider(PackagesProvider provider);
/**
* Set the location extra packages provider.
* @param provider The packages provider.
*/
public abstract void setLocationExtraPackagesProvider(PackagesProvider provider);
/**
* Sets the location provider packages provider.
* @param provider The packages provider.
*/
public abstract void setLocationPackagesProvider(PackagesProvider provider);
/**
* Sets the SIM call manager packages provider.
* @param provider The provider.
*/
public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider);
/**
* Sets the SMS application packages provider.
* @param provider The provider.
*/
public abstract void setSmsAppPackagesProvider(PackagesProvider provider);
/**
* Sets the sync adapter packages provider.
* @param provider The provider.
*/
public abstract void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider);
/**
* Sets the Use Open Wifi packages provider.
* @param provider The packages provider.
*/
public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider);
/**
* Sets the voice interaction packages provider.
* @param provider The packages provider.
*/
public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider);
/**
* Sets the default browser provider.
*
* @param provider the provider
*/
public abstract void setDefaultBrowserProvider(@NonNull DefaultBrowserProvider provider);
/**
* Sets the package name of the default browser provider for the given user.
*
* @param packageName The package name of the default browser or {@code null}
* to clear the default browser
* @param async If {@code true}, set the default browser asynchronously,
* otherwise set it synchronously
* @param doGrant If {@code true} and if {@code packageName} is not {@code null},
* perform default permission grants on the browser, otherwise skip the
* default permission grants.
* @param userId The user to set the default browser for.
*/
public abstract void setDefaultBrowser(@Nullable String packageName, boolean async,
boolean doGrant, @UserIdInt int userId);
/**
* Sets the default dialer provider.
*
* @param provider the provider
*/
public abstract void setDefaultDialerProvider(@NonNull DefaultDialerProvider provider);
/**
* Sets the default home provider.
*
* @param provider the provider
*/
public abstract void setDefaultHomeProvider(@NonNull DefaultHomeProvider provider);
/**
* Asynchronously sets the package name of the default home provider for the given user.
*
* @param packageName The package name of the default home or {@code null}
* to clear the default browser
* @param userId The user to set the default browser for
* @param callback Invoked after the default home has been set
*/
public abstract void setDefaultHome(@Nullable String packageName, @UserIdInt int userId,
@NonNull Consumer<Boolean> callback);
/**
* Returns the default browser package name for the given user.
*/
@Nullable
public abstract String getDefaultBrowser(@UserIdInt int userId);
/**
* Returns the default dialer package name for the given user.
*/
@Nullable
public abstract String getDefaultDialer(@UserIdInt int userId);
/**
* Returns the default home package name for the given user.
*/
@Nullable
public abstract String getDefaultHome(@UserIdInt int userId);
/**
* Requests granting of the default permissions to the current default Use Open Wifi app.
* @param packageName The default use open wifi package name.
* @param userId The user for which to grant the permissions.
*/
public abstract void grantDefaultPermissionsToDefaultSimCallManager(
@NonNull String packageName, @UserIdInt int userId);
/**
* Requests granting of the default permissions to the current default Use Open Wifi app.
* @param packageName The default use open wifi package name.
* @param userId The user for which to grant the permissions.
*/
public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(
@NonNull String packageName, @UserIdInt int userId);
/**
* Returns whether or not default permission grants have been performed for the given
* user since the device booted.
*/
public abstract boolean wereDefaultPermissionsGrantedSinceBoot(@UserIdInt int userId);
/** Called when a new user has been created. */
public abstract void onNewUserCreated(@UserIdInt int userId);
}

View File

@@ -260,9 +260,11 @@ public final class PermissionPolicyService extends SystemService {
private void grantOrUpgradeDefaultRuntimePermissionsIfNeeded(@UserIdInt int userId) {
if (DEBUG) Slog.i(LOG_TAG, "grantOrUpgradeDefaultPermsIfNeeded(" + userId + ")");
final PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
if (packageManagerInternal.wereDefaultPermissionsGrantedSinceBoot(userId)) {
final PackageManagerInternal packageManagerInternal =
LocalServices.getService(PackageManagerInternal.class);
final PermissionManagerServiceInternal permissionManagerInternal =
LocalServices.getService(PermissionManagerServiceInternal.class);
if (permissionManagerInternal.wereDefaultPermissionsGrantedSinceBoot(userId)) {
if (DEBUG) Slog.i(LOG_TAG, "defaultPermsWereGrantedSinceBoot(" + userId + ")");
// Now call into the permission controller to apply policy around permissions

View File

@@ -49,7 +49,6 @@ import android.os.ResultReceiver;
import android.os.ShellCallback;
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.provider.Telephony;
import android.service.sms.FinancialSmsService;
import android.telephony.IFinancialSmsCallback;
import android.text.TextUtils;
@@ -74,6 +73,7 @@ import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
@@ -155,11 +155,11 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
LocalServices.addService(RoleManagerInternal.class, new Internal());
PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
packageManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider());
packageManagerInternal.setDefaultDialerProvider(new DefaultDialerProvider());
packageManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider());
PermissionManagerServiceInternal permissionManagerInternal =
LocalServices.getService(PermissionManagerServiceInternal.class);
permissionManagerInternal.setDefaultBrowserProvider(new DefaultBrowserProvider());
permissionManagerInternal.setDefaultDialerProvider(new DefaultDialerProvider());
permissionManagerInternal.setDefaultHomeProvider(new DefaultHomeProvider());
registerUserRemovedReceiver();
}
@@ -731,7 +731,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
private class DefaultBrowserProvider implements PackageManagerInternal.DefaultBrowserProvider {
private class DefaultBrowserProvider implements
PermissionManagerServiceInternal.DefaultBrowserProvider {
@Nullable
@Override
@@ -785,7 +786,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
private class DefaultDialerProvider implements PackageManagerInternal.DefaultDialerProvider {
private class DefaultDialerProvider implements
PermissionManagerServiceInternal.DefaultDialerProvider {
@Nullable
@Override
@@ -795,7 +797,8 @@ public class RoleManagerService extends SystemService implements RoleUserState.C
}
}
private class DefaultHomeProvider implements PackageManagerInternal.DefaultHomeProvider {
private class DefaultHomeProvider implements
PermissionManagerServiceInternal.DefaultHomeProvider {
@Nullable
@Override

View File

@@ -39,7 +39,6 @@ import com.android.internal.telephony.SmsApplication;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
/**
@@ -66,9 +65,9 @@ public class TelecomLoaderService extends SystemService {
ServiceManager.addService(Context.TELECOM_SERVICE, service);
synchronized (mLock) {
final PermissionManagerServiceInternal permissionManager =
LocalServices.getService(PermissionManagerServiceInternal.class);
if (mDefaultSimCallManagerRequests != null) {
final DefaultPermissionGrantPolicy permissionPolicy =
getDefaultPermissionGrantPolicy();
if (mDefaultSimCallManagerRequests != null) {
TelecomManager telecomManager =
(TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
@@ -80,7 +79,7 @@ public class TelecomLoaderService extends SystemService {
for (int i = requestCount - 1; i >= 0; i--) {
final int userId = mDefaultSimCallManagerRequests.get(i);
mDefaultSimCallManagerRequests.remove(i);
permissionPolicy
permissionManager
.grantDefaultPermissionsToDefaultSimCallManager(
packageName, userId);
}
@@ -99,11 +98,6 @@ public class TelecomLoaderService extends SystemService {
}
}
private DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy() {
return LocalServices.getService(PermissionManagerServiceInternal.class)
.getDefaultPermissionGrantPolicy();
}
private static final ComponentName SERVICE_COMPONENT = new ComponentName(
"com.android.server.telecom",
"com.android.server.telecom.components.TelecomService");
@@ -162,10 +156,11 @@ public class TelecomLoaderService extends SystemService {
private void registerDefaultAppProviders() {
final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy();
final PermissionManagerServiceInternal permissionManager =
LocalServices.getService(PermissionManagerServiceInternal.class);
// Set a callback for the permission grant policy to query the default sms app.
permissionPolicy.setSmsAppPackagesProvider(userId -> {
permissionManager.setSmsAppPackagesProvider(userId -> {
synchronized (mLock) {
if (mServiceConnection == null) {
return null;
@@ -180,7 +175,7 @@ public class TelecomLoaderService extends SystemService {
});
// Set a callback for the permission grant policy to query the default dialer app.
permissionPolicy.setDialerAppPackagesProvider(userId -> {
permissionManager.setDialerAppPackagesProvider(userId -> {
synchronized (mLock) {
if (mServiceConnection == null) {
return null;
@@ -194,7 +189,7 @@ public class TelecomLoaderService extends SystemService {
});
// Set a callback for the permission grant policy to query the default sim call manager.
permissionPolicy.setSimCallManagerPackagesProvider(userId -> {
permissionManager.setSimCallManagerPackagesProvider(userId -> {
synchronized (mLock) {
if (mServiceConnection == null) {
if (mDefaultSimCallManagerRequests == null) {
@@ -215,12 +210,11 @@ public class TelecomLoaderService extends SystemService {
}
private void registerDefaultAppNotifier() {
final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy();
// Notify the package manager on default app changes
final RoleManager roleManager = mContext.getSystemService(RoleManager.class);
roleManager.addOnRoleHoldersChangedListenerAsUser(mContext.getMainExecutor(),
(roleName, user) -> updateSimCallManagerPermissions(permissionPolicy,
user.getIdentifier()), UserHandle.ALL);
(roleName, user) -> updateSimCallManagerPermissions(user.getIdentifier()),
UserHandle.ALL);
}
@@ -230,7 +224,7 @@ public class TelecomLoaderService extends SystemService {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
for (int userId : UserManagerService.getInstance().getUserIds()) {
updateSimCallManagerPermissions(getDefaultPermissionGrantPolicy(), userId);
updateSimCallManagerPermissions(userId);
}
}
}
@@ -240,16 +234,16 @@ public class TelecomLoaderService extends SystemService {
new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null);
}
private void updateSimCallManagerPermissions(
DefaultPermissionGrantPolicy permissionGrantPolicy, int userId) {
private void updateSimCallManagerPermissions(int userId) {
final PermissionManagerServiceInternal permissionManager =
LocalServices.getService(PermissionManagerServiceInternal.class);
TelecomManager telecomManager =
(TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
if (phoneAccount != null) {
Slog.i(TAG, "updating sim call manager permissions for userId:" + userId);
String packageName = phoneAccount.getComponentName().getPackageName();
permissionGrantPolicy.grantDefaultPermissionsToDefaultSimCallManager(
packageName, userId);
permissionManager.grantDefaultPermissionsToDefaultSimCallManager(packageName, userId);
}
}
}

View File

@@ -72,6 +72,7 @@ import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.server.devicepolicy.MockUtils;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.google.android.collect.Lists;
@@ -132,9 +133,10 @@ public class NetworkScoreServiceTest {
@Mock private UnaryOperator<List<ScoredNetwork>> mScanResultsFilter;
@Mock private WifiInfo mWifiInfo;
@Mock private NetworkScoreService.ScoringServiceConnection mServiceConnection;
@Mock private PackageManagerInternal mPackageManagerInternal;
@Mock private PermissionManagerServiceInternal mPermissionManagerInternal;
@Captor private ArgumentCaptor<List<ScoredNetwork>> mScoredNetworkCaptor;
@Captor private ArgumentCaptor<PackageManagerInternal.PackagesProvider> mPackagesProviderCaptor;
@Captor private
ArgumentCaptor<PermissionManagerServiceInternal.PackagesProvider> mPackagesProviderCaptor;
private ContentResolver mContentResolver;
private NetworkScoreService mNetworkScoreService;
@@ -162,7 +164,8 @@ public class NetworkScoreServiceTest {
when(mNetworkScorerAppManager.getActiveScorer()).thenReturn(NEW_SCORER);
mHandlerThread = new HandlerThread("NetworkScoreServiceTest");
mHandlerThread.start();
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
LocalServices.addService(
PermissionManagerServiceInternal.class, mPermissionManagerInternal);
mNetworkScoreService = new NetworkScoreService(mContext, mNetworkScorerAppManager,
networkScorerAppData -> mServiceConnection, mHandlerThread.getLooper());
WifiConfiguration configuration = new WifiConfiguration();
@@ -196,7 +199,7 @@ public class NetworkScoreServiceTest {
Settings.Global.putString(mContentResolver,
Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.app");
verify(mPackageManagerInternal)
verify(mPermissionManagerInternal)
.setUseOpenWifiAppPackagesProvider(mPackagesProviderCaptor.capture());
String[] packages = mPackagesProviderCaptor.getValue().getPackages(0);
@@ -209,7 +212,7 @@ public class NetworkScoreServiceTest {
Settings.Global.putString(mContentResolver,
Settings.Global.USE_OPEN_WIFI_PACKAGE, "com.some.other.app");
verify(mPackageManagerInternal, timeout(500))
verify(mPermissionManagerInternal, timeout(500))
.grantDefaultPermissionsToDefaultUseOpenWifiApp("com.some.other.app", 0);
}

View File

@@ -33,7 +33,6 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.ShortcutServiceInternal;
@@ -79,6 +78,7 @@ import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.UiThread;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.soundtrigger.SoundTriggerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -120,10 +120,10 @@ public class VoiceInteractionManagerService extends SystemService {
mUserManager = Preconditions.checkNotNull(
context.getSystemService(UserManager.class));
PackageManagerInternal packageManagerInternal = LocalServices.getService(
PackageManagerInternal.class);
packageManagerInternal.setVoiceInteractionPackagesProvider(
new PackageManagerInternal.PackagesProvider() {
PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
PermissionManagerServiceInternal.class);
permissionManagerInternal.setVoiceInteractionPackagesProvider(
new PermissionManagerServiceInternal.PackagesProvider() {
@Override
public String[] getPackages(int userId) {
mServiceStub.initForUser(userId);

View File

@@ -22,6 +22,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.permission.IPermissionManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
@@ -71,8 +72,8 @@ public final class CarrierAppUtils {
* privileged apps may have changed.
*/
public synchronized static void disableCarrierAppsUntilPrivileged(String callingPackage,
IPackageManager packageManager, TelephonyManager telephonyManager,
ContentResolver contentResolver, int userId) {
IPackageManager packageManager, IPermissionManager permissionManager,
TelephonyManager telephonyManager, ContentResolver contentResolver, int userId) {
if (DEBUG) {
Slog.d(TAG, "disableCarrierAppsUntilPrivileged");
}
@@ -81,8 +82,8 @@ public final class CarrierAppUtils {
config.getDisabledUntilUsedPreinstalledCarrierApps();
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
disableCarrierAppsUntilPrivileged(callingPackage, packageManager, telephonyManager,
contentResolver, userId, systemCarrierAppsDisabledUntilUsed,
disableCarrierAppsUntilPrivileged(callingPackage, packageManager, permissionManager,
telephonyManager, contentResolver, userId, systemCarrierAppsDisabledUntilUsed,
systemCarrierAssociatedAppsDisabledUntilUsed);
}
@@ -98,7 +99,8 @@ public final class CarrierAppUtils {
* Manager can kill it, and this can lead to crashes as the app is in an unexpected state.
*/
public synchronized static void disableCarrierAppsUntilPrivileged(String callingPackage,
IPackageManager packageManager, ContentResolver contentResolver, int userId) {
IPackageManager packageManager, IPermissionManager permissionManager,
ContentResolver contentResolver, int userId) {
if (DEBUG) {
Slog.d(TAG, "disableCarrierAppsUntilPrivileged");
}
@@ -109,7 +111,7 @@ public final class CarrierAppUtils {
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed =
config.getDisabledUntilUsedPreinstalledCarrierAssociatedApps();
disableCarrierAppsUntilPrivileged(callingPackage, packageManager,
disableCarrierAppsUntilPrivileged(callingPackage, packageManager, permissionManager,
null /* telephonyManager */, contentResolver, userId,
systemCarrierAppsDisabledUntilUsed, systemCarrierAssociatedAppsDisabledUntilUsed);
}
@@ -117,7 +119,8 @@ public final class CarrierAppUtils {
// Must be public b/c framework unit tests can't access package-private methods.
@VisibleForTesting
public static void disableCarrierAppsUntilPrivileged(String callingPackage,
IPackageManager packageManager, @Nullable TelephonyManager telephonyManager,
IPackageManager packageManager, IPermissionManager permissionManager,
@Nullable TelephonyManager telephonyManager,
ContentResolver contentResolver, int userId,
ArraySet<String> systemCarrierAppsDisabledUntilUsed,
ArrayMap<String, List<String>> systemCarrierAssociatedAppsDisabledUntilUsed) {
@@ -256,7 +259,7 @@ public final class CarrierAppUtils {
// apps.
String[] packageNames = new String[enabledCarrierPackages.size()];
enabledCarrierPackages.toArray(packageNames);
packageManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId);
permissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId);
}
} catch (RemoteException e) {
Slog.w(TAG, "Could not reach PackageManager", e);