Merge branch 'hkps-support' into automatic-contact-discovery

This commit is contained in:
mar-v-in 2014-05-29 11:33:53 +02:00
commit d4cdc36448

View File

@ -81,6 +81,7 @@ public class HkpKeyserver extends Keyserver {
private String mHost; private String mHost;
private short mPort; private short mPort;
private boolean mSecure;
/** /**
* pub:%keyid%:%algo%:%keylen%:%creationdate%:%expirationdate%:%flags% * pub:%keyid%:%algo%:%keylen%:%creationdate%:%expirationdate%:%flags%
@ -147,6 +148,7 @@ public class HkpKeyserver extends Keyserver {
Pattern.CASE_INSENSITIVE); Pattern.CASE_INSENSITIVE);
private static final short PORT_DEFAULT = 11371; private static final short PORT_DEFAULT = 11371;
private static final short PORT_DEFAULT_HKPS = 443;
/** /**
* @param hostAndPort may be just * @param hostAndPort may be just
@ -157,31 +159,68 @@ public class HkpKeyserver extends Keyserver {
public HkpKeyserver(String hostAndPort) { public HkpKeyserver(String hostAndPort) {
String host = hostAndPort; String host = hostAndPort;
short port = PORT_DEFAULT; short port = PORT_DEFAULT;
final int colonPosition = hostAndPort.lastIndexOf(':'); boolean secure = false;
if (colonPosition > 0) { String[] parts = hostAndPort.split(":");
host = hostAndPort.substring(0, colonPosition); if (parts.length > 1) {
final String portStr = hostAndPort.substring(colonPosition + 1); if (!parts[0].contains(".")) { // This is not a domain or ip, so it must be a protocol name
port = Short.decode(portStr); if (parts[0].equalsIgnoreCase("hkps") || parts[0].equalsIgnoreCase("https")) {
secure = true;
port = PORT_DEFAULT_HKPS;
} else if (!parts[0].equalsIgnoreCase("hkp") && !parts[0].equalsIgnoreCase("http")) {
throw new IllegalArgumentException("Protocol " + parts[0] + " is unknown");
}
host = parts[1];
if (host.startsWith("//")) { // People tend to type https:// and hkps://, so we'll support that as well
host = host.substring(2);
}
if (parts.length > 2) {
port = Short.decode(parts[2]);
}
} else {
host = parts[0];
port = Short.decode(parts[1]);
}
} }
mHost = host; mHost = host;
mPort = port; mPort = port;
mSecure = secure;
} }
public HkpKeyserver(String host, short port) { public HkpKeyserver(String host, short port) {
this(host, port, false);
}
public HkpKeyserver(String host, short port, boolean secure) {
mHost = host; mHost = host;
mPort = port; mPort = port;
mSecure = secure;
}
private String getUrlPrefix() {
return mSecure ? "https://" : "http://";
} }
private String query(String request) throws QueryFailedException, HttpError { private String query(String request) throws QueryFailedException, HttpError {
InetAddress ips[]; List<String> urls = new ArrayList<String>();
try { if (mSecure) {
ips = InetAddress.getAllByName(mHost); urls.add(getUrlPrefix() + mHost + ":" + mPort + request);
} catch (UnknownHostException e) { } else {
throw new QueryFailedException(e.toString()); InetAddress ips[];
} try {
for (int i = 0; i < ips.length; ++i) { ips = InetAddress.getAllByName(mHost);
} catch (UnknownHostException e) {
throw new QueryFailedException(e.toString());
}
for (InetAddress ip : ips) {
// Note: This is actually not HTTP 1.1 compliant, as we hide the real "Host" value,
// but Android's HTTPUrlConnection does not support any other way to set
// Socket's remote IP address...
urls.add(getUrlPrefix() + ip.getHostAddress() + ":" + mPort + request);
}
}
for (String url : urls) {
try { try {
String url = "http://" + ips[i].getHostAddress() + ":" + mPort + request;
Log.d(Constants.TAG, "hkp keyserver query: " + url); Log.d(Constants.TAG, "hkp keyserver query: " + url);
URL realUrl = new URL(url); URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
@ -244,7 +283,7 @@ public class HkpKeyserver extends Keyserver {
while (matcher.find()) { while (matcher.find()) {
final ImportKeysListEntry entry = new ImportKeysListEntry(); final ImportKeysListEntry entry = new ImportKeysListEntry();
entry.setQuery(query); entry.setQuery(query);
entry.setOrigin("hkp:"+mHost+":"+mPort); entry.setOrigin(getUrlPrefix() + mHost + ":" + mPort);
entry.setBitStrength(Integer.parseInt(matcher.group(3))); entry.setBitStrength(Integer.parseInt(matcher.group(3)));
@ -297,7 +336,7 @@ public class HkpKeyserver extends Keyserver {
public String get(String keyIdHex) throws QueryFailedException { public String get(String keyIdHex) throws QueryFailedException {
HttpClient client = new DefaultHttpClient(); HttpClient client = new DefaultHttpClient();
try { try {
String query = "http://" + mHost + ":" + mPort + String query = getUrlPrefix() + mHost + ":" + mPort +
"/pks/lookup?op=get&options=mr&search=" + keyIdHex; "/pks/lookup?op=get&options=mr&search=" + keyIdHex;
Log.d(Constants.TAG, "hkp keyserver get: " + query); Log.d(Constants.TAG, "hkp keyserver get: " + query);
HttpGet get = new HttpGet(query); HttpGet get = new HttpGet(query);
@ -326,7 +365,7 @@ public class HkpKeyserver extends Keyserver {
public void add(String armoredKey) throws AddKeyException { public void add(String armoredKey) throws AddKeyException {
HttpClient client = new DefaultHttpClient(); HttpClient client = new DefaultHttpClient();
try { try {
String query = "http://" + mHost + ":" + mPort + "/pks/add"; String query = getUrlPrefix() + mHost + ":" + mPort + "/pks/add";
HttpPost post = new HttpPost(query); HttpPost post = new HttpPost(query);
Log.d(Constants.TAG, "hkp keyserver add: " + query); Log.d(Constants.TAG, "hkp keyserver add: " + query);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);