diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java
index b02559a5e..201517742 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableHkpKeyserver.java
@@ -35,9 +35,7 @@ import java.io.UnsupportedEncodingException;
import java.net.Proxy;
import java.net.URI;
import java.net.URISyntaxException;
-import java.net.URL;
import java.net.URLDecoder;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@@ -51,7 +49,8 @@ import de.measite.minidns.Client;
import de.measite.minidns.Question;
import de.measite.minidns.Record;
import de.measite.minidns.record.SRV;
-import okhttp3.MediaType;
+import okhttp3.FormBody;
+import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
@@ -155,14 +154,6 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
return getURI(mOnion);
}
- private URI getProxiedURL(ParcelableProxy proxy) throws URISyntaxException {
- if (proxy.isTorEnabled()) {
- return getOnionURI();
- } else {
- return getUrlURI();
- }
- }
-
/**
* @param keyserverUrl "hostname" (eg. "pool.sks-keyservers.net"), then it will
* connect using {@link #PORT_DEFAULT}. However, port may be specified after colon
@@ -194,14 +185,30 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
originalURI.getPath(), originalURI.getQuery(), originalURI.getFragment());
}
- private String query(String request, @NonNull ParcelableProxy proxy) throws Keyserver.QueryFailedException, HttpError {
- try {
- URL url = new URL(getProxiedURL(proxy).toString() + request);
- Log.d(Constants.TAG, "hkp keyserver query: " + url + " Proxy: " + proxy.getProxy());
- OkHttpClient client = OkHttpClientFactory.getClientPinnedIfAvailable(url, proxy.getProxy());
- Response response = client.newCall(new Request.Builder().url(url).build()).execute();
+ private HttpUrl getHttpUrl(ParcelableProxy proxy) throws URISyntaxException {
+ HttpUrl base = proxy.isTorEnabled() ? HttpUrl.get(getOnionURI())
+ : HttpUrl.get(getUrlURI());
- String responseBody = response.body().string(); // contains body both in case of success or failure
+ return base.newBuilder()
+ .addPathSegment("pks")
+ .build();
+ }
+
+ private String query(HttpUrl url, @NonNull ParcelableProxy proxy) throws Keyserver.QueryFailedException, HttpError {
+ try {
+ OkHttpClient client =
+ OkHttpClientFactory.getClientPinnedIfAvailable(url.url(), proxy.getProxy());
+
+ Request request = new Request.Builder()
+ .url(url)
+ .build();
+
+ Response response = client
+ .newCall(request)
+ .execute();
+
+ // contains body both in case of success or failure
+ String responseBody = response.body().string();
if (response.isSuccessful()) {
return responseBody;
@@ -215,9 +222,6 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
} catch (TlsHelper.TlsHelperException e) {
Log.e(Constants.TAG, "Exception in pinning certs", e);
throw new Keyserver.QueryFailedException("Exception in pinning certs");
- } catch (URISyntaxException e) {
- Log.e(Constants.TAG, "Unsupported keyserver URI", e);
- throw new Keyserver.QueryFailedException("Unsupported keyserver URI");
}
}
@@ -225,25 +229,27 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
* Results are sorted by creation date of key!
*/
@Override
- public ArrayList search(String query, ParcelableProxy proxy) throws Keyserver.QueryFailedException,
- Keyserver.QueryNeedsRepairException {
+ public ArrayList search(String query, ParcelableProxy proxy)
+ throws Keyserver.QueryFailedException, Keyserver.QueryNeedsRepairException {
ArrayList results = new ArrayList<>();
if (query.length() < 3) {
throw new Keyserver.QueryTooShortException();
}
- String encodedQuery;
- try {
- encodedQuery = URLEncoder.encode(query, "UTF8");
- } catch (UnsupportedEncodingException e) {
- return null;
- }
- String request = "/pks/lookup?op=index&options=mr&search=" + encodedQuery;
-
String data;
try {
- data = query(request, proxy);
+ HttpUrl url = getHttpUrl(proxy).newBuilder()
+ .addPathSegment("lookup")
+ .addQueryParameter("op", "index")
+ .addQueryParameter("options", "mr")
+ .addQueryParameter("search", query)
+ .build();
+
+ data = query(url, proxy);
+ } catch (URISyntaxException e) {
+ Log.e(Constants.TAG, "Unsupported keyserver URI", e);
+ throw new Keyserver.QueryFailedException("Unsupported keyserver URI");
} catch (HttpError e) {
if (e.getData() != null) {
Log.d(Constants.TAG, "returned error data: " + e.getData().toLowerCase(Locale.ENGLISH));
@@ -359,11 +365,21 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
@Override
public String get(String keyIdHex, ParcelableProxy proxy) throws Keyserver.QueryFailedException {
- String request = "/pks/lookup?op=get&options=mr&search=" + keyIdHex;
- Log.d(Constants.TAG, "hkp keyserver get: " + request + " using Proxy: " + proxy.getProxy());
String data;
try {
- data = query(request, proxy);
+ HttpUrl url = getHttpUrl(proxy).newBuilder()
+ .addPathSegment("lookup")
+ .addQueryParameter("op", "get")
+ .addQueryParameter("options", "mr")
+ .addQueryParameter("search", keyIdHex)
+ .build();
+
+ Log.d(Constants.TAG, "Keyserver get: " + url + " using Proxy: " + proxy.getProxy());
+
+ data = query(url, proxy);
+ } catch (URISyntaxException e) {
+ Log.e(Constants.TAG, "Unsupported keyserver URI", e);
+ throw new Keyserver.QueryFailedException("Unsupported keyserver URI");
} catch (HttpError httpError) {
Log.d(Constants.TAG, "Failed to get key at HkpKeyserver", httpError);
throw new Keyserver.QueryFailedException("not found");
@@ -371,6 +387,7 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
if (data == null) {
throw new Keyserver.QueryFailedException("data is null");
}
+
Matcher matcher = PgpHelper.PGP_PUBLIC_KEY.matcher(data);
if (matcher.find()) {
return matcher.group(1);
@@ -381,34 +398,27 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
@Override
public void add(String armoredKey, ParcelableProxy proxy) throws Keyserver.AddKeyException {
try {
- String path = "/pks/add";
- String params;
- try {
- params = "keytext=" + URLEncoder.encode(armoredKey, "UTF-8");
- } catch (UnsupportedEncodingException e) {
- throw new Keyserver.AddKeyException();
- }
- URL url = new URL(getProxiedURL(proxy).toString() + path);
+ HttpUrl url = getHttpUrl(proxy).newBuilder()
+ .addPathSegment("add")
+ .build();
- Log.d(Constants.TAG, "hkp keyserver add: " + url);
- Log.d(Constants.TAG, "params: " + params);
-
-
- RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), params);
+ RequestBody formBody = new FormBody.Builder()
+ .add("keytext", armoredKey)
+ .build();
Request request = new Request.Builder()
.url(url)
- .addHeader("Content-Type", "application/x-www-form-urlencoded")
- .addHeader("Content-Length", Integer.toString(params.getBytes().length))
- .post(body)
+ .post(formBody)
.build();
Response response =
- OkHttpClientFactory.getClientPinnedIfAvailable(url, proxy.getProxy())
- .newCall(request).execute();
+ OkHttpClientFactory.getClientPinnedIfAvailable(url.url(), proxy.getProxy())
+ .newCall(request)
+ .execute();
- Log.d(Constants.TAG, "response code: " + response.code());
- Log.d(Constants.TAG, "answer: " + response.body().string());
+ Log.d(Constants.TAG, "Adding key with URL: " + url
+ + ", response code: " + response.code()
+ + ", body: " + response.body().string());
if (response.code() != 200) {
throw new Keyserver.AddKeyException();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index 005ab7ac1..1f60092e8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -119,7 +119,9 @@ public class UploadKeyActivity extends BaseActivity
}
private void uploadKey() {
- mKeyserver = (ParcelableHkpKeyserver) mKeyServerSpinner.getSelectedItem();
+ String keyserverUrl = (String) mKeyServerSpinner.getSelectedItem();
+ // TODO: Currently, not using onion addresses here!
+ mKeyserver = new ParcelableHkpKeyserver(keyserverUrl);
mUploadOpHelper = new CryptoOperationHelper<>(1, this, this, R.string.progress_uploading);
mUploadOpHelper.cryptoOperation();