]> nmode's Git Repositories - signal-cli/commitdiff
Include unrestricted unidentified access state in getUserStatus response
authorAsamK <asamk@gmx.de>
Tue, 17 May 2022 18:39:06 +0000 (20:39 +0200)
committerAsamK <asamk@gmx.de>
Tue, 17 May 2022 18:39:06 +0000 (20:39 +0200)
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/UserStatus.java [new file with mode: 0644]
src/main/java/org/asamk/signal/commands/GetUserStatusCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 99b76781c4d6f74b527e006146307f148eaff80a..d14b0f44752b4df8b8f9e994ec8c7a0f4b54772f 100644 (file)
@@ -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<String, Pair<String, UUID>> areUsersRegistered(Set<String> numbers) throws IOException;
+    Map<String, UserStatus> getUserStatus(Set<String> numbers) throws IOException;
 
     void updateAccountAttributes(String deviceName) throws IOException;
 
index fa041c55d4898666b01d7b05cfa5064e772f4c38..db8744cd3b5b89711bc4906fe57c8eb6cf49a154 100644 (file)
@@ -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<String, Pair<String, UUID>> areUsersRegistered(Set<String> numbers) throws IOException {
+    public Map<String, UserStatus> getUserStatus(Set<String> 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 (file)
index 0000000..737a259
--- /dev/null
@@ -0,0 +1,5 @@
+package org.asamk.signal.manager.api;
+
+import java.util.UUID;
+
+public record UserStatus(String number, UUID uuid, boolean unrestrictedUnidentifiedAccess) {}
index 5ab237f9da59d1a6ecf93845f111fbb999035c60..8c89dd4fd64966a44106d59a320e2255d0274287 100644 (file)
@@ -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<String, Pair<String, UUID>> registered;
+        Map<String, UserStatus> 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)" : "");
             }
         }
     }
index d64abd0b7dbcd956d5c7eb74d47d892e9be260d9..05ba6b9983d943a2f3d5bf3df496b849e8683483 100644 (file)
@@ -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<String, Pair<String, UUID>> areUsersRegistered(final Set<String> numbers) throws IOException {
+    public Map<String, UserStatus> getUserStatus(final Set<String> numbers) throws IOException {
         final var numbersList = new ArrayList<>(numbers);
         final var registered = signal.isRegistered(numbersList);
 
-        final var result = new HashMap<String, Pair<String, UUID>>();
+        final var result = new HashMap<String, UserStatus>();
         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;
     }
index 850bcf1d824fb04830f07cb8b2de6a6960d7ea80..746f8f52fe32a7b254d6b1524a2c8065558d76b7 100644 (file)
@@ -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<String, Pair<String, UUID>> registered;
+        Map<String, UserStatus> 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