diff options
4 files changed, 43 insertions, 3 deletions
diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl index 8286686fec61..9bc967fe3c4a 100644 --- a/core/java/android/hardware/usb/IUsbManager.aidl +++ b/core/java/android/hardware/usb/IUsbManager.aidl @@ -95,4 +95,7 @@ interface IUsbManager /* Deny USB debugging from the attached host */ void denyUsbDebugging(); + + /* Clear public keys installed for secure USB debugging */ + void clearUsbDebuggingKeys(); } diff --git a/services/java/com/android/server/usb/UsbDebuggingManager.java b/services/java/com/android/server/usb/UsbDebuggingManager.java index 1bb3a2c519e5..93d31144815f 100644 --- a/services/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/java/com/android/server/usb/UsbDebuggingManager.java @@ -151,6 +151,7 @@ public class UsbDebuggingManager implements Runnable { private static final int MESSAGE_ADB_ALLOW = 3; private static final int MESSAGE_ADB_DENY = 4; private static final int MESSAGE_ADB_CONFIRM = 5; + private static final int MESSAGE_ADB_CLEAR = 6; public UsbDebuggingHandler(Looper looper) { super(looper); @@ -214,6 +215,10 @@ public class UsbDebuggingManager implements Runnable { showConfirmationDialog(key, mFingerprints); break; } + + case MESSAGE_ADB_CLEAR: + deleteKeyFile(); + break; } } } @@ -257,17 +262,25 @@ public class UsbDebuggingManager implements Runnable { } } - private void writeKey(String key) { + private File getUserKeyFile() { File dataDir = Environment.getDataDirectory(); File adbDir = new File(dataDir, ADB_DIRECTORY); if (!adbDir.exists()) { Slog.e(TAG, "ADB data directory does not exist"); - return; + return null; } + return new File(adbDir, ADB_KEYS_FILE); + } + + private void writeKey(String key) { try { - File keyFile = new File(adbDir, ADB_KEYS_FILE); + File keyFile = getUserKeyFile(); + + if (keyFile == null) { + return; + } if (!keyFile.exists()) { keyFile.createNewFile(); @@ -286,6 +299,12 @@ public class UsbDebuggingManager implements Runnable { } } + private void deleteKeyFile() { + File keyFile = getUserKeyFile(); + if (keyFile != null) { + keyFile.delete(); + } + } public void setAdbEnabled(boolean enabled) { mHandler.sendEmptyMessage(enabled ? UsbDebuggingHandler.MESSAGE_ADB_ENABLED @@ -303,6 +322,9 @@ public class UsbDebuggingManager implements Runnable { mHandler.sendEmptyMessage(UsbDebuggingHandler.MESSAGE_ADB_DENY); } + public void clearUsbDebuggingKeys() { + mHandler.sendEmptyMessage(UsbDebuggingHandler.MESSAGE_ADB_CLEAR); + } public void dump(FileDescriptor fd, PrintWriter pw) { pw.println(" USB Debugging State:"); diff --git a/services/java/com/android/server/usb/UsbDeviceManager.java b/services/java/com/android/server/usb/UsbDeviceManager.java index 8fa6de57ce17..87aa8cce166a 100644 --- a/services/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/java/com/android/server/usb/UsbDeviceManager.java @@ -864,6 +864,15 @@ public class UsbDeviceManager { } } + public void clearUsbDebuggingKeys() { + if (mDebuggingManager != null) { + mDebuggingManager.clearUsbDebuggingKeys(); + } else { + throw new RuntimeException("Cannot clear Usb Debugging keys, " + + "UsbDebuggingManager not enabled"); + } + } + public void dump(FileDescriptor fd, PrintWriter pw) { if (mHandler != null) { mHandler.dump(fd, pw); diff --git a/services/java/com/android/server/usb/UsbService.java b/services/java/com/android/server/usb/UsbService.java index 3918d15f650f..36669b1a8178 100644 --- a/services/java/com/android/server/usb/UsbService.java +++ b/services/java/com/android/server/usb/UsbService.java @@ -255,6 +255,12 @@ public class UsbService extends IUsbManager.Stub { } @Override + public void clearUsbDebuggingKeys() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); + mDeviceManager.clearUsbDebuggingKeys(); + } + + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG); final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); |