diff options
author | Felipe Leme <felipeal@google.com> | 2019-04-17 13:57:59 -0700 |
---|---|---|
committer | Felipe Leme <felipeal@google.com> | 2019-04-19 20:25:45 -0700 |
commit | cbf7f26baa56b320a6e426dc765b1d6ca2faaa79 (patch) | |
tree | dc20d39d1f640333de9f15e6c64037cf41f55022 /services/contentcapture | |
parent | d4cced9ab6e5606908aad68a731b34d4f31386f5 (diff) |
Fixed content capture whitelist for specific activities.
Test: manual verification (it cannot be fully verified using the current CTS setup)
Test: atest CtsContentCaptureServiceTestCases:android.contentcaptureservice.cts.WhitelistTest
Test: atest FrameworksCoreTests:android.content.ContentCaptureOptionsTest
Test: atest CtsContentCaptureServiceTestCases # sanity check
Test: m update-api
Fixes: 130573023
Merged-In: I2c76a01bd98c4154c4c59099f1368232d2dba80d
Change-Id: I2c76a01bd98c4154c4c59099f1368232d2dba80d
Diffstat (limited to 'services/contentcapture')
2 files changed, 33 insertions, 64 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java index 7f411d83b34b..a2d3d4c25b1d 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java @@ -781,36 +781,46 @@ public final class ContentCaptureManagerService extends @GuardedBy("mGlobalWhitelistStateLock") public ContentCaptureOptions getOptions(@UserIdInt int userId, @NonNull String packageName) { + boolean packageWhitelisted; + ArraySet<ComponentName> whitelistedComponents = null; synchronized (mGlobalWhitelistStateLock) { - if (!isWhitelisted(userId, packageName)) { - if (packageName.equals(mServicePackages.get(userId))) { + packageWhitelisted = isWhitelisted(userId, packageName); + if (!packageWhitelisted) { + // Full package is not whitelisted: check individual components first + whitelistedComponents = getWhitelistedComponents(userId, packageName); + if (whitelistedComponents == null + && packageName.equals(mServicePackages.get(userId))) { + // No components whitelisted either, but let it go because it's the + // service's own package if (verbose) Slog.v(mTag, "getOptionsForPackage() lite for " + packageName); return new ContentCaptureOptions(mDevCfgLoggingLevel); } - if (verbose) { - Slog.v(mTag, "getOptionsForPackage(" + packageName + "): not whitelisted"); - } - return null; } + } // synchronized - final ArraySet<ComponentName> whitelistedComponents = - getWhitelistedComponents(userId, packageName); - if (Build.IS_USER && mServiceNameResolver.isTemporary(userId)) { - if (!packageName.equals(mServicePackages.get(userId))) { - Slog.w(mTag, "Ignoring package " + packageName - + " while using temporary service " + mServicePackages.get(userId)); - return null; - } + // Restrict what temporary services can whitelist + if (Build.IS_USER && mServiceNameResolver.isTemporary(userId)) { + if (!packageName.equals(mServicePackages.get(userId))) { + Slog.w(mTag, "Ignoring package " + packageName + " while using temporary " + + "service " + mServicePackages.get(userId)); + return null; } - final ContentCaptureOptions options = new ContentCaptureOptions(mDevCfgLoggingLevel, - mDevCfgMaxBufferSize, mDevCfgIdleFlushingFrequencyMs, - mDevCfgTextChangeFlushingFrequencyMs, mDevCfgLogHistorySize, - whitelistedComponents); + } + + if (!packageWhitelisted && whitelistedComponents == null) { + // No can do! if (verbose) { - Slog.v(mTag, "getOptionsForPackage(" + packageName + "): " + options); + Slog.v(mTag, "getOptionsForPackage(" + packageName + "): not whitelisted"); } - return options; + return null; } + + final ContentCaptureOptions options = new ContentCaptureOptions(mDevCfgLoggingLevel, + mDevCfgMaxBufferSize, mDevCfgIdleFlushingFrequencyMs, + mDevCfgTextChangeFlushingFrequencyMs, mDevCfgLogHistorySize, + whitelistedComponents); + if (verbose) Slog.v(mTag, "getOptionsForPackage(" + packageName + "): " + options); + return options; } @Override diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java index 5a42e7893ab4..a7921b5f3892 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java @@ -35,13 +35,11 @@ import android.app.ActivityManagerInternal; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; import android.content.ComponentName; -import android.content.ContentCaptureOptions; import android.content.pm.ActivityPresentationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ServiceInfo; import android.os.Binder; -import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.UserHandle; @@ -60,7 +58,6 @@ import android.view.contentcapture.ContentCaptureCondition; import android.view.contentcapture.DataRemovalRequest; import com.android.internal.annotations.GuardedBy; -import com.android.internal.infra.WhitelistHelper; import com.android.internal.os.IResultReceiver; import com.android.server.LocalServices; import com.android.server.contentcapture.RemoteContentCaptureService.ContentCaptureServiceCallbacks; @@ -97,12 +94,6 @@ final class ContentCapturePerUserService new ContentCaptureServiceRemoteCallback(); /** - * List of packages that are whitelisted to be content captured. - */ - @GuardedBy("mLock") - private final WhitelistHelper mWhitelistHelper = new WhitelistHelper(); - - /** * List of conditions keyed by package. */ @GuardedBy("mLock") @@ -131,6 +122,7 @@ final class ContentCapturePerUserService * Updates the reference to the remote service. */ private void updateRemoteServiceLocked(boolean disabled) { + if (mMaster.verbose) Slog.v(TAG, "updateRemoteService(disabled=" + disabled + ")"); if (mRemoteService != null) { if (mMaster.debug) Slog.d(TAG, "updateRemoteService(): destroying old remote service"); mRemoteService.destroy(); @@ -247,7 +239,8 @@ final class ContentCapturePerUserService final int displayId = activityPresentationInfo.displayId; final ComponentName componentName = activityPresentationInfo.componentName; final boolean whiteListed = mMaster.mGlobalContentCaptureOptions.isWhitelisted(mUserId, - componentName); + componentName) || mMaster.mGlobalContentCaptureOptions.isWhitelisted(mUserId, + componentName.getPackageName()); final ComponentName serviceComponentName = getServiceComponentName(); final boolean enabled = isEnabledLocked(); if (mMaster.mRequestsHistory != null) { @@ -462,40 +455,6 @@ final class ContentCapturePerUserService @GuardedBy("mLock") @Nullable - ContentCaptureOptions getOptionsForPackageLocked(@NonNull String packageName) { - if (!mWhitelistHelper.isWhitelisted(packageName)) { - if (packageName.equals(getServicePackageName())) { - if (mMaster.verbose) Slog.v(mTag, "getOptionsForPackage() lite for " + packageName); - return new ContentCaptureOptions(mMaster.mDevCfgLoggingLevel); - } - if (mMaster.verbose) { - Slog.v(mTag, "getOptionsForPackage(" + packageName + "): not whitelisted"); - } - return null; - } - - final ArraySet<ComponentName> whitelistedComponents = mWhitelistHelper - .getWhitelistedComponents(packageName); - if (Build.IS_USER && isTemporaryServiceSetLocked()) { - final String servicePackageName = getServicePackageName(); - if (!packageName.equals(servicePackageName)) { - Slog.w(mTag, "Ignoring package " + packageName - + " while using temporary service " + servicePackageName); - return null; - } - } - final ContentCaptureOptions options = new ContentCaptureOptions(mMaster.mDevCfgLoggingLevel, - mMaster.mDevCfgMaxBufferSize, mMaster.mDevCfgIdleFlushingFrequencyMs, - mMaster.mDevCfgTextChangeFlushingFrequencyMs, mMaster.mDevCfgLogHistorySize, - whitelistedComponents); - if (mMaster.verbose) { - Slog.v(mTag, "getOptionsForPackage(" + packageName + "): " + options); - } - return options; - } - - @GuardedBy("mLock") - @Nullable ArraySet<ContentCaptureCondition> getContentCaptureConditionsLocked( @NonNull String packageName) { return mConditionsByPkg.get(packageName); |