From 1c801c54906a731a74f6e39d700a25e4355f6e00 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Mon, 16 Jan 2023 13:24:12 +0000 Subject: [PATCH] Add event logging for admin status granting and revocation for testing = 264, 265 Bug: 259578026 Test: make statsd_testdrive; statsd_testdrive Change-Id: I0c0dfd2cac84177553b8155676c27087216f69ce --- .../android/server/pm/UserManagerService.java | 78 +++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 372d0aa5e78f0..c60a650469442 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1480,36 +1480,45 @@ public class UserManagerService extends IUserManager.Stub { @Override public void setUserAdmin(@UserIdInt int userId) { checkManageUserAndAcrossUsersFullPermission("set user admin"); - + final long sessionId = logGrantAdminJourneyBegin(userId); + UserInfo info; synchronized (mPackagesLock) { - UserInfo info; synchronized (mUsersLock) { info = getUserInfoLU(userId); } if (info == null || info.isAdmin()) { // Exit if no user found with that id, or the user is already an Admin. + logUserJourneyError(sessionId, + FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN, + userId); return; } - info.flags ^= UserInfo.FLAG_ADMIN; writeUserLP(getUserDataLU(info.id)); } + logGrantAdminJourneyFinish(sessionId, userId, info.userType, info.flags); } @Override public void revokeUserAdmin(@UserIdInt int userId) { checkManageUserAndAcrossUsersFullPermission("revoke admin privileges"); + final long sessionId = logRevokeAdminJourneyBegin(userId); + UserData user; synchronized (mPackagesLock) { synchronized (mUsersLock) { - UserData user = getUserDataLU(userId); + user = getUserDataLU(userId); if (user == null || !user.info.isAdmin()) { // Exit if no user found with that id, or the user is not an Admin. + logUserJourneyError(sessionId, FrameworkStatsLog + .USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN, + userId); return; } user.info.flags ^= UserInfo.FLAG_ADMIN; writeUserLP(user); } } + logRevokeAdminJourneyFinish(sessionId, userId, user.info.userType, user.info.flags); } /** @@ -5142,12 +5151,38 @@ public class UserManagerService extends IUserManager.Stub { userId, userType, flags, finish); } + private long logGrantAdminJourneyBegin(@UserIdInt int userId) { + return logUserJourneyBegin( + FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN, + userId); + } + + private void logGrantAdminJourneyFinish(long sessionId, @UserIdInt int userId, String userType, + @UserInfoFlag int flags) { + logUserJourneyFinish(sessionId, + FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN, + userId, userType, flags, true); + } + + private long logRevokeAdminJourneyBegin(@UserIdInt int userId) { + return logUserJourneyBegin( + FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN, + userId); + } + + private void logRevokeAdminJourneyFinish(long sessionId, @UserIdInt int userId, String userType, + @UserInfoFlag int flags) { + logUserJourneyFinish(sessionId, + FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN, + userId, userType, flags, true); + } + private void logUserJourneyFinish(long sessionId, int journey, @UserIdInt int userId, String userType, @UserInfoFlag int flags, boolean finish) { // log the journey atom with the user metadata FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED, sessionId, - journey, /* origin_user= */ -1, userId, + journey, /* origin_user= */ getCurrentUserId(), userId, UserManager.getUserTypeForStatsd(userType), flags); int event; @@ -5158,6 +5193,12 @@ public class UserManagerService extends IUserManager.Stub { case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_REMOVE: event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REMOVE_USER; break; + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__GRANT_ADMIN; + break; + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REVOKE_ADMIN; + break; default: throw new IllegalArgumentException("Journey " + journey + " not expected."); } @@ -5179,6 +5220,12 @@ public class UserManagerService extends IUserManager.Stub { case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_REMOVE: event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REMOVE_USER; break; + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__GRANT_ADMIN; + break; + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REVOKE_ADMIN; + break; default: throw new IllegalArgumentException("Journey " + journey + " not expected."); } @@ -5188,6 +5235,27 @@ public class UserManagerService extends IUserManager.Stub { return sessionId; } + private void logUserJourneyError(long sessionId, int journey, @UserIdInt int userId) { + + // log the journey atom with the user metadata + FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED, sessionId, + journey, /* origin_user= */ getCurrentUserId(), userId); + + int event; + switch (journey) { + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__GRANT_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__GRANT_ADMIN; + break; + case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__REVOKE_ADMIN: + event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REVOKE_ADMIN; + break; + default: + throw new IllegalArgumentException("Journey " + journey + " not expected."); + } + FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId, + event, FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__ERROR); + } + /** Register callbacks for statsd pulled atoms. */ private void registerStatsCallbacks() { final StatsManager statsManager = mContext.getSystemService(StatsManager.class);