From 9487806c081d9d984454dba20228298731e4ed1b Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Tue, 28 Nov 2017 14:47:55 +0100 Subject: [PATCH] respect experimental setting for untested usb devices --- .../UsbConnectionDispatcher.java | 22 +++++++++++++------ .../securitytoken/usb/UsbTransport.java | 16 ++++++++++++-- .../ui/base/BaseSecurityTokenActivity.java | 11 ++++------ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbConnectionDispatcher.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbConnectionDispatcher.java index 9db35c790..e43cf03ac 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbConnectionDispatcher.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/UsbConnectionDispatcher.java @@ -26,6 +26,7 @@ import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import org.sufficientlysecure.keychain.Constants; +import org.sufficientlysecure.keychain.securitytoken.usb.UsbTransport; import org.sufficientlysecure.keychain.ui.UsbEventReceiverActivity; import org.sufficientlysecure.keychain.util.Log; @@ -50,7 +51,7 @@ public class UsbConnectionDispatcher { false); if (permission) { Log.d(Constants.TAG, "Got permission for " + usbDevice.getDeviceName()); - mListener.usbDeviceDiscovered(usbDevice); + sendUsbTransportDiscovered(usbDevice); } break; } @@ -82,17 +83,24 @@ public class UsbConnectionDispatcher { // Note: we don't check devices VID/PID because // we check for permission instead. // We should have permission only for matching devices - for (UsbDevice device : mUsbManager.getDeviceList().values()) { - if (mUsbManager.hasPermission(device)) { - if (mListener != null) { - mListener.usbDeviceDiscovered(device); - } + for (UsbDevice usbDevice : mUsbManager.getDeviceList().values()) { + if (mUsbManager.hasPermission(usbDevice)) { + sendUsbTransportDiscovered(usbDevice); break; } } } + private void sendUsbTransportDiscovered(UsbDevice usbDevice) { + if (mListener == null) { + return; + } + + UsbTransport usbTransport = UsbTransport.createUsbTransport(mActivity.getBaseContext(), usbDevice); + mListener.usbTransportDiscovered(usbTransport); + } + public interface OnDiscoveredUsbDeviceListener { - void usbDeviceDiscovered(UsbDevice usbDevice); + void usbTransportDiscovered(UsbTransport usbTransport); } } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java index bc8613f24..152b3a540 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/securitytoken/usb/UsbTransport.java @@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb; import java.io.IOException; +import android.content.Context; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; @@ -39,6 +40,8 @@ import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TokenType import org.sufficientlysecure.keychain.securitytoken.SecurityTokenInfo.TransportType; import org.sufficientlysecure.keychain.securitytoken.Transport; import org.sufficientlysecure.keychain.util.Log; +import org.sufficientlysecure.keychain.util.Preferences; + /** * Based on USB CCID Specification rev. 1.1 @@ -72,10 +75,19 @@ public class UsbTransport implements Transport { private UsbDeviceConnection usbConnection; private UsbInterface usbInterface; private CcidTransportProtocol ccidTransportProtocol; + private boolean allowUntestedUsbTokens; - public UsbTransport(UsbDevice usbDevice, UsbManager usbManager) { + public static UsbTransport createUsbTransport(Context context, UsbDevice usbDevice) { + UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + boolean allowUntestedUsbTokens = Preferences.getPreferences(context).getExperimentalUsbAllowUntested(); + + return new UsbTransport(usbDevice, usbManager, allowUntestedUsbTokens); + } + + private UsbTransport(UsbDevice usbDevice, UsbManager usbManager, boolean allowUntestedUsbTokens) { this.usbDevice = usbDevice; this.usbManager = usbManager; + this.allowUntestedUsbTokens = allowUntestedUsbTokens; } @Override @@ -135,7 +147,7 @@ public class UsbTransport implements Transport { } boolean tokenTypeSupported = SecurityTokenInfo.SUPPORTED_USB_TOKENS.contains(getTokenTypeIfAvailable()); - if (!tokenTypeSupported) { + if (!allowUntestedUsbTokens && !tokenTypeSupported) { usbConnection.close(); usbConnection = null; throw new UnsupportedUsbTokenException(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java index 0818f1570..e98277891 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/base/BaseSecurityTokenActivity.java @@ -25,11 +25,8 @@ package org.sufficientlysecure.keychain.ui.base; import java.io.IOException; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.hardware.usb.UsbDevice; -import android.hardware.usb.UsbManager; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.TagLostException; @@ -62,6 +59,7 @@ import org.sufficientlysecure.keychain.ui.util.Notify.Style; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Passphrase; + public abstract class BaseSecurityTokenActivity extends BaseActivity implements OnDiscoveredTagListener, UsbConnectionDispatcher.OnDiscoveredUsbDeviceListener { public static final int REQUEST_CODE_PIN = 1; @@ -114,6 +112,7 @@ public abstract class BaseSecurityTokenActivity extends BaseActivity onSecurityTokenError(error); } + @Override public void tagDiscovered(Tag tag) { // Actual NFC operations are executed in doInBackground to not block the UI thread if (!mTagHandlingEnabled) { @@ -124,15 +123,13 @@ public abstract class BaseSecurityTokenActivity extends BaseActivity securityTokenDiscovered(nfcTransport); } - public void usbDeviceDiscovered(UsbDevice usbDevice) { + @Override + public void usbTransportDiscovered(UsbTransport usbTransport) { // Actual USB operations are executed in doInBackground to not block the UI thread if (!mTagHandlingEnabled) { return; } - UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); - - UsbTransport usbTransport = new UsbTransport(usbDevice, usbManager); securityTokenDiscovered(usbTransport); }