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

Commit 930634c3 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Pull dangerous permission state as atom"

parents dd4b22e6 f21a350d
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -292,6 +292,7 @@ message Atom {
        DebugFailingElapsedClock debug_failing_elapsed_clock = 10047;
        NumBiometricsEnrolled num_faces_enrolled = 10048;
        RoleHolder role_holder = 10049;
        DangerousPermissionState dangerous_permission_state = 10050;
    }

    // DO NOT USE field numbers above 100,000 in AOSP.
@@ -5404,3 +5405,20 @@ message ProcessStartTime {
    optional string hosting_name = 9;
}

/**
 * State of a dangerous permission requested by a package
 */
message DangerousPermissionState {
    // Name of the permission
    optional string permission_name = 1;

    // Uid of the package
    optional int32 uid = 2 [(is_uid) = true];

    // Package requesting the permission
    optional string package_name = 3;

    // If the permission is granted to the uid
    optional bool is_granted = 4;
}
+3 −0
Original line number Diff line number Diff line
@@ -223,6 +223,9 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = {
        // RoleHolder.
        {android::util::ROLE_HOLDER,
         {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}},
        // PermissionState.
        {android::util::DANGEROUS_PERMISSION_STATE,
         {.puller = new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE)}},
};

StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) {
+66 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
package com.android.server.stats;

import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
import static android.os.Process.getPidsForCommands;
import static android.os.Process.getUidForPid;

@@ -41,6 +43,7 @@ import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.pm.UserInfo;
import android.hardware.fingerprint.FingerprintManager;
import android.net.ConnectivityManager;
@@ -1793,6 +1796,65 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
        pulledData.add(e);
    }

    private void pullDangerousPermissionState(long elapsedNanos, final long wallClockNanos,
            List<StatsLogEventWrapper> pulledData) {
        long token = Binder.clearCallingIdentity();
        try {
            PackageManager pm = mContext.getPackageManager();

            List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();

            int numUsers = users.size();
            for (int userNum = 0; userNum < numUsers; userNum++) {
                UserHandle user = users.get(userNum).getUserHandle();

                List<PackageInfo> pkgs = pm.getInstalledPackagesAsUser(
                        PackageManager.GET_PERMISSIONS, user.getIdentifier());

                int numPkgs = pkgs.size();
                for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
                    PackageInfo pkg = pkgs.get(pkgNum);

                    if (pkg.requestedPermissions == null) {
                        continue;
                    }

                    int numPerms = pkg.requestedPermissions.length;
                    for (int permNum  = 0; permNum < numPerms; permNum++) {
                        String permName = pkg.requestedPermissions[permNum];

                        PermissionInfo permissionInfo;
                        try {
                            permissionInfo = pm.getPermissionInfo(permName, 0);
                        } catch (PackageManager.NameNotFoundException ignored) {
                            continue;
                        }

                        if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) {
                            continue;
                        }

                        StatsLogEventWrapper e = new StatsLogEventWrapper(
                                StatsLog.DANGEROUS_PERMISSION_STATE, elapsedNanos, wallClockNanos);

                        e.writeString(permName);
                        e.writeInt(pkg.applicationInfo.uid);
                        e.writeString(pkg.packageName);

                        e.writeBoolean((pkg.requestedPermissionsFlags[permNum]
                                & REQUESTED_PERMISSION_GRANTED) != 0);

                        pulledData.add(e);
                    }
                }
            }
        } catch (Throwable t) {
            Log.e(TAG, "Could not read permissions", t);
        } finally {
            Binder.restoreCallingIdentity(token);
        }
    }

    /**
     * Add a RoleHolder atom for each package that holds a role.
     *
@@ -2025,6 +2087,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub {
                pullRoleHolders(elapsedNanos, wallClockNanos, ret);
                break;
            }
            case StatsLog.DANGEROUS_PERMISSION_STATE: {
                pullDangerousPermissionState(elapsedNanos, wallClockNanos, ret);
                break;
            }
            default:
                Slog.w(TAG, "No such tagId data as " + tagId);
                return null;