introduce setting to ignore invites from strangers

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/AppSettings.java                         |  7 
src/main/java/eu/siacs/conversations/parser/MessageParser.java                | 51 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java                     |  9 
src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java |  1 
src/main/res/values/defaults.xml                                              |  1 
src/main/res/values/strings.xml                                               |  2 
src/main/res/xml/preferences_privacy.xml                                      |  9 
7 files changed, 62 insertions(+), 18 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/AppSettings.java 🔗

@@ -44,6 +44,8 @@ public class AppSettings {
     public static final String COLORFUL_CHAT_BUBBLES = "use_green_background";
     public static final String LARGE_FONT = "large_font";
 
+    private static final String ACCEPT_INVITES_FROM_STRANGERS = "accept_invites_from_strangers";
+
     private final Context context;
 
     public AppSettings(final Context context) {
@@ -107,6 +109,11 @@ public class AppSettings {
         return getBooleanPreference(USE_TOR, R.bool.use_tor);
     }
 
+    public boolean isAcceptInvitesFromStrangers() {
+        return getBooleanPreference(
+                ACCEPT_INVITES_FROM_STRANGERS, R.bool.accept_invites_from_strangers);
+    }
+
     private boolean getBooleanPreference(@NonNull final String name, @BoolRes int res) {
         final SharedPreferences sharedPreferences =
                 PreferenceManager.getDefaultSharedPreferences(context);

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -14,6 +14,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import eu.siacs.conversations.AppSettings;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.crypto.axolotl.AxolotlService;
@@ -459,7 +460,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             if (selfAddressed) {
                 counterpart = from;
             } else {
-                counterpart = to != null ? to : account.getJid();
+                counterpart = to;
             }
         } else {
             status = Message.STATUS_RECEIVED;
@@ -1136,22 +1137,48 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             if (this.jid == null) {
                 return false;
             }
-            final Contact contact = this.inviter != null ? account.getRoster().getContact(this.inviter) : null;
+            final Contact contact =
+                    this.inviter != null ? account.getRoster().getContact(this.inviter) : null;
             if (contact != null && contact.isBlocked()) {
-                Log.d(Config.LOGTAG,account.getJid().asBareJid()+": ignore invite from "+contact.getJid()+" because contact is blocked");
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid()
+                                + ": ignore invite from "
+                                + contact.getJid()
+                                + " because contact is blocked");
                 return false;
             }
-            final Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, jid, true, false);
-            if (conversation.getMucOptions().online()) {
-                Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received invite to " + jid + " but muc is considered to be online");
-                mXmppConnectionService.mucSelfPingAndRejoin(conversation);
+            final AppSettings appSettings = new AppSettings(mXmppConnectionService);
+            if ((contact != null && contact.showInContactList())
+                    || appSettings.isAcceptInvitesFromStrangers()) {
+                final Conversation conversation =
+                        mXmppConnectionService.findOrCreateConversation(account, jid, true, false);
+                if (conversation.getMucOptions().online()) {
+                    Log.d(
+                            Config.LOGTAG,
+                            account.getJid().asBareJid()
+                                    + ": received invite to "
+                                    + jid
+                                    + " but muc is considered to be online");
+                    mXmppConnectionService.mucSelfPingAndRejoin(conversation);
+                } else {
+                    conversation.getMucOptions().setPassword(password);
+                    mXmppConnectionService.databaseBackend.updateConversation(conversation);
+                    mXmppConnectionService.joinMuc(
+                            conversation, contact != null && contact.showInContactList());
+                    mXmppConnectionService.updateConversationUi();
+                }
+                return true;
             } else {
-                conversation.getMucOptions().setPassword(password);
-                mXmppConnectionService.databaseBackend.updateConversation(conversation);
-                mXmppConnectionService.joinMuc(conversation, contact != null && contact.showInContactList());
-                mXmppConnectionService.updateConversationUi();
+                Log.d(
+                        Config.LOGTAG,
+                        account.getJid().asBareJid()
+                                + ": ignoring invite from "
+                                + this.inviter
+                                + " because we are not accepting invites from strangers. direct="
+                                + direct);
+                return false;
             }
-            return true;
         }
     }
 }

src/main/java/eu/siacs/conversations/ui/XmppActivity.java 🔗

@@ -976,14 +976,15 @@ public abstract class XmppActivity extends ActionBarActivity {
             return invite;
         }
 
-        public boolean execute(XmppActivity activity) {
-            XmppConnectionService service = activity.xmppConnectionService;
-            Conversation conversation = service.findConversationByUuid(this.uuid);
+        public boolean execute(final XmppActivity activity) {
+            final XmppConnectionService service = activity.xmppConnectionService;
+            final Conversation conversation = service.findConversationByUuid(this.uuid);
             if (conversation == null) {
                 return false;
             }
             if (conversation.getMode() == Conversation.MODE_MULTI) {
-                for (Jid jid : jids) {
+                for (final Jid jid : jids) {
+                    // TODO use direct invites for public conferences
                     service.invite(conversation, jid);
                 }
                 return false;

src/main/java/eu/siacs/conversations/ui/util/MucDetailsContextMenuHelper.java 🔗

@@ -183,6 +183,7 @@ public final class MucDetailsContextMenuHelper {
                 activity.privateMsgInMuc(conversation, user.getName());
                 return true;
             case R.id.invite:
+                // TODO use direct invites for public conferences
                 if (user.getAffiliation().ranks(MucOptions.Affiliation.MEMBER)) {
                     activity.xmppConnectionService.directInvite(conversation, jid.asBareJid());
                 } else {

src/main/res/values/defaults.xml 🔗

@@ -25,6 +25,7 @@
     <integer name="automatic_message_deletion">0</integer>
     <bool name="trust_system_ca_store">true</bool>
     <bool name="allow_message_correction">true</bool>
+    <bool name="accept_invites_from_strangers">true</bool>
     <bool name="use_tor">false</bool>
     <bool name="show_connection_options">false</bool>
     <bool name="display_enter_key">false</bool>

src/main/res/values/strings.xml 🔗

@@ -1057,5 +1057,7 @@
     <string name="pref_up_long_summary">When acting as a UnifiedPush Distributor the persistent, reliable and battery-friendly XMPP connection will be utilized to wake up other UnifiedPush compatible app such as Tusky, Ltt.rs, FluffyChat and more.</string>
     <string name="pref_large_font">Large font</string>
     <string name="pref_large_font_summary">Increase font size in message bubbles</string>
+    <string name="pref_accept_invites_from_strangers">Invites from strangers</string>
+    <string name="pref_accept_invites_from_strangers_summary">Accept invites to group chats from strangers</string>
 
 </resources>

src/main/res/xml/preferences_privacy.xml 🔗

@@ -15,8 +15,8 @@
             android:title="@string/pref_chat_states" />
         <SwitchPreferenceCompat
             android:defaultValue="@bool/last_activity"
-            android:key="last_activity"
             android:icon="@drawable/ic_visibility_24dp"
+            android:key="last_activity"
             android:summary="@string/pref_broadcast_last_activity_summary"
             android:title="@string/pref_broadcast_last_activity" />
 
@@ -28,7 +28,12 @@
             android:key="allow_message_correction"
             android:summary="@string/pref_allow_message_correction_summary"
             android:title="@string/pref_allow_message_correction" />
-
+        <SwitchPreferenceCompat
+            android:defaultValue="@bool/accept_invites_from_strangers"
+            android:icon="@drawable/ic_domino_mask_24dp"
+            android:key="accept_invites_from_strangers"
+            android:summary="@string/pref_accept_invites_from_strangers_summary"
+            android:title="@string/pref_accept_invites_from_strangers" />
     </PreferenceCategory>
     <PreferenceCategory android:title="@string/pref_presence_settings">
         <SwitchPreferenceCompat