diff options
author | mar-v-in <github@rvin.mooo.com> | 2014-06-04 17:55:24 +0200 |
---|---|---|
committer | mar-v-in <github@rvin.mooo.com> | 2014-06-04 18:05:16 +0200 |
commit | dd959876f4a1a7f26a3f7524e238416c1a30c7e5 (patch) | |
tree | 116f900bec79da37f04126dcec40bc99c7e7f635 /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper | |
parent | cc2ef0c17ca1d032477eb21308c5ea677b1cc548 (diff) | |
download | open-keychain-dd959876f4a1a7f26a3f7524e238416c1a30c7e5.tar.gz open-keychain-dd959876f4a1a7f26a3f7524e238416c1a30c7e5.tar.bz2 open-keychain-dd959876f4a1a7f26a3f7524e238416c1a30c7e5.zip |
First version of automatic contact discovery.
TODO:
- Configuration (much of it)
- Enabled by default?
- Which keys to import? Current state: All non-revoked and non-expired with matching userid
- Search for keys if already known? Current state: yes, may cause traffic (configuration: only when wifi?)
- Update interval: Currently Android handles it, might be good (causes automatic refresh on new contact and stuff like that) or bad (too many of refreshes)
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper')
-rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java new file mode 100644 index 000000000..80f52f914 --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/helper/EmailKeyHelper.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2014 Dominik Schürmann <dominik@dominikschuermann.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package org.sufficientlysecure.keychain.helper; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Messenger; +import org.sufficientlysecure.keychain.keyimport.HkpKeyserver; +import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; +import org.sufficientlysecure.keychain.keyimport.Keyserver; +import org.sufficientlysecure.keychain.service.KeychainIntentService; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class EmailKeyHelper { + + public static void importContacts(Context context, Messenger messenger) { + importAll(context, messenger, ContactHelper.getContactMails(context)); + } + + public static void importAll(Context context, Messenger messenger, List<String> mails) { + Set<ImportKeysListEntry> keys = new HashSet<ImportKeysListEntry>(); + for (String mail : mails) { + keys.addAll(getEmailKeys(context, mail)); + } + importKeys(context, messenger, new ArrayList<ImportKeysListEntry>(keys)); + } + + public static List<ImportKeysListEntry> getEmailKeys(Context context, String mail) { + Set<ImportKeysListEntry> keys = new HashSet<ImportKeysListEntry>(); + + // Try _hkp._tcp SRV record first + String[] mailparts = mail.split("@"); + if (mailparts.length == 2) { + HkpKeyserver hkp = HkpKeyserver.resolve(mailparts[1]); + if (hkp != null) { + keys.addAll(getEmailKeys(mail, hkp)); + } + } + + // Most users don't have the SRV record, so ask a default server as well + String[] servers = Preferences.getPreferences(context).getKeyServers(); + if (servers != null && servers.length != 0) { + HkpKeyserver hkp = new HkpKeyserver(servers[0]); + keys.addAll(getEmailKeys(mail, hkp)); + } + return new ArrayList<ImportKeysListEntry>(keys); + } + + private static void importKeys(Context context, Messenger messenger, List<ImportKeysListEntry> keys) { + Intent importIntent = new Intent(context, KeychainIntentService.class); + importIntent.setAction(KeychainIntentService.ACTION_DOWNLOAD_AND_IMPORT_KEYS); + Bundle importData = new Bundle(); + importData.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, + new ArrayList<ImportKeysListEntry>(keys)); + importIntent.putExtra(KeychainIntentService.EXTRA_DATA, importData); + importIntent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger); + + context.startService(importIntent); + } + + public static List<ImportKeysListEntry> getEmailKeys(String mail, Keyserver keyServer) { + Set<ImportKeysListEntry> keys = new HashSet<ImportKeysListEntry>(); + try { + for (ImportKeysListEntry key : keyServer.search(mail)) { + if (key.isRevoked() || key.isExpired()) continue; + for (String userId : key.getUserIds()) { + if (userId.toLowerCase().contains(mail.toLowerCase())) { + keys.add(key); + } + } + } + } catch (Keyserver.QueryFailedException ignored) { + } catch (Keyserver.QueryNeedsRepairException ignored) { + } + return new ArrayList<ImportKeysListEntry>(keys); + } +} |