yubikey: don't assume signing key is masterKeyId in ViewKeyActivity

Conflicts:
	OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
This commit is contained in:
Vincent Breitmoser 2015-05-15 01:04:25 +02:00
parent b509c3ed39
commit d06ae7f691
2 changed files with 51 additions and 39 deletions

View File

@ -193,13 +193,19 @@ public class CreateKeyYubiKeyImportFragment extends Fragment implements NfcListe
ImportKeyResult result = ImportKeyResult result =
returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT); returnData.getParcelable(DecryptVerifyResult.EXTRA_RESULT);
if (!result.success()) { long[] masterKeyIds = result.getImportedMasterKeyIds();
// TODO handle masterKeyIds.length != 1...? sorta outlandish scenario
if (!result.success() || masterKeyIds.length == 0) {
result.createNotify(getActivity()).show(); result.createNotify(getActivity()).show();
return; return;
} }
Intent intent = new Intent(getActivity(), ViewKeyActivity.class); Intent intent = new Intent(getActivity(), ViewKeyActivity.class);
intent.setData(KeyRings.buildGenericKeyRingUri(mNfcMasterKeyId)); // use the imported masterKeyId, not the one from the yubikey, because
// that one might* just have been a subkey of the imported key
intent.setData(KeyRings.buildGenericKeyRingUri(masterKeyIds[0]));
intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result); intent.putExtra(ViewKeyActivity.EXTRA_DISPLAY_RESULT, result);
intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid); intent.putExtra(ViewKeyActivity.EXTRA_NFC_AID, mNfcAid);
intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId); intent.putExtra(ViewKeyActivity.EXTRA_NFC_USER_ID, mNfcUserId);

View File

@ -535,14 +535,23 @@ public class ViewKeyActivity extends BaseNfcActivity implements
final String nfcUserId = nfcGetUserId(); final String nfcUserId = nfcGetUserId();
final byte[] nfcAid = nfcGetAid(); final byte[] nfcAid = nfcGetAid();
String fp = KeyFormattingUtils.convertFingerprintToHex(nfcFingerprints); long yubiKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(nfcFingerprints);
final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(nfcFingerprints);
if (!mFingerprint.equals(fp)) {
try { try {
CachedPublicKeyRing ring = mProviderHelper.getCachedPublicKeyRing(masterKeyId);
ring.getMasterKeyId();
// if the yubikey matches a subkey in any key
CachedPublicKeyRing ring = mProviderHelper.getCachedPublicKeyRing(
KeyRings.buildUnifiedKeyRingsFindBySubkeyUri(yubiKeyId));
byte[] candidateFp = ring.getFingerprint();
// if the master key of that key matches this one, just show the yubikey dialog
if (KeyFormattingUtils.convertFingerprintToHex(candidateFp).equals(mFingerprint)) {
showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid);
return;
}
// otherwise, offer to go to that key
final long masterKeyId = KeyFormattingUtils.getKeyIdFromFingerprint(candidateFp);
Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG, Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
Style.WARN, new ActionListener() { Style.WARN, new ActionListener() {
@Override @Override
@ -557,8 +566,8 @@ public class ViewKeyActivity extends BaseNfcActivity implements
finish(); finish();
} }
}, R.string.snack_yubikey_view).show(); }, R.string.snack_yubikey_view).show();
return;
// and if it's not found, offer import
} catch (PgpKeyNotFoundException e) { } catch (PgpKeyNotFoundException e) {
Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG, Notify.create(this, R.string.snack_yubi_other, Notify.LENGTH_LONG,
Style.WARN, new ActionListener() { Style.WARN, new ActionListener() {
@ -573,11 +582,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements
finish(); finish();
} }
}, R.string.snack_yubikey_import).show(); }, R.string.snack_yubikey_import).show();
return;
} }
}
showYubiKeyFragment(nfcFingerprints, nfcUserId, nfcAid);
} }
@ -794,6 +799,7 @@ public class ViewKeyActivity extends BaseNfcActivity implements
// old cursor once we return.) // old cursor once we return.)
switch (loader.getId()) { switch (loader.getId()) {
case LOADER_ID_UNIFIED: { case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) { if (data.moveToFirst()) {
// get name, email, and comment from USER_ID // get name, email, and comment from USER_ID
KeyRing.UserId mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID)); KeyRing.UserId mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));