From ac9f13a9f2137ff3f126b118fa24d2a5b599d762 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Sep 2016 11:01:27 +0200 Subject: [PATCH] provide hint on why conference can not be encrypted --- README.md | 3 ++ .../crypto/axolotl/AxolotlService.java | 28 ++++++++++++- .../ui/ConversationActivity.java | 41 +++++++++++++++++++ src/main/res/values/strings.xml | 4 ++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c6a7147b..c8d289baa 100644 --- a/README.md +++ b/README.md @@ -308,6 +308,9 @@ The owner of a conference can make a public conference private by going into the details and hit the settings button (the one with the gears) and select both *private* and *members only*. +If OMEMO is grayed out long pressing the lock icon will reveal some quick hints on why OMEMO +is disabled. + ##### OpenPGP Every participant has to announce their OpenPGP key (see answer above). diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java index 9e54c0c7d..28085085a 100644 --- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java +++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java @@ -647,14 +647,38 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { }); } + public enum AxolotlCapability { + FULL, + MISSING_PRESENCE, + MISSING_KEYS, + WRONG_CONFIGURATION, + NO_MEMBERS + } + public boolean isConversationAxolotlCapable(Conversation conversation) { + return isConversationAxolotlCapableDetailed(conversation).first == AxolotlCapability.FULL; + } + + public Pair isConversationAxolotlCapableDetailed(Conversation conversation) { final List jids = getCryptoTargets(conversation); for(Jid jid : jids) { if (!hasAny(jid) && (!deviceIds.containsKey(jid) || deviceIds.get(jid).isEmpty())) { - return false; + if (conversation.getAccount().getRoster().getContact(jid).trusted()) { + return new Pair<>(AxolotlCapability.MISSING_KEYS,jid); + } else { + return new Pair<>(AxolotlCapability.MISSING_PRESENCE,jid); + } + } + } + if (jids.size() > 0) { + return new Pair<>(AxolotlCapability.FULL, null); + } else { + if (conversation.getMucOptions().membersOnly() && conversation.getMucOptions().nonanonymous()) { + return new Pair<>(AxolotlCapability.NO_MEMBERS, null); + } else { + return new Pair<>(AxolotlCapability.WRONG_CONFIGURATION, null); } } - return jids.size() > 0; } public List getCryptoTargets(Conversation conversation) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 8bb1a7f77..e891f00b8 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -15,6 +15,7 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.provider.MediaStore; import android.provider.Settings; import android.support.v4.widget.SlidingPaneLayout; @@ -66,6 +67,8 @@ import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; +import static eu.siacs.conversations.crypto.axolotl.AxolotlService.AxolotlCapability.MISSING_PRESENCE; + public class ConversationActivity extends XmppActivity implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast { @@ -421,9 +424,47 @@ public class ConversationActivity extends XmppActivity } } } + if (Config.supportOmemo()) { + new Handler().post(new Runnable() { + @Override + public void run() { + View view = findViewById(R.id.action_security); + if (view != null) { + view.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + return quickOmemoDebugger(getSelectedConversation()); + } + }); + } + } + }); + } return super.onCreateOptionsMenu(menu); } + private boolean quickOmemoDebugger(Conversation c) { + if (c != null) { + AxolotlService axolotlService = c.getAccount().getAxolotlService(); + Pair capabilityJidPair = axolotlService.isConversationAxolotlCapableDetailed(c); + switch (capabilityJidPair.first) { + case MISSING_PRESENCE: + Toast.makeText(ConversationActivity.this,getString(R.string.missing_presence_subscription_with_x,capabilityJidPair.second.toBareJid().toString()),Toast.LENGTH_SHORT).show(); + return true; + case MISSING_KEYS: + Toast.makeText(ConversationActivity.this,getString(R.string.missing_keys_from_x,capabilityJidPair.second.toBareJid().toString()),Toast.LENGTH_SHORT).show(); + return true; + case WRONG_CONFIGURATION: + Toast.makeText(ConversationActivity.this,R.string.wrong_conference_configuration, Toast.LENGTH_SHORT).show(); + return true; + case NO_MEMBERS: + Toast.makeText(ConversationActivity.this,R.string.this_conference_has_no_members, Toast.LENGTH_SHORT).show(); + return true; + } + } + return false; + } + protected void selectPresenceToAttachFile(final int attachmentChoice, final int encryption) { final Conversation conversation = getSelectedConversation(); final Account account = conversation.getAccount(); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 5a5bb6ad2..22d89a812 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -682,4 +682,8 @@ No permission to access %s Remote server not found Unable to update account + Missing presence subscription with %s. + Missing OMEMO keys from %s. + This is not a private, non-anonymous conference. + There are no members in this conference.