summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/pm/PackageManagerInternal.java3
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java9
-rw-r--r--services/core/java/com/android/server/search/Searchables.java82
3 files changed, 86 insertions, 8 deletions
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 5b3d3e595a91..6feb170b341d 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -451,6 +451,9 @@ public abstract class PackageManagerInternal {
/** Whether the binder caller can access instant apps. */
public abstract boolean canAccessInstantApps(int callingUid, int userId);
+ /** Whether the binder caller can access the given component. */
+ public abstract boolean canAccessComponent(int callingUid, ComponentName component, int userId);
+
/**
* Returns {@code true} if a given package has instant application meta-data.
* Otherwise, returns {@code false}. Meta-data is state (eg. cookie, app icon, etc)
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f0922b341a22..108247844c64 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -23847,6 +23847,15 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName());
}
@Override
+ public boolean canAccessComponent(int callingUid, ComponentName component, int userId) {
+ synchronized (mPackages) {
+ final PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
+ return !PackageManagerService.this.filterAppAccessLPr(
+ ps, callingUid, component, TYPE_UNKNOWN, userId);
+ }
+ }
+
+ @Override
public boolean hasInstantApplicationMetadata(String packageName, int userId) {
synchronized (mPackages) {
return mInstantAppRegistry.hasInstantApplicationMetadataLPr(packageName, userId);
diff --git a/services/core/java/com/android/server/search/Searchables.java b/services/core/java/com/android/server/search/Searchables.java
index 6bacdfdafbda..8af76a17f084 100644
--- a/services/core/java/com/android/server/search/Searchables.java
+++ b/services/core/java/com/android/server/search/Searchables.java
@@ -26,14 +26,18 @@ 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.os.Binder;
import android.os.Bundle;
import android.os.RemoteException;
+import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
+import com.android.server.LocalServices;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -119,7 +123,15 @@ public class Searchables {
SearchableInfo result;
synchronized (this) {
result = mSearchablesMap.get(activity);
- if (result != null) return result;
+ if (result != null) {
+ final PackageManagerInternal pm =
+ LocalServices.getService(PackageManagerInternal.class);
+ if (pm.canAccessComponent(Binder.getCallingUid(), result.getSearchActivity(),
+ UserHandle.getCallingUserId())) {
+ return result;
+ }
+ return null;
+ }
}
// Step 2. See if the current activity references a searchable.
@@ -170,8 +182,16 @@ public class Searchables {
result = mSearchablesMap.get(referredActivity);
if (result != null) {
mSearchablesMap.put(activity, result);
+ }
+ }
+ if (result != null) {
+ final PackageManagerInternal pm =
+ LocalServices.getService(PackageManagerInternal.class);
+ if (pm.canAccessComponent(Binder.getCallingUid(), result.getSearchActivity(),
+ UserHandle.getCallingUserId())) {
return result;
}
+ return null;
}
}
@@ -410,7 +430,7 @@ public class Searchables {
activities =
mPm.queryIntentActivities(intent,
intent.resolveTypeIfNeeded(mContext.getContentResolver()),
- flags, mUserId).getList();
+ flags | PackageManager.MATCH_INSTANT, mUserId).getList();
} catch (RemoteException re) {
// Local call
}
@@ -421,36 +441,82 @@ public class Searchables {
* Returns the list of searchable activities.
*/
public synchronized ArrayList<SearchableInfo> getSearchablesList() {
- ArrayList<SearchableInfo> result = new ArrayList<SearchableInfo>(mSearchablesList);
- return result;
+ return createFilterdSearchableInfoList(mSearchablesList);
}
/**
* Returns a list of the searchable activities that can be included in global search.
*/
public synchronized ArrayList<SearchableInfo> getSearchablesInGlobalSearchList() {
- return new ArrayList<SearchableInfo>(mSearchablesInGlobalSearchList);
+ return createFilterdSearchableInfoList(mSearchablesInGlobalSearchList);
}
/**
* Returns a list of activities that handle the global search intent.
*/
public synchronized ArrayList<ResolveInfo> getGlobalSearchActivities() {
- return new ArrayList<ResolveInfo>(mGlobalSearchActivities);
+ return createFilterdResolveInfoList(mGlobalSearchActivities);
+ }
+
+ private ArrayList<SearchableInfo> createFilterdSearchableInfoList(List<SearchableInfo> list) {
+ if (list == null) {
+ return null;
+ }
+ final ArrayList<SearchableInfo> resultList = new ArrayList<>(list.size());
+ final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getCallingUserId();
+ for (SearchableInfo info : list) {
+ if (pm.canAccessComponent(callingUid, info.getSearchActivity(), callingUserId)) {
+ resultList.add(info);
+ }
+ }
+ return resultList;
+ }
+
+ private ArrayList<ResolveInfo> createFilterdResolveInfoList(List<ResolveInfo> list) {
+ if (list == null) {
+ return null;
+ }
+ final ArrayList<ResolveInfo> resultList = new ArrayList<>(list.size());
+ final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getCallingUserId();
+ for (ResolveInfo info : list) {
+ if (pm.canAccessComponent(
+ callingUid, info.activityInfo.getComponentName(), callingUserId)) {
+ resultList.add(info);
+ }
+ }
+ return resultList;
}
/**
* Gets the name of the global search activity.
*/
public synchronized ComponentName getGlobalSearchActivity() {
- return mCurrentGlobalSearchActivity;
+ final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getCallingUserId();
+ if (mCurrentGlobalSearchActivity != null
+ && pm.canAccessComponent(callingUid, mCurrentGlobalSearchActivity, callingUserId)) {
+ return mCurrentGlobalSearchActivity;
+ }
+ return null;
}
/**
* Gets the name of the web search activity.
*/
public synchronized ComponentName getWebSearchActivity() {
- return mWebSearchActivity;
+ final PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getCallingUserId();
+ if (mWebSearchActivity != null
+ && pm.canAccessComponent(callingUid, mWebSearchActivity, callingUserId)) {
+ return mWebSearchActivity;
+ }
+ return null;
}
void dump(FileDescriptor fd, PrintWriter pw, String[] args) {