diff options
| author | 2021-02-19 15:32:30 -0800 | |
|---|---|---|
| committer | 2021-02-19 15:47:01 -0800 | |
| commit | 907ad40dae5b3d58da4722857e70e59a445cf7ea (patch) | |
| tree | b38f84ce602c3fc5eee5ea9fdf43d408968fdee3 | |
| parent | db9ef8e719c3b8a2c97f04070b05d0e4fd8d8ac3 (diff) | |
Fix domain verification shell command "all" params
Iterates the user IDs from UserManager when USER_ALL is passed, and
also adds support for "all" domains to set-app-links-user-selection.
Bug: 180753593
Test: manual, run commands with changes
Change-Id: Ib2c8886ae475ac4b6f2a0b77959bb735b4ce34f2
4 files changed, 36 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e6789d4ba8ac..8d0a78547e52 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1755,6 +1755,11 @@ public class PackageManagerService extends IPackageManager.Stub public boolean filterAppAccess(String packageName, int callingUid, int userId) { return mPmInternal.filterAppAccess(packageName, callingUid, userId); } + + @Override + public int[] getAllUserIds() { + return mUserManager.getUserIds(); + } } /** diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java index 5d4370ae5dd4..b6ea901ecd6b 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationManagerInternal.java @@ -358,5 +358,8 @@ public interface DomainVerificationManagerInternal extends DomainVerificationMan @Nullable AndroidPackage getPackageLocked(@NonNull String pkgName); + + @UserIdInt + int[] getAllUserIds(); } } diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java index e5ed774fcaa8..8e5aead05f96 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java @@ -423,12 +423,8 @@ public class DomainVerificationService extends SystemService for (int pkgStateIndex = 0; pkgStateIndex < pkgStateSize; pkgStateIndex++) { DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(pkgStateIndex); if (userId == UserHandle.USER_ALL) { - SparseArray<DomainVerificationUserState> userStates = - pkgState.getUserSelectionStates(); - int userStatesSize = userStates.size(); - for (int userStateIndex = 0; userStateIndex < userStatesSize; - userStateIndex++) { - userStates.valueAt(userStateIndex) + for (int aUserId : mConnection.getAllUserIds()) { + pkgState.getOrCreateUserSelectionState(aUserId) .setLinkHandlingAllowed(allowed); } } else { @@ -436,7 +432,6 @@ public class DomainVerificationService extends SystemService .setLinkHandlingAllowed(allowed); } } - } } else { synchronized (mLock) { @@ -500,28 +495,33 @@ public class DomainVerificationService extends SystemService @Override public void setDomainVerificationUserSelectionInternal(@UserIdInt int userId, - @Nullable String packageName, boolean enabled, @NonNull ArraySet<String> domains) + @Nullable String packageName, boolean enabled, @Nullable ArraySet<String> domains) throws NameNotFoundException { mEnforcer.assertInternal(mConnection.getCallingUid()); + if (packageName == null) { synchronized (mLock) { Set<String> validDomains = new ArraySet<>(); - int size = mAttachedPkgStates.size(); for (int index = 0; index < size; index++) { DomainVerificationPkgState pkgState = mAttachedPkgStates.valueAt(index); String pkgName = pkgState.getPackageName(); PackageSetting pkgSetting = mConnection.getPackageSettingLocked(pkgName); - if (pkgSetting == null || pkgSetting.getPkg() == null) { + AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg(); + if (pkg == null) { continue; } - validDomains.clear(); - validDomains.addAll(domains); + if (domains == null) { + validDomains = mCollector.collectAllWebDomains(pkg); + } else { + validDomains.clear(); + validDomains.addAll(domains); + } setDomainVerificationUserSelectionInternal(userId, pkgState, - pkgSetting.getPkg(), enabled, validDomains); + pkg, enabled, validDomains); } } } else { @@ -532,12 +532,16 @@ public class DomainVerificationService extends SystemService } PackageSetting pkgSetting = mConnection.getPackageSettingLocked(packageName); - if (pkgSetting == null || pkgSetting.getPkg() == null) { + AndroidPackage pkg = pkgSetting == null ? null : pkgSetting.getPkg(); + if (pkg == null) { throw DomainVerificationUtils.throwPackageUnavailable(packageName); } + Set<String> validDomains = + domains == null ? mCollector.collectAllWebDomains(pkg) : domains; + setDomainVerificationUserSelectionInternal(userId, pkgState, pkgSetting.getPkg(), - enabled, domains); + enabled, validDomains); } } @@ -549,12 +553,10 @@ public class DomainVerificationService extends SystemService boolean enabled, Set<String> domains) { domains.retainAll(mCollector.collectAllWebDomains(pkg)); - SparseArray<DomainVerificationUserState> userStates = - pkgState.getUserSelectionStates(); if (userId == UserHandle.USER_ALL) { - int size = userStates.size(); - for (int index = 0; index < size; index++) { - DomainVerificationUserState userState = userStates.valueAt(index); + for (int aUserId : mConnection.getAllUserIds()) { + DomainVerificationUserState userState = + pkgState.getOrCreateUserSelectionState(aUserId); if (enabled) { userState.addHosts(domains); } else { diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java index 7f9e75aa2926..d083d11cb2e2 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationShell.java @@ -250,6 +250,10 @@ public class DomainVerificationShell { return false; } + if (domains.size() == 1 && domains.contains("all")) { + domains = null; + } + try { mCallback.setDomainVerificationUserSelectionInternal(userId, packageName, enabled, domains); @@ -446,10 +450,10 @@ public class DomainVerificationShell { * @param packageName the package whose state to change, or all packages if non is * specified * @param enabled whether the domain is now approved by the user - * @param domains the set of domains to change + * @param domains the set of domains to change, or null to affect all domains */ void setDomainVerificationUserSelectionInternal(@UserIdInt int userId, - @Nullable String packageName, boolean enabled, @NonNull ArraySet<String> domains) + @Nullable String packageName, boolean enabled, @Nullable ArraySet<String> domains) throws PackageManager.NameNotFoundException; /** |