trim hostname before connecting via tor

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Account.java    | 33 ++--
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 23 +--
2 files changed, 25 insertions(+), 31 deletions(-)

Detailed changes

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

@@ -4,22 +4,9 @@ import android.content.ContentValues;
 import android.database.Cursor;
 import android.os.SystemClock;
 import android.util.Log;
-
+import androidx.annotation.NonNull;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArraySet;
-
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.crypto.PgpDecryptionService;
@@ -38,6 +25,16 @@ import eu.siacs.conversations.utils.XmppUri;
 import eu.siacs.conversations.xmpp.Jid;
 import eu.siacs.conversations.xmpp.XmppConnection;
 import eu.siacs.conversations.xmpp.jingle.RtpCapability;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import org.json.JSONException;
+import org.json.JSONObject;
 
 public class Account extends AbstractEntity implements AvatarService.Avatarable {
 
@@ -306,11 +303,12 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable
         this.password = password;
     }
 
+    @NonNull
     public String getHostname() {
         return Strings.nullToEmpty(this.hostname);
     }
 
-    public void setHostname(String hostname) {
+    public void setHostname(final String hostname) {
         this.hostname = hostname;
     }
 
@@ -398,7 +396,8 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable
     }
 
     public HashedToken getFastMechanism() {
-        final HashedToken.Mechanism fastMechanism = HashedToken.Mechanism.ofOrNull(this.fastMechanism);
+        final HashedToken.Mechanism fastMechanism =
+                HashedToken.Mechanism.ofOrNull(this.fastMechanism);
         final String token = this.fastToken;
         if (fastMechanism == null || Strings.isNullOrEmpty(token)) {
             return null;
@@ -775,7 +774,7 @@ public class Account extends AbstractEntity implements AvatarService.Avatarable
 
     public enum State {
         DISABLED(false, false),
-        LOGGED_OUT(false,false),
+        LOGGED_OUT(false, false),
         OFFLINE(false),
         CONNECTING(false),
         ONLINE(false),

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -303,6 +303,7 @@ public class XmppConnection implements Runnable {
             // TODO collapse Tor usage into normal connection code path
             if (useTor) {
                 final var seeOtherHost = this.seeOtherHostResolverResult;
+                final var hostname = account.getHostname();
                 final Resolver.Result resume = streamId == null ? null : streamId.location;
                 final Resolver.Result viaTor;
                 if (account.isOnion()) {
@@ -315,7 +316,7 @@ public class XmppConnection implements Runnable {
                     viaTor = resume;
                 } else if (seeOtherHost != null) {
                     viaTor = seeOtherHost;
-                } else if (account.getHostname().isEmpty()) {
+                } else if (hostname.isEmpty()) {
                     viaTor =
                             Iterables.getOnlyElement(
                                     Resolver.fromHardCoded(
@@ -323,18 +324,12 @@ public class XmppConnection implements Runnable {
                 } else {
                     viaTor =
                             Iterables.getOnlyElement(
-                                    Resolver.fromHardCoded(
-                                            account.getHostname(), account.getPort()));
-                    this.verifiedHostname = account.getHostname();
+                                    Resolver.fromHardCoded(hostname, account.getPort()));
+                    this.verifiedHostname = hostname;
                 }
 
-                Log.d(
-                        Config.LOGTAG,
-                        account.getJid().asBareJid()
-                                + ": connect to "
-                                + viaTor.asDestination()
-                                + " via Tor. directTls="
-                                + viaTor.isDirectTls());
+                Log.d(Config.LOGTAG, account.getJid().asBareJid() + " via Tor: " + viaTor);
+
                 localSocket =
                         SocksSocketFactory.createSocketOverTor(
                                 viaTor.asDestination(), viaTor.getPort());
@@ -359,12 +354,12 @@ public class XmppConnection implements Runnable {
                     throw new IOException("Could not start stream", e);
                 }
             } else {
+                final var hostname = account.getHostname().trim();
                 final String domain = account.getServer();
                 final List<Resolver.Result> results = new ArrayList<>();
-                final boolean hardcoded = extended && !account.getHostname().isEmpty();
+                final boolean hardcoded = extended && !hostname.isEmpty();
                 if (hardcoded) {
-                    results.addAll(
-                            Resolver.fromHardCoded(account.getHostname(), account.getPort()));
+                    results.addAll(Resolver.fromHardCoded(hostname, account.getPort()));
                 } else {
                     results.addAll(Resolver.resolve(domain));
                 }