From 39bb8ad05f3469a81cf795cc75fd47475f967654 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 9 Jan 2017 19:54:27 +0100 Subject: [PATCH] automatically bookmark private, non-anonymous mucs where inviter is trusted. fixes #2035 #937 --- .../conversations/parser/MessageParser.java | 22 ++++++++++++------- .../services/XmppConnectionService.java | 13 ++++++++++- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 87993a456..7a08340b2 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -167,11 +167,13 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } private class Invite { - Jid jid; - String password; - Invite(Jid jid, String password) { + final Jid jid; + final String password; + final Contact inviter; + Invite(Jid jid, String password, Contact inviter) { this.jid = jid; this.password = password; + this.inviter = inviter; } public boolean execute(Account account) { @@ -180,7 +182,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (!conversation.getMucOptions().online()) { conversation.getMucOptions().setPassword(password); mXmppConnectionService.databaseBackend.updateConversation(conversation); - mXmppConnectionService.joinMuc(conversation); + mXmppConnectionService.joinMuc(conversation, inviter != null && inviter.mutualPresenceSubscription()); mXmppConnectionService.updateConversationUi(); } return true; @@ -189,18 +191,22 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } } - private Invite extractInvite(Element message) { + private Invite extractInvite(Account account, Element message) { Element x = message.findChild("x", "http://jabber.org/protocol/muc#user"); if (x != null) { Element invite = x.findChild("invite"); if (invite != null) { Element pw = x.findChild("password"); - return new Invite(message.getAttributeAsJid("from"), pw != null ? pw.getContent(): null); + Jid from = invite.getAttributeAsJid("from"); + Contact contact = from == null ? null : account.getRoster().getContact(from); + return new Invite(message.getAttributeAsJid("from"), pw != null ? pw.getContent(): null, contact); } } else { x = message.findChild("x","jabber:x:conference"); if (x != null) { - return new Invite(x.getAttributeAsJid("jid"),x.getAttribute("password")); + Jid from = message.getAttributeAsJid("from"); + Contact contact = from == null ? null : account.getRoster().getContact(from); + return new Invite(x.getAttributeAsJid("jid"),x.getAttribute("password"),contact); } } return null; @@ -364,7 +370,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece counterpart = from; } - Invite invite = extractInvite(packet); + Invite invite = extractInvite(account, packet); if (invite != null && invite.execute(account)) { return; } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 053cbde1b..ce49b2b66 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -2047,10 +2047,18 @@ public class XmppConnectionService extends Service { } public void joinMuc(Conversation conversation) { - joinMuc(conversation, null); + joinMuc(conversation,null, false); + } + + public void joinMuc(Conversation conversation, boolean followedInvite) { + joinMuc(conversation, null, followedInvite); } private void joinMuc(Conversation conversation, final OnConferenceJoined onConferenceJoined) { + joinMuc(conversation,onConferenceJoined,false); + } + + private void joinMuc(Conversation conversation, final OnConferenceJoined onConferenceJoined, final boolean followedInvite) { Account account = conversation.getAccount(); account.pendingConferenceJoins.remove(conversation); account.pendingConferenceLeaves.remove(conversation); @@ -2095,6 +2103,9 @@ public class XmppConnectionService extends Service { } if (mucOptions.membersOnly() && mucOptions.nonanonymous()) { fetchConferenceMembers(conversation); + if (followedInvite && conversation.getBookmark() == null) { + saveConversationAsBookmark(conversation,null); + } } sendUnsentMessages(conversation); }