]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
Add recipient id to logging
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / ManagerImpl.java
index fdb289295651790a8bb18c8ac4407a36d6d3f1cd..0e100d722b08505cd78ff5105e3ddf335633c04e 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2015-2021 AsamK and contributors
+  Copyright (C) 2015-2022 AsamK and contributors
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -30,6 +30,8 @@ import org.asamk.signal.manager.api.SendGroupMessageResults;
 import org.asamk.signal.manager.api.SendMessageResult;
 import org.asamk.signal.manager.api.SendMessageResults;
 import org.asamk.signal.manager.api.StickerPack;
+import org.asamk.signal.manager.api.StickerPackId;
+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;
@@ -49,7 +51,6 @@ import org.asamk.signal.manager.storage.recipients.Profile;
 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.storage.stickers.Sticker;
-import org.asamk.signal.manager.storage.stickers.StickerPackId;
 import org.asamk.signal.manager.util.AttachmentUtils;
 import org.asamk.signal.manager.util.KeyUtils;
 import org.asamk.signal.manager.util.StickerUtils;
@@ -70,9 +71,6 @@ import org.whispersystems.signalservice.internal.util.Util;
 import java.io.File;
 import java.io.IOException;
 import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -88,6 +86,8 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+
 public class ManagerImpl implements Manager {
 
     private final static Logger logger = LoggerFactory.getLogger(ManagerImpl.class);
@@ -103,6 +103,7 @@ public class ManagerImpl implements Manager {
     private final Set<ReceiveMessageHandler> weakHandlers = new HashSet<>();
     private final Set<ReceiveMessageHandler> messageHandlers = new HashSet<>();
     private final List<Runnable> closedListeners = new ArrayList<>();
+    private final CompositeDisposable disposable = new CompositeDisposable();
 
     ManagerImpl(
             SignalAccount account,
@@ -143,6 +144,20 @@ public class ManagerImpl implements Manager {
                 this.notifyAll();
             }
         });
+        disposable.add(account.getIdentityKeyStore().getIdentityChanges().subscribe(recipientId -> {
+            logger.trace("Archiving old sessions for {}", recipientId);
+            account.getSessionStore().archiveSessions(recipientId);
+            account.getSenderKeyStore().deleteSharedWith(recipientId);
+            final var profile = account.getRecipientStore().getProfile(recipientId);
+            if (profile != null) {
+                account.getRecipientStore()
+                        .storeProfile(recipientId,
+                                Profile.newBuilder(profile)
+                                        .withUnidentifiedAccessMode(Profile.UnidentifiedAccessMode.UNKNOWN)
+                                        .withLastUpdateTimestamp(0)
+                                        .build());
+            }
+        }));
     }
 
     @Override
@@ -274,7 +289,7 @@ public class ManagerImpl implements Manager {
     }
 
     @Override
-    public void removeLinkedDevices(long deviceId) throws IOException {
+    public void removeLinkedDevices(int deviceId) throws IOException {
         context.getAccountHelper().removeLinkedDevices(deviceId);
     }
 
@@ -519,10 +534,10 @@ public class ManagerImpl implements Manager {
             final var stickerId = sticker.stickerId();
 
             final var stickerPack = context.getAccount().getStickerStore().getStickerPack(packId);
-            if (stickerPack == null || !context.getStickerPackStore().existsStickerPack(packId)) {
+            if (stickerPack == null) {
                 throw new InvalidStickerException("Sticker pack not found");
             }
-            final var manifest = context.getStickerPackStore().retrieveManifest(packId);
+            final var manifest = context.getStickerHelper().getOrRetrieveStickerPack(packId, stickerPack.getPackKey());
             if (manifest.stickers().size() <= stickerId) {
                 throw new InvalidStickerException("Sticker id not part of this pack");
             }
@@ -658,7 +673,7 @@ public class ManagerImpl implements Manager {
     }
 
     @Override
-    public URI uploadStickerPack(File path) throws IOException, StickerPackInvalidException {
+    public StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPackInvalidException {
         var manifest = StickerUtils.getSignalServiceStickerManifestUpload(path);
 
         var messageSender = dependencies.getMessageSender();
@@ -670,17 +685,7 @@ public class ManagerImpl implements Manager {
         var sticker = new Sticker(packId, packKey);
         account.getStickerStore().updateSticker(sticker);
 
-        try {
-            return new URI("https",
-                    "signal.art",
-                    "/addstickers/",
-                    "pack_id="
-                            + URLEncoder.encode(Hex.toStringCondensed(packId.serialize()), StandardCharsets.UTF_8)
-                            + "&pack_key="
-                            + URLEncoder.encode(Hex.toStringCondensed(packKey), StandardCharsets.UTF_8));
-        } catch (URISyntaxException e) {
-            throw new AssertionError(e);
-        }
+        return new StickerPackUrl(packId, packKey);
     }
 
     @Override
@@ -691,7 +696,7 @@ public class ManagerImpl implements Manager {
                 try {
                     final var manifest = stickerPackStore.retrieveManifest(pack.getPackId());
                     return new StickerPack(pack.getPackId(),
-                            pack.getPackKey(),
+                            new StickerPackUrl(pack.getPackId(), pack.getPackKey()),
                             pack.isInstalled(),
                             manifest.title(),
                             manifest.author(),
@@ -994,6 +999,7 @@ public class ManagerImpl implements Manager {
         executor.shutdown();
 
         dependencies.getSignalWebSocket().disconnect();
+        disposable.dispose();
 
         synchronized (closedListeners) {
             closedListeners.forEach(Runnable::run);