From 035a62e9200eacf5ece2c2551c6ecdd0abe63458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 4 Jul 2018 13:32:35 +0200 Subject: [PATCH] check for key status in legacy API key lists --- .../sufficientlysecure/keychain/model/SubKey.java | 4 ++++ .../remote/ui/SelectPublicKeyFragment.java | 12 +++++++++++- .../remote/ui/SelectSignKeyIdListFragment.java | 14 +++++++++++++- .../keychain/ui/adapter/KeyChoiceAdapter.java | 6 ++++++ OpenKeychain/src/main/res/values/strings.xml | 5 +++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java index e035917eb..5937ab318 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/model/SubKey.java @@ -66,6 +66,10 @@ public abstract class SubKey implements KeysModel { return has_encrypt_key_int() != 0; } + public boolean has_sign_key() { + return has_sign_key_int() != 0; + } + public String uidSearchString() { if (cachedUidSearchString == null) { cachedUidSearchString = user_id_list(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java index 1a01edfda..8603a1b62 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectPublicKeyFragment.java @@ -124,7 +124,17 @@ public class SelectPublicKeyFragment extends RecyclerFragment public void onLoadUnifiedKeyData(List data) { if (keyChoiceAdapter == null) { keyChoiceAdapter = KeyChoiceAdapter.createMultiChoiceAdapter(data, (keyInfo -> { - return keyInfo.is_revoked() ? R.string.keychoice_cannot_encrypt : null; + if (keyInfo.is_revoked()) { + return R.string.keychoice_revoked; + } else if (keyInfo.is_expired()) { + return R.string.keychoice_expired; + } else if (!keyInfo.is_secure()) { + return R.string.keychoice_insecure; + } else if (!keyInfo.has_encrypt_key()) { + return R.string.keychoice_cannot_encrypt; + } else { + return null; + } })); setAdapter(keyChoiceAdapter); keyChoiceAdapter.setSelectionByIds(selectedMasterKeyIds); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java index 3cefc75ba..fd9165fd4 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdListFragment.java @@ -116,7 +116,19 @@ public class SelectSignKeyIdListFragment extends RecyclerFragment data) { if (keyChoiceAdapter == null) { - keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(data, this::onSelectKeyItemClicked); + keyChoiceAdapter = KeyChoiceAdapter.createSingleClickableAdapter(data, this::onSelectKeyItemClicked, (keyInfo -> { + if (keyInfo.is_revoked()) { + return R.string.keychoice_revoked; + } else if (keyInfo.is_expired()) { + return R.string.keychoice_expired; + } else if (!keyInfo.is_secure()) { + return R.string.keychoice_insecure; + } else if (!keyInfo.has_sign_key()) { + return R.string.keychoice_cannot_sign; + } else { + return null; + } + })); setAdapter(keyChoiceAdapter); } else { keyChoiceAdapter.setUnifiedKeyInfoItems(data); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java index 10325d083..3d1dd655a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/KeyChoiceAdapter.java @@ -40,6 +40,12 @@ public class KeyChoiceAdapter extends FlexibleAdapter { return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, null); } + public static KeyChoiceAdapter createSingleClickableAdapter(List items, + OnKeyClickListener onKeyClickListener, + KeyDisabledPredicate keyDisabledPredicate) { + return new KeyChoiceAdapter(items, Objects.requireNonNull(onKeyClickListener), Mode.IDLE, keyDisabledPredicate); + } + public static KeyChoiceAdapter createSingleChoiceAdapter(List items) { return new KeyChoiceAdapter(items, null, Mode.SINGLE, null); } diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml index 5ad862968..931926c8c 100644 --- a/OpenKeychain/src/main/res/values/strings.xml +++ b/OpenKeychain/src/main/res/values/strings.xml @@ -2035,4 +2035,9 @@ An error occurred while updating all keys This key cannot be used for encryption! + This key cannot be used for signing! + This key cannot be used because it is insecure! + This key cannot be used because it is revoked! + This key cannot be used because it is expired! +