automatically bookmark private, non-anonymous mucs where inviter is trusted. fixes #2035 #937

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/MessageParser.java           | 22 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 13 
2 files changed, 26 insertions(+), 9 deletions(-)

Detailed changes

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;
 		}

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);
 				}