make use of proxies a Keyserver property

This commit is contained in:
Vincent Breitmoser
2015-10-29 16:58:20 +01:00
parent 1c83c33d35
commit ee79cc76d3
7 changed files with 55 additions and 49 deletions

View File

@@ -35,7 +35,7 @@ public class CloudSearch {
private final static long SECONDS = 1000; private final static long SECONDS = 1000;
public static ArrayList<ImportKeysListEntry> search( public static ArrayList<ImportKeysListEntry> search(
@NonNull final String query, Preferences.CloudSearchPrefs cloudPrefs, @NonNull final Proxy proxy) @NonNull final String query, Preferences.CloudSearchPrefs cloudPrefs, @NonNull Proxy proxy)
throws Keyserver.CloudSearchFailureException { throws Keyserver.CloudSearchFailureException {
final ArrayList<Keyserver> servers = new ArrayList<>(); final ArrayList<Keyserver> servers = new ArrayList<>();
@@ -43,10 +43,10 @@ public class CloudSearch {
final Vector<Keyserver.CloudSearchFailureException> problems = new Vector<>(); final Vector<Keyserver.CloudSearchFailureException> problems = new Vector<>();
if (cloudPrefs.searchKeyserver) { if (cloudPrefs.searchKeyserver) {
servers.add(new HkpKeyserver(cloudPrefs.keyserver)); servers.add(new HkpKeyserver(cloudPrefs.keyserver, proxy));
} }
if (cloudPrefs.searchKeybase) { if (cloudPrefs.searchKeybase) {
servers.add(new KeybaseKeyserver()); servers.add(new KeybaseKeyserver(proxy));
} }
final ImportKeysList results = new ImportKeysList(servers.size()); final ImportKeysList results = new ImportKeysList(servers.size());
@@ -56,7 +56,7 @@ public class CloudSearch {
@Override @Override
public void run() { public void run() {
try { try {
results.addAll(keyserver.search(query, proxy)); results.addAll(keyserver.search(query));
} catch (Keyserver.CloudSearchFailureException e) { } catch (Keyserver.CloudSearchFailureException e) {
problems.add(e); problems.add(e);
} }

View File

@@ -76,6 +76,7 @@ public class HkpKeyserver extends Keyserver {
private String mHost; private String mHost;
private short mPort; private short mPort;
private Proxy mProxy;
private boolean mSecure; private boolean mSecure;
/** /**
@@ -152,17 +153,17 @@ public class HkpKeyserver extends Keyserver {
* connect using {@link #PORT_DEFAULT}. However, port may be specified after colon * connect using {@link #PORT_DEFAULT}. However, port may be specified after colon
* ("<code>hostname:port</code>", eg. "<code>p80.pool.sks-keyservers.net:80</code>"). * ("<code>hostname:port</code>", eg. "<code>p80.pool.sks-keyservers.net:80</code>").
*/ */
public HkpKeyserver(String hostAndPort) { public HkpKeyserver(String hostAndPort, Proxy proxy) {
String host = hostAndPort; String host = hostAndPort;
short port = PORT_DEFAULT; short port = PORT_DEFAULT;
boolean secure = false; boolean secure = false;
String[] parts = hostAndPort.split(":"); String[] parts = hostAndPort.split(":");
if (parts.length > 1) { if (parts.length > 1) {
if (!parts[0].contains(".")) { // This is not a domain or ip, so it must be a protocol name if (!parts[0].contains(".")) { // This is not a domain or ip, so it must be a protocol name
if (parts[0].equalsIgnoreCase("hkps") || parts[0].equalsIgnoreCase("https")) { if ("hkps".equalsIgnoreCase(parts[0]) || "https".equalsIgnoreCase(parts[0])) {
secure = true; secure = true;
port = PORT_DEFAULT_HKPS; port = PORT_DEFAULT_HKPS;
} else if (!parts[0].equalsIgnoreCase("hkp") && !parts[0].equalsIgnoreCase("http")) { } else if (!"hkp".equalsIgnoreCase(parts[0]) && !"http".equalsIgnoreCase(parts[0])) {
throw new IllegalArgumentException("Protocol " + parts[0] + " is unknown"); throw new IllegalArgumentException("Protocol " + parts[0] + " is unknown");
} }
host = parts[1]; host = parts[1];
@@ -179,16 +180,18 @@ public class HkpKeyserver extends Keyserver {
} }
mHost = host; mHost = host;
mPort = port; mPort = port;
mProxy = proxy;
mSecure = secure; mSecure = secure;
} }
public HkpKeyserver(String host, short port) { public HkpKeyserver(String host, short port, Proxy proxy) {
this(host, port, false); this(host, port, proxy, false);
} }
public HkpKeyserver(String host, short port, boolean secure) { public HkpKeyserver(String host, short port, Proxy proxy, boolean secure) {
mHost = host; mHost = host;
mPort = port; mPort = port;
mProxy = proxy;
mSecure = secure; mSecure = secure;
} }
@@ -253,7 +256,7 @@ public class HkpKeyserver extends Keyserver {
* Results are sorted by creation date of key! * Results are sorted by creation date of key!
*/ */
@Override @Override
public ArrayList<ImportKeysListEntry> search(String query, Proxy proxy) throws QueryFailedException, public ArrayList<ImportKeysListEntry> search(String query) throws QueryFailedException,
QueryNeedsRepairException { QueryNeedsRepairException {
ArrayList<ImportKeysListEntry> results = new ArrayList<>(); ArrayList<ImportKeysListEntry> results = new ArrayList<>();
@@ -271,7 +274,7 @@ public class HkpKeyserver extends Keyserver {
String data; String data;
try { try {
data = query(request, proxy); data = query(request, mProxy);
} catch (HttpError e) { } catch (HttpError e) {
if (e.getData() != null) { if (e.getData() != null) {
Log.d(Constants.TAG, "returned error data: " + e.getData().toLowerCase(Locale.ENGLISH)); Log.d(Constants.TAG, "returned error data: " + e.getData().toLowerCase(Locale.ENGLISH));
@@ -375,12 +378,12 @@ public class HkpKeyserver extends Keyserver {
} }
@Override @Override
public String get(String keyIdHex, @NonNull Proxy proxy) throws QueryFailedException { public String get(String keyIdHex) throws QueryFailedException {
String request = "/pks/lookup?op=get&options=mr&search=" + keyIdHex; String request = "/pks/lookup?op=get&options=mr&search=" + keyIdHex;
Log.d(Constants.TAG, "hkp keyserver get: " + request + " using Proxy: " + proxy); Log.d(Constants.TAG, "hkp keyserver get: " + request + " using Proxy: " + mProxy);
String data; String data;
try { try {
data = query(request, proxy); data = query(request, mProxy);
} catch (HttpError httpError) { } catch (HttpError httpError) {
Log.d(Constants.TAG, "Failed to get key at HkpKeyserver", httpError); Log.d(Constants.TAG, "Failed to get key at HkpKeyserver", httpError);
throw new QueryFailedException("not found"); throw new QueryFailedException("not found");
@@ -396,7 +399,7 @@ public class HkpKeyserver extends Keyserver {
} }
@Override @Override
public void add(String armoredKey, Proxy proxy) throws AddKeyException { public void add(String armoredKey) throws AddKeyException {
try { try {
String path = "/pks/add"; String path = "/pks/add";
String params; String params;
@@ -407,7 +410,7 @@ public class HkpKeyserver extends Keyserver {
} }
URL url = new URL(getUrlPrefix() + mHost + ":" + mPort + path); URL url = new URL(getUrlPrefix() + mHost + ":" + mPort + path);
Log.d(Constants.TAG, "hkp keyserver add: " + url.toString()); Log.d(Constants.TAG, "hkp keyserver add: " + url);
Log.d(Constants.TAG, "params: " + params); Log.d(Constants.TAG, "params: " + params);
RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), params); RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), params);
@@ -419,7 +422,7 @@ public class HkpKeyserver extends Keyserver {
.post(body) .post(body)
.build(); .build();
Response response = getClient(url, proxy).newCall(request).execute(); Response response = getClient(url, mProxy).newCall(request).execute();
Log.d(Constants.TAG, "response code: " + response.code()); Log.d(Constants.TAG, "response code: " + response.code());
Log.d(Constants.TAG, "answer: " + response.body().string()); Log.d(Constants.TAG, "answer: " + response.body().string());
@@ -445,7 +448,7 @@ public class HkpKeyserver extends Keyserver {
* @return A responsible Keyserver or null if not found. * @return A responsible Keyserver or null if not found.
* TODO: Add proxy functionality * TODO: Add proxy functionality
*/ */
public static HkpKeyserver resolve(String domain) { public static HkpKeyserver resolve(String domain, Proxy proxy) {
try { try {
Record[] records = new Client().query(new Question("_hkp._tcp." + domain, Record.TYPE.SRV)).getAnswers(); Record[] records = new Client().query(new Question("_hkp._tcp." + domain, Record.TYPE.SRV)).getAnswers();
if (records.length > 0) { if (records.length > 0) {
@@ -460,7 +463,7 @@ public class HkpKeyserver extends Keyserver {
Record record = records[0]; // This is our best choice Record record = records[0]; // This is our best choice
if (record.getPayload().getType() == Record.TYPE.SRV) { if (record.getPayload().getType() == Record.TYPE.SRV) {
return new HkpKeyserver(((SRV) record.getPayload()).getName(), return new HkpKeyserver(((SRV) record.getPayload()).getName(),
(short) ((SRV) record.getPayload()).getPort()); (short) ((SRV) record.getPayload()).getPort(), proxy);
} }
} }
} catch (Exception ignored) { } catch (Exception ignored) {

View File

@@ -33,10 +33,15 @@ import java.util.List;
public class KeybaseKeyserver extends Keyserver { public class KeybaseKeyserver extends Keyserver {
public static final String ORIGIN = "keybase:keybase.io"; public static final String ORIGIN = "keybase:keybase.io";
private String mQuery;
Proxy mProxy;
public KeybaseKeyserver(Proxy proxy) {
mProxy = proxy;
}
@Override @Override
public ArrayList<ImportKeysListEntry> search(String query, Proxy proxy) throws QueryFailedException, public ArrayList<ImportKeysListEntry> search(String query) throws QueryFailedException,
QueryNeedsRepairException { QueryNeedsRepairException {
ArrayList<ImportKeysListEntry> results = new ArrayList<>(); ArrayList<ImportKeysListEntry> results = new ArrayList<>();
@@ -47,14 +52,13 @@ public class KeybaseKeyserver extends Keyserver {
if (query.isEmpty()) { if (query.isEmpty()) {
throw new QueryTooShortException(); throw new QueryTooShortException();
} }
mQuery = query;
try { try {
KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient());
keybaseQuery.setProxy(proxy); keybaseQuery.setProxy(mProxy);
Iterable<Match> matches = keybaseQuery.search(query); Iterable<Match> matches = keybaseQuery.search(query);
for (Match match : matches) { for (Match match : matches) {
results.add(makeEntry(match)); results.add(makeEntry(match, query));
} }
} catch (KeybaseException e) { } catch (KeybaseException e) {
Log.e(Constants.TAG, "keybase result parsing error", e); Log.e(Constants.TAG, "keybase result parsing error", e);
@@ -64,9 +68,9 @@ public class KeybaseKeyserver extends Keyserver {
return results; return results;
} }
private ImportKeysListEntry makeEntry(Match match) throws KeybaseException { private ImportKeysListEntry makeEntry(Match match, String query) throws KeybaseException {
final ImportKeysListEntry entry = new ImportKeysListEntry(); final ImportKeysListEntry entry = new ImportKeysListEntry();
entry.setQuery(mQuery); entry.setQuery(query);
entry.addOrigin(ORIGIN); entry.addOrigin(ORIGIN);
entry.setRevoked(false); // keybase doesnt say anything about revoked keys entry.setRevoked(false); // keybase doesnt say anything about revoked keys
@@ -102,10 +106,10 @@ public class KeybaseKeyserver extends Keyserver {
} }
@Override @Override
public String get(String id, Proxy proxy) throws QueryFailedException { public String get(String id) throws QueryFailedException {
try { try {
KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient()); KeybaseQuery keybaseQuery = new KeybaseQuery(new OkHttpKeybaseClient());
keybaseQuery.setProxy(proxy); keybaseQuery.setProxy(mProxy);
return User.keyForUsername(keybaseQuery, id); return User.keyForUsername(keybaseQuery, id);
} catch (KeybaseException e) { } catch (KeybaseException e) {
throw new QueryFailedException(e.getMessage()); throw new QueryFailedException(e.getMessage());
@@ -113,7 +117,7 @@ public class KeybaseKeyserver extends Keyserver {
} }
@Override @Override
public void add(String armoredKey, Proxy proxy) throws AddKeyException { public void add(String armoredKey) throws AddKeyException {
throw new AddKeyException(); throw new AddKeyException();
} }
} }

View File

@@ -69,12 +69,12 @@ public abstract class Keyserver {
private static final long serialVersionUID = -507574859137295530L; private static final long serialVersionUID = -507574859137295530L;
} }
public abstract List<ImportKeysListEntry> search(String query, Proxy proxy) public abstract List<ImportKeysListEntry> search(String query)
throws QueryFailedException, QueryNeedsRepairException; throws QueryFailedException, QueryNeedsRepairException;
public abstract String get(String keyIdHex, Proxy proxy) throws QueryFailedException; public abstract String get(String keyIdHex) throws QueryFailedException;
public abstract void add(String armoredKey, Proxy proxy) throws AddKeyException; public abstract void add(String armoredKey) throws AddKeyException;
public static String readAll(InputStream in, String encoding) throws IOException { public static String readAll(InputStream in, String encoding) throws IOException {
ByteArrayOutputStream raw = new ByteArrayOutputStream(); ByteArrayOutputStream raw = new ByteArrayOutputStream();

View File

@@ -188,7 +188,7 @@ public class ImportOperation extends BaseOperation<ImportKeyringParcel> {
// Make sure we have the keyserver instance cached // Make sure we have the keyserver instance cached
if (keyServer == null) { if (keyServer == null) {
log.add(LogType.MSG_IMPORT_KEYSERVER, 1, keyServerUri); log.add(LogType.MSG_IMPORT_KEYSERVER, 1, keyServerUri);
keyServer = new HkpKeyserver(keyServerUri); keyServer = new HkpKeyserver(keyServerUri, proxy);
} }
try { try {
@@ -197,10 +197,10 @@ public class ImportOperation extends BaseOperation<ImportKeyringParcel> {
if (entry.mExpectedFingerprint != null) { if (entry.mExpectedFingerprint != null) {
log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" + log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, "0x" +
entry.mExpectedFingerprint.substring(24)); entry.mExpectedFingerprint.substring(24));
data = keyServer.get("0x" + entry.mExpectedFingerprint, proxy).getBytes(); data = keyServer.get("0x" + entry.mExpectedFingerprint).getBytes();
} else { } else {
log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, entry.mKeyIdHex); log.add(LogType.MSG_IMPORT_FETCH_KEYSERVER, 2, entry.mKeyIdHex);
data = keyServer.get(entry.mKeyIdHex, proxy).getBytes(); data = keyServer.get(entry.mKeyIdHex).getBytes();
} }
key = UncachedKeyRing.decodeFromData(data); key = UncachedKeyRing.decodeFromData(data);
if (key != null) { if (key != null) {
@@ -218,12 +218,12 @@ public class ImportOperation extends BaseOperation<ImportKeyringParcel> {
if (entry.mKeybaseName != null) { if (entry.mKeybaseName != null) {
// Make sure we have this cached // Make sure we have this cached
if (keybaseServer == null) { if (keybaseServer == null) {
keybaseServer = new KeybaseKeyserver(); keybaseServer = new KeybaseKeyserver(proxy);
} }
try { try {
log.add(LogType.MSG_IMPORT_FETCH_KEYBASE, 2, entry.mKeybaseName); log.add(LogType.MSG_IMPORT_FETCH_KEYBASE, 2, entry.mKeybaseName);
byte[] data = keybaseServer.get(entry.mKeybaseName, proxy).getBytes(); byte[] data = keybaseServer.get(entry.mKeybaseName).getBytes();
UncachedKeyRing keybaseKey = UncachedKeyRing.decodeFromData(data); UncachedKeyRing keybaseKey = UncachedKeyRing.decodeFromData(data);
// If there already is a key, merge the two // If there already is a key, merge the two

View File

@@ -105,7 +105,7 @@ public class UploadOperation extends BaseOperation<UploadKeyringParcel> {
HkpKeyserver hkpKeyserver; HkpKeyserver hkpKeyserver;
{ {
hkpKeyserver = new HkpKeyserver(uploadInput.mKeyserver); hkpKeyserver = new HkpKeyserver(uploadInput.mKeyserver, proxy);
log.add(LogType.MSG_UPLOAD_SERVER, 1, hkpKeyserver.toString()); log.add(LogType.MSG_UPLOAD_SERVER, 1, hkpKeyserver.toString());
} }
@@ -114,7 +114,7 @@ public class UploadOperation extends BaseOperation<UploadKeyringParcel> {
return new UploadResult(UploadResult.RESULT_ERROR, log); return new UploadResult(UploadResult.RESULT_ERROR, log);
} }
return uploadKeyRingToServer(log, hkpKeyserver, keyring, proxy); return uploadKeyRingToServer(log, hkpKeyserver, keyring);
} }
@Nullable @Nullable
@@ -155,7 +155,7 @@ public class UploadOperation extends BaseOperation<UploadKeyringParcel> {
@NonNull @NonNull
private UploadResult uploadKeyRingToServer( private UploadResult uploadKeyRingToServer(
OperationLog log, HkpKeyserver server, CanonicalizedPublicKeyRing keyring, Proxy proxy) { OperationLog log, HkpKeyserver server, CanonicalizedPublicKeyRing keyring) {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
ArmoredOutputStream aos = null; ArmoredOutputStream aos = null;
@@ -166,7 +166,7 @@ public class UploadOperation extends BaseOperation<UploadKeyringParcel> {
aos.close(); aos.close();
String armoredKey = bos.toString("UTF-8"); String armoredKey = bos.toString("UTF-8");
server.add(armoredKey, proxy); server.add(armoredKey);
updateProgress(R.string.progress_uploading, 1, 1); updateProgress(R.string.progress_uploading, 1, 1);

View File

@@ -74,9 +74,9 @@ public class EmailKeyHelper {
// Try _hkp._tcp SRV record first // Try _hkp._tcp SRV record first
String[] mailparts = mail.split("@"); String[] mailparts = mail.split("@");
if (mailparts.length == 2) { if (mailparts.length == 2) {
HkpKeyserver hkp = HkpKeyserver.resolve(mailparts[1]); HkpKeyserver hkp = HkpKeyserver.resolve(mailparts[1], proxy);
if (hkp != null) { if (hkp != null) {
keys.addAll(getEmailKeys(mail, hkp, proxy)); keys.addAll(getEmailKeys(mail, hkp));
} }
} }
@@ -84,18 +84,17 @@ public class EmailKeyHelper {
// Most users don't have the SRV record, so ask a default server as well // Most users don't have the SRV record, so ask a default server as well
String server = Preferences.getPreferences(context).getPreferredKeyserver(); String server = Preferences.getPreferences(context).getPreferredKeyserver();
if (server != null) { if (server != null) {
HkpKeyserver hkp = new HkpKeyserver(server); HkpKeyserver hkp = new HkpKeyserver(server, proxy);
keys.addAll(getEmailKeys(mail, hkp, proxy)); keys.addAll(getEmailKeys(mail, hkp));
} }
} }
return keys; return keys;
} }
public static List<ImportKeysListEntry> getEmailKeys(String mail, Keyserver keyServer, public static List<ImportKeysListEntry> getEmailKeys(String mail, Keyserver keyServer) {
Proxy proxy) {
Set<ImportKeysListEntry> keys = new HashSet<>(); Set<ImportKeysListEntry> keys = new HashSet<>();
try { try {
for (ImportKeysListEntry key : keyServer.search(mail, proxy)) { for (ImportKeysListEntry key : keyServer.search(mail)) {
if (key.isRevoked() || key.isExpired()) continue; if (key.isRevoked() || key.isExpired()) continue;
for (String userId : key.getUserIds()) { for (String userId : key.getUserIds()) {
if (userId.toLowerCase().contains(mail.toLowerCase(Locale.ENGLISH))) { if (userId.toLowerCase().contains(mail.toLowerCase(Locale.ENGLISH))) {