]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Implement more methods for DbusManagerImpl
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index 84a866d00df9458fc7bd9dbe65a92d3a5f67ce87..df757a8b92e26f4862d25b13688a7424a90b83de 100644 (file)
@@ -77,9 +77,11 @@ 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.push.SignalServiceAddress;
+import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
 import org.whispersystems.signalservice.api.util.DeviceNameUtil;
 import org.whispersystems.signalservice.api.util.InvalidNumberException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
+import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState;
 import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException;
 import org.whispersystems.signalservice.internal.contacts.crypto.Quote;
 import org.whispersystems.signalservice.internal.contacts.crypto.UnauthenticatedQuoteException;
@@ -111,6 +113,9 @@ import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+
 import static org.asamk.signal.manager.config.ServiceConfig.capabilities;
 
 public class ManagerImpl implements Manager {
@@ -267,11 +272,16 @@ public class ManagerImpl implements Manager {
                         days);
             }
         }
-        preKeyHelper.refreshPreKeysIfNecessary();
-        if (account.getAci() == null) {
-            account.setAci(dependencies.getAccountManager().getOwnAci());
+        try {
+            preKeyHelper.refreshPreKeysIfNecessary();
+            if (account.getAci() == null) {
+                account.setAci(ACI.parseOrNull(dependencies.getAccountManager().getWhoAmI().getAci()));
+            }
+            updateAccountAttributes(null);
+        } catch (AuthorizationFailedException e) {
+            account.setRegistered(false);
+            throw e;
         }
-        updateAccountAttributes(null);
     }
 
     /**
@@ -279,13 +289,17 @@ public class ManagerImpl implements Manager {
      *
      * @param numbers The set of phone number in question
      * @return A map of numbers to canonicalized number and uuid. If a number is not registered the uuid is null.
-     * @throws IOException if its unable to get the contacts to check if they're registered
+     * @throws IOException if it's unable to get the contacts to check if they're registered
      */
     @Override
     public Map<String, Pair<String, UUID>> areUsersRegistered(Set<String> numbers) throws IOException {
         Map<String, String> canonicalizedNumbers = numbers.stream().collect(Collectors.toMap(n -> n, n -> {
             try {
-                return PhoneNumberFormatter.formatNumber(n, account.getAccount());
+                final var canonicalizedNumber = PhoneNumberFormatter.formatNumber(n, account.getAccount());
+                if (!canonicalizedNumber.equals(n)) {
+                    logger.debug("Normalized number {} to {}.", n, canonicalizedNumber);
+                }
+                return canonicalizedNumber;
             } catch (InvalidNumberException e) {
                 return "";
             }
@@ -431,7 +445,7 @@ public class ManagerImpl implements Manager {
                     d.getCreated(),
                     d.getLastSeen(),
                     d.getId() == account.getDeviceId());
-        }).collect(Collectors.toList());
+        }).toList();
     }
 
     @Override
@@ -503,7 +517,7 @@ public class ManagerImpl implements Manager {
 
     @Override
     public List<Group> getGroups() {
-        return account.getGroupStore().getGroups().stream().map(this::toGroup).collect(Collectors.toList());
+        return account.getGroupStore().getGroups().stream().map(this::toGroup).toList();
     }
 
     private Group toGroup(final GroupInfo groupInfo) {
@@ -614,7 +628,7 @@ public class ManagerImpl implements Manager {
                                 .map(sendMessageResult -> SendMessageResult.from(sendMessageResult,
                                         account.getRecipientStore(),
                                         account.getRecipientStore()::resolveRecipientAddress))
-                                .collect(Collectors.toList()));
+                                .toList());
             }
         }
         return new SendMessageResults(timestamp, results);
@@ -643,7 +657,7 @@ public class ManagerImpl implements Manager {
                                 .map(r -> SendMessageResult.from(r,
                                         account.getRecipientStore(),
                                         account.getRecipientStore()::resolveRecipientAddress))
-                                .collect(Collectors.toList()));
+                                .toList());
             }
         }
         return new SendMessageResults(timestamp, results);
@@ -774,6 +788,16 @@ public class ManagerImpl implements Manager {
         }
     }
 
+    @Override
+    public void deleteRecipient(final RecipientIdentifier.Single recipient) throws IOException {
+        account.removeRecipient(resolveRecipient(recipient));
+    }
+
+    @Override
+    public void deleteContact(final RecipientIdentifier.Single recipient) throws IOException {
+        account.getContactStore().deleteContact(resolveRecipient(recipient));
+    }
+
     @Override
     public void setContactName(
             RecipientIdentifier.Single recipient, String name
@@ -1082,6 +1106,12 @@ public class ManagerImpl implements Manager {
         Map<HandleAction, HandleAction> queuedActions = new HashMap<>();
 
         final var signalWebSocket = dependencies.getSignalWebSocket();
+        final var webSocketStateDisposable = Observable.merge(signalWebSocket.getUnidentifiedWebSocketState(),
+                        signalWebSocket.getWebSocketState())
+                .subscribeOn(Schedulers.computation())
+                .observeOn(Schedulers.computation())
+                .distinctUntilChanged()
+                .subscribe(this::onWebSocketStateChange);
         signalWebSocket.connect();
 
         hasCaughtUpWithOldMessages = false;
@@ -1187,6 +1217,18 @@ public class ManagerImpl implements Manager {
         handleQueuedActions(queuedActions.keySet());
         queuedActions.clear();
         dependencies.getSignalWebSocket().disconnect();
+        webSocketStateDisposable.dispose();
+    }
+
+    private void onWebSocketStateChange(final WebSocketConnectionState s) {
+        if (s.equals(WebSocketConnectionState.AUTHENTICATION_FAILED)) {
+            account.setRegistered(false);
+            try {
+                close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
     }
 
     @Override
@@ -1241,7 +1283,7 @@ public class ManagerImpl implements Manager {
                 .getContacts()
                 .stream()
                 .map(p -> new Pair<>(account.getRecipientStore().resolveRecipientAddress(p.first()), p.second()))
-                .collect(Collectors.toList());
+                .toList();
     }
 
     @Override
@@ -1277,11 +1319,7 @@ public class ManagerImpl implements Manager {
 
     @Override
     public List<Identity> getIdentities() {
-        return account.getIdentityKeyStore()
-                .getIdentities()
-                .stream()
-                .map(this::toIdentity)
-                .collect(Collectors.toList());
+        return account.getIdentityKeyStore().getIdentities().stream().map(this::toIdentity).toList();
     }
 
     private Identity toIdentity(final IdentityInfo identityInfo) {
@@ -1394,13 +1432,13 @@ public class ManagerImpl implements Manager {
 
     private SignalServiceAddress resolveSignalServiceAddress(RecipientId recipientId) {
         final var address = account.getRecipientStore().resolveRecipientAddress(recipientId);
-        if (address.getUuid().isPresent()) {
+        if (address.uuid().isPresent()) {
             return address.toSignalServiceAddress();
         }
 
         // Address in recipient store doesn't have a uuid, this shouldn't happen
         // Try to retrieve the uuid from the server
-        final var number = address.getNumber().get();
+        final var number = address.number().get();
         final ACI aci;
         try {
             aci = getRegisteredUser(number);