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