fix Pre-Authenticated In-Band Registration

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java      | 50 
src/main/java/eu/siacs/conversations/parser/PresenceParser.java            |  2 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java   |  6 
src/main/java/eu/siacs/conversations/xmpp/manager/PresenceManager.java     | 38 
src/main/java/eu/siacs/conversations/xmpp/manager/RegistrationManager.java |  3 
src/main/java/im/conversations/android/xmpp/model/pars/PreAuth.java        |  4 
6 files changed, 7 insertions(+), 96 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java 🔗

@@ -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;
-    }
-}

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;

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<Account> 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;
     }

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);
     }

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<Void> 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);

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() {