From d40f62ec2154a6df1d741a498753265b27feb986 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 2 Apr 2026 21:32:19 +0200 Subject: [PATCH 1/7] Adapt exception handling to libsignal-service changes --- .../org/asamk/signal/manager/helper/AccountHelper.java | 6 ++---- .../org/asamk/signal/manager/internal/ManagerImpl.java | 9 +++------ 2 files changed, 5 insertions(+), 10 deletions(-) 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 82fb7d5a..2396b36e 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 @@ -37,9 +37,7 @@ import org.whispersystems.signalservice.api.push.UsernameLinkComponents; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; -import org.whispersystems.signalservice.api.push.exceptions.UsernameIsNotReservedException; -import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException; -import org.whispersystems.signalservice.api.push.exceptions.UsernameTakenException; +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.internal.push.DeviceLimitExceededException; import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity; @@ -465,7 +463,7 @@ public class AccountHelper { logger.debug("Attempting to resynchronize username."); try { tryReserveConfirmUsername(username); - } catch (UsernameMalformedException | UsernameTakenException | UsernameIsNotReservedException e) { + } catch (NonSuccessfulResponseCodeException e) { logger.debug("[confirmUsername] Failed to reserve confirm username: {} ({})", e.getMessage(), e.getClass().getSimpleName()); 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 3a3da757..e0174e7f 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 @@ -117,8 +117,7 @@ import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMess import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo; import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException; -import org.whispersystems.signalservice.api.push.exceptions.UsernameMalformedException; -import org.whispersystems.signalservice.api.push.exceptions.UsernameTakenException; +import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException; import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.api.util.StreamDetails; import org.whispersystems.signalservice.internal.util.Util; @@ -411,10 +410,8 @@ public class ManagerImpl implements Manager { } else { context.getAccountHelper().reserveUsernameFromNickname(username); } - } catch (UsernameMalformedException e) { - throw new InvalidUsernameException("Username is malformed", e); - } catch (UsernameTakenException e) { - throw new InvalidUsernameException("Username is already registered", e); + } catch (NonSuccessfulResponseCodeException e) { + throw new InvalidUsernameException("Username is malformed or already taken", e); } catch (BaseUsernameException e) { throw new InvalidUsernameException(e.getMessage() + " (" + e.getClass().getSimpleName() + ")", e); } From e6b33b8da747210c712a12ec270f4ef4e77b6f7f Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 2 Apr 2026 22:06:10 +0200 Subject: [PATCH 2/7] Check for missing attachment id Closes #1989 --- .../java/org/asamk/signal/commands/GetAttachmentCommand.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java index cf716194..c640ee83 100644 --- a/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java +++ b/src/main/java/org/asamk/signal/commands/GetAttachmentCommand.java @@ -41,6 +41,9 @@ public class GetAttachmentCommand implements JsonRpcLocalCommand { ) throws CommandException { final var id = ns.getString("id"); + if (id == null) { + throw new UserErrorException("Missing attachment id parameter"); + } try (InputStream attachment = m.retrieveAttachment(id)) { final var bytes = attachment.readAllBytes(); From 990d1eab584625f4cf9ced44c80ed0f9abd7ba9a Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 3 Apr 2026 10:11:04 +0200 Subject: [PATCH 3/7] Add java 26 to ci build --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da2122f1..cbbbbd7a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [ '25' ] + java: [ '25', '26' ] steps: - uses: actions/checkout@v6 From 266768813979b36adf6a225fc9bcb618f3612a5f Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 3 Apr 2026 11:20:01 +0200 Subject: [PATCH 4/7] Update gradle wrapper --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbc3ce4a..c61a118f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 62fc96c4c9fe2e43d355b02fa1d44884e42ab689 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 3 Apr 2026 11:20:46 +0200 Subject: [PATCH 5/7] Handle MustRequestNewCodeException Fixes #1968 --- .../asamk/signal/manager/internal/RegistrationManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java index ee1cd096..e90bb154 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java @@ -45,6 +45,7 @@ import org.whispersystems.signalservice.api.push.ServiceIdType; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; +import org.whispersystems.signalservice.api.push.exceptions.MustRequestNewCodeException; import org.whispersystems.signalservice.api.svr.SecureValueRecovery; import org.whispersystems.signalservice.internal.push.VerifyAccountResponse; @@ -262,6 +263,8 @@ public class RegistrationManagerImpl implements RegistrationManager { final var registrationApi = unauthenticatedAccountManager.getRegistrationApi(); try { handleResponseException(registrationApi.verifyAccount(sessionId, verificationCode)); + } catch (MustRequestNewCodeException e) { + throw new IOException("Verification code expired, please request a new one by registering again.", e); } catch (AlreadyVerifiedException e) { // Already verified so can continue registering } From b2bab0d0dcef55bd6bf11f447c393e78929d6f60 Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 3 Apr 2026 11:40:08 +0200 Subject: [PATCH 6/7] Add libsignal-version file Fixes #1964 --- build.gradle.kts | 14 ++++++++++++++ libsignal-version | 1 + 2 files changed, 15 insertions(+) create mode 100644 libsignal-version diff --git a/build.gradle.kts b/build.gradle.kts index 8d729984..fa8f4cd6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -146,3 +146,17 @@ tasks.register("fatJar", type = Jar::class) { } with(tasks.jar.get()) } + +tasks.register("writeLibsignalVersion") { + doLast { + val resolutionResult = configurations.runtimeClasspath.get().incoming.resolutionResult + val libsignalDep = + resolutionResult.allDependencies.find { dep -> dep.requested is ModuleComponentSelector && (dep.requested as ModuleComponentSelector).group == "org.signal" && (dep.requested as ModuleComponentSelector).moduleIdentifier.name == "libsignal-client" } + if (libsignalDep != null) { + val version = (libsignalDep.requested as ModuleComponentSelector).version + file("libsignal-version").writeText(version + "\n") + } else { + throw GradleException("Could not find libsignal-client dependency") + } + } +} diff --git a/libsignal-version b/libsignal-version new file mode 100644 index 00000000..ae02209b --- /dev/null +++ b/libsignal-version @@ -0,0 +1 @@ +0.90.0 From 763ddf85e64a95c88f9fdd5a3559e02a0813ff23 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 4 Apr 2026 15:05:24 +0200 Subject: [PATCH 7/7] Bump version to 0.14.2 --- CHANGELOG.md | 11 ++++++++++- build.gradle.kts | 2 +- data/org.asamk.SignalCli.metainfo.xml | 3 +++ src/main/java/org/asamk/signal/BaseConfig.java | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7567a29d..74377ed7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog -## [Unreleased] +## [0.14.2] - 2026-04-04 + +### Added + +- Add `--voice-note` parameter to `send` command (Thanks @Kevin) +- Add experimental support for voice calling (Thanks @visigoth) + +### Fixed + +- Fix `updateGroup` command for adding admins and removing members (Thanks @joeykrim) ## [0.14.1] - 2026-03-08 diff --git a/build.gradle.kts b/build.gradle.kts index fa8f4cd6..5d127e4c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { group = "org.asamk" - version = "0.14.2-SNAPSHOT" + version = "0.14.2" } java { diff --git a/data/org.asamk.SignalCli.metainfo.xml b/data/org.asamk.SignalCli.metainfo.xml index 15df456a..c1730192 100644 --- a/data/org.asamk.SignalCli.metainfo.xml +++ b/data/org.asamk.SignalCli.metainfo.xml @@ -45,6 +45,9 @@ intense + + https://github.com/AsamK/signal-cli/releases/tag/v0.14.2 + https://github.com/AsamK/signal-cli/releases/tag/v0.14.1 diff --git a/src/main/java/org/asamk/signal/BaseConfig.java b/src/main/java/org/asamk/signal/BaseConfig.java index dc19b461..022a22f1 100644 --- a/src/main/java/org/asamk/signal/BaseConfig.java +++ b/src/main/java/org/asamk/signal/BaseConfig.java @@ -8,7 +8,7 @@ public class BaseConfig { public static final String PROJECT_VERSION = BaseConfig.class.getPackage().getImplementationVersion(); static final String USER_AGENT_SIGNAL_ANDROID = Optional.ofNullable(System.getenv("SIGNAL_CLI_USER_AGENT")) - .orElse("Signal-Android/8.1.2"); + .orElse("Signal-Android/8.6.1"); static final String USER_AGENT_SIGNAL_CLI = PROJECT_NAME == null ? "signal-cli" : PROJECT_NAME + "/" + PROJECT_VERSION;