]> nmode's Git Repositories - signal-cli/commitdiff
Allow setting a username with explicit descriminator
authorAsamK <asamk@gmx.de>
Thu, 22 Feb 2024 18:59:19 +0000 (19:59 +0100)
committerAsamK <asamk@gmx.de>
Thu, 22 Feb 2024 19:00:00 +0000 (20:00 +0100)
Fixes #1469

graalvm-config-dir/jni-config.json
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java

index 5b47a7b6debfcb33d882e6db9c3ce05070933d88..b79debed009e57463001795d78fcf4f462f7ae30 100644 (file)
 {
   "name":"org.signal.libsignal.protocol.state.SignedPreKeyStore"
 },
+{
+  "name":"org.signal.libsignal.usernames.BadDiscriminatorCharacterException",
+  "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
+},
 {
   "name":"org.signal.libsignal.usernames.BadNicknameCharacterException",
   "methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
index 06b1fe80fb700a5f347943cbf532027731fd93fe..5abac1e7b48754bbf38d6bcbe946266fd5cdcaa5 100644 (file)
@@ -321,21 +321,42 @@ public class AccountHelper {
     public static final int USERNAME_MIN_LENGTH = 3;
     public static final int USERNAME_MAX_LENGTH = 32;
 
-    public void reserveUsername(String nickname) throws IOException, BaseUsernameException {
+    public void reserveUsernameFromNickname(String nickname) throws IOException, BaseUsernameException {
         final var currentUsername = account.getUsername();
         if (currentUsername != null) {
             final var currentNickname = currentUsername.substring(0, currentUsername.indexOf('.'));
             if (currentNickname.equals(nickname)) {
                 try {
                     refreshCurrentUsername();
+                    return;
                 } catch (IOException | BaseUsernameException e) {
                     logger.warn("[reserveUsername] Failed to refresh current username, trying to claim new username");
                 }
-                return;
             }
         }
 
         final var candidates = Username.candidatesFrom(nickname, USERNAME_MIN_LENGTH, USERNAME_MAX_LENGTH);
+        reserveUsername(candidates);
+    }
+
+    public void reserveExactUsername(String username) throws IOException, BaseUsernameException {
+        final var currentUsername = account.getUsername();
+        if (currentUsername != null) {
+            if (currentUsername.equals(username)) {
+                try {
+                    refreshCurrentUsername();
+                    return;
+                } catch (IOException | BaseUsernameException e) {
+                    logger.warn("[reserveUsername] Failed to refresh current username, trying to claim new username");
+                }
+            }
+        }
+
+        final var candidates = List.of(new Username(username));
+        reserveUsername(candidates);
+    }
+
+    private void reserveUsername(final List<Username> candidates) throws IOException {
         final var candidateHashes = new ArrayList<String>();
         for (final var candidate : candidates) {
             candidateHashes.add(Base64.encodeUrlSafeWithoutPadding(candidate.getHash()));
index 2caffc3842d597f6e5599beb0b9a843fb924c9fb..51a0e5ace4be96a257811c0fff3b3a37a9ac141a 100644 (file)
@@ -361,7 +361,11 @@ public class ManagerImpl implements Manager {
     @Override
     public void setUsername(final String username) throws IOException, InvalidUsernameException {
         try {
-            context.getAccountHelper().reserveUsername(username);
+            if (username.contains(".")) {
+                context.getAccountHelper().reserveExactUsername(username);
+            } else {
+                context.getAccountHelper().reserveUsernameFromNickname(username);
+            }
         } catch (BaseUsernameException e) {
             throw new InvalidUsernameException(e.getMessage() + " (" + e.getClass().getSimpleName() + ")", e);
         }