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 86d237619964c3cbb4d41d3dfdf1246657a8b4a1..ae1b3a03f7d04d1887a5ae3756d30335931a6fc2 100644 --- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java +++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java @@ -53,6 +53,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { public static final String PEP_PREFIX = "eu.siacs.conversations.axolotl"; public static final String PEP_DEVICE_LIST = PEP_PREFIX + ".devicelist"; + public static final String PEP_DEVICE_LIST_NOTIFY = PEP_DEVICE_LIST + "+notify"; public static final String PEP_BUNDLES = PEP_PREFIX + ".bundles"; public static final String PEP_VERIFICATION = PEP_PREFIX + ".verification"; diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index b1d597df2759db45d5754bf1f9361310b6e57ce5..646bc2bee62b05b323f03a13ce8cf6889fb118c5 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -27,6 +27,7 @@ import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.jid.InvalidJidException; import eu.siacs.conversations.xmpp.jid.Jid; + public class Conversation extends AbstractEntity implements Blockable { public static final String TABLENAME = "conversations"; @@ -678,12 +679,12 @@ public class Conversation extends AbstractEntity implements Blockable { final AxolotlService axolotlService = getAccount().getAxolotlService(); int next = this.getIntAttribute(ATTRIBUTE_NEXT_ENCRYPTION, -1); if (next == -1) { - if (Config.X509_VERIFICATION) { - if (axolotlService != null && axolotlService.isConversationAxolotlCapable(this)) { - return Message.ENCRYPTION_AXOLOTL; - } else { - return Message.ENCRYPTION_NONE; - } + if (Config.supportOmemo() + && axolotlService != null + && mode == MODE_SINGLE + && axolotlService.isConversationAxolotlCapable(this) + && getContact().getPresences().allOrNonSupport(AxolotlService.PEP_DEVICE_LIST_NOTIFY)) { + return Message.ENCRYPTION_AXOLOTL; } int outgoing = this.getMostRecentlyUsedOutgoingEncryption(); if (outgoing == Message.ENCRYPTION_NONE) { @@ -695,7 +696,7 @@ public class Conversation extends AbstractEntity implements Blockable { if (!Config.supportUnencrypted() && next <= 0) { if (Config.supportOmemo() - && (axolotlService != null && axolotlService.isConversationAxolotlCapable(this) || !Config.multipleEncryptionChoices())) { + && ((axolotlService != null && axolotlService.isConversationAxolotlCapable(this)) || !Config.multipleEncryptionChoices())) { return Message.ENCRYPTION_AXOLOTL; } else if (Config.supportOtr() && mode == MODE_SINGLE) { return Message.ENCRYPTION_OTR; diff --git a/src/main/java/eu/siacs/conversations/entities/Presence.java b/src/main/java/eu/siacs/conversations/entities/Presence.java index 485adaa135d41a36ffa4c0ddba63621c42c0c876..e9f6d0d1684c715d27bdd62e5667a8d95cb27d5b 100644 --- a/src/main/java/eu/siacs/conversations/entities/Presence.java +++ b/src/main/java/eu/siacs/conversations/entities/Presence.java @@ -40,11 +40,11 @@ public class Presence implements Comparable { } } - protected final Status status; - protected ServiceDiscoveryResult disco; - protected final String ver; - protected final String hash; - protected final String message; + private final Status status; + private ServiceDiscoveryResult disco; + private final String ver; + private final String hash; + private final String message; private Presence(Status status, String ver, String hash, String message) { this.status = status; @@ -79,7 +79,15 @@ public class Presence implements Comparable { return this.hash; } + public String getMessage() { + return this.message; + } + public void setServiceDiscoveryResult(ServiceDiscoveryResult disco) { this.disco = disco; } + + public ServiceDiscoveryResult getServiceDiscoveryResult() { + return disco; + } } diff --git a/src/main/java/eu/siacs/conversations/entities/Presences.java b/src/main/java/eu/siacs/conversations/entities/Presences.java index 5fe10de0f7d981db65350877193d85db42a03be9..754175ab2655746c467ffd82dc99dc2cb5e6c3c2 100644 --- a/src/main/java/eu/siacs/conversations/entities/Presences.java +++ b/src/main/java/eu/siacs/conversations/entities/Presences.java @@ -64,11 +64,24 @@ public class Presences { ArrayList messages = new ArrayList<>(); synchronized (this.presences) { for(Presence presence : this.presences.values()) { - if (presence.message != null && !presence.message.trim().isEmpty()) { - messages.add(presence.message.trim()); + String message = presence.getMessage(); + if (message != null && !message.trim().isEmpty()) { + messages.add(message.trim()); } } } return messages; } + + public boolean allOrNonSupport(String namespace) { + synchronized (this.presences) { + for(Presence presence : this.presences.values()) { + ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult(); + if (disco == null || !disco.getFeatures().contains(namespace)) { + return false; + } + } + } + return true; + } } diff --git a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java b/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java index 05fa0b82e3c8a34c5db8d40720f94e9ecda40a38..4be6c621988abac50388af4c0591137262487f1c 100644 --- a/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java @@ -33,7 +33,7 @@ public abstract class AbstractGenerator { "urn:xmpp:ping", "jabber:iq:version", "http://jabber.org/protocol/chatstates", - AxolotlService.PEP_DEVICE_LIST+"+notify"}; + AxolotlService.PEP_DEVICE_LIST_NOTIFY}; private final String[] MESSAGE_CONFIRMATION_FEATURES = { "urn:xmpp:chat-markers:0", "urn:xmpp:receipts"