]> nmode's Git Repositories - signal-cli/commitdiff
Add InvalidDeviceLinkException exception
authorAsamK <asamk@gmx.de>
Sun, 31 Oct 2021 18:35:00 +0000 (19:35 +0100)
committerAsamK <asamk@gmx.de>
Sun, 31 Oct 2021 18:35:00 +0000 (19:35 +0100)
lib/src/main/java/org/asamk/signal/manager/DeviceLinkInfo.java
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/api/InvalidDeviceLinkException.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/AddDeviceCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 3e35acedcfd7927416f62b33446a30c709bfd5da..ca6e305ceb8df3b6c0b7ac460b975b0e57535e18 100644 (file)
@@ -1,5 +1,6 @@
 package org.asamk.signal.manager;
 
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.libsignal.ecc.Curve;
 import org.whispersystems.libsignal.ecc.ECPublicKey;
@@ -17,7 +18,7 @@ import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
 
 public record DeviceLinkInfo(String deviceIdentifier, ECPublicKey deviceKey) {
 
-    public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidKeyException {
+    public static DeviceLinkInfo parseDeviceLinkUri(URI linkUri) throws InvalidDeviceLinkException {
         final var rawQuery = linkUri.getRawQuery();
         if (isEmpty(rawQuery)) {
             throw new RuntimeException("Invalid device link uri");
@@ -28,16 +29,21 @@ public record DeviceLinkInfo(String deviceIdentifier, ECPublicKey deviceKey) {
         var publicKeyEncoded = query.get("pub_key");
 
         if (isEmpty(deviceIdentifier) || isEmpty(publicKeyEncoded)) {
-            throw new RuntimeException("Invalid device link uri");
+            throw new InvalidDeviceLinkException("Invalid device link uri");
         }
 
         final byte[] publicKeyBytes;
         try {
             publicKeyBytes = Base64.getDecoder().decode(publicKeyEncoded);
         } catch (IllegalArgumentException e) {
-            throw new RuntimeException("Invalid device link uri", e);
+            throw new InvalidDeviceLinkException("Invalid device link uri", e);
+        }
+        ECPublicKey deviceKey;
+        try {
+            deviceKey = Curve.decodePoint(publicKeyBytes, 0);
+        } catch (InvalidKeyException e) {
+            throw new InvalidDeviceLinkException("Invalid device link", e);
         }
-        var deviceKey = Curve.decodePoint(publicKeyBytes, 0);
 
         return new DeviceLinkInfo(deviceIdentifier, deviceKey);
     }
index ad467d1f4c72a7e31befc42b532c12e005b89947..fae863817207ceb7fb707cc3fc4f797478a08837 100644 (file)
@@ -3,6 +3,7 @@ package org.asamk.signal.manager;
 import org.asamk.signal.manager.api.Device;
 import org.asamk.signal.manager.api.Group;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
@@ -23,7 +24,6 @@ import org.asamk.signal.manager.storage.identities.TrustNewIdentity;
 import org.asamk.signal.manager.storage.recipients.Contact;
 import org.asamk.signal.manager.storage.recipients.Profile;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
-import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId;
 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
@@ -117,7 +117,7 @@ public interface Manager extends Closeable {
 
     void removeLinkedDevices(long deviceId) throws IOException;
 
-    void addDeviceLink(URI linkUri) throws IOException, InvalidKeyException;
+    void addDeviceLink(URI linkUri) throws IOException, InvalidDeviceLinkException;
 
     void setRegistrationLockPin(Optional<String> pin) throws IOException, UnauthenticatedResponseException;
 
index c3af9ccf9f5a7bf5881630010813e3bdb4e67e7c..345413c67c54ca12d421f196d3d6d0c753489de0 100644 (file)
@@ -20,6 +20,7 @@ import org.asamk.signal.manager.actions.HandleAction;
 import org.asamk.signal.manager.api.Device;
 import org.asamk.signal.manager.api.Group;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
@@ -427,22 +428,28 @@ public class ManagerImpl implements Manager {
     }
 
     @Override
-    public void addDeviceLink(URI linkUri) throws IOException, InvalidKeyException {
+    public void addDeviceLink(URI linkUri) throws IOException, InvalidDeviceLinkException {
         var info = DeviceLinkInfo.parseDeviceLinkUri(linkUri);
 
         addDevice(info.deviceIdentifier(), info.deviceKey());
     }
 
-    private void addDevice(String deviceIdentifier, ECPublicKey deviceKey) throws IOException, InvalidKeyException {
+    private void addDevice(
+            String deviceIdentifier, ECPublicKey deviceKey
+    ) throws IOException, InvalidDeviceLinkException {
         var identityKeyPair = account.getIdentityKeyPair();
         var verificationCode = dependencies.getAccountManager().getNewDeviceVerificationCode();
 
-        dependencies.getAccountManager()
-                .addDevice(deviceIdentifier,
-                        deviceKey,
-                        identityKeyPair,
-                        Optional.of(account.getProfileKey().serialize()),
-                        verificationCode);
+        try {
+            dependencies.getAccountManager()
+                    .addDevice(deviceIdentifier,
+                            deviceKey,
+                            identityKeyPair,
+                            Optional.of(account.getProfileKey().serialize()),
+                            verificationCode);
+        } catch (InvalidKeyException e) {
+            throw new InvalidDeviceLinkException("Invalid device link", e);
+        }
         account.setMultiDevice(true);
     }
 
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/InvalidDeviceLinkException.java b/lib/src/main/java/org/asamk/signal/manager/api/InvalidDeviceLinkException.java
new file mode 100644 (file)
index 0000000..6d3c306
--- /dev/null
@@ -0,0 +1,12 @@
+package org.asamk.signal.manager.api;
+
+public class InvalidDeviceLinkException extends Exception {
+
+    public InvalidDeviceLinkException(final String message) {
+        super(message);
+    }
+
+    public InvalidDeviceLinkException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+}
index e609ec1e074b73935f7c5b168c2e6d2565aeb9ae..8674345220c30bda462204b6002b82a559b6e563 100644 (file)
@@ -6,12 +6,11 @@ import net.sourceforge.argparse4j.inf.Subparser;
 import org.asamk.signal.OutputWriter;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.IOErrorException;
-import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.Manager;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.libsignal.InvalidKeyException;
 
 import java.io.IOException;
 import java.net.URI;
@@ -38,16 +37,21 @@ public class AddDeviceCommand implements JsonRpcLocalCommand {
     public void handleCommand(
             final Namespace ns, final Manager m, final OutputWriter outputWriter
     ) throws CommandException {
+        final URI linkUri;
         try {
-            m.addDeviceLink(new URI(ns.getString("uri")));
+            linkUri = new URI(ns.getString("uri"));
+        } catch (URISyntaxException e) {
+            throw new UserErrorException("Device link uri has invalid format: " + e.getMessage());
+        }
+
+        try {
+            m.addDeviceLink(linkUri);
         } catch (IOException e) {
             logger.error("Add device link failed", e);
             throw new IOErrorException("Add device link failed", e);
-        } catch (URISyntaxException e) {
-            throw new UserErrorException("Device link uri has invalid format: " + e.getMessage());
-        } catch (InvalidKeyException e) {
+        } catch (InvalidDeviceLinkException e) {
             logger.error("Add device link failed", e);
-            throw new UnexpectedErrorException("Add device link failed.", e);
+            throw new UserErrorException("Add device link failed.", e);
         }
     }
 }
index 95b626784859079d5ab74926d2626460b583cbcd..20309cfc0415cd5ec14f7c39b7b94d1871b97519 100644 (file)
@@ -10,6 +10,7 @@ import org.asamk.signal.manager.UntrustedIdentityException;
 import org.asamk.signal.manager.api.Device;
 import org.asamk.signal.manager.api.Group;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
@@ -31,7 +32,6 @@ import org.freedesktop.dbus.DBusPath;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.freedesktop.dbus.interfaces.DBusInterface;
-import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
@@ -162,7 +162,7 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void addDeviceLink(final URI linkUri) throws IOException, InvalidKeyException {
+    public void addDeviceLink(final URI linkUri) throws IOException, InvalidDeviceLinkException {
         signal.addDevice(linkUri.toString());
     }
 
index d2419733203afb87a4fabc076c49e06cb379c9a8..00721f55761b50081198fcd010b5f6bdca822ac6 100644 (file)
@@ -9,6 +9,7 @@ import org.asamk.signal.manager.NotMasterDeviceException;
 import org.asamk.signal.manager.StickerPackInvalidException;
 import org.asamk.signal.manager.UntrustedIdentityException;
 import org.asamk.signal.manager.api.Identity;
+import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.Message;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.RecipientIdentifier;
@@ -30,7 +31,6 @@ import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.freedesktop.dbus.exceptions.DBusExecutionException;
 import org.freedesktop.dbus.types.Variant;
-import org.whispersystems.libsignal.InvalidKeyException;
 import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
@@ -107,7 +107,7 @@ public class DbusSignalImpl implements Signal {
     public void addDevice(String uri) {
         try {
             m.addDeviceLink(new URI(uri));
-        } catch (IOException | InvalidKeyException e) {
+        } catch (IOException | InvalidDeviceLinkException e) {
             throw new Error.Failure(e.getClass().getSimpleName() + " Add device link failed. " + e.getMessage());
         } catch (URISyntaxException e) {
             throw new Error.InvalidUri(e.getClass().getSimpleName()