]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/LegacySenderKeySharedStore.java
cfc36539ecea9b41e7b302a48239185a9f6ffa2d
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / senderKeys / LegacySenderKeySharedStore.java
1 package org.asamk.signal.manager.storage.senderKeys;
2
3 import org.asamk.signal.manager.helper.RecipientAddressResolver;
4 import org.asamk.signal.manager.storage.Utils;
5 import org.asamk.signal.manager.storage.recipients.RecipientResolver;
6 import org.asamk.signal.manager.storage.senderKeys.SenderKeySharedStore.SenderKeySharedEntry;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9 import org.whispersystems.signalservice.api.push.DistributionId;
10
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.IOException;
14 import java.nio.file.Files;
15 import java.util.HashMap;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Set;
19
20 public class LegacySenderKeySharedStore {
21
22 private final static Logger logger = LoggerFactory.getLogger(LegacySenderKeySharedStore.class);
23
24 public static void migrate(
25 final File file,
26 final RecipientResolver resolver,
27 final RecipientAddressResolver addressResolver,
28 final SenderKeyStore senderKeyStore
29 ) {
30 final var objectMapper = Utils.createStorageObjectMapper();
31 try (var inputStream = new FileInputStream(file)) {
32 final var storage = objectMapper.readValue(inputStream, Storage.class);
33 final var sharedSenderKeys = new HashMap<DistributionId, Set<SenderKeySharedEntry>>();
34 for (final var senderKey : storage.sharedSenderKeys) {
35 final var recipientId = resolver.resolveRecipient(senderKey.recipientId);
36 if (recipientId == null) {
37 continue;
38 }
39 final var serviceId = addressResolver.resolveRecipientAddress(recipientId).serviceId();
40 if (serviceId.isEmpty()) {
41 continue;
42 }
43 final var entry = new SenderKeySharedEntry(serviceId.get(), senderKey.deviceId);
44 final var distributionId = DistributionId.from(senderKey.distributionId);
45 var entries = sharedSenderKeys.get(distributionId);
46 if (entries == null) {
47 entries = new HashSet<>();
48 }
49 entries.add(entry);
50 sharedSenderKeys.put(distributionId, entries);
51 }
52
53 senderKeyStore.addLegacySenderKeysShared(sharedSenderKeys);
54 } catch (IOException e) {
55 logger.info("Failed to load shared sender key store, ignoring", e);
56 }
57 try {
58 Files.delete(file.toPath());
59 } catch (IOException e) {
60 logger.info("Failed to load shared sender key store, ignoring", e);
61 }
62 }
63
64 private record Storage(List<SharedSenderKey> sharedSenderKeys) {
65
66 private record SharedSenderKey(long recipientId, int deviceId, String distributionId) {}
67 }
68 }