From b061b38945deb756b4932edc965147e068effaad Mon Sep 17 00:00:00 2001 From: Joseph Jang Date: Wed, 26 Jan 2022 09:22:43 +0000 Subject: [PATCH] Revert "SurfaceControlViewHost: Restrict disclosure of input token" This reverts commit 131444d50077884daf4e00c097f1f2335c465c04. Reason for revert: Change-Id: I172db29e4eebea9214d05fc1309abbc0c4487804 --- core/java/android/view/IWindowSession.aidl | 2 +- .../android/view/SurfaceControlViewHost.java | 2 +- .../android/view/WindowlessWindowManager.java | 12 ++----- .../server/wm/EmbeddedWindowController.java | 35 +++---------------- .../java/com/android/server/wm/Session.java | 4 +-- .../server/wm/WindowManagerService.java | 14 +++----- 6 files changed, 15 insertions(+), 54 deletions(-) diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index 16154c9fac9cd..921ce53b3bda9 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -295,7 +295,7 @@ interface IWindowSession { */ void grantInputChannel(int displayId, in SurfaceControl surface, in IWindow window, in IBinder hostInputToken, int flags, int privateFlags, int type, - in IBinder focusGrantToken, out InputChannel outInputChannel); + out InputChannel outInputChannel); /** * Update the flags on an input channel associated with a particular surface. diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java index 22baa692428a8..85a9dbd736edf 100644 --- a/core/java/android/view/SurfaceControlViewHost.java +++ b/core/java/android/view/SurfaceControlViewHost.java @@ -274,7 +274,7 @@ public class SurfaceControlViewHost { public @Nullable SurfacePackage getSurfacePackage() { if (mSurfaceControl != null && mAccessibilityEmbeddedConnection != null) { return new SurfacePackage(mSurfaceControl, mAccessibilityEmbeddedConnection, - mWm.getFocusGrantToken(), mRemoteInterface); + mViewRoot.getInputToken(), mRemoteInterface); } else { return null; } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 2227597c0a238..5176f9bb0f939 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -22,7 +22,6 @@ import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; -import android.os.Binder; import android.os.IBinder; import android.os.RemoteCallback; import android.os.RemoteException; @@ -76,7 +75,6 @@ public class WindowlessWindowManager implements IWindowSession { private final Configuration mConfiguration; private final IWindowSession mRealWm; private final IBinder mHostInputToken; - private final IBinder mFocusGrantToken = new Binder(); private int mForceHeight = -1; private int mForceWidth = -1; @@ -93,10 +91,6 @@ public class WindowlessWindowManager implements IWindowSession { mConfiguration.setTo(configuration); } - IBinder getFocusGrantToken() { - return mFocusGrantToken; - } - /** * Utility API. */ @@ -159,10 +153,10 @@ public class WindowlessWindowManager implements IWindowSession { mRealWm.grantInputChannel(displayId, new SurfaceControl(sc, "WindowlessWindowManager.addToDisplay"), window, mHostInputToken, attrs.flags, attrs.privateFlags, attrs.type, - mFocusGrantToken, outInputChannel); + outInputChannel); } else { mRealWm.grantInputChannel(displayId, sc, window, mHostInputToken, attrs.flags, - attrs.privateFlags, attrs.type, mFocusGrantToken, outInputChannel); + attrs.privateFlags, attrs.type, outInputChannel); } } catch (RemoteException e) { Log.e(TAG, "Failed to grant input to surface: ", e); @@ -466,7 +460,7 @@ public class WindowlessWindowManager implements IWindowSession { @Override public void grantInputChannel(int displayId, SurfaceControl surface, IWindow window, - IBinder hostInputToken, int flags, int privateFlags, int type, IBinder focusGrantToken, + IBinder hostInputToken, int flags, int privateFlags, int type, InputChannel outInputChannel) { } diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java index e04e3a387b6d2..0e2d847796024 100644 --- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java +++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java @@ -41,8 +41,6 @@ class EmbeddedWindowController { private static final String TAG = TAG_WITH_CLASS_NAME ? "EmbeddedWindowController" : TAG_WM; /* maps input token to an embedded window */ private ArrayMap mWindows = new ArrayMap<>(); - private ArrayMap mWindowsByFocusToken = - new ArrayMap<>(); private final Object mGlobalLock; private final ActivityTaskManagerService mAtmService; @@ -61,13 +59,10 @@ class EmbeddedWindowController { void add(IBinder inputToken, EmbeddedWindow window) { try { mWindows.put(inputToken, window); - final IBinder focusToken = window.getFocusGrantToken(); - mWindowsByFocusToken.put(focusToken, window); updateProcessController(window); window.mClient.asBinder().linkToDeath(()-> { synchronized (mGlobalLock) { mWindows.remove(inputToken); - mWindowsByFocusToken.remove(focusToken); } }, 0); } catch (RemoteException e) { @@ -112,10 +107,8 @@ class EmbeddedWindowController { void remove(IWindow client) { for (int i = mWindows.size() - 1; i >= 0; i--) { - EmbeddedWindow ew = mWindows.valueAt(i); - if (ew.mClient.asBinder() == client.asBinder()) { + if (mWindows.valueAt(i).mClient.asBinder() == client.asBinder()) { mWindows.removeAt(i).onRemoved(); - mWindowsByFocusToken.remove(ew.getFocusGrantToken()); return; } } @@ -123,10 +116,8 @@ class EmbeddedWindowController { void onWindowRemoved(WindowState host) { for (int i = mWindows.size() - 1; i >= 0; i--) { - EmbeddedWindow ew = mWindows.valueAt(i); - if (ew.mHostWindowState == host) { + if (mWindows.valueAt(i).mHostWindowState == host) { mWindows.removeAt(i).onRemoved(); - mWindowsByFocusToken.remove(ew.getFocusGrantToken()); } } } @@ -135,10 +126,6 @@ class EmbeddedWindowController { return mWindows.get(inputToken); } - EmbeddedWindow getByFocusToken(IBinder focusGrantToken) { - return mWindowsByFocusToken.get(focusGrantToken); - } - void onActivityRemoved(ActivityRecord activityRecord) { for (int i = mWindows.size() - 1; i >= 0; i--) { final EmbeddedWindow window = mWindows.valueAt(i); @@ -170,8 +157,6 @@ class EmbeddedWindowController { // and this variable is mostly used for tracking that. boolean mIsOverlay = false; - private IBinder mFocusGrantToken; - /** * @param session calling session to check ownership of the window * @param clientToken client token used to clean up the map if the embedding process dies @@ -186,7 +171,7 @@ class EmbeddedWindowController { */ EmbeddedWindow(Session session, WindowManagerService service, IWindow clientToken, WindowState hostWindowState, int ownerUid, int ownerPid, int windowType, - int displayId, IBinder focusGrantToken) { + int displayId) { mSession = session; mWmService = service; mClient = clientToken; @@ -197,7 +182,6 @@ class EmbeddedWindowController { mOwnerPid = ownerPid; mWindowType = windowType; mDisplayId = displayId; - mFocusGrantToken = focusGrantToken; } @Override @@ -258,17 +242,6 @@ class EmbeddedWindowController { return mIsOverlay; } - IBinder getFocusGrantToken() { - return mFocusGrantToken; - } - - IBinder getInputChannelToken() { - if (mInputChannel != null) { - return mInputChannel.getToken(); - } - return null; - } - /** * System hosted overlays need the WM to invoke grantEmbeddedWindowFocus and * so we need to participate inside handlePointerDownOutsideFocus logic @@ -282,7 +255,7 @@ class EmbeddedWindowController { private void handleTap(boolean grantFocus) { if (mInputChannel != null) { - mWmService.grantEmbeddedWindowFocus(mSession, mFocusGrantToken, grantFocus); + mWmService.grantEmbeddedWindowFocus(mSession, mInputChannel.getToken(), grantFocus); } } diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 3dd5532f8f6b2..005544b961c32 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -798,7 +798,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public void grantInputChannel(int displayId, SurfaceControl surface, IWindow window, IBinder hostInputToken, int flags, int privateFlags, int type, - IBinder focusGrantToken, InputChannel outInputChannel) { + InputChannel outInputChannel) { if (hostInputToken == null && !mCanAddInternalSystemWindow) { // Callers without INTERNAL_SYSTEM_WINDOW permission cannot grant input channel to // embedded windows without providing a host window input token @@ -814,7 +814,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { try { mService.grantInputChannel(this, mUid, mPid, displayId, surface, window, hostInputToken, flags, mCanAddInternalSystemWindow ? privateFlags : 0, - mCanAddInternalSystemWindow ? type : 0, focusGrantToken, outInputChannel); + mCanAddInternalSystemWindow ? type : 0, outInputChannel); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index e3cbb66c1b05c..2f0ef4a8ee1b4 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8263,8 +8263,7 @@ public class WindowManagerService extends IWindowManager.Stub */ void grantInputChannel(Session session, int callingUid, int callingPid, int displayId, SurfaceControl surface, IWindow window, IBinder hostInputToken, - int flags, int privateFlags, int type, IBinder focusGrantToken, - InputChannel outInputChannel) { + int flags, int privateFlags, int type, InputChannel outInputChannel) { final InputApplicationHandle applicationHandle; final String name; final InputChannel clientChannel; @@ -8272,7 +8271,7 @@ public class WindowManagerService extends IWindowManager.Stub EmbeddedWindowController.EmbeddedWindow win = new EmbeddedWindowController.EmbeddedWindow(session, this, window, mInputToWindowMap.get(hostInputToken), callingUid, callingPid, type, - displayId, focusGrantToken); + displayId); clientChannel = win.openInputChannel(); mEmbeddedWindowController.add(clientChannel.getToken(), win); applicationHandle = win.getApplicationHandle(); @@ -8539,10 +8538,10 @@ public class WindowManagerService extends IWindowManager.Stub } } - void grantEmbeddedWindowFocus(Session session, IBinder focusToken, boolean grantFocus) { + void grantEmbeddedWindowFocus(Session session, IBinder inputToken, boolean grantFocus) { synchronized (mGlobalLock) { final EmbeddedWindowController.EmbeddedWindow embeddedWindow = - mEmbeddedWindowController.getByFocusToken(focusToken); + mEmbeddedWindowController.get(inputToken); if (embeddedWindow == null) { Slog.e(TAG, "Embedded window not found"); return; @@ -8551,11 +8550,6 @@ public class WindowManagerService extends IWindowManager.Stub Slog.e(TAG, "Window not in session:" + session); return; } - IBinder inputToken = embeddedWindow.getInputChannelToken(); - if (inputToken == null) { - Slog.e(TAG, "Focus token found but input channel token not found"); - return; - } SurfaceControl.Transaction t = mTransactionFactory.get(); final int displayId = embeddedWindow.mDisplayId; if (grantFocus) {