From 19b15e68e4ec652e23f9625662b7c0f96b963029 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 8 Sep 2024 09:00:34 +0200 Subject: [PATCH] Improve addDevice error message Fixes #1573 --- .../main/java/org/asamk/signal/manager/Manager.java | 3 ++- .../manager/api/DeviceLimitExceededException.java | 12 ++++++++++++ .../asamk/signal/manager/helper/AccountHelper.java | 10 ++++++++-- .../asamk/signal/manager/internal/ManagerImpl.java | 3 ++- .../org/asamk/signal/commands/AddDeviceCommand.java | 5 ++++- .../java/org/asamk/signal/dbus/DbusSignalImpl.java | 3 ++- 6 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 lib/src/main/java/org/asamk/signal/manager/api/DeviceLimitExceededException.java diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index 736f4e08..4b086994 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -6,6 +6,7 @@ import org.asamk.signal.manager.api.CaptchaRejectedException; import org.asamk.signal.manager.api.CaptchaRequiredException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; +import org.asamk.signal.manager.api.DeviceLimitExceededException; import org.asamk.signal.manager.api.DeviceLinkUrl; import org.asamk.signal.manager.api.Group; import org.asamk.signal.manager.api.GroupId; @@ -148,7 +149,7 @@ public interface Manager extends Closeable { void removeLinkedDevices(int deviceId) throws IOException, NotPrimaryDeviceException; - void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException; + void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException, DeviceLimitExceededException; void setRegistrationLockPin(Optional pin) throws IOException, NotPrimaryDeviceException; diff --git a/lib/src/main/java/org/asamk/signal/manager/api/DeviceLimitExceededException.java b/lib/src/main/java/org/asamk/signal/manager/api/DeviceLimitExceededException.java new file mode 100644 index 00000000..e24cc2ac --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/api/DeviceLimitExceededException.java @@ -0,0 +1,12 @@ +package org.asamk.signal.manager.api; + +public class DeviceLimitExceededException extends Exception { + + public DeviceLimitExceededException(final String message) { + super(message); + } + + public DeviceLimitExceededException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 5c74a37f..0ec45cb9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -39,6 +39,7 @@ import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotReserve import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException; import org.whispersystems.signalservice.api.push.exceptions.UsernameTakenException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; +import org.whispersystems.signalservice.internal.push.DeviceLimitExceededException; import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity; import org.whispersystems.signalservice.internal.push.OutgoingPushMessage; import org.whispersystems.signalservice.internal.push.SyncMessage; @@ -466,8 +467,13 @@ public class AccountHelper { dependencies.getAccountManager().setAccountAttributes(account.getAccountAttributes(null)); } - public void addDevice(DeviceLinkUrl deviceLinkInfo) throws IOException, InvalidDeviceLinkException { - var verificationCode = dependencies.getAccountManager().getNewDeviceVerificationCode(); + public void addDevice(DeviceLinkUrl deviceLinkInfo) throws IOException, InvalidDeviceLinkException, org.asamk.signal.manager.api.DeviceLimitExceededException { + String verificationCode; + try { + verificationCode = dependencies.getAccountManager().getNewDeviceVerificationCode(); + } catch (DeviceLimitExceededException e) { + throw new org.asamk.signal.manager.api.DeviceLimitExceededException("Too many linked devices", e); + } try { dependencies.getAccountManager() diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index 6549b088..39f59ccd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -23,6 +23,7 @@ import org.asamk.signal.manager.api.CaptchaRejectedException; import org.asamk.signal.manager.api.CaptchaRequiredException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; +import org.asamk.signal.manager.api.DeviceLimitExceededException; import org.asamk.signal.manager.api.DeviceLinkUrl; import org.asamk.signal.manager.api.Group; import org.asamk.signal.manager.api.GroupId; @@ -487,7 +488,7 @@ public class ManagerImpl implements Manager { } @Override - public void addDeviceLink(DeviceLinkUrl linkUrl) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException { + public void addDeviceLink(DeviceLinkUrl linkUrl) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException, DeviceLimitExceededException { if (!account.isPrimaryDevice()) { throw new NotPrimaryDeviceException(); } diff --git a/src/main/java/org/asamk/signal/commands/AddDeviceCommand.java b/src/main/java/org/asamk/signal/commands/AddDeviceCommand.java index 2813f4af..c40e4901 100644 --- a/src/main/java/org/asamk/signal/commands/AddDeviceCommand.java +++ b/src/main/java/org/asamk/signal/commands/AddDeviceCommand.java @@ -7,6 +7,7 @@ import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.asamk.signal.manager.Manager; +import org.asamk.signal.manager.api.DeviceLimitExceededException; import org.asamk.signal.manager.api.DeviceLinkUrl; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.NotPrimaryDeviceException; @@ -53,8 +54,10 @@ public class AddDeviceCommand implements JsonRpcLocalCommand { logger.error("Add device link failed: {}", e.getMessage()); throw new IOErrorException("Add device link failed", e); } catch (InvalidDeviceLinkException e) { - logger.error("Invalid device link"); + logger.info("Invalid device link"); throw new UserErrorException("Invalid device link", e); + } catch (DeviceLimitExceededException e) { + throw new UserErrorException("Account has too many linked devices already", e); } catch (NotPrimaryDeviceException e) { throw new UserErrorException("This command doesn't work on linked devices."); } diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index fae0c0a5..1b8b7825 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -5,6 +5,7 @@ import org.asamk.signal.BaseConfig; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.api.AttachmentInvalidException; import org.asamk.signal.manager.api.CaptchaRejectedException; +import org.asamk.signal.manager.api.DeviceLimitExceededException; import org.asamk.signal.manager.api.DeviceLinkUrl; import org.asamk.signal.manager.api.GroupId; import org.asamk.signal.manager.api.GroupInviteLinkUrl; @@ -189,7 +190,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable { try { var deviceLinkUrl = DeviceLinkUrl.parseDeviceLinkUri(new URI(uri)); m.addDeviceLink(deviceLinkUrl); - } catch (IOException | InvalidDeviceLinkException e) { + } catch (IOException | InvalidDeviceLinkException | DeviceLimitExceededException e) { throw new Error.Failure(e.getClass().getSimpleName() + " Add device link failed. " + e.getMessage()); } catch (NotPrimaryDeviceException e) { throw new Error.Failure("This command doesn't work on linked devices."); -- 2.50.1