provide hint on why conference can not be encrypted

This commit is contained in:
Daniel Gultsch 2016-09-08 11:01:27 +02:00
parent a54a7dca30
commit ac9f13a9f2
4 changed files with 74 additions and 2 deletions

View file

@ -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 details and hit the settings button (the one with the gears) and select both *private* and
*members only*. *members only*.
If OMEMO is grayed out long pressing the lock icon will reveal some quick hints on why OMEMO
is disabled.
##### OpenPGP ##### OpenPGP
Every participant has to announce their OpenPGP key (see answer above). Every participant has to announce their OpenPGP key (see answer above).

View file

@ -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) { public boolean isConversationAxolotlCapable(Conversation conversation) {
return isConversationAxolotlCapableDetailed(conversation).first == AxolotlCapability.FULL;
}
public Pair<AxolotlCapability,Jid> isConversationAxolotlCapableDetailed(Conversation conversation) {
final List<Jid> jids = getCryptoTargets(conversation); final List<Jid> jids = getCryptoTargets(conversation);
for(Jid jid : jids) { for(Jid jid : jids) {
if (!hasAny(jid) && (!deviceIds.containsKey(jid) || deviceIds.get(jid).isEmpty())) { 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<Jid> getCryptoTargets(Conversation conversation) { public List<Jid> getCryptoTargets(Conversation conversation) {

View file

@ -15,6 +15,7 @@ import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.Settings; import android.provider.Settings;
import android.support.v4.widget.SlidingPaneLayout; 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.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.jid.Jid;
import static eu.siacs.conversations.crypto.axolotl.AxolotlService.AxolotlCapability.MISSING_PRESENCE;
public class ConversationActivity extends XmppActivity public class ConversationActivity extends XmppActivity
implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast { 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); return super.onCreateOptionsMenu(menu);
} }
private boolean quickOmemoDebugger(Conversation c) {
if (c != null) {
AxolotlService axolotlService = c.getAccount().getAxolotlService();
Pair<AxolotlService.AxolotlCapability,Jid> 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) { protected void selectPresenceToAttachFile(final int attachmentChoice, final int encryption) {
final Conversation conversation = getSelectedConversation(); final Conversation conversation = getSelectedConversation();
final Account account = conversation.getAccount(); final Account account = conversation.getAccount();

View file

@ -682,4 +682,8 @@
<string name="no_permission_to_access_x">No permission to access %s</string> <string name="no_permission_to_access_x">No permission to access %s</string>
<string name="remote_server_not_found">Remote server not found</string> <string name="remote_server_not_found">Remote server not found</string>
<string name="unable_to_update_account">Unable to update account</string> <string name="unable_to_update_account">Unable to update account</string>
<string name="missing_presence_subscription_with_x">Missing presence subscription with %s.</string>
<string name="missing_keys_from_x">Missing OMEMO keys from %s.</string>
<string name="wrong_conference_configuration">This is not a private, non-anonymous conference.</string>
<string name="this_conference_has_no_members">There are no members in this conference.</string>
</resources> </resources>