]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/profiles/LegacyProfileStore.java
abb66470dad3e1cc5df8d7b11667ac4ffc1e37a3
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / profiles / LegacyProfileStore.java
1 package org.asamk.signal.manager.storage.profiles;
2
3 import com.fasterxml.jackson.annotation.JsonProperty;
4 import com.fasterxml.jackson.core.JsonParser;
5 import com.fasterxml.jackson.databind.DeserializationContext;
6 import com.fasterxml.jackson.databind.JsonDeserializer;
7 import com.fasterxml.jackson.databind.JsonNode;
8 import com.fasterxml.jackson.databind.ObjectMapper;
9 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
10
11 import org.asamk.signal.manager.storage.recipients.RecipientAddress;
12 import org.signal.libsignal.zkgroup.InvalidInputException;
13 import org.signal.libsignal.zkgroup.profiles.ProfileKey;
14 import org.whispersystems.signalservice.api.push.ServiceId;
15
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Base64;
19 import java.util.List;
20
21 public class LegacyProfileStore {
22
23 private static final ObjectMapper jsonProcessor = new ObjectMapper();
24
25 @JsonProperty("profiles")
26 @JsonDeserialize(using = ProfileStoreDeserializer.class)
27 private final List<LegacySignalProfileEntry> profiles = new ArrayList<>();
28
29 public List<LegacySignalProfileEntry> getProfileEntries() {
30 return profiles;
31 }
32
33 public static class ProfileStoreDeserializer extends JsonDeserializer<List<LegacySignalProfileEntry>> {
34
35 @Override
36 public List<LegacySignalProfileEntry> deserialize(
37 JsonParser jsonParser, DeserializationContext deserializationContext
38 ) throws IOException {
39 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
40
41 var profileEntries = new ArrayList<LegacySignalProfileEntry>();
42
43 if (node.isArray()) {
44 for (var entry : node) {
45 var name = entry.hasNonNull("name") ? entry.get("name").asText() : null;
46 var serviceId = entry.hasNonNull("uuid")
47 ? ServiceId.ACI.parseOrNull(entry.get("uuid").asText())
48 : null;
49 final var address = new RecipientAddress(serviceId, name);
50 ProfileKey profileKey = null;
51 try {
52 profileKey = new ProfileKey(Base64.getDecoder().decode(entry.get("profileKey").asText()));
53 } catch (InvalidInputException ignored) {
54 }
55 var lastUpdateTimestamp = entry.get("lastUpdateTimestamp").asLong();
56 var profile = jsonProcessor.treeToValue(entry.get("profile"), LegacySignalProfile.class);
57 profileEntries.add(new LegacySignalProfileEntry(address, profileKey, lastUpdateTimestamp, profile));
58 }
59 }
60
61 return profileEntries;
62 }
63 }
64 }