diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 8b940a440ec97e39060268e3909f6ab26d05fe8f..be3627bb2cf49ad921e39db9e607b7f5c1843ed0 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/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; } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 8c7e8fb801ceef04e5f79b6c759c3e0ed6ddc006..62bc7484c87e622a8ead3751094dd268d87ce312 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/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 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; } }