Store explicit moderation info

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/entities/Message.java     | 12 ++
src/main/java/eu/siacs/conversations/parser/MessageParser.java | 22 ++-
2 files changed, 25 insertions(+), 9 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -552,6 +552,18 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
         return this.deleted;
     }
 
+    public Element getModerated() {
+        if (this.payloads == null) return null;
+
+        for (Element el : this.payloads) {
+            if (el.getName().equals("moderated") && el.getNamespace().equals("urn:xmpp:message-moderate:0")) {
+                return el;
+            }
+        }
+
+        return null;
+    }
+
     public void setDeleted(boolean deleted) {
         this.deleted = deleted;
     }

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

@@ -413,7 +413,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
         }
         final Element mucUserElement = packet.findChild("x", Namespace.MUC_USER);
         final String pgpEncrypted = packet.findChildContent("x", "jabber:x:encrypted");
-        final Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
+        Element replaceElement = packet.findChild("replace", "urn:xmpp:message-correct:0");
         Set<Message.FileParams> attachments = new LinkedHashSet<>();
         for (Element child : packet.getChildren()) {
             // SIMS first so they get preference in the set
@@ -429,13 +429,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
             }
         }
         String replacementId = replaceElement == null ? null : replaceElement.getAttribute("id");
-        boolean replaceAsRetraction = false;
         if (replacementId == null) {
-            Element fasten = packet.findChild("apply-to", "urn:xmpp:fasten:0");
-            if (fasten != null && (fasten.findChild("retract", "urn:xmpp:message-retract:0") != null || fasten.findChild("moderated", "urn:xmpp:message-moderate:0") != null)) {
-                replacementId = fasten.getAttribute("id");
-                packet.setBody("");
-                replaceAsRetraction = true;
+            final Element fasten = packet.findChild("apply-to", "urn:xmpp:fasten:0");
+            if (fasten != null) {
+                replaceElement = fasten.findChild("retract", "urn:xmpp:message-retract:0");
+                if (replaceElement == null) replaceElement = fasten.findChild("moderated", "urn:xmpp:message-moderate:0");
+                if (replaceElement != null) {
+                    final String reason = replaceElement.findChildContent("reason", "urn:xmpp:message-moderate:0");
+                    replacementId = fasten.getAttribute("id");
+                    packet.setBody(reason == null ? "" : reason);
+                }
             }
         }
         final LocalizedContent body = packet.getBody();
@@ -690,12 +693,13 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                             replacedMessage.setBody(message.getBody());
                             replacedMessage.putEdited(replacedMessage.getRemoteMsgId(), replacedMessage.getServerMsgId());
                             replacedMessage.setRemoteMsgId(remoteMsgId);
-                            if (replaceAsRetraction) {
+                            if (!replaceElement.getName().equals("replace")) {
                                 mXmppConnectionService.getFileBackend().deleteFile(replacedMessage);
                                 mXmppConnectionService.evictPreview(message.getUuid());
                                 replacedMessage.clearPayloads();
                                 replacedMessage.setFileParams(null);
                                 replacedMessage.setDeleted(true);
+                                replacedMessage.addPayload(replaceElement);
                             }
                             if (replacedMessage.getServerMsgId() == null || message.getServerMsgId() != null) {
                                 replacedMessage.setServerMsgId(message.getServerMsgId());
@@ -724,7 +728,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
                     } else {
                         Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received message correction but verification didn't check out");
                     }
-                } else if (replaceAsRetraction) {
+                } else if (message.getBody() == null || message.getBody().equals("") || message.getBody().equals(" ")) {
                     return;
                 }
             }