Merge "Allow apps with MANAGE_USB_STATE permission access to all USB accessories." into tm-dev

This commit is contained in:
TreeHugger Robot
2022-03-01 03:54:05 +00:00
committed by Android (Google) Code Review
4 changed files with 19 additions and 12 deletions

View File

@@ -2187,7 +2187,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
* @param uid Uid of the caller * @param uid Uid of the caller
*/ */
public ParcelFileDescriptor openAccessory(UsbAccessory accessory, public ParcelFileDescriptor openAccessory(UsbAccessory accessory,
UsbUserPermissionManager permissions, int uid) { UsbUserPermissionManager permissions, int pid, int uid) {
UsbAccessory currentAccessory = mHandler.getCurrentAccessory(); UsbAccessory currentAccessory = mHandler.getCurrentAccessory();
if (currentAccessory == null) { if (currentAccessory == null) {
throw new IllegalArgumentException("no accessory attached"); throw new IllegalArgumentException("no accessory attached");
@@ -2198,7 +2198,7 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser
+ currentAccessory; + currentAccessory;
throw new IllegalArgumentException(error); throw new IllegalArgumentException(error);
} }
permissions.checkPermission(accessory, uid); permissions.checkPermission(accessory, pid, uid);
return nativeOpenAccessory(); return nativeOpenAccessory();
} }

View File

@@ -98,7 +98,7 @@ class UsbSerialReader extends IUsbSerialReader.Stub {
.checkPermission((UsbDevice) mDevice, packageName, pid, uid); .checkPermission((UsbDevice) mDevice, packageName, pid, uid);
} else { } else {
mPermissionManager.getPermissionsForUser(userId) mPermissionManager.getPermissionsForUser(userId)
.checkPermission((UsbAccessory) mDevice, uid); .checkPermission((UsbAccessory) mDevice, pid, uid);
} }
} }
} }

View File

@@ -321,6 +321,7 @@ public class UsbService extends IUsbManager.Stub {
public ParcelFileDescriptor openAccessory(UsbAccessory accessory) { public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
if (mDeviceManager != null) { if (mDeviceManager != null) {
int uid = Binder.getCallingUid(); int uid = Binder.getCallingUid();
int pid = Binder.getCallingPid();
int user = UserHandle.getUserId(uid); int user = UserHandle.getUserId(uid);
final long ident = clearCallingIdentity(); final long ident = clearCallingIdentity();
@@ -328,7 +329,7 @@ public class UsbService extends IUsbManager.Stub {
synchronized (mLock) { synchronized (mLock) {
if (mUserManager.isSameProfileGroup(user, mCurrentUserId)) { if (mUserManager.isSameProfileGroup(user, mCurrentUserId)) {
return mDeviceManager.openAccessory(accessory, getPermissionsForUser(user), return mDeviceManager.openAccessory(accessory, getPermissionsForUser(user),
uid); pid, uid);
} else { } else {
Slog.w(TAG, "Cannot open " + accessory + " for user " + user Slog.w(TAG, "Cannot open " + accessory + " for user " + user
+ " as user is not active."); + " as user is not active.");
@@ -505,11 +506,12 @@ public class UsbService extends IUsbManager.Stub {
@Override @Override
public boolean hasAccessoryPermission(UsbAccessory accessory) { public boolean hasAccessoryPermission(UsbAccessory accessory) {
final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid();
final int pid = Binder.getCallingPid();
final int userId = UserHandle.getUserId(uid); final int userId = UserHandle.getUserId(uid);
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
try { try {
return getPermissionsForUser(userId).hasPermission(accessory, uid); return getPermissionsForUser(userId).hasPermission(accessory, pid, uid);
} finally { } finally {
Binder.restoreCallingIdentity(token); Binder.restoreCallingIdentity(token);
} }
@@ -533,11 +535,12 @@ public class UsbService extends IUsbManager.Stub {
public void requestAccessoryPermission( public void requestAccessoryPermission(
UsbAccessory accessory, String packageName, PendingIntent pi) { UsbAccessory accessory, String packageName, PendingIntent pi) {
final int uid = Binder.getCallingUid(); final int uid = Binder.getCallingUid();
final int pid = Binder.getCallingPid();
final int userId = UserHandle.getUserId(uid); final int userId = UserHandle.getUserId(uid);
final long token = Binder.clearCallingIdentity(); final long token = Binder.clearCallingIdentity();
try { try {
getPermissionsForUser(userId).requestPermission(accessory, packageName, pi, uid); getPermissionsForUser(userId).requestPermission(accessory, packageName, pi, pid, uid);
} finally { } finally {
Binder.restoreCallingIdentity(token); Binder.restoreCallingIdentity(token);
} }

View File

@@ -246,9 +246,13 @@ class UsbUserPermissionManager {
* @param uid to check permission for * @param uid to check permission for
* @return {@code true} if caller has permssion * @return {@code true} if caller has permssion
*/ */
boolean hasPermission(@NonNull UsbAccessory accessory, int uid) { boolean hasPermission(@NonNull UsbAccessory accessory, int pid, int uid) {
synchronized (mLock) { synchronized (mLock) {
if (uid == Process.SYSTEM_UID || mDisablePermissionDialogs) { if (uid == Process.SYSTEM_UID
|| mDisablePermissionDialogs
|| mContext.checkPermission(
android.Manifest.permission.MANAGE_USB, pid, uid)
== android.content.pm.PackageManager.PERMISSION_GRANTED) {
return true; return true;
} }
AccessoryFilter filter = new AccessoryFilter(accessory); AccessoryFilter filter = new AccessoryFilter(accessory);
@@ -675,8 +679,8 @@ class UsbUserPermissionManager {
} }
} }
public void checkPermission(UsbAccessory accessory, int uid) { public void checkPermission(UsbAccessory accessory, int pid, int uid) {
if (!hasPermission(accessory, uid)) { if (!hasPermission(accessory, pid, uid)) {
throw new SecurityException("User has not given " + uid + " permission to accessory " throw new SecurityException("User has not given " + uid + " permission to accessory "
+ accessory); + accessory);
} }
@@ -745,9 +749,9 @@ class UsbUserPermissionManager {
} }
public void requestPermission(UsbAccessory accessory, String packageName, PendingIntent pi, public void requestPermission(UsbAccessory accessory, String packageName, PendingIntent pi,
int uid) { int pid, int uid) {
// respond immediately if permission has already been granted // respond immediately if permission has already been granted
if (hasPermission(accessory, uid)) { if (hasPermission(accessory, pid, uid)) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(UsbManager.EXTRA_ACCESSORY, accessory); intent.putExtra(UsbManager.EXTRA_ACCESSORY, accessory);
intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true); intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true);