diff options
| author | 2015-04-29 19:42:41 -0700 | |
|---|---|---|
| committer | 2015-05-01 11:24:44 -0700 | |
| commit | 1de3f0dcafb0c5ceb3d9bec96a5c630bb8d4a515 (patch) | |
| tree | 93fe5a68b5dadec105743bc6e92744ace7f004c4 | |
| parent | 9f7e39fc9d278642a29df48daf44dceff11acd17 (diff) | |
Add IntentFilter auto verification - part 7
- update packages priming so that it effectively save its data
- use ArraySet instead of ArrayList for list of domains (a set
is preferable as we dont want duplicates)
See bug #19628909
Change-Id: I52085f4bc28dcbc7fbc02ba0898abcd4ae9cf1e2
3 files changed, 39 insertions, 30 deletions
diff --git a/core/java/android/content/pm/IntentFilterVerificationInfo.java b/core/java/android/content/pm/IntentFilterVerificationInfo.java index e50b0ff17a0a..96000dd84c6f 100644 --- a/core/java/android/content/pm/IntentFilterVerificationInfo.java +++ b/core/java/android/content/pm/IntentFilterVerificationInfo.java @@ -48,19 +48,18 @@ public final class IntentFilterVerificationInfo implements Parcelable { private static final String ATTR_PACKAGE_NAME = "packageName"; private static final String ATTR_STATUS = "status"; - private ArrayList<String> mDomains; + private ArraySet<String> mDomains = new ArraySet<>(); private String mPackageName; private int mMainStatus; public IntentFilterVerificationInfo() { mPackageName = null; - mDomains = new ArrayList<>(); mMainStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; } public IntentFilterVerificationInfo(String packageName, ArrayList<String> domains) { mPackageName = packageName; - mDomains = domains; + mDomains.addAll(domains); mMainStatus = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; } @@ -73,14 +72,6 @@ public final class IntentFilterVerificationInfo implements Parcelable { readFromParcel(source); } - public ArrayList<String> getDomains() { - return mDomains; - } - - public ArraySet<String> getDomainsSet() { - return new ArraySet<>(mDomains); - } - public String getPackageName() { return mPackageName; } @@ -98,6 +89,14 @@ public final class IntentFilterVerificationInfo implements Parcelable { } } + public ArraySet<String> getDomains() { + return mDomains; + } + + public void setDomains(ArrayList<String> list) { + mDomains = new ArraySet<>(list); + } + public String getDomainsString() { StringBuilder sb = new StringBuilder(); for (String str : mDomains) { @@ -145,7 +144,6 @@ public final class IntentFilterVerificationInfo implements Parcelable { } mMainStatus = status; - mDomains = new ArrayList<>(); int outerDepth = parser.getDepth(); int type; while ((type=parser.next()) != XmlPullParser.END_DOCUMENT @@ -201,15 +199,16 @@ public final class IntentFilterVerificationInfo implements Parcelable { private void readFromParcel(Parcel source) { mPackageName = source.readString(); mMainStatus = source.readInt(); - mDomains = new ArrayList<>(); - source.readStringList(mDomains); + ArrayList<String> list = new ArrayList<>(); + source.readStringList(list); + mDomains.addAll(list); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mPackageName); dest.writeInt(mMainStatus); - dest.writeStringList(mDomains); + dest.writeStringList(new ArrayList<>(mDomains)); } public static final Creator<IntentFilterVerificationInfo> CREATOR = @@ -221,5 +220,4 @@ public final class IntentFilterVerificationInfo implements Parcelable { return new IntentFilterVerificationInfo[size]; } }; - } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6c18e25a2902..e42cb3c59095 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2147,6 +2147,8 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.mFingerprint = Build.FINGERPRINT; } + primeDomainVerificationsLPw(false); + // All the changes are done during package scanning. mSettings.updateInternalDatabaseVersion(); @@ -2164,8 +2166,6 @@ public class PackageManagerService extends IPackageManager.Stub { mIntentFilterVerifier = new IntentVerifierProxy(mContext, mIntentFilterVerifierComponent); - primeDomainVerificationsLPw(false); - } // synchronized (mPackages) } // synchronized (mInstallLock) @@ -2263,9 +2263,9 @@ public class PackageManagerService extends IPackageManager.Stub { } private void primeDomainVerificationsLPw(boolean logging) { - Slog.d(TAG, "Start priming domain verification"); + Slog.d(TAG, "Start priming domain verifications"); boolean updated = false; - ArrayList<String> allHosts = new ArrayList<>(); + ArraySet<String> allHostsSet = new ArraySet<>(); for (PackageParser.Package pkg : mPackages.values()) { final String packageName = pkg.packageName; if (!hasDomainURLs(pkg)) { @@ -2285,18 +2285,20 @@ public class PackageManagerService extends IPackageManager.Stub { for (PackageParser.Activity a : pkg.activities) { for (ActivityIntentInfo filter : a.intents) { if (hasValidDomains(filter, false)) { - allHosts.addAll(filter.getHostsList()); + allHostsSet.addAll(filter.getHostsList()); } } } - if (allHosts.size() == 0) { - allHosts.add("*"); + if (allHostsSet.size() == 0) { + allHostsSet.add("*"); } + ArrayList<String> allHostsList = new ArrayList<>(allHostsSet); IntentFilterVerificationInfo ivi = - mSettings.createIntentFilterVerificationIfNeededLPw(packageName, allHosts); + mSettings.createIntentFilterVerificationIfNeededLPw(packageName, allHostsList); if (ivi != null) { // We will always log this - Slog.d(TAG, "Priming domain verifications for package: " + packageName); + Slog.d(TAG, "Priming domain verifications for package: " + packageName + + " with hosts:" + ivi.getDomainsString()); ivi.setStatus(INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS); updated = true; } @@ -2305,12 +2307,14 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.d(TAG, "No priming domain verifications for package: " + packageName); } } - allHosts.clear(); + allHostsSet.clear(); } if (updated) { - scheduleWriteSettingsLocked(); + if (logging) { + Slog.d(TAG, "Will need to write primed domain verifications"); + } } - Slog.d(TAG, "End priming domain verification"); + Slog.d(TAG, "End priming domain verifications"); } @Override diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 252c16a6fb87..fb2b31ae0105 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -985,6 +985,13 @@ final class Settings { if (ivi == null) { ivi = new IntentFilterVerificationInfo(packageName, domains); ps.setIntentFilterVerificationInfo(ivi); + Slog.d(PackageManagerService.TAG, + "Creating new IntentFilterVerificationInfo for packageName: " + packageName); + } else { + ivi.setDomains(domains); + Slog.d(PackageManagerService.TAG, + "Setting domains to existing IntentFilterVerificationInfo for packageName: " + + packageName + " and with domains: " + ivi.getDomainsString()); } return ivi; } @@ -1021,7 +1028,7 @@ final class Settings { // Then, if we set a ALWAYS status, then put NEVER status for Apps whose IntentFilter // domains overlap the domains of the current package - ArraySet<String> currentDomains = current.getIntentFilterVerificationInfo().getDomainsSet(); + ArraySet<String> currentDomains = current.getIntentFilterVerificationInfo().getDomains(); if (status == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) { for (PackageSetting ps : mPackages.values()) { if (ps == null || ps.pkg.packageName.equals(packageName)) continue; @@ -1029,7 +1036,7 @@ final class Settings { if (ivi == null) { continue; } - ArraySet<String> set = ivi.getDomainsSet(); + ArraySet<String> set = ivi.getDomains(); set.retainAll(currentDomains); if (set.size() > 0) { ps.setDomainVerificationStatusForUser( |