summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2018-11-10 01:10:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-11-10 01:10:31 +0000
commitd641d64ab4613feefec9bb8e6fb6846f7b43f97e (patch)
treea73d78b3366056b9e86ace1e222d9de7ce745250 /core/java
parent1045456b954246d1d13d2516025cc68c0c528dd2 (diff)
parent5e86959d0457b2ac37cd33f92695d8f086b2b281 (diff)
Merge "Allow adopting a subset of shell permissions"
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/IActivityManager.aidl2
-rw-r--r--core/java/android/app/IUiAutomationConnection.aidl2
-rw-r--r--core/java/android/app/UiAutomation.java43
-rw-r--r--core/java/android/app/UiAutomationConnection.java7
4 files changed, 43 insertions, 11 deletions
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index e7597620e138..e2312a539ae4 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -475,7 +475,7 @@ interface IActivityManager {
* instrumentation at a time. An active instrumentation is one running and
* started from the shell.
*/
- void startDelegateShellPermissionIdentity(int uid);
+ void startDelegateShellPermissionIdentity(int uid, in String[] permissions);
/**
* Method for the shell UID to stop deletating its permission identity to an
diff --git a/core/java/android/app/IUiAutomationConnection.aidl b/core/java/android/app/IUiAutomationConnection.aidl
index ac4bf7d9c2c5..96da72a1b517 100644
--- a/core/java/android/app/IUiAutomationConnection.aidl
+++ b/core/java/android/app/IUiAutomationConnection.aidl
@@ -47,7 +47,7 @@ interface IUiAutomationConnection {
in ParcelFileDescriptor source);
void grantRuntimePermission(String packageName, String permission, int userId);
void revokeRuntimePermission(String packageName, String permission, int userId);
- void adoptShellPermissionIdentity(int uid);
+ void adoptShellPermissionIdentity(int uid, in String[] permissions);
void dropShellPermissionIdentity();
// Called from the system process.
oneway void shutdown();
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 5a25f5aed161..3f9627ed807c 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -354,12 +354,17 @@ public final class UiAutomation {
}
/**
- * Adopt the permission identity of the shell UID. This allows you to call APIs protected
- * permissions which normal apps cannot hold but are granted to the shell UID. If you
- * already adopted the shell permission identity this method would be a no-op.
- * Note that your permission state becomes that of the shell UID and it is not a
- * combination of your and the shell UID permissions.
+ * Adopt the permission identity of the shell UID for all permissions. This allows
+ * you to call APIs protected permissions which normal apps cannot hold but are
+ * granted to the shell UID. If you already adopted all shell permissions by calling
+ * this method or {@link #adoptShellPermissionIdentity(String...)} a subsequent call
+ * would be a no-op. Note that your permission state becomes that of the shell UID
+ * and it is not a combination of your and the shell UID permissions.
+ * <p>
+ * <strong>Note:<strong/> Calling this method adopts all shell permissions and overrides
+ * any subset of adopted permissions via {@link #adoptShellPermissionIdentity(String...)}.
*
+ * @see #adoptShellPermissionIdentity(String...)
* @see #dropShellPermissionIdentity()
*/
public void adoptShellPermissionIdentity() {
@@ -368,7 +373,33 @@ public final class UiAutomation {
}
try {
// Calling out without a lock held.
- mUiAutomationConnection.adoptShellPermissionIdentity(Process.myUid());
+ mUiAutomationConnection.adoptShellPermissionIdentity(Process.myUid(), null);
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error executing adopting shell permission identity!", re);
+ }
+ }
+
+ /**
+ * Adopt the permission identity of the shell UID only for the provided permissions.
+ * This allows you to call APIs protected permissions which normal apps cannot hold
+ * but are granted to the shell UID. If you already adopted the specified shell
+ * permissions by calling this method or {@link #adoptShellPermissionIdentity()} a
+ * subsequent call would be a no-op. Note that your permission state becomes that of the
+ * shell UID and it is not a combination of your and the shell UID permissions.
+ * <p>
+ * <strong>Note:<strong/> Calling this method adopts only the specified shell permissions
+ * and overrides all adopted permissions via {@link #adoptShellPermissionIdentity()}.
+ *
+ * @see #adoptShellPermissionIdentity()
+ * @see #dropShellPermissionIdentity()
+ */
+ public void adoptShellPermissionIdentity(String... permissions) {
+ synchronized (mLock) {
+ throwIfNotConnectedLocked();
+ }
+ try {
+ // Calling out without a lock held.
+ mUiAutomationConnection.adoptShellPermissionIdentity(Process.myUid(), permissions);
} catch (RemoteException re) {
Log.e(LOG_TAG, "Error executing adopting shell permission identity!", re);
}
diff --git a/core/java/android/app/UiAutomationConnection.java b/core/java/android/app/UiAutomationConnection.java
index b406d9e30a53..dc2f9838785c 100644
--- a/core/java/android/app/UiAutomationConnection.java
+++ b/core/java/android/app/UiAutomationConnection.java
@@ -18,7 +18,7 @@ package android.app;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
-import android.annotation.UnsupportedAppUsage;
+import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.graphics.Bitmap;
@@ -279,7 +279,8 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
}
@Override
- public void adoptShellPermissionIdentity(int uid) throws RemoteException {
+ public void adoptShellPermissionIdentity(int uid, @Nullable String[] permissions)
+ throws RemoteException {
synchronized (mLock) {
throwIfCalledByNotTrustedUidLocked();
throwIfShutdownLocked();
@@ -287,7 +288,7 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
}
final long identity = Binder.clearCallingIdentity();
try {
- mActivityManager.startDelegateShellPermissionIdentity(uid);
+ mActivityManager.startDelegateShellPermissionIdentity(uid, permissions);
} finally {
Binder.restoreCallingIdentity(identity);
}