]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Refactor set blocked methods to accept multiple recipientIds/groupIds
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index aa4752a2644e0e4b4f7100e8ff334e6f3edd4b94..f6205dba7c7c59b0fb3ae83644a5f48c01f35bbb 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;
@@ -66,6 +67,7 @@ import org.whispersystems.signalservice.api.SignalSessionLock;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
+import org.whispersystems.signalservice.api.push.ACI;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
@@ -77,13 +79,13 @@ import java.io.IOException;
 import java.net.URI;
 import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 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;
@@ -99,6 +101,7 @@ class ManagerImpl implements Manager {
     private final static Logger logger = LoggerFactory.getLogger(ManagerImpl.class);
 
     private SignalAccount account;
+    private AccountFileUpdater accountFileUpdater;
     private final SignalDependencies dependencies;
     private final Context context;
 
@@ -120,6 +123,7 @@ class ManagerImpl implements Manager {
             String userAgent
     ) {
         this.account = account;
+        this.accountFileUpdater = accountFileUpdater;
 
         final var sessionLock = new SignalSessionLock() {
             private final ReentrantLock LEGACY_LOCK = new ReentrantLock();
@@ -140,10 +144,18 @@ class ManagerImpl implements Manager {
         final var attachmentStore = new AttachmentStore(pathConfig.attachmentsPath());
         final var stickerPackStore = new StickerPackStore(pathConfig.stickerPacksPath());
 
-        this.context = new Context(account, (number, aci) -> {
-            accountFileUpdater.updateAccountIdentifiers(number, aci);
-            synchronized (addressChangedListeners) {
-                addressChangedListeners.forEach(Runnable::run);
+        this.context = new Context(account, new AccountFileUpdater() {
+            @Override
+            public void updateAccountIdentifiers(final String number, final ACI aci) {
+                accountFileUpdater.updateAccountIdentifiers(number, aci);
+                synchronized (addressChangedListeners) {
+                    addressChangedListeners.forEach(Runnable::run);
+                }
+            }
+
+            @Override
+            public void removeAccount() {
+                accountFileUpdater.removeAccount();
             }
         }, dependencies, avatarStore, attachmentStore, stickerPackStore);
         this.context.getAccountHelper().setUnregisteredListener(this::close);
@@ -179,7 +191,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());
@@ -202,7 +214,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);
         }));
     }
 
@@ -348,6 +366,11 @@ class ManagerImpl implements Manager {
 
     @Override
     public void deleteGroup(GroupId groupId) throws IOException {
+        final var group = context.getGroupHelper().getGroup(groupId);
+        if (group.isMember(account.getSelfRecipientId())) {
+            throw new IOException(
+                    "The local group information cannot be removed, as the user is still a member of the group");
+        }
         context.getGroupHelper().deleteGroup(groupId);
     }
 
@@ -381,6 +404,12 @@ class ManagerImpl implements Manager {
                         updateGroup.getRemoveAdmins() == null
                                 ? null
                                 : context.getRecipientHelper().resolveRecipients(updateGroup.getRemoveAdmins()),
+                        updateGroup.getBanMembers() == null
+                                ? null
+                                : context.getRecipientHelper().resolveRecipients(updateGroup.getBanMembers()),
+                        updateGroup.getUnbanMembers() == null
+                                ? null
+                                : context.getRecipientHelper().resolveRecipients(updateGroup.getUnbanMembers()),
                         updateGroup.isResetGroupLink(),
                         updateGroup.getGroupLinkState(),
                         updateGroup.getAddMemberPermission(),
@@ -506,6 +535,11 @@ class ManagerImpl implements Manager {
     public SendMessageResults sendMessage(
             Message message, Set<RecipientIdentifier> recipients
     ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException {
+        final var selfProfile = context.getProfileHelper().getSelfProfile();
+        if (selfProfile == null || selfProfile.getDisplayName().isEmpty()) {
+            logger.warn(
+                    "No profile name set. When sending a message it's recommended to set a profile name wit the updateProfile command. This may become mandatory in the future.");
+        }
         final var messageBuilder = SignalServiceDataMessage.newBuilder();
         applyMessage(messageBuilder, message);
         return sendMessage(messageBuilder, recipients);
@@ -529,7 +563,8 @@ class ManagerImpl implements Manager {
                             .resolveSignalServiceAddress(context.getRecipientHelper().resolveRecipient(quote.author())),
                     quote.message(),
                     List.of(),
-                    resolveMentions(quote.mentions())));
+                    resolveMentions(quote.mentions()),
+                    SignalServiceDataMessage.Quote.Type.NORMAL));
         }
         if (message.sticker().isPresent()) {
             final var sticker = message.sticker().get();
@@ -649,25 +684,36 @@ class ManagerImpl implements Manager {
     }
 
     @Override
-    public void setContactBlocked(
-            RecipientIdentifier.Single recipient, boolean blocked
+    public void setContactsBlocked(
+            Collection<RecipientIdentifier.Single> recipients, boolean blocked
     ) throws NotMasterDeviceException, IOException, UnregisteredRecipientException {
         if (!account.isMasterDevice()) {
             throw new NotMasterDeviceException();
         }
-        context.getContactHelper().setContactBlocked(context.getRecipientHelper().resolveRecipient(recipient), blocked);
+        if (recipients.size() == 0) {
+            return;
+        }
+        final var recipientIds = context.getRecipientHelper().resolveRecipients(recipients);
+        for (final var recipientId : recipientIds) {
+            context.getContactHelper().setContactBlocked(recipientId, blocked);
+        }
         // TODO cycle our profile key, if we're not together in a group with recipient
         context.getSyncHelper().sendBlockedList();
     }
 
     @Override
-    public void setGroupBlocked(
-            final GroupId groupId, final boolean blocked
+    public void setGroupsBlocked(
+            final Collection<GroupId> groupIds, final boolean blocked
     ) throws GroupNotFoundException, NotMasterDeviceException {
         if (!account.isMasterDevice()) {
             throw new NotMasterDeviceException();
         }
-        context.getGroupHelper().setGroupBlocked(groupId, blocked);
+        if (groupIds.size() == 0) {
+            return;
+        }
+        for (final var groupId : groupIds) {
+            context.getGroupHelper().setGroupBlocked(groupId, blocked);
+        }
         // TODO cycle our profile key
         context.getSyncHelper().sendBlockedList();
     }