Merge "Allow apps with MANAGE_USB_STATE permission access to all USB accessories." into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
04e3e536d9
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user