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

Commit c10b8f54 authored by Tetiana Meronyk's avatar Tetiana Meronyk Committed by Android (Google) Code Review
Browse files

Merge "Add event logging for admin status granting and revocation"

parents 6496c1a5 1c801c54
Loading
Loading
Loading
Loading
+73 −5
Original line number Diff line number Diff line
@@ -1481,36 +1481,45 @@ public class UserManagerService extends IUserManager.Stub {
    @Override
    public void setUserAdmin(@UserIdInt int userId) {
        checkManageUserAndAcrossUsersFullPermission("set user admin");

        synchronized (mPackagesLock) {
        final long sessionId = logGrantAdminJourneyBegin(userId);
        UserInfo info;
        synchronized (mPackagesLock) {
            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);
    }

    /**
@@ -5147,12 +5156,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;
@@ -5163,6 +5198,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.");
        }
@@ -5184,6 +5225,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.");
        }
@@ -5193,6 +5240,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);