From bb9d44811c511c7acef24e0e9047bdafef9b8f39 Mon Sep 17 00:00:00 2001 From: AsamK Date: Tue, 17 May 2022 20:39:06 +0200 Subject: [PATCH] Include unrestricted unidentified access state in getUserStatus response --- .../java/org/asamk/signal/manager/Manager.java | 4 ++-- .../org/asamk/signal/manager/ManagerImpl.java | 12 +++++++++--- .../asamk/signal/manager/api/UserStatus.java | 5 +++++ .../signal/commands/GetUserStatusCommand.java | 18 ++++++++++-------- .../org/asamk/signal/dbus/DbusManagerImpl.java | 10 ++++++---- .../org/asamk/signal/dbus/DbusSignalImpl.java | 11 ++++------- 6 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 lib/src/main/java/org/asamk/signal/manager/api/UserStatus.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 99b76781..d14b0f44 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -21,6 +21,7 @@ import org.asamk.signal.manager.api.StickerPackUrl; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.manager.api.UpdateGroup; +import org.asamk.signal.manager.api.UserStatus; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupInviteLinkUrl; import org.asamk.signal.manager.groups.GroupNotFoundException; @@ -41,7 +42,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.UUID; public interface Manager extends Closeable { @@ -58,7 +58,7 @@ public interface Manager extends Closeable { * @return A map of numbers to canonicalized number and uuid. If a number is not registered the uuid is null. * @throws IOException if it's unable to get the contacts to check if they're registered */ - Map> areUsersRegistered(Set numbers) throws IOException; + Map getUserStatus(Set numbers) throws IOException; void updateAccountAttributes(String deviceName) throws IOException; diff --git a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java index fa041c55..db8744cd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java @@ -38,6 +38,7 @@ import org.asamk.signal.manager.api.StickerPackUrl; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.manager.api.UpdateGroup; +import org.asamk.signal.manager.api.UserStatus; import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupInviteLinkUrl; @@ -84,7 +85,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -190,7 +190,7 @@ class ManagerImpl implements Manager { } @Override - public Map> areUsersRegistered(Set numbers) throws IOException { + public Map getUserStatus(Set numbers) throws IOException { final var canonicalizedNumbers = numbers.stream().collect(Collectors.toMap(n -> n, n -> { try { final var canonicalizedNumber = PhoneNumberFormatter.formatNumber(n, account.getNumber()); @@ -213,7 +213,13 @@ class ManagerImpl implements Manager { return numbers.stream().collect(Collectors.toMap(n -> n, n -> { final var number = canonicalizedNumbers.get(n); final var aci = registeredUsers.get(number); - return new Pair<>(number.isEmpty() ? null : number, aci == null ? null : aci.uuid()); + final var profile = aci == null + ? null + : context.getProfileHelper().getRecipientProfile(account.getRecipientStore().resolveRecipient(aci)); + return new UserStatus(number.isEmpty() ? null : number, + aci == null ? null : aci.uuid(), + profile != null + && profile.getUnidentifiedAccessMode() == Profile.UnidentifiedAccessMode.UNRESTRICTED); })); } diff --git a/lib/src/main/java/org/asamk/signal/manager/api/UserStatus.java b/lib/src/main/java/org/asamk/signal/manager/api/UserStatus.java new file mode 100644 index 00000000..737a2595 --- /dev/null +++ b/lib/src/main/java/org/asamk/signal/manager/api/UserStatus.java @@ -0,0 +1,5 @@ +package org.asamk.signal.manager.api; + +import java.util.UUID; + +public record UserStatus(String number, UUID uuid, boolean unrestrictedUnidentifiedAccess) {} diff --git a/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java index 5ab237f9..8c89dd4f 100644 --- a/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java +++ b/src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java @@ -6,7 +6,7 @@ import net.sourceforge.argparse4j.inf.Subparser; import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.manager.Manager; -import org.asamk.signal.manager.api.Pair; +import org.asamk.signal.manager.api.UserStatus; import org.asamk.signal.output.JsonWriter; import org.asamk.signal.output.OutputWriter; import org.asamk.signal.output.PlainTextWriter; @@ -16,7 +16,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.HashSet; import java.util.Map; -import java.util.UUID; public class GetUserStatusCommand implements JsonRpcLocalCommand { @@ -38,9 +37,9 @@ public class GetUserStatusCommand implements JsonRpcLocalCommand { final Namespace ns, final Manager m, final OutputWriter outputWriter ) throws CommandException { // Get a map of registration statuses - Map> registered; + Map registered; try { - registered = m.areUsersRegistered(new HashSet<>(ns.getList("recipient"))); + registered = m.getUserStatus(new HashSet<>(ns.getList("recipient"))); } catch (IOException e) { throw new IOErrorException("Unable to check if users are registered: " + e.getMessage() @@ -53,8 +52,8 @@ public class GetUserStatusCommand implements JsonRpcLocalCommand { if (outputWriter instanceof JsonWriter jsonWriter) { var jsonUserStatuses = registered.entrySet().stream().map(entry -> { - final var number = entry.getValue().first(); - final var uuid = entry.getValue().second(); + final var number = entry.getValue().number(); + final var uuid = entry.getValue().uuid(); return new JsonUserStatus(entry.getKey(), number, uuid == null ? null : uuid.toString(), uuid != null); }).toList(); @@ -63,8 +62,11 @@ public class GetUserStatusCommand implements JsonRpcLocalCommand { final var writer = (PlainTextWriter) outputWriter; for (var entry : registered.entrySet()) { - final var uuid = entry.getValue().second(); - writer.println("{}: {}", entry.getKey(), uuid != null); + final var userStatus = entry.getValue(); + writer.println("{}: {}{}", + entry.getKey(), + userStatus.uuid() != null, + userStatus.unrestrictedUnidentifiedAccess() ? " (unrestricted sealed sender)" : ""); } } } diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index d64abd0b..05ba6b99 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -22,6 +22,7 @@ import org.asamk.signal.manager.api.StickerPackInvalidException; import org.asamk.signal.manager.api.StickerPackUrl; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UpdateGroup; +import org.asamk.signal.manager.api.UserStatus; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupInviteLinkUrl; import org.asamk.signal.manager.groups.GroupNotFoundException; @@ -53,7 +54,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Function; import java.util.function.Supplier; @@ -87,14 +87,16 @@ public class DbusManagerImpl implements Manager { } @Override - public Map> areUsersRegistered(final Set numbers) throws IOException { + public Map getUserStatus(final Set numbers) throws IOException { final var numbersList = new ArrayList<>(numbers); final var registered = signal.isRegistered(numbersList); - final var result = new HashMap>(); + final var result = new HashMap(); for (var i = 0; i < numbersList.size(); i++) { result.put(numbersList.get(i), - new Pair<>(numbersList.get(i), registered.get(i) ? RecipientAddress.UNKNOWN_UUID : null)); + new UserStatus(numbersList.get(i), + registered.get(i) ? RecipientAddress.UNKNOWN_UUID : null, + false)); } return result; } diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 850bcf1d..746f8f52 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -19,6 +19,7 @@ import org.asamk.signal.manager.api.StickerPackInvalidException; import org.asamk.signal.manager.api.TypingAction; import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.manager.api.UpdateGroup; +import org.asamk.signal.manager.api.UserStatus; import org.asamk.signal.manager.groups.GroupId; import org.asamk.signal.manager.groups.GroupInviteLinkUrl; import org.asamk.signal.manager.groups.GroupLinkState; @@ -53,7 +54,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -641,17 +641,14 @@ public class DbusSignalImpl implements Signal { return List.of(); } - Map> registered; + Map registered; try { - registered = m.areUsersRegistered(new HashSet<>(numbers)); + registered = m.getUserStatus(new HashSet<>(numbers)); } catch (IOException e) { throw new Error.Failure(e.getMessage()); } - return numbers.stream().map(number -> { - var uuid = registered.get(number).second(); - return uuid != null; - }).toList(); + return numbers.stream().map(number -> registered.get(number).uuid() != null).toList(); } @Override -- 2.50.1