From 4c6ef3b24edcd1169940851fc01103cc9d29d2be Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 22 Jan 2017 18:58:49 +0100 Subject: [PATCH] cleaning up crypto targets when conference member is getting removed --- .../conversations/parser/MessageParser.java | 9 +++++++++ .../services/XmppConnectionService.java | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 7a08340b2..9a52ff802 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -624,6 +624,15 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece mXmppConnectionService.getAvatarService().clear(conversation); mXmppConnectionService.updateMucRosterUi(); mXmppConnectionService.updateConversationUi(); + if (!user.getAffiliation().ranks(MucOptions.Affiliation.MEMBER)) { + Jid jid = user.getRealJid(); + List cryptoTargets = conversation.getAcceptedCryptoTargets(); + if (cryptoTargets.remove(user.getRealJid())) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": removed "+jid+" from crypto targets of "+conversation.getName()); + conversation.setAcceptedCryptoTargets(cryptoTargets); + mXmppConnectionService.updateConversation(conversation); + } + } } } } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index e53b2524f..5f9498214 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -55,6 +55,7 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; @@ -2140,6 +2141,7 @@ public class XmppConnectionService extends Service { OnIqPacketReceived callback = new OnIqPacketReceived() { private int i = 0; + private boolean success = true; @Override public void onIqPacketReceived(Account account, IqPacket packet) { @@ -2155,10 +2157,28 @@ public class XmppConnectionService extends Service { } } } else { + success = false; Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not request affiliation "+affiliations[i]+" in "+conversation.getJid().toBareJid()); } ++i; if (i >= affiliations.length) { + List members = conversation.getMucOptions().getMembers(); + if (success) { + List cryptoTargets = conversation.getAcceptedCryptoTargets(); + boolean changed = false; + for(ListIterator iterator = cryptoTargets.listIterator(); iterator.hasNext();) { + Jid jid = iterator.next(); + if (!members.contains(jid)) { + iterator.remove(); + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": removed "+jid+" from crypto targets of "+conversation.getName()); + changed = true; + } + } + if (changed) { + conversation.setAcceptedCryptoTargets(cryptoTargets); + updateConversation(conversation); + } + } Log.d(Config.LOGTAG,account.getJid().toBareJid()+": retrieved members for "+conversation.getJid().toBareJid()+": "+conversation.getMucOptions().getMembers()); getAvatarService().clear(conversation); updateMucRosterUi();