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

Commit 1c801c54 authored by Tetiana Meronyk's avatar Tetiana Meronyk
Browse files

Add event logging for admin status granting and revocation

<atom #> for testing = 264, 265
Bug: 259578026
Test: make statsd_testdrive; statsd_testdrive <atom #>
Change-Id: I0c0dfd2cac84177553b8155676c27087216f69ce
parent 3140901f
Loading
Loading
Loading
Loading
+73 −5
Original line number Diff line number Diff line
@@ -1480,36 +1480,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);
    }

    /**
@@ -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);