From 30e8e36635733b3e8c75a44e95785ba33cf55e61 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sat, 13 Jan 2024 16:00:55 +0100 Subject: [PATCH] Add --unrestricted-unidentified-sender to updateAccount command --- CHANGELOG.md | 1 + .../main/java/org/asamk/signal/manager/Manager.java | 2 +- .../asamk/signal/manager/helper/ProfileHelper.java | 7 +++++++ .../asamk/signal/manager/internal/ManagerImpl.java | 5 ++++- .../asamk/signal/manager/storage/SignalAccount.java | 11 +++++++++-- man/signal-cli.1.adoc | 3 +++ .../asamk/signal/commands/UpdateAccountCommand.java | 13 +++++++++---- .../java/org/asamk/signal/dbus/DbusManagerImpl.java | 4 +++- .../java/org/asamk/signal/dbus/DbusSignalImpl.java | 2 +- 9 files changed, 38 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40bb6d37..4abfc108 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - New --hidden parameter for removeContact command - New --notify-self parameter for send command, for sending a non-sync message when self is part of the recipients or groups. With this parameter sending to the self number (+XXXX) now behaves the same as the --note-to-self parameter. +- New --unrestricted-unidentified-sender parameter for updateAccount command ### Improved - Better shutdown handling after Ctrl+C and SIGTERM 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 4104a8fb..6fe1a67f 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -89,7 +89,7 @@ public interface Manager extends Closeable { */ Map getUserStatus(Set numbers) throws IOException, RateLimitException; - void updateAccountAttributes(String deviceName) throws IOException; + void updateAccountAttributes(String deviceName, Boolean unrestrictedUnidentifiedSender) throws IOException; Configuration getConfiguration(); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java index d427d0d0..ec3ae020 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java @@ -328,6 +328,13 @@ public final class ProfileHelper { final var profile = account.getProfileStore().getProfile(recipientId); + if (recipientId.equals(account.getSelfRecipientId())) { + final var isUnrestricted = encryptedProfile.isUnrestrictedUnidentifiedAccess(); + if (account.isUnrestrictedUnidentifiedAccess() != isUnrestricted) { + account.setUnrestrictedUnidentifiedAccess(isUnrestricted); + } + } + Profile newProfile = null; if (profileKey.isPresent()) { logger.trace("Decrypting profile"); 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 bc801a28..29f3d2ab 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 @@ -277,10 +277,13 @@ public class ManagerImpl implements Manager { } @Override - public void updateAccountAttributes(String deviceName) throws IOException { + public void updateAccountAttributes(String deviceName, Boolean unrestrictedUnidentifiedSender) throws IOException { if (deviceName != null) { context.getAccountHelper().setDeviceName(deviceName); } + if (unrestrictedUnidentifiedSender != null) { + account.setUnrestrictedUnidentifiedAccess(unrestrictedUnidentifiedSender); + } context.getAccountHelper().updateAccountAttributes(); context.getAccountHelper().checkWhoAmiI(); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index b95b86e5..6860e239 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -154,6 +154,10 @@ public class SignalAccount implements Closeable { private final KeyValueEntry storageManifestVersion = new KeyValueEntry<>("storage-manifest-version", long.class, -1L); + private final KeyValueEntry unrestrictedUnidentifiedAccess = new KeyValueEntry<>( + "unrestricted-unidentified-access", + Boolean.class, + false); private boolean isMultiDevice = false; private boolean registered = false; @@ -1594,8 +1598,11 @@ public class SignalAccount implements Closeable { } public boolean isUnrestrictedUnidentifiedAccess() { - final var profile = getProfileStore().getProfile(getSelfRecipientId()); - return profile != null && profile.getUnidentifiedAccessMode() == Profile.UnidentifiedAccessMode.UNRESTRICTED; + return Boolean.TRUE.equals(getKeyValueStore().getEntry(unrestrictedUnidentifiedAccess)); + } + + public void setUnrestrictedUnidentifiedAccess(boolean value) { + getKeyValueStore().storeEntry(unrestrictedUnidentifiedAccess, value); } public boolean isDiscoverableByPhoneNumber() { diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 4814d28a..bd855ab4 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -147,6 +147,9 @@ Can fix problems with receiving messages. *-n* NAME, *--device-name* NAME:: Set a new device name for the primary or linked device +*--unrestricted-unidentified-sender* {true,false}:: +Enable if anyone should be able to send you unidentified sender messages. + === startChangeNumber Change an account to a new phone number with SMS or voice verification. diff --git a/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java b/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java index c729a39a..95c0f4a4 100644 --- a/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java +++ b/src/main/java/org/asamk/signal/commands/UpdateAccountCommand.java @@ -28,6 +28,10 @@ public class UpdateAccountCommand implements JsonRpcLocalCommand { public void attachToSubparser(final Subparser subparser) { subparser.help("Update the account attributes on the signal server."); subparser.addArgument("-n", "--device-name").help("Specify a name to describe this device."); + subparser.addArgument("--unrestricted-unidentified-sender") + .type(Boolean.class) + .help("Enable if anyone should be able to send you unidentified sender messages."); + var mut = subparser.addMutuallyExclusiveGroup(); mut.addArgument("-u", "--username").help("Specify a username that can then be used to contact this account."); mut.addArgument("--delete-username") @@ -39,14 +43,15 @@ public class UpdateAccountCommand implements JsonRpcLocalCommand { public void handleCommand( final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { - var deviceName = ns.getString("device-name"); + final var deviceName = ns.getString("device-name"); + final var unrestrictedUnidentifiedSender = ns.getBoolean("unrestricted-unidentified-sender"); try { - m.updateAccountAttributes(deviceName); + m.updateAccountAttributes(deviceName, unrestrictedUnidentifiedSender); } catch (IOException e) { throw new IOErrorException("UpdateAccount error: " + e.getMessage(), e); } - var username = ns.getString("username"); + final var username = ns.getString("username"); if (username != null) { try { m.setUsername(username); @@ -66,7 +71,7 @@ public class UpdateAccountCommand implements JsonRpcLocalCommand { } } - var deleteUsername = Boolean.TRUE.equals(ns.getBoolean("delete-username")); + final var deleteUsername = Boolean.TRUE.equals(ns.getBoolean("delete-username")); if (deleteUsername) { try { m.deleteUsername(); diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index e149e58c..e6a18307 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -121,7 +121,9 @@ public class DbusManagerImpl implements Manager { } @Override - public void updateAccountAttributes(final String deviceName) throws IOException { + public void updateAccountAttributes( + final String deviceName, final Boolean unrestrictedUnidentifiedSender + ) throws IOException { if (deviceName != null) { final var devicePath = signal.getThisDevice(); getRemoteObject(devicePath, Signal.Device.class).Set("org.asamk.Signal.Device", "Name", deviceName); diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 5ad14537..80132f09 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -1187,7 +1187,7 @@ public class DbusSignalImpl implements Signal, AutoCloseable { throw new Error.Failure("Only the name of this device can be changed"); } try { - m.updateAccountAttributes(name); + m.updateAccountAttributes(name, null); // update device list updateDevices(); } catch (IOException e) { -- 2.50.1