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

Commit aa1e6bfe authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "TEMP: Repair user sensitive read phone flags" into rvc-dev am: d5d8f6b6 am: d458d722

Change-Id: I97c2b8ea2a8579d88bd77ab45f7e8958df0bd545
parents 3002b572 d458d722
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -16,14 +16,17 @@

package com.android.server.policy;

import static android.Manifest.permission.READ_PHONE_STATE;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_FOREGROUND;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.app.AppOpsManager.OP_NONE;
import static android.content.pm.PackageManager.FLAG_PERMISSION_APPLY_RESTRICTION;
import static android.content.pm.PackageManager.FLAG_PERMISSION_AUTO_REVOKED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static android.content.pm.PackageManager.MATCH_ALL;

import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -42,6 +45,7 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManagerInternal.PackageListObserver;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -53,6 +57,7 @@ import android.provider.Telephony;
import android.telecom.TelecomManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.LongSparseLongArray;
import android.util.Pair;
import android.util.Slog;
@@ -318,12 +323,52 @@ public final class PermissionPolicyService extends SystemService {
        // Force synchronization as permissions might have changed
        synchronizePermissionsAndAppOpsForUser(userId);

        restoreReadPhoneStatePermissions();

        // Tell observers we are initialized for this user.
        if (callback != null) {
            callback.onInitialized(userId);
        }
    }

    /**
     * Ensure READ_PHONE_STATE user sensitive flags are assigned properly
     * TODO ntmyren: Remove once propagated, and state is repaired
     */
    private void restoreReadPhoneStatePermissions() {
        PermissionControllerManager manager = new PermissionControllerManager(this.getContext(),
                Handler.getMain());
        PackageManager pm = getContext().getPackageManager();
        List<PackageInfo> packageInfos = pm.getInstalledPackages(MATCH_ALL | GET_PERMISSIONS);
        for (int i = packageInfos.size() - 1; i >= 0; i--) {
            PackageInfo pI = packageInfos.get(i);
            if (pI.requestedPermissions == null) {
                continue;
            }

            boolean hasReadPhoneState = false;
            for (int j = pI.requestedPermissions.length - 1; j >= 0; j--) {
                if (pI.requestedPermissions[j].equals(READ_PHONE_STATE)) {
                    hasReadPhoneState = true;
                }
            }
            if (!hasReadPhoneState) {
                continue;
            }

            Log.i(LOG_TAG, "Updating read phone state for " + pI.packageName + " "
                    + pI.applicationInfo.uid);
            manager.updateUserSensitiveForApp(pI.applicationInfo.uid);

            UserHandle user = UserHandle.getUserHandleForUid(pI.applicationInfo.uid);
            int permFlags = pm.getPermissionFlags(READ_PHONE_STATE, pI.packageName, user);
            if ((permFlags & FLAG_PERMISSION_AUTO_REVOKED) != 0) {
                pm.updatePermissionFlags(READ_PHONE_STATE, pI.packageName,
                        FLAG_PERMISSION_AUTO_REVOKED, 0, user);
            }
        }
    }

    @Override
    public void onStopUser(@UserIdInt int userId) {
        if (DEBUG) Slog.i(LOG_TAG, "onStopUser(" + userId + ")");