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

Commit 08e9422e authored by Daniel Chapin's avatar Daniel Chapin Committed by Android (Google) Code Review
Browse files

Revert "Refactor Bug report flow to work for all ADMIN users"

This reverts commit 4fe5d002.

Reason for revert: DroidFood blocking bug: 262355071

Change-Id: I74ecd73b533d39f4737849105193ae731e2a782a
parent 4fe5d002
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -455,7 +455,8 @@ public class BugreportProgressService extends Service {
        intent.putExtra(DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_HASH, bugreportHash);
        intent.putExtra(DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_NONCE, nonce);
        intent.putExtra(EXTRA_BUGREPORT, bugreportFileName);
        context.sendBroadcast(intent, android.Manifest.permission.DUMP);
        context.sendBroadcastAsUser(intent, UserHandle.SYSTEM,
                android.Manifest.permission.DUMP);
    }

    /**
+1 −2
Original line number Diff line number Diff line
@@ -7391,11 +7391,10 @@ public class ActivityManagerService extends IActivityManager.Stub
        if (shareDescription != null) {
            triggerShellBugreport.putExtra(EXTRA_DESCRIPTION, shareDescription);
        }
        UserHandle callingUser = Binder.getCallingUserHandle();
        final long identity = Binder.clearCallingIdentity();
        try {
            // Send broadcast to shell to trigger bugreport using Bugreport API
            mContext.sendBroadcastAsUser(triggerShellBugreport, callingUser);
            mContext.sendBroadcastAsUser(triggerShellBugreport, UserHandle.SYSTEM);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
+22 −14
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.IncidentManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;

import com.android.internal.util.DumpUtils;
@@ -127,21 +128,21 @@ public class IncidentCompanionService extends SystemService {
            try {
                final Context context = getContext();

                // Get the current admin user. Only they can do incident reports.
                final int currentAdminUser = getCurrentUserIfAdmin();
                if (currentAdminUser == UserHandle.USER_NULL) {
                final int primaryUser = getAndValidateUser(context);
                if (primaryUser == UserHandle.USER_NULL) {
                    return;
                }

                final Intent intent = new Intent(Intent.ACTION_INCIDENT_REPORT_READY);
                intent.setComponent(new ComponentName(pkg, cls));

                Log.d(TAG, "sendReportReadyBroadcast sending currentUser=" + currentAdminUser
                        + " userHandle=" + UserHandle.of(currentAdminUser)
                Log.d(TAG, "sendReportReadyBroadcast sending primaryUser=" + primaryUser
                        + " userHandle=" + UserHandle.getUserHandleForUid(primaryUser)
                        + " intent=" + intent);

                // Send it to the primary user.  Only they can do incident reports.
                context.sendBroadcastAsUserMultiplePermissions(intent,
                        UserHandle.of(currentAdminUser),
                        UserHandle.getUserHandleForUid(primaryUser),
                        DUMP_AND_USAGE_STATS_PERMISSIONS);
            } finally {
                Binder.restoreCallingIdentity(ident);
@@ -413,10 +414,10 @@ public class IncidentCompanionService extends SystemService {
    }

    /**
     * Check whether the current user is an admin user, and return the user id if they are.
     * Check whether the current user is the primary user, and return the user id if they are.
     * Returns UserHandle.USER_NULL if not valid.
     */
    public static int getCurrentUserIfAdmin() {
    public static int getAndValidateUser(Context context) {
        // Current user
        UserInfo currentUser;
        try {
@@ -426,21 +427,28 @@ public class IncidentCompanionService extends SystemService {
            throw new RuntimeException(ex);
        }

        // Primary user
        final UserManager um = UserManager.get(context);
        final UserInfo primaryUser = um.getPrimaryUser();

        // Check that we're using the right user.
        if (currentUser == null) {
            Log.w(TAG, "No current user.  Nobody to approve the report."
                    + " The report will be denied.");
            return UserHandle.USER_NULL;
        }

        if (!currentUser.isAdmin()) {
            Log.w(TAG, "Only an admin user running in foreground can approve "
                    + "bugreports, but the current foreground user is not an admin user. "
        if (primaryUser == null) {
            Log.w(TAG, "No primary user.  Nobody to approve the report."
                    + " The report will be denied.");
            return UserHandle.USER_NULL;
        }
        if (primaryUser.id != currentUser.id) {
            Log.w(TAG, "Only the primary user can approve bugreports, but they are not"
                    + " the current user. The report will be denied.");
            return UserHandle.USER_NULL;
        }

        return currentUser.id;
        return primaryUser.id;
    }
}
+23 −28
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.server.incident;

import android.annotation.UserIdInt;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
import android.content.ComponentName;
@@ -273,19 +272,15 @@ class PendingReports {
            return;
        }

        // Find the current user of the device and check if they are an admin.
        final int currentAdminUser = getCurrentUserIfAdmin();

        // Deny the report if the current admin user is null
        // or not the user who requested the report.
        if (currentAdminUser == UserHandle.USER_NULL
                || currentAdminUser != UserHandle.getUserId(callingUid)) {
        // Find the primary user of this device.
        final int primaryUser = getAndValidateUser();
        if (primaryUser == UserHandle.USER_NULL) {
            denyReportBeforeAddingRec(listener, callingPackage);
            return;
        }

        // Find the approver app (hint: it's PermissionController).
        final ComponentName receiver = getApproverComponent(currentAdminUser);
        final ComponentName receiver = getApproverComponent(primaryUser);
        if (receiver == null) {
            // We couldn't find an approver... so deny the request here and now, before we
            // do anything else.
@@ -303,26 +298,26 @@ class PendingReports {
        try {
            listener.asBinder().linkToDeath(() -> {
                Log.i(TAG, "Got death notification listener=" + listener);
                cancelReportImpl(listener, receiver, currentAdminUser);
                cancelReportImpl(listener, receiver, primaryUser);
            }, 0);
        } catch (RemoteException ex) {
            Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri());
            // First, remove from our list.
            cancelReportImpl(listener, receiver, currentAdminUser);
            cancelReportImpl(listener, receiver, primaryUser);
        }

        // Go tell Permission controller to start asking the user.
        sendBroadcast(receiver, currentAdminUser);
        sendBroadcast(receiver, primaryUser);
    }

    /**
     * Cancel a pending report request (because of an explicit call to cancel)
     */
    private void cancelReportImpl(IIncidentAuthListener listener) {
        final int currentAdminUser = getCurrentUserIfAdmin();
        final ComponentName receiver = getApproverComponent(currentAdminUser);
        if (currentAdminUser != UserHandle.USER_NULL && receiver != null) {
            cancelReportImpl(listener, receiver, currentAdminUser);
        final int primaryUser = getAndValidateUser();
        final ComponentName receiver = getApproverComponent(primaryUser);
        if (primaryUser != UserHandle.USER_NULL && receiver != null) {
            cancelReportImpl(listener, receiver, primaryUser);
        }
    }

@@ -331,13 +326,13 @@ class PendingReports {
     * by the calling app, or because of a binder death).
     */
    private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver,
            @UserIdInt int user) {
            int primaryUser) {
        // First, remove from our list.
        synchronized (mLock) {
            removePendingReportRecLocked(listener);
        }
        // Second, call back to PermissionController to say it's canceled.
        sendBroadcast(receiver, user);
        sendBroadcast(receiver, primaryUser);
    }

    /**
@@ -347,21 +342,21 @@ class PendingReports {
     * cleanup cases to keep the apps' list in sync with ours.
     */
    private void sendBroadcast() {
        final int currentAdminUser = getCurrentUserIfAdmin();
        if (currentAdminUser == UserHandle.USER_NULL) {
        final int primaryUser = getAndValidateUser();
        if (primaryUser == UserHandle.USER_NULL) {
            return;
        }
        final ComponentName receiver = getApproverComponent(currentAdminUser);
        final ComponentName receiver = getApproverComponent(primaryUser);
        if (receiver == null) {
            return;
        }
        sendBroadcast(receiver, currentAdminUser);
        sendBroadcast(receiver, primaryUser);
    }

    /**
     * Send the confirmation broadcast.
     */
    private void sendBroadcast(ComponentName receiver, int currentUser) {
    private void sendBroadcast(ComponentName receiver, int primaryUser) {
        final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED);
        intent.setComponent(receiver);
        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -369,8 +364,8 @@ class PendingReports {
        final BroadcastOptions options = BroadcastOptions.makeBasic();
        options.setBackgroundActivityStartsAllowed(true);

        // Send it to the current user.
        mContext.sendBroadcastAsUser(intent, UserHandle.of(currentUser),
        // Send it to the primary user.
        mContext.sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser),
                android.Manifest.permission.APPROVE_INCIDENT_REPORTS, options.toBundle());
    }

@@ -425,11 +420,11 @@ class PendingReports {
    }

    /**
     * Check whether the current user is an admin user, and return the user id if they are.
     * Check whether the current user is the primary user, and return the user id if they are.
     * Returns UserHandle.USER_NULL if not valid.
     */
    private int getCurrentUserIfAdmin() {
        return IncidentCompanionService.getCurrentUserIfAdmin();
    private int getAndValidateUser() {
        return IncidentCompanionService.getAndValidateUser(mContext);
    }

    /**
+12 −9
Original line number Diff line number Diff line
@@ -33,8 +33,8 @@ import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Slog;

@@ -189,10 +189,10 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub {
    }

    /**
     * Validates that the current user is an admin user or, when bugreport is requested remotely
     * that the current user is an affiliated user.
     * Validates that the current user is the primary user or when bugreport is requested remotely
     * and current user is affiliated user.
     *
     * @throws IllegalArgumentException if the current user is not an admin user
     * @throws IllegalArgumentException if the current user is not the primary user
     */
    private void ensureUserCanTakeBugReport(int bugreportMode) {
        UserInfo currentUser = null;
@@ -202,17 +202,20 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub {
            // Impossible to get RemoteException for an in-process call.
        }

        UserInfo primaryUser = UserManager.get(mContext).getPrimaryUser();
        if (currentUser == null) {
            logAndThrow("There is no current user, so no bugreport can be requested.");
            logAndThrow("No current user. Only primary user is allowed to take bugreports.");
        }

        if (!currentUser.isAdmin()) {
        if (primaryUser == null) {
            logAndThrow("No primary user. Only primary user is allowed to take bugreports.");
        }
        if (primaryUser.id != currentUser.id) {
            if (bugreportMode == BugreportParams.BUGREPORT_MODE_REMOTE
                    && isCurrentUserAffiliated(currentUser.id)) {
                return;
            }
            logAndThrow(TextUtils.formatSimple("Current user %s is not an admin user."
                    + " Only admin users are allowed to take bugreport.", currentUser.id));
            logAndThrow("Current user not primary user. Only primary user"
                    + " is allowed to take bugreports.");
        }
    }