Merge "Pull dangerous permission state as atom"

This commit is contained in:
TreeHugger Robot
2019-02-01 23:58:34 +00:00
committed by Android (Google) Code Review
3 changed files with 87 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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;