From 1566742743bdb2aa9de36baf15bb4b532d80ecba Mon Sep 17 00:00:00 2001 From: Cassie Wang Date: Wed, 20 Jan 2021 23:59:55 -0800 Subject: [PATCH] Pass global query package name to AppSearchImpl. Gets the config string and checks that it's a system package. Bug: 169883602 Test: presubmit Change-Id: I5ef844f87cd2a90f6bc727860fba7aa155a09e3e --- .../appsearch/AppSearchManagerService.java | 28 +++++----- .../server/appsearch/ImplInstanceManager.java | 53 +++++++++++++++---- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index ec41353e76bbd..ed55f0056ea0b 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -54,6 +54,7 @@ import java.util.Objects; public class AppSearchManagerService extends SystemService { private static final String TAG = "AppSearchManagerService"; private PackageManagerInternal mPackageManagerInternal; + private ImplInstanceManager mImplInstanceManager; public AppSearchManagerService(Context context) { super(context); @@ -63,6 +64,7 @@ public class AppSearchManagerService extends SystemService { public void onStart() { publishBinderService(Context.APP_SEARCH_SERVICE, new Stub()); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); + mImplInstanceManager = new ImplInstanceManager(getContext()); } private class Stub extends IAppSearchManager.Stub { @@ -100,7 +102,7 @@ public class AppSearchManagerService extends SystemService { } schemasPackageAccessible.put(entry.getKey(), packageIdentifiers); } - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); impl.setSchema( packageName, databaseName, @@ -131,7 +133,7 @@ public class AppSearchManagerService extends SystemService { final long callingIdentity = Binder.clearCallingIdentity(); try { verifyCallingPackage(callingUid, packageName); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); List schemas = impl.getSchema(packageName, databaseName); List schemaBundles = new ArrayList<>(schemas.size()); for (int i = 0; i < schemas.size(); i++) { @@ -164,7 +166,7 @@ public class AppSearchManagerService extends SystemService { verifyCallingPackage(callingUid, packageName); AppSearchBatchResult.Builder resultBuilder = new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); for (int i = 0; i < documentBundles.size(); i++) { GenericDocument document = new GenericDocument(documentBundles.get(i)); try { @@ -205,7 +207,7 @@ public class AppSearchManagerService extends SystemService { verifyCallingPackage(callingUid, packageName); AppSearchBatchResult.Builder resultBuilder = new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); for (int i = 0; i < uris.size(); i++) { String uri = uris.get(i); try { @@ -243,7 +245,7 @@ public class AppSearchManagerService extends SystemService { final long callingIdentity = Binder.clearCallingIdentity(); try { verifyCallingPackage(callingUid, packageName); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); SearchResultPage searchResultPage = impl.query( packageName, @@ -276,7 +278,7 @@ public class AppSearchManagerService extends SystemService { final long callingIdentity = Binder.clearCallingIdentity(); try { verifyCallingPackage(callingUid, packageName); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); SearchResultPage searchResultPage = impl.globalQuery( queryExpression, new SearchSpec(searchSpecBundle), @@ -304,7 +306,7 @@ public class AppSearchManagerService extends SystemService { // TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally // opened it try { - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); SearchResultPage searchResultPage = impl.getNextPage(nextPageToken); invokeCallbackOnResult( callback, @@ -322,7 +324,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = handleIncomingUser(userId, callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); impl.invalidateNextPageToken(nextPageToken); } catch (Throwable t) { Log.e(TAG, "Unable to invalidate the query page token", t); @@ -348,7 +350,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = handleIncomingUser(userId, callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); impl.reportUsage( packageName, databaseName, @@ -383,7 +385,7 @@ public class AppSearchManagerService extends SystemService { verifyCallingPackage(callingUid, packageName); AppSearchBatchResult.Builder resultBuilder = new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); for (int i = 0; i < uris.size(); i++) { String uri = uris.get(i); try { @@ -419,7 +421,7 @@ public class AppSearchManagerService extends SystemService { final long callingIdentity = Binder.clearCallingIdentity(); try { verifyCallingPackage(callingUid, packageName); - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); impl.removeByQuery( packageName, databaseName, @@ -439,7 +441,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = handleIncomingUser(userId, callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); + AppSearchImpl impl = mImplInstanceManager.getInstance(callingUserId); impl.persistToDisk(); } catch (Throwable t) { Log.e(TAG, "Unable to persist the data to disk", t); @@ -455,7 +457,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = handleIncomingUser(userId, callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - ImplInstanceManager.getInstance(getContext(), callingUserId); + mImplInstanceManager.getInstance(callingUserId); invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); } catch (Throwable t) { invokeCallbackOnError(callback, t); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java index 85423d28a5e18..fe3c2e1d16046 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java @@ -16,14 +16,19 @@ package com.android.server.appsearch; +import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; + import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.appsearch.exceptions.AppSearchException; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Environment; +import android.os.UserHandle; import android.os.storage.StorageManager; import android.util.SparseArray; +import com.android.internal.R; import com.android.server.appsearch.external.localstorage.AppSearchImpl; import java.io.File; @@ -38,7 +43,13 @@ public final class ImplInstanceManager { private static final SparseArray sInstances = new SparseArray<>(); - private ImplInstanceManager() {} + private final Context mContext; + private final String mGlobalQuerierPackage; + + public ImplInstanceManager(@NonNull Context context) { + mContext = context; + mGlobalQuerierPackage = getGlobalAppSearchDataQuerierPackageName(mContext); + } /** * Gets an instance of AppSearchImpl for the given user. @@ -46,19 +57,18 @@ public final class ImplInstanceManager { *

If no AppSearchImpl instance exists for this user, Icing will be initialized and one will * be created. * - * @param context The Android context * @param userId The multi-user userId of the device user calling AppSearch * @return An initialized {@link AppSearchImpl} for this user */ @NonNull - public static AppSearchImpl getInstance(@NonNull Context context, @UserIdInt int userId) + public AppSearchImpl getInstance(@UserIdInt int userId) throws AppSearchException { AppSearchImpl instance = sInstances.get(userId); if (instance == null) { synchronized (ImplInstanceManager.class) { instance = sInstances.get(userId); if (instance == null) { - instance = createImpl(context, userId); + instance = createImpl(userId); sInstances.put(userId, instance); } } @@ -66,16 +76,41 @@ public final class ImplInstanceManager { return instance; } - private static AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId) + private AppSearchImpl createImpl(@UserIdInt int userId) throws AppSearchException { - File appSearchDir = getAppSearchDir(context, userId); - return AppSearchImpl.create(appSearchDir, context, userId, /*globalQuerierPackage=*/""); + File appSearchDir = getAppSearchDir(mContext, userId); + return AppSearchImpl.create( + appSearchDir, mContext, userId, mGlobalQuerierPackage); } private static File getAppSearchDir(@NonNull Context context, @UserIdInt int userId) { // See com.android.internal.app.ChooserActivity::getPinnedSharedPrefs - File userCeDir = Environment.getDataUserCePackageDirectory( - StorageManager.UUID_PRIVATE_INTERNAL, userId, context.getPackageName()); + File userCeDir = + Environment.getDataUserCePackageDirectory( + StorageManager.UUID_PRIVATE_INTERNAL, userId, context.getPackageName()); return new File(userCeDir, APP_SEARCH_DIR); } + + /** + * Returns the global querier package if it's a system package. Otherwise, empty string. + * + * @param context Context of the system service. + */ + private static String getGlobalAppSearchDataQuerierPackageName(Context context) { + String globalAppSearchDataQuerierPackage = + context.getString(R.string.config_globalAppSearchDataQuerierPackage); + try { + if (context.getPackageManager() + .getPackageInfoAsUser( + globalAppSearchDataQuerierPackage, + MATCH_FACTORY_ONLY, + UserHandle.USER_SYSTEM) + == null) { + return ""; + } + } catch (PackageManager.NameNotFoundException e) { + return ""; + } + return globalAppSearchDataQuerierPackage; + } }