aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java73
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java52
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java23
4 files changed, 113 insertions, 37 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
index 4cb6c69e0..94eaa8171 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -57,6 +57,9 @@ public class ImportKeysProxyActivity extends FragmentActivity {
public static final String ACTION_QR_CODE_API = OpenKeychainIntents.IMPORT_KEY_FROM_QR_CODE;
public static final String ACTION_SCAN_WITH_RESULT = Constants.INTENT_PREFIX + "SCAN_QR_CODE_WITH_RESULT";
+ public static final String ACTION_SCAN_IMPORT = Constants.INTENT_PREFIX + "SCAN_QR_CODE_IMPORT";
+
+ public static final String EXTRA_FINGERPRINT = "fingerprint";
boolean returnResult;
@@ -78,10 +81,15 @@ public class ImportKeysProxyActivity extends FragmentActivity {
// Scanning a fingerprint directly with Barcode Scanner, thus we already have scanned
returnResult = false;
- startCertify(dataUri);
+ processScannedContent(dataUri);
+ } else if (ACTION_SCAN_IMPORT.equals(action)) {
+ returnResult = false;
+ IntentIntegrator integrator = new IntentIntegrator(this);
+ integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)
+ .setPrompt(getString(R.string.import_qr_code_text))
+ .setResultDisplayDuration(0)
+ .initiateScan();
} else if (ACTION_SCAN_WITH_RESULT.equals(action)) {
- // scan using xzing's Barcode Scanner and return result parcel in OpenKeychain
-
returnResult = true;
IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES)
@@ -113,16 +121,16 @@ public class ImportKeysProxyActivity extends FragmentActivity {
if (requestCode == IntentIntegratorSupportV4.REQUEST_CODE) {
IntentResult scanResult = IntentIntegratorSupportV4.parseActivityResult(requestCode,
resultCode, data);
- if (scanResult != null && scanResult.getFormatName() != null) {
- String scannedContent = scanResult.getContents();
- Log.d(Constants.TAG, "scannedContent: " + scannedContent);
- startCertify(Uri.parse(scanResult.getContents()));
- } else {
+ if (scanResult == null || scanResult.getFormatName() == null) {
Log.e(Constants.TAG, "scanResult or formatName null! Should not happen!");
finish();
+ return;
}
+ String scannedContent = scanResult.getContents();
+ processScannedContent(scannedContent);
+
return;
}
// if a result has been returned, return it down to other activity
@@ -134,6 +142,41 @@ public class ImportKeysProxyActivity extends FragmentActivity {
}
}
+ private void processScannedContent(String content) {
+ Uri uri = Uri.parse(content);
+ processScannedContent(uri);
+ }
+
+ private void processScannedContent(Uri uri) {
+
+ Log.d(Constants.TAG, "scanned: " + uri.toString());
+
+ String fingerprint = null;
+
+ // example: openpgp4fpr:73EE2314F65FA92EC2390D3A718C070100012282
+ if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals(Constants.FINGERPRINT_SCHEME)) {
+ fingerprint = uri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
+ }
+
+ if (fingerprint == null) {
+ SingletonResult result = new SingletonResult(
+ SingletonResult.RESULT_ERROR, OperationResult.LogType.MSG_WRONG_QR_CODE);
+ Intent intent = new Intent();
+ intent.putExtra(SingletonResult.EXTRA_RESULT, result);
+ returnResult(intent);
+ return;
+ }
+
+ if (returnResult) {
+ Intent result = new Intent();
+ result.putExtra(EXTRA_FINGERPRINT, fingerprint);
+ setResult(RESULT_OK, result);
+ finish();
+ } else {
+ importKeys(fingerprint);
+ }
+ }
+
public void returnResult(Intent data) {
if (returnResult) {
setResult(RESULT_OK, data);
@@ -147,20 +190,6 @@ public class ImportKeysProxyActivity extends FragmentActivity {
}
}
- public void startCertify(Uri dataUri) {
- // example: openpgp4fpr:73EE2314F65FA92EC2390D3A718C070100012282
- if (dataUri.getScheme().equals(Constants.FINGERPRINT_SCHEME)) {
- String fingerprint = dataUri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
- importKeys(fingerprint);
- } else {
- SingletonResult result = new SingletonResult(
- SingletonResult.RESULT_ERROR, OperationResult.LogType.MSG_WRONG_QR_CODE);
- Intent intent = new Intent();
- intent.putExtra(SingletonResult.EXTRA_RESULT, result);
- returnResult(intent);
- }
- }
-
public void importKeys(byte[] keyringData) {
ParcelableKeyRing keyEntry = new ParcelableKeyRing(keyringData);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 496048582..b56da463a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -527,7 +527,7 @@ public class KeyListFragment extends LoaderFragment
private void scanQrCode() {
Intent scanQrCode = new Intent(getActivity(), ImportKeysProxyActivity.class);
- scanQrCode.setAction(ImportKeysProxyActivity.ACTION_SCAN_WITH_RESULT);
+ scanQrCode.setAction(ImportKeysProxyActivity.ACTION_SCAN_IMPORT);
startActivityForResult(scanQrCode, 0);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index f7d402c0b..3bc207419 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -88,6 +88,8 @@ import java.util.HashMap;
public class ViewKeyActivity extends BaseActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
+ static final int REQUEST_QR_FINGERPRINT = 1;
+
ExportHelper mExportHelper;
ProviderHelper mProviderHelper;
@@ -122,6 +124,8 @@ public class ViewKeyActivity extends BaseActivity implements
private boolean mIsRefreshing;
private Animation mRotate, mRotateSpin;
private View mRefresh;
+ private String mFingerprint;
+ private long mMasterKeyId;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -380,13 +384,24 @@ public class ViewKeyActivity extends BaseActivity implements
private void scanQrCode() {
Intent scanQrCode = new Intent(this, ImportKeysProxyActivity.class);
scanQrCode.setAction(ImportKeysProxyActivity.ACTION_SCAN_WITH_RESULT);
- startActivityForResult(scanQrCode, 0);
+ startActivityForResult(scanQrCode, REQUEST_QR_FINGERPRINT);
}
private void certifyFingeprint(Uri dataUri) {
Intent intent = new Intent(this, CertifyFingerprintActivity.class);
intent.setData(dataUri);
+ startCertifyIntent(intent);
+ }
+
+ private void certifyImmediate() {
+ Intent intent = new Intent(this, CertifyKeyActivity.class);
+ intent.putExtra(CertifyKeyActivity.EXTRA_KEY_IDS, new long[]{ mMasterKeyId });
+
+ startCertifyIntent(intent);
+ }
+
+ private void startCertifyIntent (Intent intent) {
// Message is received after signing is done in KeychainIntentService
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(this) {
public void handleMessage(Message message) {
@@ -456,7 +471,31 @@ public class ViewKeyActivity extends BaseActivity implements
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // if a result has been returned, display a notify
+ if (requestCode == REQUEST_QR_FINGERPRINT && resultCode == Activity.RESULT_OK) {
+
+ // If there is an EXTRA_RESULT, that's an error. Just show it.
+ if (data.hasExtra(OperationResult.EXTRA_RESULT)) {
+ OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
+ result.createNotify(this).show();
+ return;
+ }
+
+ String fp = data.getStringExtra(ImportKeysProxyActivity.EXTRA_FINGERPRINT);
+ if (fp == null) {
+ Notify.createNotify(this, "Error scanning fingerprint!",
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show();
+ return;
+ }
+ if (mFingerprint.equalsIgnoreCase(fp)) {
+ certifyImmediate();
+ } else {
+ Notify.createNotify(this, "Fingerprints did not match!",
+ Notify.LENGTH_LONG, Notify.Style.ERROR).show();
+ }
+
+ return;
+ }
+
if (data != null && data.hasExtra(OperationResult.EXTRA_RESULT)) {
OperationResult result = data.getParcelableExtra(OperationResult.EXTRA_RESULT);
result.createNotify(this).show();
@@ -764,7 +803,8 @@ public class ViewKeyActivity extends BaseActivity implements
mName.setText(R.string.user_id_no_name);
}
- String fingerprint = KeyFormattingUtils.convertFingerprintToHex(data.getBlob(INDEX_FINGERPRINT));
+ mMasterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
+ mFingerprint = KeyFormattingUtils.convertFingerprintToHex(data.getBlob(INDEX_FINGERPRINT));
mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
mHasEncrypt = data.getInt(INDEX_HAS_ENCRYPT) != 0;
@@ -826,8 +866,8 @@ public class ViewKeyActivity extends BaseActivity implements
mStatusText.setText(R.string.view_key_my_key);
mStatusImage.setVisibility(View.GONE);
color = getResources().getColor(R.color.primary);
- photoTask.execute(fingerprint);
- loadQrCode(fingerprint);
+ photoTask.execute(mFingerprint);
+ loadQrCode(mFingerprint);
mQrCodeLayout.setVisibility(View.VISIBLE);
// and place leftOf qr code
@@ -873,7 +913,7 @@ public class ViewKeyActivity extends BaseActivity implements
KeyFormattingUtils.setStatusImage(this, mStatusImage, mStatusText,
KeyFormattingUtils.STATE_VERIFIED, R.color.icons, true);
color = getResources().getColor(R.color.primary);
- photoTask.execute(fingerprint);
+ photoTask.execute(mFingerprint);
mFab.setVisibility(View.GONE);
} else {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
index 8686b605f..3bc29edb6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/util/Notify.java
@@ -100,18 +100,25 @@ public class Notify {
return createNotify(activity, activity.getString(resId), duration, style, listener, resIdAction);
}
+ public static Showable createNotify(Activity activity, String msg, int duration, Style style) {
+ return createNotify(activity, msg, duration, style, null, 0);
+ }
+
public static Showable createNotify(Activity activity, String msg, int duration, Style style,
final ActionListener listener, int resIdAction) {
final Snackbar bar = getSnackbar(activity)
- .text(msg)
- .actionLabel(resIdAction)
- .actionListener(new ActionClickListener() {
- @Override
- public void onActionClicked(Snackbar snackbar) {
- listener.onAction();
- }
- });
+ .text(msg);
+
+ if (listener != null) {
+ bar.actionLabel(resIdAction);
+ bar.actionListener(new ActionClickListener() {
+ @Override
+ public void onActionClicked(Snackbar snackbar) {
+ listener.onAction();
+ }
+ });
+ }
if (duration == LENGTH_INDEFINITE) {
bar.duration(SnackbarDuration.LENGTH_INDEFINITE);