respect experimental setting for untested usb devices

This commit is contained in:
Vincent Breitmoser
2017-11-28 14:47:55 +01:00
parent 0d099116d5
commit 9487806c08
3 changed files with 33 additions and 16 deletions

View File

@@ -26,6 +26,7 @@ import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.securitytoken.usb.UsbTransport;
import org.sufficientlysecure.keychain.ui.UsbEventReceiverActivity; import org.sufficientlysecure.keychain.ui.UsbEventReceiverActivity;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
@@ -50,7 +51,7 @@ public class UsbConnectionDispatcher {
false); false);
if (permission) { if (permission) {
Log.d(Constants.TAG, "Got permission for " + usbDevice.getDeviceName()); Log.d(Constants.TAG, "Got permission for " + usbDevice.getDeviceName());
mListener.usbDeviceDiscovered(usbDevice); sendUsbTransportDiscovered(usbDevice);
} }
break; break;
} }
@@ -82,17 +83,24 @@ public class UsbConnectionDispatcher {
// Note: we don't check devices VID/PID because // Note: we don't check devices VID/PID because
// we check for permission instead. // we check for permission instead.
// We should have permission only for matching devices // We should have permission only for matching devices
for (UsbDevice device : mUsbManager.getDeviceList().values()) { for (UsbDevice usbDevice : mUsbManager.getDeviceList().values()) {
if (mUsbManager.hasPermission(device)) { if (mUsbManager.hasPermission(usbDevice)) {
if (mListener != null) { sendUsbTransportDiscovered(usbDevice);
mListener.usbDeviceDiscovered(device);
}
break; break;
} }
} }
} }
private void sendUsbTransportDiscovered(UsbDevice usbDevice) {
if (mListener == null) {
return;
}
UsbTransport usbTransport = UsbTransport.createUsbTransport(mActivity.getBaseContext(), usbDevice);
mListener.usbTransportDiscovered(usbTransport);
}
public interface OnDiscoveredUsbDeviceListener { public interface OnDiscoveredUsbDeviceListener {
void usbDeviceDiscovered(UsbDevice usbDevice); void usbTransportDiscovered(UsbTransport usbTransport);
} }
} }

View File

@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.securitytoken.usb;
import java.io.IOException; import java.io.IOException;
import android.content.Context;
import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection; 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.SecurityTokenInfo.TransportType;
import org.sufficientlysecure.keychain.securitytoken.Transport; import org.sufficientlysecure.keychain.securitytoken.Transport;
import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.Preferences;
/** /**
* Based on USB CCID Specification rev. 1.1 * Based on USB CCID Specification rev. 1.1
@@ -72,10 +75,19 @@ public class UsbTransport implements Transport {
private UsbDeviceConnection usbConnection; private UsbDeviceConnection usbConnection;
private UsbInterface usbInterface; private UsbInterface usbInterface;
private CcidTransportProtocol ccidTransportProtocol; 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.usbDevice = usbDevice;
this.usbManager = usbManager; this.usbManager = usbManager;
this.allowUntestedUsbTokens = allowUntestedUsbTokens;
} }
@Override @Override
@@ -135,7 +147,7 @@ public class UsbTransport implements Transport {
} }
boolean tokenTypeSupported = SecurityTokenInfo.SUPPORTED_USB_TOKENS.contains(getTokenTypeIfAvailable()); boolean tokenTypeSupported = SecurityTokenInfo.SUPPORTED_USB_TOKENS.contains(getTokenTypeIfAvailable());
if (!tokenTypeSupported) { if (!allowUntestedUsbTokens && !tokenTypeSupported) {
usbConnection.close(); usbConnection.close();
usbConnection = null; usbConnection = null;
throw new UnsupportedUsbTokenException(); throw new UnsupportedUsbTokenException();

View File

@@ -25,11 +25,8 @@ package org.sufficientlysecure.keychain.ui.base;
import java.io.IOException; import java.io.IOException;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.nfc.NfcAdapter; import android.nfc.NfcAdapter;
import android.nfc.Tag; import android.nfc.Tag;
import android.nfc.TagLostException; 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.Log;
import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Passphrase;
public abstract class BaseSecurityTokenActivity extends BaseActivity public abstract class BaseSecurityTokenActivity extends BaseActivity
implements OnDiscoveredTagListener, UsbConnectionDispatcher.OnDiscoveredUsbDeviceListener { implements OnDiscoveredTagListener, UsbConnectionDispatcher.OnDiscoveredUsbDeviceListener {
public static final int REQUEST_CODE_PIN = 1; public static final int REQUEST_CODE_PIN = 1;
@@ -114,6 +112,7 @@ public abstract class BaseSecurityTokenActivity extends BaseActivity
onSecurityTokenError(error); onSecurityTokenError(error);
} }
@Override
public void tagDiscovered(Tag tag) { public void tagDiscovered(Tag tag) {
// Actual NFC operations are executed in doInBackground to not block the UI thread // Actual NFC operations are executed in doInBackground to not block the UI thread
if (!mTagHandlingEnabled) { if (!mTagHandlingEnabled) {
@@ -124,15 +123,13 @@ public abstract class BaseSecurityTokenActivity extends BaseActivity
securityTokenDiscovered(nfcTransport); 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 // Actual USB operations are executed in doInBackground to not block the UI thread
if (!mTagHandlingEnabled) { if (!mTagHandlingEnabled) {
return; return;
} }
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbTransport usbTransport = new UsbTransport(usbDevice, usbManager);
securityTokenDiscovered(usbTransport); securityTokenDiscovered(usbTransport);
} }