Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b9dd36b authored by Philip P. Moltmann's avatar Philip P. Moltmann Committed by Android (Google) Code Review
Browse files

Merge "Revert "Check cross-user interactions for permissions and app-op...""

parents a5c0618a 7fa1bd7f
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -52,23 +52,14 @@ public abstract class ActivityManagerInternal {
     * if in the same profile group.
     * Otherwise, {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} is required.
     */
    public static final int ALLOW_NON_FULL_IN_PROFILE_OR_FULL = 1;
    public static final int ALLOW_NON_FULL_IN_PROFILE = 1;
    public static final int ALLOW_FULL_ONLY = 2;
    /**
     * Allows access to a caller with {@link android.Manifest.permission#INTERACT_ACROSS_PROFILES}
     * or {@link android.Manifest.permission#INTERACT_ACROSS_USERS} if in the same profile group.
     * Otherwise, {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} is required.
     */
    public static final int ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL = 3;
    /**
     * Requires {@link android.Manifest.permission#INTERACT_ACROSS_PROFILES},
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS}, or
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} if in same profile group,
     * otherwise {@link android.Manifest.permission#INTERACT_ACROSS_USERS} or
     * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL}. (so this is an extension
     * to {@link #ALLOW_NON_FULL})
     */
    public static final int ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL = 4;
    public static final int ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE = 3;

    /**
     * Verify that calling app has access to the given provider.
+3 −3
Original line number Diff line number Diff line
@@ -2559,12 +2559,12 @@ public final class ActiveServices {

    private int getAllowMode(Intent service, @Nullable String callingPackage) {
        if (callingPackage == null || service.getComponent() == null) {
            return ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE_OR_FULL;
            return ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
        }
        if (callingPackage.equals(service.getComponent().getPackageName())) {
            return ActivityManagerInternal.ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL;
            return ActivityManagerInternal.ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE;
        } else {
            return ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE_OR_FULL;
            return ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
        }
    }

+8 −14
Original line number Diff line number Diff line
@@ -23,11 +23,10 @@ import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM;
import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
import static android.app.ActivityManager.USER_OP_IS_CURRENT;
import static android.app.ActivityManager.USER_OP_SUCCESS;
import static android.app.ActivityManagerInternal.ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL;
import static android.app.ActivityManagerInternal.ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL;
import static android.app.ActivityManagerInternal.ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE;
import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE_OR_FULL;
import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE;
import static android.os.Process.SHELL_UID;
import static android.os.Process.SYSTEM_UID;

@@ -1910,12 +1909,11 @@ class UserController implements Handler.Callback {
                    callingUid, -1, true) != PackageManager.PERMISSION_GRANTED) {
                // If the caller does not have either permission, they are always doomed.
                allow = false;
            } else if (allowMode == ALLOW_NON_FULL
                    || allowMode == ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL) {
            } else if (allowMode == ALLOW_NON_FULL) {
                // We are blanket allowing non-full access, you lucky caller!
                allow = true;
            } else if (allowMode == ALLOW_NON_FULL_IN_PROFILE_OR_FULL
                        || allowMode == ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL) {
            } else if (allowMode == ALLOW_NON_FULL_IN_PROFILE
                        || allowMode == ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) {
                // We may or may not allow this depending on whether the two users are
                // in the same profile.
                allow = isSameProfileGroup;
@@ -1942,15 +1940,12 @@ class UserController implements Handler.Callback {
                    builder.append("; this requires ");
                    builder.append(INTERACT_ACROSS_USERS_FULL);
                    if (allowMode != ALLOW_FULL_ONLY) {
                        if (allowMode == ALLOW_NON_FULL
                                || allowMode == ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL
                                || isSameProfileGroup) {
                        if (allowMode == ALLOW_NON_FULL || isSameProfileGroup) {
                            builder.append(" or ");
                            builder.append(INTERACT_ACROSS_USERS);
                        }
                        if (isSameProfileGroup
                                && (allowMode == ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL
                                || allowMode == ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL)) {
                                && allowMode == ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) {
                            builder.append(" or ");
                            builder.append(INTERACT_ACROSS_PROFILES);
                        }
@@ -1977,8 +1972,7 @@ class UserController implements Handler.Callback {
    private boolean canInteractWithAcrossProfilesPermission(
            int allowMode, boolean isSameProfileGroup, int callingPid, int callingUid,
            String callingPackage) {
        if (allowMode != ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_FULL
                && allowMode != ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL) {
        if (allowMode != ALLOW_ALL_PROFILE_PERMISSIONS_IN_PROFILE) {
            return false;
        }
        if (!isSameProfileGroup) {
+8 −65
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.server.appop;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
import static android.app.ActivityManagerInternal.ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL;
import static android.app.AppOpsManager.CALL_BACK_ON_SWITCHED_OP;
import static android.app.AppOpsManager.FILTER_BY_ATTRIBUTION_TAG;
import static android.app.AppOpsManager.FILTER_BY_OP_NAMES;
@@ -129,7 +128,6 @@ import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.EventLog;
import android.util.KeyValueListParser;
import android.util.LongSparseArray;
import android.util.Pair;
@@ -163,7 +161,6 @@ import com.android.server.LocalServices;
import com.android.server.LockGuard;
import com.android.server.SystemServerInitThreadPool;
import com.android.server.SystemServiceManager;
import com.android.server.am.ActivityManagerService;
import com.android.server.pm.PackageList;
import com.android.server.pm.parsing.pkg.AndroidPackage;

@@ -2200,11 +2197,8 @@ public class AppOpsService extends IAppOpsService.Stub {
                    + " by uid " + Binder.getCallingUid());
        }

        int userId = UserHandle.getUserId(uid);

        enforceManageAppOpsModes(Binder.getCallingPid(), Binder.getCallingUid(), uid);
        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        code = AppOpsManager.opToSwitch(code);

        if (permissionPolicyCallback == null) {
@@ -2449,12 +2443,8 @@ public class AppOpsService extends IAppOpsService.Stub {
    private void setMode(int code, int uid, @NonNull String packageName, int mode,
            @Nullable IAppOpsCallback permissionPolicyCallback) {
        enforceManageAppOpsModes(Binder.getCallingPid(), Binder.getCallingUid(), uid);

        int userId = UserHandle.getUserId(uid);

        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        ArraySet<ModeCallback> repCbs = null;
        code = AppOpsManager.opToSwitch(code);
@@ -2867,11 +2857,8 @@ public class AppOpsService extends IAppOpsService.Stub {

    private int checkOperationImpl(int code, int uid, String packageName,
                boolean raw) {
        int userId = UserHandle.getUserId(uid);

        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        String resolvedPackageName = resolvePackageName(uid, packageName);
        if (resolvedPackageName == null) {
@@ -2990,15 +2977,10 @@ public class AppOpsService extends IAppOpsService.Stub {
            String proxiedAttributionTag, int proxyUid, String proxyPackageName,
            String proxyAttributionTag, boolean shouldCollectAsyncNotedOp, String message,
            boolean shouldCollectMessage) {
        int proxiedUserId = UserHandle.getUserId(proxiedUid);
        int proxyUserId = UserHandle.getUserId(proxyUid);

        verifyIncomingUid(proxyUid);
        verifyIncomingOp(code);
        verifyIncomingUser(proxiedUserId);
        verifyIncomingUser(proxyUserId);
        verifyIncomingPackage(proxiedPackageName, proxiedUserId);
        verifyIncomingPackage(proxyPackageName, proxyUserId);
        verifyIncomingPackage(proxiedPackageName, UserHandle.getUserId(proxiedUid));
        verifyIncomingPackage(proxyPackageName, UserHandle.getUserId(proxyUid));

        String resolveProxyPackageName = resolvePackageName(proxyUid, proxyPackageName);
        if (resolveProxyPackageName == null) {
@@ -3048,12 +3030,9 @@ public class AppOpsService extends IAppOpsService.Stub {
    private int noteOperationImpl(int code, int uid, @Nullable String packageName,
            @Nullable String attributionTag, boolean shouldCollectAsyncNotedOp,
            @Nullable String message, boolean shouldCollectMessage) {
        int userId = UserHandle.getUserId(uid);

        verifyIncomingUid(uid);
        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        String resolvedPackageName = resolvePackageName(uid, packageName);
        if (resolvedPackageName == null) {
@@ -3430,12 +3409,9 @@ public class AppOpsService extends IAppOpsService.Stub {
    public int startOperation(IBinder clientId, int code, int uid, String packageName,
            String attributionTag, boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp,
            String message, boolean shouldCollectMessage) {
        int userId = UserHandle.getUserId(uid);

        verifyIncomingUid(uid);
        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        String resolvedPackageName = resolvePackageName(uid, packageName);
        if (resolvedPackageName == null) {
@@ -3515,12 +3491,9 @@ public class AppOpsService extends IAppOpsService.Stub {
    @Override
    public void finishOperation(IBinder clientId, int code, int uid, String packageName,
            String attributionTag) {
        int userId = UserHandle.getUserId(uid);

        verifyIncomingUid(uid);
        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        String resolvedPackageName = resolvePackageName(uid, packageName);
        if (resolvedPackageName == null) {
@@ -3749,33 +3722,6 @@ public class AppOpsService extends IAppOpsService.Stub {
        }
    }

    private void verifyIncomingUser(@UserIdInt int userId) {
        int callingUid = Binder.getCallingUid();
        int callingUserId = UserHandle.getUserId(callingUid);
        int callingPid = Binder.getCallingPid();

        if (callingUserId != userId) {
            // Prevent endless loop between when checking appops inside of handleIncomingUser
            if (Binder.getCallingPid() == ActivityManagerService.MY_PID) {
                return;
            }
            long token = Binder.clearCallingIdentity();
            try {
                try {
                    LocalServices.getService(ActivityManagerInternal.class).handleIncomingUser(
                            callingPid, callingUid, userId, /* allowAll */ false,
                            ALLOW_ACROSS_PROFILES_IN_PROFILE_OR_NON_FULL, "appop operation", null);
                } catch (Exception e) {
                    EventLog.writeEvent(0x534e4554, "153996875", "appop", userId);

                    throw e;
                }
            } finally {
                Binder.restoreCallingIdentity(token);
            }
        }
    }

    private @Nullable UidState getUidStateLocked(int uid, boolean edit) {
        UidState uidState = mUidStates.get(uid);
        if (uidState == null) {
@@ -5855,11 +5801,8 @@ public class AppOpsService extends IAppOpsService.Stub {
                return false;
            }
        }
        int userId = UserHandle.getUserId(uid);

        verifyIncomingOp(code);
        verifyIncomingUser(userId);
        verifyIncomingPackage(packageName, userId);
        verifyIncomingPackage(packageName, UserHandle.getUserId(uid));

        final String resolvedPackageName = resolvePackageName(uid, packageName);
        if (resolvedPackageName == null) {
+0 −3
Original line number Diff line number Diff line
@@ -6,9 +6,6 @@
        {
            "name": "CtsAppOps2TestCases"
        },
        {
            "name": "CtsAppOpHostTestCases"
        },
        {
            "name": "FrameworksServicesTests",
            "options": [
Loading