From f7378376ca2ddc78a6183fe6024186c56707f84d Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Wed, 26 Feb 2020 08:22:12 -0800 Subject: Remove key from adb_keys if user forgets the key. It was being removed from adb_temp_keys.xml but not adb_keys. Bug: 150138676 Bug: 111434128 Test: atest AdbDebuggingManagerTest Change-Id: I3c31394e4480e787c771e193b179a472d6ee4a62 Merged-In: I3c31394e4480e787c771e193b179a472d6ee4a62 --- .../android/server/adb/AdbDebuggingManager.java | 1 + .../server/adb/AdbDebuggingManagerTest.java | 25 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java index 10a2b91695e7..4a6c2bee2fc8 100644 --- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java +++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java @@ -1849,6 +1849,7 @@ public class AdbDebuggingManager { public void removeKey(String key) { if (mKeyMap.containsKey(key)) { mKeyMap.remove(key); + writeKeys(mKeyMap.keySet()); sendPersistKeyStoreMessage(); } } diff --git a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java index d4182f3d31e2..c687ede5fdf7 100644 --- a/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/adb/AdbDebuggingManagerTest.java @@ -672,6 +672,31 @@ public final class AdbDebuggingManagerTest { connectionTime2, mKeyStore.getLastConnectionTime(TEST_KEY_2)); } + @Test + public void testAdbKeyStore_removeKey() throws Exception { + // Accept the test key with the 'Always allow' option selected. + runAdbTest(TEST_KEY_1, true, true, false); + runAdbTest(TEST_KEY_2, true, true, false); + + // Set the connection time to 0 to restore the original behavior. + setAllowedConnectionTime(0); + + // Verify that the key is in the adb_keys file to ensure subsequent connections are + // automatically allowed by adbd. + persistKeyStore(); + assertTrue("The key was not in the adb_keys file after persisting the keystore", + isKeyInFile(TEST_KEY_1, mAdbKeyFile)); + assertTrue("The key was not in the adb_keys file after persisting the keystore", + isKeyInFile(TEST_KEY_2, mAdbKeyFile)); + + // Now remove one of the keys and make sure the other key is still there + mKeyStore.removeKey(TEST_KEY_1); + assertFalse("The key was still in the adb_keys file after removing the key", + isKeyInFile(TEST_KEY_1, mAdbKeyFile)); + assertTrue("The key was not in the adb_keys file after removing a different key", + isKeyInFile(TEST_KEY_2, mAdbKeyFile)); + } + /** * Runs an adb test with the provided configuration. * -- cgit v1.2.3-59-g8ed1b From eb6e5bc47b7a16855b590f6dccb719ea78a2dab7 Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Wed, 26 Feb 2020 08:33:19 -0800 Subject: Allow UsbDeviceManager to start adbd again. There's some weird state where if persist.sys.usb.config=none,adb, then adbd won't get started. Give back adbd start permissions to UsbDeviceManager to see if that fixes the issue. Bug: 150130503 Test: adb shell su 0 setprop persist.sys.usb.config none,adb; adb reboot adb should be online after. Change-Id: I36c6ef4b20d58570a2d51ed70088ae5c54d6687d Merged-In: I36c6ef4b20d58570a2d51ed70088ae5c54d6687d Exempt-From-Owner-Approval: Fix adbd offline failure --- core/java/android/debug/AdbManagerInternal.java | 10 +++++++++ .../java/com/android/server/adb/AdbService.java | 25 ++++++++++++++++++++++ .../com/android/server/usb/UsbDeviceManager.java | 14 +++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/core/java/android/debug/AdbManagerInternal.java b/core/java/android/debug/AdbManagerInternal.java index 0bd9f19f91fe..d730129507d7 100644 --- a/core/java/android/debug/AdbManagerInternal.java +++ b/core/java/android/debug/AdbManagerInternal.java @@ -53,4 +53,14 @@ public abstract class AdbManagerInternal { * Returns the file that contains all of the ADB keys and their last used time. */ public abstract File getAdbTempKeysFile(); + + /** + * Starts adbd for a transport. + */ + public abstract void startAdbdForTransport(byte transportType); + + /** + * Stops adbd for a transport. + */ + public abstract void stopAdbdForTransport(byte transportType); } diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java index 7ccb28474604..7aaf9be1fdd2 100644 --- a/services/core/java/com/android/server/adb/AdbService.java +++ b/services/core/java/com/android/server/adb/AdbService.java @@ -144,6 +144,18 @@ public class AdbService extends IAdbManager.Stub { public File getAdbTempKeysFile() { return mDebuggingManager.getAdbTempKeysFile(); } + + @Override + public void startAdbdForTransport(byte transportType) { + FgThread.getHandler().sendMessage(obtainMessage( + AdbService::setAdbdEnabledForTransport, AdbService.this, true, transportType)); + } + + @Override + public void stopAdbdForTransport(byte transportType) { + FgThread.getHandler().sendMessage(obtainMessage( + AdbService::setAdbdEnabledForTransport, AdbService.this, false, transportType)); + } } private void initAdbState() { @@ -437,6 +449,19 @@ public class AdbService extends IAdbManager.Stub { } } + private void setAdbdEnabledForTransport(boolean enable, byte transportType) { + if (transportType == AdbTransportType.USB) { + mIsAdbUsbEnabled = enable; + } else if (transportType == AdbTransportType.WIFI) { + mIsAdbWifiEnabled = enable; + } + if (enable) { + startAdbd(); + } else { + stopAdbd(); + } + } + private void setAdbEnabled(boolean enable, byte transportType) { if (DEBUG) { Slog.d(TAG, "setAdbEnabled(" + enable + "), mIsAdbUsbEnabled=" + mIsAdbUsbEnabled diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index d2b30b2ff5ef..121a5b57a69c 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -1898,7 +1898,19 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser return; } try { - // Adbd will be started by AdbService once Global.ADB_ENABLED is set. + if ((config & UsbManager.FUNCTION_ADB) != 0) { + /** + * Start adbd if ADB function is included in the configuration. + */ + LocalServices.getService(AdbManagerInternal.class) + .startAdbdForTransport(AdbTransportType.USB); + } else { + /** + * Stop adbd otherwise + */ + LocalServices.getService(AdbManagerInternal.class) + .stopAdbdForTransport(AdbTransportType.USB); + } UsbGadgetCallback usbGadgetCallback = new UsbGadgetCallback(mCurrentRequest, config, chargingFunctions); mGadgetProxy.setCurrentUsbFunctions(config, usbGadgetCallback, -- cgit v1.2.3-59-g8ed1b