/*
- 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
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;
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;
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);
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,
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
}
@Override
- public void removeLinkedDevices(long deviceId) throws IOException {
+ public void removeLinkedDevices(int deviceId) throws IOException {
context.getAccountHelper().removeLinkedDevices(deviceId);
}
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");
}
}
@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();
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
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(),
executor.shutdown();
dependencies.getSignalWebSocket().disconnect();
+ disposable.dispose();
synchronized (closedListeners) {
closedListeners.forEach(Runnable::run);