]> nmode's Git Repositories - signal-cli/commitdiff
Refactor trust command implementation
authorAsamK <asamk@gmx.de>
Sat, 3 Jun 2023 14:10:47 +0000 (16:10 +0200)
committerAsamK <asamk@gmx.de>
Sat, 3 Jun 2023 14:10:47 +0000 (16:10 +0200)
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java
src/main/java/org/asamk/signal/commands/TrustCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java

index 884871c6aea9761f8c661272b8224655404286ac..38d9e12cbcb760a622948295e979d13637234c34 100644 (file)
@@ -11,6 +11,7 @@ import org.asamk.signal.manager.api.GroupInviteLinkUrl;
 import org.asamk.signal.manager.api.GroupNotFoundException;
 import org.asamk.signal.manager.api.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.IdentityVerificationCode;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.InvalidStickerException;
@@ -261,33 +262,12 @@ public interface Manager extends Closeable {
     List<Identity> getIdentities(RecipientIdentifier.Single recipient);
 
     /**
-     * Trust this the identity with this fingerprint
+     * Trust this the identity with this fingerprint/safetyNumber
      *
-     * @param recipient   account of the identity
-     * @param fingerprint Fingerprint
+     * @param recipient account of the identity
      */
     boolean trustIdentityVerified(
-            RecipientIdentifier.Single recipient, byte[] fingerprint
-    ) throws UnregisteredRecipientException;
-
-    /**
-     * Trust this the identity with this safety number
-     *
-     * @param recipient    account of the identity
-     * @param safetyNumber Safety number
-     */
-    boolean trustIdentityVerifiedSafetyNumber(
-            RecipientIdentifier.Single recipient, String safetyNumber
-    ) throws UnregisteredRecipientException;
-
-    /**
-     * Trust this the identity with this scannable safety number
-     *
-     * @param recipient    account of the identity
-     * @param safetyNumber Scannable safety number
-     */
-    boolean trustIdentityVerifiedSafetyNumber(
-            RecipientIdentifier.Single recipient, byte[] safetyNumber
+            RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode
     ) throws UnregisteredRecipientException;
 
     /**
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java b/lib/src/main/java/org/asamk/signal/manager/api/IdentityVerificationCode.java
new file mode 100644 (file)
index 0000000..0f05b48
--- /dev/null
@@ -0,0 +1,28 @@
+package org.asamk.signal.manager.api;
+
+import org.signal.libsignal.protocol.util.Hex;
+
+import java.util.Base64;
+import java.util.Locale;
+
+public sealed interface IdentityVerificationCode {
+
+    record Fingerprint(byte[] fingerprint) implements IdentityVerificationCode {}
+
+    record SafetyNumber(String safetyNumber) implements IdentityVerificationCode {}
+
+    record ScannableSafetyNumber(byte[] safetyNumber) implements IdentityVerificationCode {}
+
+    static IdentityVerificationCode parse(String code) throws Exception {
+        code = code.replaceAll(" ", "");
+        if (code.length() == 66) {
+            final var fingerprintBytes = Hex.fromStringCondensed(code.toLowerCase(Locale.ROOT));
+            return new Fingerprint(fingerprintBytes);
+        } else if (code.length() == 60) {
+            return new SafetyNumber(code);
+        } else {
+            final var scannableSafetyNumber = Base64.getDecoder().decode(code);
+            return new ScannableSafetyNumber(scannableSafetyNumber);
+        }
+    }
+}
index 9147eae19274693ace82e213c8fe887f7c2f6cdf..90b2f6a4cb16e45e3e2ccc9d75cfbc666cb286d5 100644 (file)
@@ -28,6 +28,7 @@ import org.asamk.signal.manager.api.GroupInviteLinkUrl;
 import org.asamk.signal.manager.api.GroupNotFoundException;
 import org.asamk.signal.manager.api.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.IdentityVerificationCode;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.InvalidStickerException;
@@ -1166,25 +1167,20 @@ public class ManagerImpl implements Manager {
 
     @Override
     public boolean trustIdentityVerified(
-            RecipientIdentifier.Single recipient, byte[] fingerprint
+            RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode
     ) throws UnregisteredRecipientException {
-        return trustIdentity(recipient, r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint));
-    }
-
-    @Override
-    public boolean trustIdentityVerifiedSafetyNumber(
-            RecipientIdentifier.Single recipient, String safetyNumber
-    ) throws UnregisteredRecipientException {
-        return trustIdentity(recipient,
-                r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber));
-    }
-
-    @Override
-    public boolean trustIdentityVerifiedSafetyNumber(
-            RecipientIdentifier.Single recipient, byte[] safetyNumber
-    ) throws UnregisteredRecipientException {
-        return trustIdentity(recipient,
-                r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber));
+        if (verificationCode instanceof IdentityVerificationCode.Fingerprint fingerprint) {
+            return trustIdentity(recipient,
+                    r -> context.getIdentityHelper().trustIdentityVerified(r, fingerprint.fingerprint()));
+        } else if (verificationCode instanceof IdentityVerificationCode.SafetyNumber safetyNumber) {
+            return trustIdentity(recipient,
+                    r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber()));
+        } else if (verificationCode instanceof IdentityVerificationCode.ScannableSafetyNumber safetyNumber) {
+            return trustIdentity(recipient,
+                    r -> context.getIdentityHelper().trustIdentityVerifiedSafetyNumber(r, safetyNumber.safetyNumber()));
+        } else {
+            throw new AssertionError("Invalid verification code type");
+        }
     }
 
     @Override
index 618655be1e6d08fc2b91ca34869a4cdcc2e1c09b..7d1dd6321c2cc76e4275ab6f64688a912f4777c7 100644 (file)
@@ -7,13 +7,10 @@ import net.sourceforge.argparse4j.inf.Subparser;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.Manager;
+import org.asamk.signal.manager.api.IdentityVerificationCode;
 import org.asamk.signal.manager.api.UnregisteredRecipientException;
 import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.util.CommandUtil;
-import org.asamk.signal.util.Hex;
-
-import java.util.Base64;
-import java.util.Locale;
 
 public class TrustCommand implements JsonRpcLocalCommand {
 
@@ -57,54 +54,22 @@ public class TrustCommand implements JsonRpcLocalCommand {
                         "You need to specify the fingerprint/safety number you have verified with -v SAFETY_NUMBER");
             }
 
-            safetyNumber = safetyNumber.replaceAll(" ", "");
-            if (safetyNumber.length() == 66) {
-                byte[] fingerprintBytes;
-                try {
-                    fingerprintBytes = Hex.toByteArray(safetyNumber.toLowerCase(Locale.ROOT));
-                } catch (Exception e) {
-                    throw new UserErrorException(
-                            "Failed to parse the fingerprint, make sure the fingerprint is a correctly encoded hex string without additional characters.");
-                }
-                boolean res;
-                try {
-                    res = m.trustIdentityVerified(recipient, fingerprintBytes);
-                } catch (UnregisteredRecipientException e) {
-                    throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered.");
-                }
-                if (!res) {
-                    throw new UserErrorException(
-                            "Failed to set the trust for the fingerprint of this number, make sure the number and the fingerprint are correct.");
-                }
-            } else if (safetyNumber.length() == 60) {
-                boolean res;
-                try {
-                    res = m.trustIdentityVerifiedSafetyNumber(recipient, safetyNumber);
-                } catch (UnregisteredRecipientException e) {
-                    throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered.");
-                }
-                if (!res) {
-                    throw new UserErrorException(
-                            "Failed to set the trust for the safety number of this phone number, make sure the phone number and the safety number are correct.");
-                }
-            } else {
-                final byte[] scannableSafetyNumber;
-                try {
-                    scannableSafetyNumber = Base64.getDecoder().decode(safetyNumber);
-                } catch (IllegalArgumentException e) {
-                    throw new UserErrorException(
-                            "Safety number has invalid format, either specify the old hex fingerprint or the new safety number");
-                }
-                boolean res;
-                try {
-                    res = m.trustIdentityVerifiedSafetyNumber(recipient, scannableSafetyNumber);
-                } catch (UnregisteredRecipientException e) {
-                    throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered.");
-                }
+            final IdentityVerificationCode verificationCode;
+            try {
+                verificationCode = IdentityVerificationCode.parse(safetyNumber);
+            } catch (Exception e) {
+                throw new UserErrorException(
+                        "Safety number has invalid format, either specify the old hex fingerprint or the new safety number");
+            }
+
+            try {
+                final var res = m.trustIdentityVerified(recipient, verificationCode);
                 if (!res) {
                     throw new UserErrorException(
-                            "Failed to set the trust for the safety number of this phone number, make sure the phone number and the safety number are correct.");
+                            "Failed to set the trust for this number, make sure the number and the fingerprint/safety number are correct.");
                 }
+            } catch (UnregisteredRecipientException e) {
+                throw new UserErrorException("The user " + e.getSender().getIdentifier() + " is not registered.");
             }
         }
     }
index 2871ad5d82e2d44ff6bce61fe8ac3e872043f1ab..0e81e57829e003ca9e00de1bb1b152933e445a34 100644 (file)
@@ -15,6 +15,7 @@ import org.asamk.signal.manager.api.GroupNotFoundException;
 import org.asamk.signal.manager.api.GroupPermission;
 import org.asamk.signal.manager.api.GroupSendingNotAllowedException;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.IdentityVerificationCode;
 import org.asamk.signal.manager.api.InactiveGroupLinkException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.InvalidStickerException;
@@ -667,20 +668,9 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public boolean trustIdentityVerified(final RecipientIdentifier.Single recipient, final byte[] fingerprint) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean trustIdentityVerifiedSafetyNumber(
-            final RecipientIdentifier.Single recipient, final String safetyNumber
-    ) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean trustIdentityVerifiedSafetyNumber(
-            final RecipientIdentifier.Single recipient, final byte[] safetyNumber
+    public boolean trustIdentityVerified(
+            final RecipientIdentifier.Single recipient,
+            final IdentityVerificationCode verificationCode
     ) {
         throw new UnsupportedOperationException();
     }