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

Commit fabc3ec6 authored by Chris Antol's avatar Chris Antol Committed by Android (Google) Code Review
Browse files

Merge "RESTRICT AUTOMERGE Checks cross user permission before handling intent" into sc-dev

parents 5e94bcbb 7d2552bf
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@ package com.android.settings.applications;

import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;

import android.Manifest;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
@@ -38,6 +40,7 @@ import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
@@ -134,8 +137,13 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
            }
        }
        if (intent != null && intent.hasExtra(Intent.EXTRA_USER_HANDLE)) {
            mUserId = ((UserHandle) intent.getParcelableExtra(
                    Intent.EXTRA_USER_HANDLE)).getIdentifier();
            mUserId = ((UserHandle) intent.getParcelableExtra(Intent.EXTRA_USER_HANDLE))
                    .getIdentifier();
            if (mUserId != UserHandle.myUserId() && !hasInteractAcrossUsersPermission()) {
                Log.w(TAG, "Intent not valid.");
                finish();
                return "";
            }
        } else {
            mUserId = UserHandle.myUserId();
        }
@@ -158,6 +166,32 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
        return mPackageName;
    }

    @VisibleForTesting
    protected boolean hasInteractAcrossUsersPermission() {
        Activity activity = getActivity();
        if (activity == null) {
            return false;
        }
        String callingPackageName = null;
        try {
            callingPackageName = ActivityManager.getService()
                .getLaunchedFromPackage(activity.getActivityToken());
        } catch (Exception e) {
            return false;
        }
        if (TextUtils.isEmpty(callingPackageName)) {
            Log.w(TAG, "Not able to get calling package name for permission check");
            return false;
        }
        if (mPm.checkPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL, callingPackageName)
                != PackageManager.PERMISSION_GRANTED) {
            Log.w(TAG, "Package " + callingPackageName + " does not have required permission "
                    + Manifest.permission.INTERACT_ACROSS_USERS_FULL);
            return false;
        }
        return true;
    }

    protected void setIntentAndFinish(boolean appChanged) {
        Log.i(TAG, "appChanged=" + appChanged);
        Intent intent = new Intent();