From 8cc418e89b2aea3492bb2f6d11c7c244e061e1fc Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 23 Dec 2022 23:11:29 -0500 Subject: [PATCH] Support extended addressing ofrom when domain matches Allow a message to appear as from a different jid using ofrom if the domain matches the actual from and source domain advertises support for extended addressing. This is safe because spoofing control is up to the source server, and the source server could have chosen to write a different from with the same domain if it wished. If there is a true counterpart (set from ofrom) then display nickname like in a MUC because this message isn't from the normal counterpart of this conversation. --- .../eu/siacs/conversations/entities/Message.java | 5 +++++ .../conversations/parser/MessageParser.java | 16 ++++++++++++++++ .../conversations/ui/adapter/MessageAdapter.java | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 04175632ef46035b175a40da6cf09727de0b2c14..399dc61734db6647bafc08ea726ebfec23fbddce 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -392,6 +392,11 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable public Contact getContact() { if (this.conversation.getMode() == Conversation.MODE_SINGLE) { + if (this.trueCounterpart != null) { + return this.conversation.getAccount().getRoster() + .getContact(this.trueCounterpart); + } + return this.conversation.getContact(); } else { if (this.trueCounterpart == null) { diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 6ccfe69b4cde5c2b07cb84656c6b2bd5354a7a17..655ddcbf8ff6dc54ee1fc6853f29d88217e08a46 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -602,6 +602,22 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } } + Element addresses = packet.findChild("addresses", "http://jabber.org/protocol/address"); + if (status == Message.STATUS_RECEIVED && addresses != null) { + for (Element address : addresses.getChildren()) { + if (!address.getName().equals("address") || !address.getNamespace().equals("http://jabber.org/protocol/address")) continue; + + if (address.getAttribute("type").equals("ofrom") && address.getAttribute("jid") != null) { + Jid ofrom = address.getAttributeAsJid("jid"); + if (InvalidJid.isValid(ofrom) && ofrom.getDomain().equals(counterpart.getDomain()) && + conversation.getAccount().getRoster().getContact(counterpart.getDomain()).getPresences().anySupport("http://jabber.org/protocol/address")) { + + message.setTrueCounterpart(ofrom); + } + } + } + } + if (html != null) message.addPayload(html); message.setSubject(original.findChildContent("subject")); message.setCounterpart(counterpart); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 7194f5c80ec1f7a890a454bd0fcfbc02ffde8a00..a6e53d77a3b45713efd628a1d1c8511185e98c00 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -267,7 +267,7 @@ public class MessageAdapter extends ArrayAdapter { error = true; break; default: - if (mForceNames || multiReceived) { + if (mForceNames || multiReceived || (message.getTrueCounterpart() != null && message.getContact() != null)) { info = UIHelper.getMessageDisplayName(message); } break;