Show import key dialog when clicking on WKD URL

This change extends WKD support for direct Web Key Directory URLs
similarily to Facebook key URLs and HKP URLs.

When a link with scheme `https` and path starting with
`/.well-known/openpgpkey/hu/` is clicked Android will suggest importing
the key with OpenKeychain.

Fixes #2270.
This commit is contained in:
Wiktor Kwapisiewicz 2018-05-22 10:16:19 +02:00
parent bc25b345fc
commit 222231066e
4 changed files with 47 additions and 0 deletions

View file

@ -719,6 +719,21 @@
<data android:pathPattern="/..*/publickey/download" />
</intent-filter>
<!-- VIEW from Web Key Directory urls opened in a browser -->
<intent-filter android:label="@string/intent_import_key">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https" />
<!-- if we don't specify a host, pathPattern will be ignored-->
<data android:host="*" />
<data android:pathPattern="/.well-known/openpgpkey/hu/.*" />
</intent-filter>
<!-- IMPORT_KEY with files TODO: does this work? -->
<intent-filter android:label="@string/intent_import_key">
<action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY" />

View file

@ -56,6 +56,8 @@ public class ImportKeysActivity extends BaseActivity implements ImportKeysListen
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER = Constants.IMPORT_KEY_FROM_KEYSERVER;
public static final String ACTION_IMPORT_KEY_FROM_FACEBOOK
= Constants.INTENT_PREFIX + "IMPORT_KEY_FROM_FACEBOOK";
public static final String ACTION_IMPORT_KEY_FROM_WEB_KEY_DIRECTORY
= Constants.INTENT_PREFIX + "ACTION_IMPORT_KEY_FROM_WEB_KEY_DIRECTORY";
public static final String ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT =
Constants.INTENT_PREFIX + "IMPORT_KEY_FROM_KEY_SERVER_AND_RETURN_RESULT";
public static final String ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN = Constants.INTENT_PREFIX
@ -121,6 +123,8 @@ public class ImportKeysActivity extends BaseActivity implements ImportKeysListen
if (Intent.ACTION_VIEW.equals(action)) {
if (FacebookKeyserverClient.isFacebookHost(dataUri)) {
action = ACTION_IMPORT_KEY_FROM_FACEBOOK;
} else if ("https".equalsIgnoreCase(scheme) || dataUri.getPath().startsWith("/.well-known/openpgpkey/hu/")) {
action = ACTION_IMPORT_KEY_FROM_WEB_KEY_DIRECTORY;
} else if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) {
action = ACTION_SEARCH_KEYSERVER_FROM_URL;
} else if ("openpgp4fpr".equalsIgnoreCase(scheme)) {
@ -208,6 +212,13 @@ public class ImportKeysActivity extends BaseActivity implements ImportKeysListen
startListFragment(null, null, fbUsername, cloudSearchPrefs);
break;
}
case ACTION_IMPORT_KEY_FROM_WEB_KEY_DIRECTORY: {
Preferences.CloudSearchPrefs cloudSearchPrefs =
new Preferences.CloudSearchPrefs(false, false, false, true, null);
// search immediately
startListFragment(null, null, dataUri.toString(), cloudSearchPrefs);
break;
}
case ACTION_SEARCH_KEYSERVER_FROM_URL: {
// get keyserver from URL
HkpKeyserverAddress keyserver = HkpKeyserverAddress.createFromUri(

View file

@ -24,6 +24,18 @@ public class WebKeyDirectoryUtil {
*/
@Nullable
public static URL toWebKeyDirectoryURL(String name) {
if (name == null) {
return null;
}
if (name.startsWith("https://") && name.contains("/.well-known/openpgpkey/hu/")) {
try {
return new URL(name);
} catch (MalformedURLException e) {
return null;
}
}
Matcher matcher = EMAIL_PATTERN.matcher(name);
if (!matcher.matches()) {

View file

@ -27,4 +27,13 @@ public class WebKeyDirectoryUtilTest {
assertEquals("/.well-known/openpgpkey/hu/4hg7tescnttreaouu4z1izeuuyibwww1", url.getPath());
}
@Test
public void testWkdDirectUrl() {
URL url = WebKeyDirectoryUtil.toWebKeyDirectoryURL("https://openkeychain.org/.well-known/openpgpkey/hu/4hg7tescnttreaouu4z1izeuuyibwww1");
assertNotNull(url);
assertEquals("openkeychain.org", url.getHost());
assertEquals("https", url.getProtocol());
assertEquals("/.well-known/openpgpkey/hu/4hg7tescnttreaouu4z1izeuuyibwww1", url.getPath());
}
}