From c6be9b68c05834210a658cfa9d682ae85e20a523 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 16 Jul 2025 15:33:29 +0200 Subject: [PATCH] fix Pre-Authenticated In-Band Registration --- .../generator/PresenceGenerator.java | 50 ------------------- .../conversations/parser/PresenceParser.java | 2 - .../services/XmppConnectionService.java | 6 --- .../xmpp/manager/PresenceManager.java | 38 ++------------ .../xmpp/manager/RegistrationManager.java | 3 +- .../android/xmpp/model/pars/PreAuth.java | 4 +- 6 files changed, 7 insertions(+), 96 deletions(-) delete mode 100644 src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java diff --git a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java deleted file mode 100644 index 041293a421a053b9aa6ceaa5e4763a5de9492457..0000000000000000000000000000000000000000 --- a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -package eu.siacs.conversations.generator; - -import eu.siacs.conversations.entities.Account; -import eu.siacs.conversations.entities.MucOptions; -import eu.siacs.conversations.services.XmppConnectionService; -import eu.siacs.conversations.xmpp.manager.PresenceManager; -import im.conversations.android.xmpp.model.stanza.Presence; - -public class PresenceGenerator extends AbstractGenerator { - - public PresenceGenerator(XmppConnectionService service) { - super(service); - } - - public im.conversations.android.xmpp.model.stanza.Presence selfPresence(Account account, Presence.Availability status) { - return selfPresence(account, status, true, null); - } - - public im.conversations.android.xmpp.model.stanza.Presence selfPresence( - final Account account, final Presence.Availability status, final boolean personal, final String nickname) { - final var connection = account.getXmppConnection(); - if (connection == null) { - return new Presence(); - } - final var packet = connection.getManager(PresenceManager.class).getPresence(status, personal); - if (nickname != null) { - final var nick = packet.addChild("nick", "http://jabber.org/protocol/nick"); - nick.setContent(nickname); - } - return packet; - } - - public im.conversations.android.xmpp.model.stanza.Presence leave(final MucOptions mucOptions) { - im.conversations.android.xmpp.model.stanza.Presence presence = - new im.conversations.android.xmpp.model.stanza.Presence(); - presence.setTo(mucOptions.getSelf().getFullJid()); - presence.setFrom(mucOptions.getAccount().getJid()); - presence.setAttribute("type", "unavailable"); - return presence; - } - - public im.conversations.android.xmpp.model.stanza.Presence sendOfflinePresence( - Account account) { - im.conversations.android.xmpp.model.stanza.Presence packet = - new im.conversations.android.xmpp.model.stanza.Presence(); - packet.setFrom(account.getJid()); - packet.setAttribute("type", "unavailable"); - return packet; - } -} diff --git a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java index 41dc4840b775a0fa81881c5f2a3e6c83e19745b7..bf0104cab821cf69b50dca92580e9c7aff0ee856 100644 --- a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java +++ b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java @@ -15,7 +15,6 @@ import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.MucOptions; -import eu.siacs.conversations.generator.PresenceGenerator; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.utils.XmppUri; import eu.siacs.conversations.xml.Element; @@ -321,7 +320,6 @@ public class PresenceParser extends AbstractParser private void parseContactPresence( final im.conversations.android.xmpp.model.stanza.Presence packet) { final var account = getAccount(); - final PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator(); final Jid from = packet.getFrom(); if (from == null || from.equals(account.getJid())) { return; diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 21e8628b96d9e871c01aa26549ceeafc2bb7eb79..f545587735ff50d94f5ad5d04ae48a8715c24d31 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -139,7 +139,6 @@ import eu.siacs.conversations.entities.Reaction; import eu.siacs.conversations.generator.AbstractGenerator; import eu.siacs.conversations.generator.IqGenerator; import eu.siacs.conversations.generator.MessageGenerator; -import eu.siacs.conversations.generator.PresenceGenerator; import eu.siacs.conversations.http.HttpConnectionManager; import eu.siacs.conversations.http.ServiceOutageStatus; import eu.siacs.conversations.parser.IqParser; @@ -333,7 +332,6 @@ public class XmppConnectionService extends Service { } } }; - private final PresenceGenerator mPresenceGenerator = new PresenceGenerator(this); private List accounts; private final JingleConnectionManager mJingleConnectionManager = new JingleConnectionManager(this); @@ -4833,10 +4831,6 @@ public class XmppConnectionService extends Service { return this.mMessageGenerator; } - public PresenceGenerator getPresenceGenerator() { - return this.mPresenceGenerator; - } - public IqGenerator getIqGenerator() { return this.mIqGenerator; } diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/PresenceManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/PresenceManager.java index 24ffba366fbe77f608144940ad3abe94b2b6b4de..060c7c1bc6684d084b00b6cb7cbc446c65c9be99 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/PresenceManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/PresenceManager.java @@ -44,8 +44,7 @@ public class PresenceManager extends AbstractManager { } public void subscribe(final Jid address, final String preAuth) { - - var presence = new Presence(Presence.Type.SUBSCRIBE); + final var presence = new Presence(Presence.Type.SUBSCRIBE); presence.setTo(address); final var displayName = getAccount().getDisplayName(); @@ -59,13 +58,13 @@ public class PresenceManager extends AbstractManager { } public void unsubscribe(final Jid address) { - var presence = new Presence(Presence.Type.UNSUBSCRIBE); + final var presence = new Presence(Presence.Type.UNSUBSCRIBE); presence.setTo(address); this.connection.sendPresencePacket(presence); } public void unsubscribed(final Jid address) { - var presence = new Presence(Presence.Type.UNSUBSCRIBED); + final var presence = new Presence(Presence.Type.UNSUBSCRIBED); presence.setTo(address); this.connection.sendPresencePacket(presence); } @@ -158,37 +157,6 @@ public class PresenceManager extends AbstractManager { } } - public Presence getPresence(final Presence.Availability availability, final boolean personal) { - final var account = connection.getAccount(); - final var serviceDiscoveryFeatures = getManager(DiscoManager.class).getServiceDescription(); - final var infoQuery = serviceDiscoveryFeatures.asInfoQuery(); - final var capsHash = EntityCapabilities.hash(infoQuery); - final var caps2Hash = EntityCapabilities2.hash(infoQuery); - serviceDescriptions.put(capsHash, serviceDiscoveryFeatures); - serviceDescriptions.put(caps2Hash, serviceDiscoveryFeatures); - final var capabilities = new Capabilities(); - capabilities.setHash(caps2Hash); - final var legacyCapabilities = new LegacyCapabilities(); - legacyCapabilities.setNode(DiscoManager.CAPABILITY_NODE); - legacyCapabilities.setHash(capsHash); - final var presence = new Presence(); - presence.addExtension(capabilities); - presence.addExtension(legacyCapabilities); - - if (personal) { - final String pgpSignature = account.getPgpSignature(); - final String message = account.getPresenceStatusMessage(); - presence.setAvailability(availability); - presence.setStatus(message); - if (pgpSignature != null) { - final var signed = new Signed(); - signed.setContent(pgpSignature); - presence.addExtension(new Signed()); - } - } - return presence; - } - public ServiceDescription getCachedServiceDescription(final EntityCapabilities.Hash hash) { return this.serviceDescriptions.get(hash); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/manager/RegistrationManager.java b/src/main/java/eu/siacs/conversations/xmpp/manager/RegistrationManager.java index 0b12536fce6b3c6568798c3679daf58fd19a0584..6b525676d6b782dfec57777a48cd11632a81d2a9 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/manager/RegistrationManager.java +++ b/src/main/java/eu/siacs/conversations/xmpp/manager/RegistrationManager.java @@ -206,6 +206,7 @@ public class RegistrationManager extends AbstractManager { preAuthentication, IqErrorException.class, ex -> { + Log.d(Config.LOGTAG, "could not pre authenticate registration", ex); final var error = ex.getError(); final var condition = error == null ? null : error.getCondition(); if (condition instanceof Condition.ItemNotFound) { @@ -222,7 +223,7 @@ public class RegistrationManager extends AbstractManager { public ListenableFuture sendPreAuthentication(final String token) { final var account = getAccount(); - final var iq = new Iq(Iq.Type.GET); + final var iq = new Iq(Iq.Type.SET); iq.setTo(account.getJid().getDomain()); final var preAuthentication = iq.addExtension(new PreAuth()); preAuthentication.setToken(token); diff --git a/src/main/java/im/conversations/android/xmpp/model/pars/PreAuth.java b/src/main/java/im/conversations/android/xmpp/model/pars/PreAuth.java index d3d4b391034608fbcc7b3e52757f0b69403c5962..b18da3ffdbefb8848ab812e08f1a73bec2742f7b 100644 --- a/src/main/java/im/conversations/android/xmpp/model/pars/PreAuth.java +++ b/src/main/java/im/conversations/android/xmpp/model/pars/PreAuth.java @@ -1,10 +1,10 @@ package im.conversations.android.xmpp.model.pars; -import im.conversations.android.annotation.XmlElement; import eu.siacs.conversations.xml.Namespace; +import im.conversations.android.annotation.XmlElement; import im.conversations.android.xmpp.model.Extension; -@XmlElement(namespace = Namespace.PARS) +@XmlElement(namespace = Namespace.PARS, name = "preauth") public class PreAuth extends Extension { public PreAuth() {