diff options
-rw-r--r-- | core/java/android/os/BugreportManager.java | 13 | ||||
-rw-r--r-- | services/core/java/com/android/server/os/BugreportManagerServiceImpl.java | 15 |
2 files changed, 21 insertions, 7 deletions
diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java index cbb3909a5536..c5a51f133047 100644 --- a/core/java/android/os/BugreportManager.java +++ b/core/java/android/os/BugreportManager.java @@ -66,10 +66,14 @@ public class BugreportManager { @interface BugreportErrorCode {} /** The input options were invalid */ - int BUGREPORT_ERROR_INVALID_INPUT = 1; + int BUGREPORT_ERROR_INVALID_INPUT = IDumpstateListener.BUGREPORT_ERROR_INVALID_INPUT; /** A runtime error occured */ - int BUGREPORT_ERROR_RUNTIME = 2; + int BUGREPORT_ERROR_RUNTIME = IDumpstateListener.BUGREPORT_ERROR_RUNTIME_ERROR; + + /** User denied consent to share the bugreport */ + int BUGREPORT_ERROR_USER_DENIED_CONSENT = + IDumpstateListener.BUGREPORT_ERROR_USER_DENIED_CONSENT; /** * Called when taking bugreport resulted in an error. @@ -108,7 +112,10 @@ public class BugreportManager { DumpstateListener dsListener = new DumpstateListener(listener); try { - mBinder.startBugreport(bugreportFd, screenshotFd, params.getMode(), dsListener); + // Note: mBinder can get callingUid from the binder transaction. + mBinder.startBugreport(-1 /* callingUid */, + mContext.getOpPackageName(), bugreportFd, screenshotFd, + params.getMode(), dsListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java index faa4714a8697..1178cc18f828 100644 --- a/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java +++ b/services/core/java/com/android/server/os/BugreportManagerServiceImpl.java @@ -17,7 +17,9 @@ package com.android.server.os; import android.annotation.RequiresPermission; +import android.app.AppOpsManager; import android.content.Context; +import android.os.Binder; import android.os.BugreportParams; import android.os.IDumpstate; import android.os.IDumpstateListener; @@ -46,9 +48,11 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub { private IDumpstate mDs = null; private final Context mContext; + private final AppOpsManager mAppOps; BugreportManagerServiceImpl(Context context) { mContext = context; + mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); } @Override @@ -60,21 +64,24 @@ class BugreportManagerServiceImpl extends IDumpstate.Stub { throw new UnsupportedOperationException("setListener is not allowed on this service"); } - @Override @RequiresPermission(android.Manifest.permission.DUMP) - public void startBugreport(FileDescriptor bugreportFd, FileDescriptor screenshotFd, + public void startBugreport(int callingUidUnused, String callingPackage, + FileDescriptor bugreportFd, FileDescriptor screenshotFd, int bugreportMode, IDumpstateListener listener) throws RemoteException { - + int callingUid = Binder.getCallingUid(); + // TODO(b/111441001): validate all arguments & ensure primary user validate(bugreportMode); + mAppOps.checkPackage(callingUid, callingPackage); mDs = getDumpstateService(); if (mDs == null) { Slog.w(TAG, "Unable to get bugreport service"); // TODO(b/111441001): pass error on listener return; } - mDs.startBugreport(bugreportFd, screenshotFd, bugreportMode, listener); + mDs.startBugreport(callingUid, callingPackage, + bugreportFd, screenshotFd, bugreportMode, listener); } private boolean validate(@BugreportParams.BugreportMode int mode) { |