summaryrefslogtreecommitdiffstats
path: root/core/java/android/os
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/os')
-rw-r--r--core/java/android/os/Binder.java31
-rw-r--r--core/java/android/os/UserId.java90
2 files changed, 120 insertions, 1 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 24569fa..577fc43 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -49,6 +49,7 @@ public class Binder implements IBinder {
private static final boolean FIND_POTENTIAL_LEAKS = false;
private static final String TAG = "Binder";
+ /* mObject is used by native code, do not remove or rename */
private int mObject;
private IInterface mOwner;
private String mDescriptor;
@@ -70,7 +71,35 @@ public class Binder implements IBinder {
* incoming transaction, then its own uid is returned.
*/
public static final native int getCallingUid();
-
+
+ /**
+ * Return the original ID of the user assigned to the process that sent you the current
+ * transaction that is being processed. This uid can be used with higher-level system services
+ * to determine its identity and check permissions. If the current thread is not currently
+ * executing an incoming transaction, then its own uid is returned.
+ * <p/>
+ * This value cannot be reset by calls to {@link #clearCallingIdentity()}.
+ * @hide
+ */
+ public static final int getOrigCallingUid() {
+ if (UserId.MU_ENABLED) {
+ return getOrigCallingUidNative();
+ } else {
+ return getCallingUid();
+ }
+ }
+
+ private static final native int getOrigCallingUidNative();
+
+ /**
+ * Utility function to return the user id of the calling process.
+ * @return userId of the calling process, extracted from the callingUid
+ * @hide
+ */
+ public static final int getOrigCallingUser() {
+ return UserId.getUserId(getOrigCallingUid());
+ }
+
/**
* Reset the identity of the incoming IPC on the current thread. This can
* be useful if, while handling an incoming call, you will be calling
diff --git a/core/java/android/os/UserId.java b/core/java/android/os/UserId.java
new file mode 100644
index 0000000..4124d51
--- /dev/null
+++ b/core/java/android/os/UserId.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+/**
+ * @hide
+ */
+public final class UserId {
+ /**
+ * Range of IDs allocated for a user.
+ *
+ * @hide
+ */
+ public static final int PER_USER_RANGE = 100000;
+
+ public static final int USER_ALL = -1;
+
+ /**
+ * Enable multi-user related side effects. Set this to false if there are problems with single
+ * user usecases.
+ * */
+ public static final boolean MU_ENABLED = true;
+
+ /**
+ * Checks to see if the user id is the same for the two uids, i.e., they belong to the same
+ * user.
+ * @hide
+ */
+ public static final boolean isSameUser(int uid1, int uid2) {
+ return getUserId(uid1) == getUserId(uid2);
+ }
+
+ /**
+ * Checks to see if both uids are referring to the same app id, ignoring the user id part of the
+ * uids.
+ * @param uid1 uid to compare
+ * @param uid2 other uid to compare
+ * @return whether the appId is the same for both uids
+ * @hide
+ */
+ public static final boolean isSameApp(int uid1, int uid2) {
+ return getAppId(uid1) == getAppId(uid2);
+ }
+
+ /**
+ * Returns the user id for a given uid.
+ * @hide
+ */
+ public static final int getUserId(int uid) {
+ if (MU_ENABLED) {
+ return uid / PER_USER_RANGE;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Returns the uid that is composed from the userId and the appId.
+ * @hide
+ */
+ public static final int getUid(int userId, int appId) {
+ if (MU_ENABLED) {
+ return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
+ } else {
+ return appId;
+ }
+ }
+
+ /**
+ * Returns the app id (or base uid) for a given uid, stripping out the user id from it.
+ * @hide
+ */
+ public static final int getAppId(int uid) {
+ return uid % PER_USER_RANGE;
+ }
+}