Fix advanced upload, use OkHttp's HttpUrl class
This commit is contained in:
parent
c57b544395
commit
f8f7fb7d14
|
@ -35,9 +35,7 @@ import java.io.UnsupportedEncodingException;
|
||||||
import java.net.Proxy;
|
import java.net.Proxy;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.net.URLEncoder;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
@ -51,7 +49,8 @@ import de.measite.minidns.Client;
|
||||||
import de.measite.minidns.Question;
|
import de.measite.minidns.Question;
|
||||||
import de.measite.minidns.Record;
|
import de.measite.minidns.Record;
|
||||||
import de.measite.minidns.record.SRV;
|
import de.measite.minidns.record.SRV;
|
||||||
import okhttp3.MediaType;
|
import okhttp3.FormBody;
|
||||||
|
import okhttp3.HttpUrl;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
|
@ -155,14 +154,6 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
|
||||||
return getURI(mOnion);
|
return getURI(mOnion);
|
||||||
}
|
}
|
||||||
|
|
||||||
private URI getProxiedURL(ParcelableProxy proxy) throws URISyntaxException {
|
|
||||||
if (proxy.isTorEnabled()) {
|
|
||||||
return getOnionURI();
|
|
||||||
} else {
|
|
||||||
return getUrlURI();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param keyserverUrl "<code>hostname</code>" (eg. "<code>pool.sks-keyservers.net</code>"), then it will
|
* @param keyserverUrl "<code>hostname</code>" (eg. "<code>pool.sks-keyservers.net</code>"), then it will
|
||||||
* connect using {@link #PORT_DEFAULT}. However, port may be specified after colon
|
* 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());
|
originalURI.getPath(), originalURI.getQuery(), originalURI.getFragment());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String query(String request, @NonNull ParcelableProxy proxy) throws Keyserver.QueryFailedException, HttpError {
|
private HttpUrl getHttpUrl(ParcelableProxy proxy) throws URISyntaxException {
|
||||||
try {
|
HttpUrl base = proxy.isTorEnabled() ? HttpUrl.get(getOnionURI())
|
||||||
URL url = new URL(getProxiedURL(proxy).toString() + request);
|
: HttpUrl.get(getUrlURI());
|
||||||
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();
|
|
||||||
|
|
||||||
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()) {
|
if (response.isSuccessful()) {
|
||||||
return responseBody;
|
return responseBody;
|
||||||
|
@ -215,9 +222,6 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
|
||||||
} catch (TlsHelper.TlsHelperException e) {
|
} catch (TlsHelper.TlsHelperException e) {
|
||||||
Log.e(Constants.TAG, "Exception in pinning certs", e);
|
Log.e(Constants.TAG, "Exception in pinning certs", e);
|
||||||
throw new Keyserver.QueryFailedException("Exception in pinning certs");
|
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!
|
* Results are sorted by creation date of key!
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<ImportKeysListEntry> search(String query, ParcelableProxy proxy) throws Keyserver.QueryFailedException,
|
public ArrayList<ImportKeysListEntry> search(String query, ParcelableProxy proxy)
|
||||||
Keyserver.QueryNeedsRepairException {
|
throws Keyserver.QueryFailedException, Keyserver.QueryNeedsRepairException {
|
||||||
ArrayList<ImportKeysListEntry> results = new ArrayList<>();
|
ArrayList<ImportKeysListEntry> results = new ArrayList<>();
|
||||||
|
|
||||||
if (query.length() < 3) {
|
if (query.length() < 3) {
|
||||||
throw new Keyserver.QueryTooShortException();
|
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;
|
String data;
|
||||||
try {
|
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) {
|
} 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));
|
||||||
|
@ -359,11 +365,21 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String get(String keyIdHex, ParcelableProxy proxy) throws Keyserver.QueryFailedException {
|
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;
|
String data;
|
||||||
try {
|
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) {
|
} 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 Keyserver.QueryFailedException("not found");
|
throw new Keyserver.QueryFailedException("not found");
|
||||||
|
@ -371,6 +387,7 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
throw new Keyserver.QueryFailedException("data is null");
|
throw new Keyserver.QueryFailedException("data is null");
|
||||||
}
|
}
|
||||||
|
|
||||||
Matcher matcher = PgpHelper.PGP_PUBLIC_KEY.matcher(data);
|
Matcher matcher = PgpHelper.PGP_PUBLIC_KEY.matcher(data);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
return matcher.group(1);
|
return matcher.group(1);
|
||||||
|
@ -381,34 +398,27 @@ public class ParcelableHkpKeyserver extends Keyserver implements Parcelable {
|
||||||
@Override
|
@Override
|
||||||
public void add(String armoredKey, ParcelableProxy proxy) throws Keyserver.AddKeyException {
|
public void add(String armoredKey, ParcelableProxy proxy) throws Keyserver.AddKeyException {
|
||||||
try {
|
try {
|
||||||
String path = "/pks/add";
|
HttpUrl url = getHttpUrl(proxy).newBuilder()
|
||||||
String params;
|
.addPathSegment("add")
|
||||||
try {
|
.build();
|
||||||
params = "keytext=" + URLEncoder.encode(armoredKey, "UTF-8");
|
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
throw new Keyserver.AddKeyException();
|
|
||||||
}
|
|
||||||
URL url = new URL(getProxiedURL(proxy).toString() + path);
|
|
||||||
|
|
||||||
Log.d(Constants.TAG, "hkp keyserver add: " + url);
|
RequestBody formBody = new FormBody.Builder()
|
||||||
Log.d(Constants.TAG, "params: " + params);
|
.add("keytext", armoredKey)
|
||||||
|
.build();
|
||||||
|
|
||||||
RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), params);
|
|
||||||
|
|
||||||
Request request = new Request.Builder()
|
Request request = new Request.Builder()
|
||||||
.url(url)
|
.url(url)
|
||||||
.addHeader("Content-Type", "application/x-www-form-urlencoded")
|
.post(formBody)
|
||||||
.addHeader("Content-Length", Integer.toString(params.getBytes().length))
|
|
||||||
.post(body)
|
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Response response =
|
Response response =
|
||||||
OkHttpClientFactory.getClientPinnedIfAvailable(url, proxy.getProxy())
|
OkHttpClientFactory.getClientPinnedIfAvailable(url.url(), proxy.getProxy())
|
||||||
.newCall(request).execute();
|
.newCall(request)
|
||||||
|
.execute();
|
||||||
|
|
||||||
Log.d(Constants.TAG, "response code: " + response.code());
|
Log.d(Constants.TAG, "Adding key with URL: " + url
|
||||||
Log.d(Constants.TAG, "answer: " + response.body().string());
|
+ ", response code: " + response.code()
|
||||||
|
+ ", body: " + response.body().string());
|
||||||
|
|
||||||
if (response.code() != 200) {
|
if (response.code() != 200) {
|
||||||
throw new Keyserver.AddKeyException();
|
throw new Keyserver.AddKeyException();
|
||||||
|
|
|
@ -119,7 +119,9 @@ public class UploadKeyActivity extends BaseActivity
|
||||||
}
|
}
|
||||||
|
|
||||||
private void uploadKey() {
|
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 = new CryptoOperationHelper<>(1, this, this, R.string.progress_uploading);
|
||||||
mUploadOpHelper.cryptoOperation();
|
mUploadOpHelper.cryptoOperation();
|
||||||
|
|
Loading…
Reference in a new issue