diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java index 2c1f2e1cf..e915c1852 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java @@ -155,6 +155,41 @@ public class ImportExportOperation extends BaseOperation { // Otherwise, we need to fetch the data from a server first else { + // We fetch from keyservers first, because we tend to get more certificates + // from there, so the number of certificates which are merged in later is smaller. + + // If we have a keyServerUri and a fingerprint or at least a keyId, + // download from HKP + if (keyServerUri != null + && (entry.mKeyIdHex != null || entry.mExpectedFingerprint != null)) { + // Make sure we have the keyserver instance cached + if (keyServer == null) { + log.add(LogType.MSG_IMPORT_KEYSERVER, 1, keyServerUri); + keyServer = new HkpKeyserver(keyServerUri); + } + + try { + byte[] data; + // Download by fingerprint, or keyId - whichever is available + if (entry.mExpectedFingerprint != null) { + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" + entry.mExpectedFingerprint.substring(24)); + data = keyServer.get("0x" + entry.mExpectedFingerprint).getBytes(); + } else { + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, entry.mKeyIdHex); + data = keyServer.get(entry.mKeyIdHex).getBytes(); + } + key = UncachedKeyRing.decodeFromData(data); + if (key != null) { + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_OK, 3); + } else { + log.add(LogType.MSG_IMPORT_FETCH_ERROR_DECODE, 3); + } + } catch (Keyserver.QueryFailedException e) { + Log.e(Constants.TAG, "query failed", e); + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3); + } + } + // If we have a keybase name, try to fetch from there if (entry.mKeybaseName != null) { // Make sure we have this cached @@ -163,50 +198,33 @@ public class ImportExportOperation extends BaseOperation { } try { + log.add(LogType.MSG_IMPORT_FETCH_KEYBASE, 2, entry.mKeybaseName); byte[] data = keybaseServer.get(entry.mKeybaseName).getBytes(); key = UncachedKeyRing.decodeFromData(data); - } catch (Keyserver.QueryFailedException e) { - // download failed, too bad. just proceed - } - } - - // If we have a keyServerUri and a fingerprint or at least a keyId, - // download from HKP - if (keyServerUri != null - && (entry.mKeyIdHex != null || entry.mExpectedFingerprint != null)) { - // Make sure we have the keyserver instance cached - if (keyServer == null) { - keyServer = new HkpKeyserver(keyServerUri); - } - - try { - byte[] data; - // Download by fingerprint, or keyId - whichever is available - if (entry.mExpectedFingerprint != null) { - data = keyServer.get("0x" + entry.mExpectedFingerprint).getBytes(); - } else { - data = keyServer.get(entry.mKeyIdHex).getBytes(); - } // If there already is a key (of keybase origin), merge the two if (key != null) { + log.add(LogType.MSG_IMPORT_MERGE, 3); UncachedKeyRing merged = UncachedKeyRing.decodeFromData(data); - // TODO log pollution? - merged = key.merge(merged, log, 2); + merged = key.merge(merged, log, 4); // If the merge didn't fail, use the new merged key if (merged != null) { key = merged; } } else { + log.add(LogType.MSG_IMPORT_FETCH_ERROR_DECODE, 3); key = UncachedKeyRing.decodeFromData(data); } } catch (Keyserver.QueryFailedException e) { - break; + // download failed, too bad. just proceed + Log.e(Constants.TAG, "query failed", e); + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER_ERROR, 3); } } } if (key == null) { + log.add(LogType.MSG_IMPORT_FETCH_ERROR, 2); badKeys += 1; continue; } @@ -214,13 +232,11 @@ public class ImportExportOperation extends BaseOperation { // If we have an expected fingerprint, make sure it matches if (entry.mExpectedFingerprint != null) { if(!KeyFormattingUtils.convertFingerprintToHex(key.getFingerprint()).equals(entry.mExpectedFingerprint)) { - Log.d(Constants.TAG, "fingerprint: " + KeyFormattingUtils.convertFingerprintToHex(key.getFingerprint())); - Log.d(Constants.TAG, "expected fingerprint: " + entry.mExpectedFingerprint); - Log.e(Constants.TAG, "Actual key fingerprint is not the same as expected!"); + log.add(LogType.MSG_IMPORT_FINGERPRINT_ERROR, 2); badKeys += 1; continue; } else { - Log.d(Constants.TAG, "Actual key fingerprint matches expected one."); + log.add(LogType.MSG_IMPORT_FINGERPRINT_OK, 2); } } @@ -252,7 +268,7 @@ public class ImportExportOperation extends BaseOperation { importedMasterKeyIds.add(key.getMasterKeyId()); } - log.add(result, 1); + log.add(result, 2); } catch (IOException e) { Log.e(Constants.TAG, "Encountered bad key on import!", e); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java index 9d04dec38..aa360609f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/results/OperationResult.java @@ -581,6 +581,17 @@ public abstract class OperationResult implements Parcelable { MSG_CRT_WARN_SAVE_FAILED (LogLevel.WARN, R.string.msg_crt_warn_save_failed), MSG_IMPORT (LogLevel.START, R.plurals.msg_import), + + MSG_IMPORT_FETCH_ERROR (LogLevel.ERROR, R.string.msg_import_fetch_error), + MSG_IMPORT_FETCH_ERROR_DECODE (LogLevel.ERROR, R.string.msg_import_fetch_error_decode), + MSG_IMPORT_FETCH_KEYSERVER (LogLevel.INFO, R.string.msg_import_fetch_keyserver), + MSG_IMPORT_FETCH_KEYSERVER_OK (LogLevel.DEBUG, R.string.msg_import_fetch_keyserver_ok), + MSG_IMPORT_FETCH_KEYSERVER_ERROR (LogLevel.ERROR, R.string.msg_import_fetch_keyserver_error), + MSG_IMPORT_FETCH_KEYBASE (LogLevel.INFO, R.string.msg_import_fetch_keybase), + MSG_IMPORT_KEYSERVER (LogLevel.DEBUG, R.string.msg_import_keyserver), + MSG_IMPORT_MERGE (LogLevel.DEBUG, R.string.msg_import_merge), + MSG_IMPORT_FINGERPRINT_ERROR (LogLevel.ERROR, R.string.msg_import_fingerprint_error), + MSG_IMPORT_FINGERPRINT_OK (LogLevel.DEBUG, R.string.msg_import_fingerprint_ok), MSG_IMPORT_ERROR (LogLevel.ERROR, R.string.msg_import_error), MSG_IMPORT_PARTIAL (LogLevel.ERROR, R.string.msg_import_partial), MSG_IMPORT_SUCCESS (LogLevel.OK, R.string.msg_import_success), diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java index 6166faf10..2baebc83d 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/LogDisplayFragment.java @@ -133,6 +133,8 @@ public class LogDisplayFragment extends ListFragment implements OnItemClickListe ih.mSub.setVisibility(View.VISIBLE); convertView.setClickable(false); + convertView.setPadding((entry.mIndent) * dipFactor, 0, 0, 0); + OperationResult result = ((SubLogEntryParcel) entry).getSubResult(); LogEntryParcel subEntry = result.getLog().getLast(); if (subEntry != null) { diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index b6de54c14..87c0acd6a 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -941,6 +941,16 @@ "Importing key" "Importing %d keys" + "Error decoding retrieved keyring!" + "Key could not be retrieved! (Network problems?)" + "Retrieving from keybase.io: %s" + "Could not retrieve key from keybase!" + "Retrieving from keyserver: %s" + "Key retrieval successful" + "Using keyserver %s" + "Fingerprint of fetched key didn't match expected!" + "Fingerprint check OK" + "Merging keys…" "Import operation failed!" "Import operation successful, with errors!" "Import operation successful"