am 7c3d595a: am 4b655fd1: am b045331f: Merge "Add GTS test to ensure valid default permission grants - framework" into mnc-dev
* commit '7c3d595a3d2bdded486a01d6b00a435f4881ceed': Add GTS test to ensure valid default permission grants - framework
This commit is contained in:
@@ -43,6 +43,8 @@ interface IUiAutomationConnection {
|
|||||||
void clearWindowAnimationFrameStats();
|
void clearWindowAnimationFrameStats();
|
||||||
WindowAnimationFrameStats getWindowAnimationFrameStats();
|
WindowAnimationFrameStats getWindowAnimationFrameStats();
|
||||||
void executeShellCommand(String command, in ParcelFileDescriptor fd);
|
void executeShellCommand(String command, in ParcelFileDescriptor fd);
|
||||||
|
void grantRuntimePermission(String packageName, String permission, int userId);
|
||||||
|
void revokeRuntimePermission(String packageName, String permission, int userId);
|
||||||
|
|
||||||
// Called from the system process.
|
// Called from the system process.
|
||||||
oneway void shutdown();
|
oneway void shutdown();
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import android.os.Looper;
|
|||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.InputEvent;
|
import android.view.InputEvent;
|
||||||
@@ -845,6 +846,62 @@ public final class UiAutomation {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Grants a runtime permission to a package for a user.
|
||||||
|
* @param packageName The package to which to grant.
|
||||||
|
* @param permission The permission to grant.
|
||||||
|
* @return Whether granting succeeded.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public boolean grantRuntimePermission(String packageName, String permission,
|
||||||
|
UserHandle userHandle) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
throwIfNotConnectedLocked();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.i(LOG_TAG, "Granting runtime permission");
|
||||||
|
}
|
||||||
|
// Calling out without a lock held.
|
||||||
|
mUiAutomationConnection.grantRuntimePermission(packageName,
|
||||||
|
permission, userHandle.getIdentifier());
|
||||||
|
// TODO: The package manager API should return boolean.
|
||||||
|
return true;
|
||||||
|
} catch (RemoteException re) {
|
||||||
|
Log.e(LOG_TAG, "Error granting runtime permission", re);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revokes a runtime permission from a package for a user.
|
||||||
|
* @param packageName The package from which to revoke.
|
||||||
|
* @param permission The permission to revoke.
|
||||||
|
* @return Whether revoking succeeded.
|
||||||
|
*
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public boolean revokeRuntimePermission(String packageName, String permission,
|
||||||
|
UserHandle userHandle) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
throwIfNotConnectedLocked();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.i(LOG_TAG, "Revoking runtime permission");
|
||||||
|
}
|
||||||
|
// Calling out without a lock held.
|
||||||
|
mUiAutomationConnection.revokeRuntimePermission(packageName,
|
||||||
|
permission, userHandle.getIdentifier());
|
||||||
|
// TODO: The package manager API should return boolean.
|
||||||
|
return true;
|
||||||
|
} catch (RemoteException re) {
|
||||||
|
Log.e(LOG_TAG, "Error revoking runtime permission", re);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes a shell command. This method returs a file descriptor that points
|
* Executes a shell command. This method returs a file descriptor that points
|
||||||
* to the standard output stream. The command execution is similar to running
|
* to the standard output stream. The command execution is similar to running
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package android.app;
|
|||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
import android.accessibilityservice.AccessibilityServiceInfo;
|
||||||
import android.accessibilityservice.IAccessibilityServiceClient;
|
import android.accessibilityservice.IAccessibilityServiceClient;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.IPackageManager;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.hardware.input.InputManager;
|
import android.hardware.input.InputManager;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
@@ -60,6 +61,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
|
|||||||
private final IAccessibilityManager mAccessibilityManager = IAccessibilityManager.Stub
|
private final IAccessibilityManager mAccessibilityManager = IAccessibilityManager.Stub
|
||||||
.asInterface(ServiceManager.getService(Service.ACCESSIBILITY_SERVICE));
|
.asInterface(ServiceManager.getService(Service.ACCESSIBILITY_SERVICE));
|
||||||
|
|
||||||
|
private final IPackageManager mPackageManager = IPackageManager.Stub
|
||||||
|
.asInterface(ServiceManager.getService("package"));
|
||||||
|
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
|
|
||||||
private final Binder mToken = new Binder();
|
private final Binder mToken = new Binder();
|
||||||
@@ -226,6 +230,38 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void grantRuntimePermission(String packageName, String permission, int userId)
|
||||||
|
throws RemoteException {
|
||||||
|
synchronized (mLock) {
|
||||||
|
throwIfCalledByNotTrustedUidLocked();
|
||||||
|
throwIfShutdownLocked();
|
||||||
|
throwIfNotConnectedLocked();
|
||||||
|
}
|
||||||
|
final long identity = Binder.clearCallingIdentity();
|
||||||
|
try {
|
||||||
|
mPackageManager.grantRuntimePermission(packageName, permission, userId);
|
||||||
|
} finally {
|
||||||
|
Binder.restoreCallingIdentity(identity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void revokeRuntimePermission(String packageName, String permission, int userId)
|
||||||
|
throws RemoteException {
|
||||||
|
synchronized (mLock) {
|
||||||
|
throwIfCalledByNotTrustedUidLocked();
|
||||||
|
throwIfShutdownLocked();
|
||||||
|
throwIfNotConnectedLocked();
|
||||||
|
}
|
||||||
|
final long identity = Binder.clearCallingIdentity();
|
||||||
|
try {
|
||||||
|
mPackageManager.revokeRuntimePermission(packageName, permission, userId);
|
||||||
|
} finally {
|
||||||
|
Binder.restoreCallingIdentity(identity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void executeShellCommand(final String command, final ParcelFileDescriptor sink)
|
public void executeShellCommand(final String command, final ParcelFileDescriptor sink)
|
||||||
throws RemoteException {
|
throws RemoteException {
|
||||||
|
|||||||
@@ -293,6 +293,29 @@ public class ArrayUtils {
|
|||||||
return cur;
|
return cur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes value from given array if present, providing set-like behavior.
|
||||||
|
*/
|
||||||
|
public static @Nullable String[] removeString(@Nullable String[] cur, String val) {
|
||||||
|
if (cur == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final int N = cur.length;
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
if (Objects.equals(cur[i], val)) {
|
||||||
|
String[] ret = new String[N - 1];
|
||||||
|
if (i > 0) {
|
||||||
|
System.arraycopy(cur, 0, ret, 0, i);
|
||||||
|
}
|
||||||
|
if (i < (N - 1)) {
|
||||||
|
System.arraycopy(cur, i + 1, ret, i, N - i - 1);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return cur;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds value to given array if not already present, providing set-like
|
* Adds value to given array if not already present, providing set-like
|
||||||
* behavior.
|
* behavior.
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ public final class ContentService extends IContentService.Stub {
|
|||||||
mFactoryTest = factoryTest;
|
mFactoryTest = factoryTest;
|
||||||
|
|
||||||
// Let the package manager query for the sync adapters for a given authority
|
// Let the package manager query for the sync adapters for a given authority
|
||||||
// as we grant default permissions to sync adapters for specifix authorities.
|
// as we grant default permissions to sync adapters for specific authorities.
|
||||||
PackageManagerInternal packageManagerInternal = LocalServices.getService(
|
PackageManagerInternal packageManagerInternal = LocalServices.getService(
|
||||||
PackageManagerInternal.class);
|
PackageManagerInternal.class);
|
||||||
packageManagerInternal.setSyncAdapterPackagesprovider(
|
packageManagerInternal.setSyncAdapterPackagesprovider(
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ final class DefaultPermissionGrantPolicy {
|
|||||||
PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
|
PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
|
||||||
"com.android.externalstorage.documents", userId);
|
"com.android.externalstorage.documents", userId);
|
||||||
if (storagePackage != null) {
|
if (storagePackage != null) {
|
||||||
grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, userId);
|
grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, true, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CertInstaller
|
// CertInstaller
|
||||||
@@ -360,7 +360,7 @@ final class DefaultPermissionGrantPolicy {
|
|||||||
PackageParser.Package cbrPackage =
|
PackageParser.Package cbrPackage =
|
||||||
getDefaultSystemHandlerActivityPackageLPr(cbrIntent, userId);
|
getDefaultSystemHandlerActivityPackageLPr(cbrIntent, userId);
|
||||||
if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
|
if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
|
||||||
grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, false, userId);
|
grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calendar
|
// Calendar
|
||||||
|
|||||||
@@ -4154,7 +4154,7 @@ final class Settings {
|
|||||||
pw.print(", COSTS_MONEY");
|
pw.print(", COSTS_MONEY");
|
||||||
}
|
}
|
||||||
if ((perm.info.flags&PermissionInfo.FLAG_HIDDEN) != 0) {
|
if ((perm.info.flags&PermissionInfo.FLAG_HIDDEN) != 0) {
|
||||||
pw.print(", COSTS_HIDDEN");
|
pw.print(", HIDDEN");
|
||||||
}
|
}
|
||||||
if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
|
if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
|
||||||
pw.print(", INSTALLED");
|
pw.print(", INSTALLED");
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class DefaultDialerManager {
|
|||||||
* @hide
|
* @hide
|
||||||
* */
|
* */
|
||||||
public static String getDefaultDialerApplication(Context context) {
|
public static String getDefaultDialerApplication(Context context) {
|
||||||
return getDefaultDialerApplication(context, ActivityManager.getCurrentUser());
|
return getDefaultDialerApplication(context, context.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user