From f4a8e71c338c03642514aba2026156d541d3eab8 Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:07:44 +0200
Subject: [PATCH 01/19] Make keybase lookup works for key ids starting with 0x
---
.../keychain/keyimport/KeybaseKeyServer.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index 7ffe123c0..442cecef2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -41,6 +41,11 @@ public class KeybaseKeyServer extends KeyServer {
InsufficientQuery {
ArrayList results = new ArrayList();
+ if (query.startsWith("0x")) {
+ // cut off "0x" if a user is searching for a key id
+ query = query.substring(2);
+ }
+
JSONObject fromQuery = getFromKeybase("_/api/1.0/user/autocomplete.json?q=", query);
try {
@@ -158,4 +163,4 @@ public class KeybaseKeyServer extends KeyServer {
public void add(String armoredKey) throws AddKeyException {
throw new AddKeyException();
}
-}
\ No newline at end of file
+}
From d50e798c13a6429f3a90341ee239f60cac832f1e Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:08:33 +0200
Subject: [PATCH 02/19] List full keybase id or strong key id matches on top
---
.../keychain/keyimport/KeybaseKeyServer.java | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index 442cecef2..6fd4c3975 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -55,10 +55,19 @@ public class KeybaseKeyServer extends KeyServer {
// only list them if they have a key
if (JWalk.optObject(match, "components", "key_fingerprint") != null) {
- results.add(makeEntry(match));
+ String keybaseId = JWalk.getString(match, "components", "username", "val");
+ String fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
+ fingerprint = fingerprint.replace(" ", "").toUpperCase();
+
+ if (keybaseId.equals(query) || fingerprint.startsWith(query.toUpperCase())) {
+ results.add(makeEntry(match));
+ } else {
+ results.add(makeEntry(match));
+ }
}
}
} catch (Exception e) {
+ Log.e(Constants.TAG, "keybase result parsing error", e);
throw new QueryException("Unexpected structure in keybase search result: " + e.getMessage());
}
From 61622471557dc1f67a1465ca8fcace7604a8c1a7 Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:13:00 +0200
Subject: [PATCH 03/19] Add extraData property in ImportKeyListEntry
This allows any KeyServer to store some extra data it might need.
In the case of KeybaseKeyServer it is the username, which then can
be grabbed directly, without the hack of storing it as userId.
---
.../keychain/keyimport/ImportKeysListEntry.java | 11 +++++++++++
.../keychain/keyimport/KeybaseKeyServer.java | 13 +++++++------
.../keychain/service/KeychainIntentService.java | 4 ++--
3 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index 1199290e0..60416c3d0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -50,6 +50,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
public String algorithm;
public boolean secretKey;
public String mPrimaryUserId;
+ private String mExtraData;
private boolean mSelected;
@@ -74,6 +75,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
dest.writeByte((byte) (mSelected ? 1 : 0));
dest.writeInt(mBytes.length);
dest.writeByteArray(mBytes);
+ dest.writeString(mExtraData);
}
public static final Creator CREATOR = new Creator() {
@@ -93,6 +95,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
vr.mSelected = source.readByte() == 1;
vr.mBytes = new byte[source.readInt()];
source.readByteArray(vr.mBytes);
+ vr.mExtraData = source.readString();
return vr;
}
@@ -198,6 +201,14 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
mPrimaryUserId = uid;
}
+ public String getExtraData() {
+ return mExtraData;
+ }
+
+ public void setExtraData(String extraData) {
+ mExtraData = extraData;
+ }
+
/**
* Constructor for later querying from keyserver
*/
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index 6fd4c3975..d1755fa12 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -74,13 +74,13 @@ public class KeybaseKeyServer extends KeyServer {
return results;
}
- private JSONObject getUser(String keybaseID) throws QueryException {
+ private JSONObject getUser(String keybaseId) throws QueryException {
try {
- return getFromKeybase("_/api/1.0/user/lookup.json?username=", keybaseID);
+ return getFromKeybase("_/api/1.0/user/lookup.json?username=", keybaseId);
} catch (Exception e) {
String detail = "";
- if (keybaseID != null) {
- detail = ". Query was for user '" + keybaseID + "'";
+ if (keybaseId != null) {
+ detail = ". Query was for user '" + keybaseId + "'";
}
throw new QueryException(e.getMessage() + detail);
}
@@ -88,12 +88,14 @@ public class KeybaseKeyServer extends KeyServer {
private ImportKeysListEntry makeEntry(JSONObject match) throws QueryException, JSONException {
- String keybaseID = JWalk.getString(match, "components", "username", "val");
String key_fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
key_fingerprint = key_fingerprint.replace(" ", "").toUpperCase();
match = getUser(keybaseID);
final ImportKeysListEntry entry = new ImportKeysListEntry();
+ String keybaseId = JWalk.getString(match, "components", "username", "val");
+ // store extra info, so we can query for the keybase id directly
+ entry.setExtraData(keybaseId);
// TODO: Fix; have suggested keybase provide this value to avoid search-time crypto calls
entry.setBitStrength(4096);
@@ -116,7 +118,6 @@ public class KeybaseKeyServer extends KeyServer {
ArrayList userIds = new ArrayList();
String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>";
userIds.add(name);
- userIds.add(keybaseID);
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
return entry;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index f1e30c560..ca4f5869b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -749,8 +749,8 @@ public class KeychainIntentService extends IntentService
KeybaseKeyServer server = new KeybaseKeyServer();
for (ImportKeysListEntry entry : entries) {
// the keybase handle is in userId(1)
- String keybaseID = entry.getUserIds().get(1);
- byte[] downloadedKeyBytes = server.get(keybaseID).getBytes();
+ String keybaseId = entry.getExtraData();
+ byte[] downloadedKeyBytes = server.get(keybaseId).getBytes();
// create PGPKeyRing object based on downloaded armored key
PGPKeyRing downloadedKey = null;
From 056a6dd3479fe1e5cc5981ac51a458b015d3e9cb Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:14:02 +0200
Subject: [PATCH 04/19] Don't guess keybase key algorithm and size
Once keybase reports them, we can display them. Until then we simply
don't know and shouldn't lie about it.
---
.../keychain/keyimport/KeybaseKeyServer.java | 6 ++----
.../keychain/ui/adapter/ImportKeysAdapter.java | 7 ++++++-
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index d1755fa12..da47c32c6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -98,10 +98,8 @@ public class KeybaseKeyServer extends KeyServer {
entry.setExtraData(keybaseId);
// TODO: Fix; have suggested keybase provide this value to avoid search-time crypto calls
- entry.setBitStrength(4096);
- entry.setAlgorithm("RSA");
- entry.setKeyIdHex("0x" + key_fingerprint);
- entry.setRevoked(false);
+ //entry.setBitStrength(4096);
+ //entry.setAlgorithm("RSA");
// ctime
final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime");
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index 9d323c822..70b9f3f7e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -153,7 +153,12 @@ public class ImportKeysAdapter extends ArrayAdapter {
holder.fingerprint.setVisibility(View.GONE);
}
- holder.algorithm.setText("" + entry.bitStrength + "/" + entry.algorithm);
+ if (entry.bitStrength != 0 && entry.algorithm != null) {
+ holder.algorithm.setText("" + entry.bitStrength + "/" + entry.algorithm);
+ holder.algorithm.setVisibility(View.VISIBLE);
+ } else {
+ holder.algorithm.setVisibility(View.INVISIBLE);
+ }
if (entry.revoked) {
holder.status.setVisibility(View.VISIBLE);
From 2480844884ecffcd0d407a9d967b062ac8950462 Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:17:20 +0200
Subject: [PATCH 05/19] Cleanup keybase query a bit
Remove ctime and the cached key, making the query for the entire user
object unnecessary. This should only be done when the user decides to
import the key. Hopefully keybase.io can provide all info necessary in
the search results.
---
.../keychain/keyimport/KeybaseKeyServer.java | 29 +++++++++----------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index da47c32c6..57355d808 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -88,12 +88,14 @@ public class KeybaseKeyServer extends KeyServer {
private ImportKeysListEntry makeEntry(JSONObject match) throws QueryException, JSONException {
- String key_fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
- key_fingerprint = key_fingerprint.replace(" ", "").toUpperCase();
- match = getUser(keybaseID);
-
final ImportKeysListEntry entry = new ImportKeysListEntry();
String keybaseId = JWalk.getString(match, "components", "username", "val");
+ String fullName = JWalk.getString(match, "components", "full_name", "val");
+ String fingerprint = JWalk.getString(match, "components", "key_fingerprint", "val");
+ fingerprint = fingerprint.replace(" ", "").toUpperCase();
+
+ // in anticipation of a full fingerprint, only use the last 16 chars as 64-bit key id
+ entry.setKeyIdHex("0x" + fingerprint.substring(Math.max(0, fingerprint.length() - 16)));
// store extra info, so we can query for the keybase id directly
entry.setExtraData(keybaseId);
@@ -101,20 +103,17 @@ public class KeybaseKeyServer extends KeyServer {
//entry.setBitStrength(4096);
//entry.setAlgorithm("RSA");
- // ctime
- final long creationDate = JWalk.getLong(match, "them", "public_keys", "primary", "ctime");
- final GregorianCalendar tmpGreg = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
- tmpGreg.setTimeInMillis(creationDate * 1000);
- entry.setDate(tmpGreg.getTime());
+ entry.setFingerprintHex(fingerprint);
- // key bits
- // we have to fetch the user object to construct the search-result list, so we might as
- // well (weakly) remember the key, in case they try to import it
- mKeyCache.put(keybaseID, JWalk.getString(match,"them", "public_keys", "primary", "bundle"));
+ // key data
+ // currently there's no need to query the user right away, and it should be avoided, so the
+ // user doesn't experience lag and doesn't download many keys unnecessarily, but should we
+ // require to do it at soe point:
+ // (weakly) remember the key, in case the user tries to import it
+ //mKeyCache.put(keybaseId, JWalk.getString(match, "them", "public_keys", "primary", "bundle"));
- // String displayName = JWalk.getString(match, "them", "profile", "full_name");
ArrayList userIds = new ArrayList();
- String name = "keybase.io/" + keybaseID + " <" + keybaseID + "@keybase.io>";
+ String name = fullName + " ";
userIds.add(name);
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
From 73acb69208ea3cae0a98786a2352e0dd58c2a445 Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 14:19:07 +0200
Subject: [PATCH 06/19] Add github, twitter, website info for keybase keys
The very point of keybase.io is the identification and proven link
to those identities, so it should be nice to have them.
The display is a bit basic still, as it just adds them as userIds,
I'm sure this can be prettified, perhaps with logos?
---
.../keychain/keyimport/KeybaseKeyServer.java | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
index 57355d808..953cf3cbb 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/KeybaseKeyServer.java
@@ -115,6 +115,23 @@ public class KeybaseKeyServer extends KeyServer {
ArrayList userIds = new ArrayList();
String name = fullName + " ";
userIds.add(name);
+ try {
+ userIds.add("github.com/" + JWalk.getString(match, "components", "github", "val"));
+ } catch (JSONException e) {
+ // ignore
+ }
+ try {
+ userIds.add("twitter.com/" + JWalk.getString(match, "components", "twitter", "val"));
+ } catch (JSONException e) {
+ // ignore
+ }
+ try {
+ JSONArray array = JWalk.getArray(match, "components", "websites");
+ JSONObject website = array.getJSONObject(0);
+ userIds.add(JWalk.getString(website, "val"));
+ } catch (JSONException e) {
+ // ignore
+ }
entry.setUserIds(userIds);
entry.setPrimaryUserId(name);
return entry;
From b8462de6e53a0e6a54e124ddc5da68abcae4d8bf Mon Sep 17 00:00:00 2001
From: Thialfihar
Date: Wed, 14 May 2014 17:18:46 +0200
Subject: [PATCH 07/19] Rename fingerPrint to fingerprint
---
.../keychain/keyimport/HkpKeyServer.java | 2 +-
.../keychain/keyimport/ImportKeysListEntry.java | 16 ++++++++--------
.../keychain/service/KeychainIntentService.java | 8 ++++----
.../keychain/ui/adapter/ImportKeysAdapter.java | 4 ++--
.../ui/adapter/ImportKeysListServerLoader.java | 2 +-
5 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java
index 85ce6bfcc..8d1e1f460 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyServer.java
@@ -247,7 +247,7 @@ public class HkpKeyServer extends KeyServer {
// see http://bit.ly/1d4bxbk and http://bit.ly/1gD1wwr
String fingerprintOrKeyId = matcher.group(1);
if (fingerprintOrKeyId.length() > 16) {
- entry.setFingerPrintHex(fingerprintOrKeyId.toLowerCase(Locale.US));
+ entry.setFingerprintHex(fingerprintOrKeyId.toLowerCase(Locale.US));
entry.setKeyIdHex("0x" + fingerprintOrKeyId.substring(fingerprintOrKeyId.length()
- 16, fingerprintOrKeyId.length()));
} else {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index 60416c3d0..4a8d58e56 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -45,7 +45,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
public String keyIdHex;
public boolean revoked;
public Date date; // TODO: not displayed
- public String fingerPrintHex;
+ public String fingerprintHex;
public int bitStrength;
public String algorithm;
public boolean secretKey;
@@ -67,7 +67,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
dest.writeLong(keyId);
dest.writeByte((byte) (revoked ? 1 : 0));
dest.writeSerializable(date);
- dest.writeString(fingerPrintHex);
+ dest.writeString(fingerprintHex);
dest.writeString(keyIdHex);
dest.writeInt(bitStrength);
dest.writeString(algorithm);
@@ -87,7 +87,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
vr.keyId = source.readLong();
vr.revoked = source.readByte() == 1;
vr.date = (Date) source.readSerializable();
- vr.fingerPrintHex = source.readString();
+ vr.fingerprintHex = source.readString();
vr.keyIdHex = source.readString();
vr.bitStrength = source.readInt();
vr.algorithm = source.readString();
@@ -153,12 +153,12 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
this.date = date;
}
- public String getFingerPrintHex() {
- return fingerPrintHex;
+ public String getFingerprintHex() {
+ return fingerprintHex;
}
- public void setFingerPrintHex(String fingerPrintHex) {
- this.fingerPrintHex = fingerPrintHex;
+ public void setFingerprintHex(String fingerprintHex) {
+ this.fingerprintHex = fingerprintHex;
}
public int getBitStrength() {
@@ -271,7 +271,7 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
this.keyIdHex = PgpKeyHelper.convertKeyIdToHex(keyId);
this.revoked = key.isRevoked();
- this.fingerPrintHex = PgpKeyHelper.convertFingerprintToHex(key.getFingerprint());
+ this.fingerprintHex = PgpKeyHelper.convertFingerprintToHex(key.getFingerprint());
this.bitStrength = key.getBitStrength();
final int algorithm = key.getAlgorithm();
this.algorithm = PgpKeyHelper.getAlgorithmInfo(context, algorithm);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
index ca4f5869b..805bb9dad 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeychainIntentService.java
@@ -802,8 +802,8 @@ public class KeychainIntentService extends IntentService
for (ImportKeysListEntry entry : entries) {
// if available use complete fingerprint for get request
byte[] downloadedKeyBytes;
- if (entry.getFingerPrintHex() != null) {
- downloadedKeyBytes = server.get("0x" + entry.getFingerPrintHex()).getBytes();
+ if (entry.getFingerprintHex() != null) {
+ downloadedKeyBytes = server.get("0x" + entry.getFingerprintHex()).getBytes();
} else {
downloadedKeyBytes = server.get(entry.getKeyIdHex()).getBytes();
}
@@ -829,10 +829,10 @@ public class KeychainIntentService extends IntentService
}
// verify downloaded key by comparing fingerprints
- if (entry.getFingerPrintHex() != null) {
+ if (entry.getFingerprintHex() != null) {
String downloadedKeyFp = PgpKeyHelper.convertFingerprintToHex(
downloadedKey.getPublicKey().getFingerprint());
- if (downloadedKeyFp.equals(entry.getFingerPrintHex())) {
+ if (downloadedKeyFp.equals(entry.getFingerprintHex())) {
Log.d(Constants.TAG, "fingerprint of downloaded key is the same as " +
"the requested fingerprint!");
} else {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index 70b9f3f7e..c1fb9ae94 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -146,9 +146,9 @@ public class ImportKeysAdapter extends ArrayAdapter {
holder.keyId.setText(entry.keyIdHex);
- if (entry.fingerPrintHex != null) {
+ if (entry.fingerprintHex != null) {
holder.fingerprint.setVisibility(View.VISIBLE);
- holder.fingerprint.setText(PgpKeyHelper.colorizeFingerprint(entry.fingerPrintHex));
+ holder.fingerprint.setText(PgpKeyHelper.colorizeFingerprint(entry.fingerprintHex));
} else {
holder.fingerprint.setVisibility(View.GONE);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
index 4175592d6..d5329e6f6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListServerLoader.java
@@ -108,7 +108,7 @@ public class ImportKeysListServerLoader
* set fingerprint explicitly after query
* to enforce a check when the key is imported by KeychainIntentService
*/
- uniqueEntry.setFingerPrintHex(fingerprint);
+ uniqueEntry.setFingerprintHex(fingerprint);
uniqueEntry.setSelected(true);
mEntryList.add(uniqueEntry);
}
From fd12f89ccb5a4dd5832c00691ada98898f161a0e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 14 May 2014 18:01:40 +0200
Subject: [PATCH 08/19] Clarify help start
---
OpenKeychain/src/main/res/raw/help_start.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenKeychain/src/main/res/raw/help_start.html b/OpenKeychain/src/main/res/raw/help_start.html
index 26386d3d4..58d1340c9 100644
--- a/OpenKeychain/src/main/res/raw/help_start.html
+++ b/OpenKeychain/src/main/res/raw/help_start.html
@@ -14,7 +14,7 @@ And don't add newlines before or after p tags because of transifex -->
Several applications support OpenKeychain to encrypt/sign your private communication:

K-9 Mail: OpenKeychain support available in current alpha build!

Conversations: Jabber/XMPP client
-

PGPAuth: App to send a PGP-signed request to a server to open or close $thing
+

PGPAuth: App to send a PGP-signed request to a server to open or close something, e.g. a door
I found a bug in OpenKeychain!
Please report the bug using the issue tracker of OpenKeychain.
From bbc0694700ecc378692ec77d7966f7806ebc7258 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Wed, 14 May 2014 22:28:41 +0200
Subject: [PATCH 09/19] New screenshots
---
.../screenshots/device-2014-01-19-183737.png | Bin 58565 -> 0 bytes
.../screenshots/device-2014-01-19-183913.png | Bin 67302 -> 0 bytes
.../screenshots/device-2014-01-19-183925.png | Bin 118510 -> 0 bytes
.../screenshots/device-2014-01-19-183946.png | Bin 67639 -> 0 bytes
.../screenshots/device-2014-01-19-184238.png | Bin 73852 -> 0 bytes
.../screenshots/device-2014-05-14-221745.png | Bin 0 -> 74011 bytes
.../screenshots/device-2014-05-14-222126.png | Bin 0 -> 87126 bytes
.../screenshots/device-2014-05-14-222143.png | Bin 0 -> 74720 bytes
.../screenshots/device-2014-05-14-222455.png | Bin 0 -> 83469 bytes
.../screenshots/device-2014-05-14-222753.png | Bin 0 -> 56465 bytes
10 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 Resources/screenshots/device-2014-01-19-183737.png
delete mode 100644 Resources/screenshots/device-2014-01-19-183913.png
delete mode 100644 Resources/screenshots/device-2014-01-19-183925.png
delete mode 100644 Resources/screenshots/device-2014-01-19-183946.png
delete mode 100644 Resources/screenshots/device-2014-01-19-184238.png
create mode 100644 Resources/screenshots/device-2014-05-14-221745.png
create mode 100644 Resources/screenshots/device-2014-05-14-222126.png
create mode 100644 Resources/screenshots/device-2014-05-14-222143.png
create mode 100644 Resources/screenshots/device-2014-05-14-222455.png
create mode 100644 Resources/screenshots/device-2014-05-14-222753.png
diff --git a/Resources/screenshots/device-2014-01-19-183737.png b/Resources/screenshots/device-2014-01-19-183737.png
deleted file mode 100644
index 0aaf1923c1590cae7a6984565defd719287d1790..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 58565
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
y6=U_@+?XP|5_#YbwSK~DI
zG(a;u2rBGyIqX#rB~VK37og=b8i7xkumiYWo4+44c)^+KH1<)H!}1r)EWjS~C~|;{
z<+Wn&GfyLU%3zY+S3r=k?UL`QgP5a7y*H+8xZb~oj&nEvo}-(a1?d^K3T)W0pPeaX
zbEsfg%*|65HBIpi$|+@O4E^7n*-EtUDwri3H9dt)UnPc~@pw~o&5<{c0sX?8qP@N)L=
z3-KqX=67ocSZB%YI*MpOEHN>EP?YPF-1nOt%F_=+d{-BVd;_B^2f@rUU$#HY=1h*P
zn)I6#Z5p?dQ107{R>)XvJ0aPJL>$vee4ZRkT%Ieb?zvjaBg7WZZ&>*P`^f^)@cFp(
zjQPL|!q?9hhzKJF?d&%)Zl`tat*F_VD0>erwVcq`O<8O6GQfk0t>33jeX|06sJMF&
za#5b&cx0Zh^~z)*Bk$+_q=w!h{vqG{1l)jr!_o9ZVkN59g~MQ7U2s0_@=Dk3NInu_
zvj|IE1{L3$!uy+id+B*0k!zQ!Jk;nCgXl9H@yeo$s8#5`7jjJIMN3
zlQRd*nydCXwzLoukmFY@g%QY_ubu~wf*R%BZeT>(9iF-q-y$;~M_d{JCari+xf_Wk
zExULU8CE}AhNQEa_*=fun{{hK`S|P*4VRDF3gh}8S!+7e
z&6Y=uN~&LKv0}lH@GQN0mR5Ihe|oL#6DHx&v|Crkp4S#XVWLcbO_1P#Dgrv$D7HYQ
zUYUif?(iIWXU+`s?u?2UKJSsonT9SpN7KfNXWA(;A}W&NS^3?K%uc#-9Qb_TIu7E+
z?XUb~r)kRepvZjL8rFLG9@>?#ffFx7)!>_SL{E${PrSa8Y}MQMG`e!kd8&3_GOlzS
zddNoGtS*!g!B_maCX+WWKHXf&wJLqo8odm3KJ;dRC;Gx9ZUK@gOS5kFDkLGRfTz)|_oPTdeyFF20{(Vn&3jvHXVHxDOj>bnhOf%xXV6
zM1rngJyWDC7yp?!Z>j|D)4lWl9fgq2fSx`jyG|{(L|5rMPg;FSr-;2RK+hF1rsL-7
z=Wj;U)OLc-E*mX^8_lLy51y-D9B-MET~0Tu95E2Mr)gX&gTsV
zg6lb3h`We;r8{|5jY4MEIiL^7Q)0Z{4M(!!UXhZ`?1I1n)68Ge>sDSIlNy>#0kK&v
z@#B>OJJvcMG}+go8?7z-t3R~6n!bVp&ZRysv>OL6c{m+kSj+3P1pQ-0OQKIiCw5OW
zJDk{_Q8}3Cvof0(@KHA7@a~XVbuU(rz!ZxPI(Z>v^Vb-5thet=%MhigxdXzih5d05
zLsF6dcF%n2QiCax+ELOnC$Dr>EI4&c5s6eiGhTj|Jl!zKz01A%=y05u&!L6aTvb=z
z?+$`yin%zWF0QB>8ba|`jy2?YXYzc8JiGFBB8_H~i1}!az{3JYKHq0Iv*-A*`?)fe
zhttBlxQ^k{hfBSq)-I{e($B!~(v~O1Z=%^~bz}W;&WVB2%Z$9&2sL}XfmtRpXF~>$
zjwXXfL*~*=<3Y?2(DC#_Gl}W5*+xaY@1XkS5nsU9tF;C$c`Mt_ZEPNoEG_hm+@h^1
z_lzpK=M=AZzl8tKdr>N}i5JYy-+kI1Vo`e8ih8NF>R>BX=0hxYkdFWQ&hDU>=fxn@
zu$L6kkmO4eHMc8uh|$2#c<|y|yoRRtqS|hDx+Y+{{8`p=g&!rzuK`LtfZQPhDJW
z)&9xqa!s|XGQGSd>Ur6sPJ?ei!
zs*|KY0@5=c9z&~J0gz_&!`*EOPS)NKc&
zmX5HENNMz{SAMcAom5Cy1*Z{0alI4_rEREi@kycpBs|jQ%sG5O8tY+&&*ml?CseKo?RY*Lh`#YVWYc