Merge "Require CREATE_VIRTUAL_DEVICE permission to register or unregister an AccessibilityDisplayProxy" into udc-dev

This commit is contained in:
Sally Yuen
2023-02-28 21:00:27 +00:00
committed by Android (Google) Code Review
4 changed files with 37 additions and 8 deletions

View File

@@ -17290,9 +17290,9 @@ package android.view.accessibility {
public final class AccessibilityManager { public final class AccessibilityManager {
method public int getAccessibilityWindowId(@Nullable android.os.IBinder); method public int getAccessibilityWindowId(@Nullable android.os.IBinder);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut(); method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut();
method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public boolean registerDisplayProxy(@NonNull android.view.accessibility.AccessibilityDisplayProxy); method @RequiresPermission(allOf={android.Manifest.permission.MANAGE_ACCESSIBILITY, android.Manifest.permission.CREATE_VIRTUAL_DEVICE}) public boolean registerDisplayProxy(@NonNull android.view.accessibility.AccessibilityDisplayProxy);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull android.app.RemoteAction, int); method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull android.app.RemoteAction, int);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public boolean unregisterDisplayProxy(@NonNull android.view.accessibility.AccessibilityDisplayProxy); method @RequiresPermission(allOf={android.Manifest.permission.MANAGE_ACCESSIBILITY, android.Manifest.permission.CREATE_VIRTUAL_DEVICE}) public boolean unregisterDisplayProxy(@NonNull android.view.accessibility.AccessibilityDisplayProxy);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int); method @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int);
} }

View File

@@ -2068,12 +2068,14 @@ public final class AccessibilityManager {
* {@link android.view.Display#INVALID_DISPLAY}, or is already being proxy-ed. * {@link android.view.Display#INVALID_DISPLAY}, or is already being proxy-ed.
* *
* @throws SecurityException if the app does not hold the * @throws SecurityException if the app does not hold the
* {@link Manifest.permission#MANAGE_ACCESSIBILITY} permission. * {@link Manifest.permission#MANAGE_ACCESSIBILITY} permission or the
* {@link Manifest.permission#CREATE_VIRTUAL_DEVICE} permission.
* *
* @hide * @hide
*/ */
@SystemApi @SystemApi
@RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) @RequiresPermission(allOf = {Manifest.permission.MANAGE_ACCESSIBILITY,
Manifest.permission.CREATE_VIRTUAL_DEVICE})
public boolean registerDisplayProxy(@NonNull AccessibilityDisplayProxy proxy) { public boolean registerDisplayProxy(@NonNull AccessibilityDisplayProxy proxy) {
final IAccessibilityManager service; final IAccessibilityManager service;
synchronized (mLock) { synchronized (mLock) {
@@ -2096,12 +2098,14 @@ public final class AccessibilityManager {
* @return {@code true} if the proxy is successfully unregistered. * @return {@code true} if the proxy is successfully unregistered.
* *
* @throws SecurityException if the app does not hold the * @throws SecurityException if the app does not hold the
* {@link Manifest.permission#MANAGE_ACCESSIBILITY} permission. * {@link Manifest.permission#MANAGE_ACCESSIBILITY} permission or the
* {@link Manifest.permission#CREATE_VIRTUAL_DEVICE} permission.
* *
* @hide * @hide
*/ */
@SystemApi @SystemApi
@RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) @RequiresPermission(allOf = {Manifest.permission.MANAGE_ACCESSIBILITY,
Manifest.permission.CREATE_VIRTUAL_DEVICE})
public boolean unregisterDisplayProxy(@NonNull AccessibilityDisplayProxy proxy) { public boolean unregisterDisplayProxy(@NonNull AccessibilityDisplayProxy proxy) {
final IAccessibilityManager service; final IAccessibilityManager service;
synchronized (mLock) { synchronized (mLock) {

View File

@@ -3801,6 +3801,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
public boolean registerProxyForDisplay(IAccessibilityServiceClient client, int displayId) public boolean registerProxyForDisplay(IAccessibilityServiceClient client, int displayId)
throws RemoteException { throws RemoteException {
mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY); mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY);
mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.CREATE_VIRTUAL_DEVICE);
if (client == null) { if (client == null) {
return false; return false;
} }
@@ -3837,6 +3838,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override @Override
public boolean unregisterProxyForDisplay(int displayId) { public boolean unregisterProxyForDisplay(int displayId) {
mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY); mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY);
mSecurityPolicy.enforceCallingOrSelfPermission(Manifest.permission.CREATE_VIRTUAL_DEVICE);
final long identity = Binder.clearCallingIdentity(); final long identity = Binder.clearCallingIdentity();
try { try {
return mProxyManager.unregisterProxy(displayId); return mProxyManager.unregisterProxy(displayId);

View File

@@ -289,7 +289,7 @@ public class AccessibilityManagerServiceTest {
@SmallTest @SmallTest
@Test @Test
public void testRegisterProxyWithoutPermission() throws Exception { public void testRegisterProxyWithoutA11yPermission() throws Exception {
doThrow(SecurityException.class).when(mMockSecurityPolicy) doThrow(SecurityException.class).when(mMockSecurityPolicy)
.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY); .enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY);
@@ -299,6 +299,18 @@ public class AccessibilityManagerServiceTest {
any(), any(), any()); any(), any(), any());
} }
@SmallTest
@Test
public void testRegisterProxyWithoutDevicePermission() throws Exception {
doThrow(SecurityException.class).when(mMockSecurityPolicy)
.enforceCallingOrSelfPermission(Manifest.permission.CREATE_VIRTUAL_DEVICE);
assertThrows(SecurityException.class,
() -> mA11yms.registerProxyForDisplay(mMockServiceClient, TEST_DISPLAY));
verify(mProxyManager, never()).registerProxy(any(), anyInt(), any(), anyInt(), any(), any(),
any(), any(), any());
}
@SmallTest @SmallTest
@Test @Test
public void testRegisterProxyForDefaultDisplay() throws Exception { public void testRegisterProxyForDefaultDisplay() throws Exception {
@@ -328,7 +340,7 @@ public class AccessibilityManagerServiceTest {
@SmallTest @SmallTest
@Test @Test
public void testUnRegisterProxyWithoutPermission() throws Exception { public void testUnRegisterProxyWithoutA11yPermission() {
doThrow(SecurityException.class).when(mMockSecurityPolicy) doThrow(SecurityException.class).when(mMockSecurityPolicy)
.enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY); .enforceCallingOrSelfPermission(Manifest.permission.MANAGE_ACCESSIBILITY);
@@ -337,6 +349,17 @@ public class AccessibilityManagerServiceTest {
verify(mProxyManager, never()).unregisterProxy(TEST_DISPLAY); verify(mProxyManager, never()).unregisterProxy(TEST_DISPLAY);
} }
@SmallTest
@Test
public void testUnRegisterProxyWithoutDevicePermission() {
doThrow(SecurityException.class).when(mMockSecurityPolicy)
.enforceCallingOrSelfPermission(Manifest.permission.CREATE_VIRTUAL_DEVICE);
assertThrows(SecurityException.class,
() -> mA11yms.unregisterProxyForDisplay(TEST_DISPLAY));
verify(mProxyManager, never()).unregisterProxy(TEST_DISPLAY);
}
@SmallTest @SmallTest
@Test @Test
public void testOnMagnificationTransitionFailed_capabilitiesIsAll_fallBackToPreviousMode() { public void testOnMagnificationTransitionFailed_capabilitiesIsAll_fallBackToPreviousMode() {