am b045331f: Merge "Add GTS test to ensure valid default permission grants - framework" into mnc-dev

* commit 'b045331fcb033507072bfd7899a147bb2be7176e':
  Add GTS test to ensure valid default permission grants - framework
This commit is contained in:
Svetoslav Ganov
2015-08-14 15:13:38 +00:00
committed by Android Git Automerger
8 changed files with 123 additions and 5 deletions

View File

@@ -43,6 +43,8 @@ interface IUiAutomationConnection {
void clearWindowAnimationFrameStats();
WindowAnimationFrameStats getWindowAnimationFrameStats();
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.
oneway void shutdown();

View File

@@ -30,6 +30,7 @@ import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.util.Log;
import android.view.Display;
import android.view.InputEvent;
@@ -845,6 +846,62 @@ public final class UiAutomation {
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
* to the standard output stream. The command execution is similar to running

View File

@@ -19,6 +19,7 @@ package android.app;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.graphics.Bitmap;
import android.hardware.input.InputManager;
import android.os.Binder;
@@ -60,6 +61,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
private final IAccessibilityManager mAccessibilityManager = IAccessibilityManager.Stub
.asInterface(ServiceManager.getService(Service.ACCESSIBILITY_SERVICE));
private final IPackageManager mPackageManager = IPackageManager.Stub
.asInterface(ServiceManager.getService("package"));
private final Object mLock = new Object();
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
public void executeShellCommand(final String command, final ParcelFileDescriptor sink)
throws RemoteException {

View File

@@ -293,6 +293,29 @@ public class ArrayUtils {
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
* behavior.

View File

@@ -157,7 +157,7 @@ public final class ContentService extends IContentService.Stub {
mFactoryTest = factoryTest;
// 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.class);
packageManagerInternal.setSyncAdapterPackagesprovider(

View File

@@ -296,7 +296,7 @@ final class DefaultPermissionGrantPolicy {
PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
"com.android.externalstorage.documents", userId);
if (storagePackage != null) {
grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, userId);
grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, true, userId);
}
// CertInstaller
@@ -360,7 +360,7 @@ final class DefaultPermissionGrantPolicy {
PackageParser.Package cbrPackage =
getDefaultSystemHandlerActivityPackageLPr(cbrIntent, userId);
if (cbrPackage != null && doesPackageSupportRuntimePermissions(cbrPackage)) {
grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, false, userId);
grantRuntimePermissionsLPw(cbrPackage, SMS_PERMISSIONS, userId);
}
// Calendar

View File

@@ -4154,7 +4154,7 @@ final class Settings {
pw.print(", COSTS_MONEY");
}
if ((perm.info.flags&PermissionInfo.FLAG_HIDDEN) != 0) {
pw.print(", COSTS_HIDDEN");
pw.print(", HIDDEN");
}
if ((perm.info.flags&PermissionInfo.FLAG_INSTALLED) != 0) {
pw.print(", INSTALLED");

View File

@@ -97,7 +97,7 @@ public class DefaultDialerManager {
* @hide
* */
public static String getDefaultDialerApplication(Context context) {
return getDefaultDialerApplication(context, ActivityManager.getCurrentUser());
return getDefaultDialerApplication(context, context.getUserId());
}
/**