]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/profiles/LegacyProfileStore.java
99e2980eb7dc2fb1db64315ec4d4752ebdc78f70
[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.util.UuidUtil;
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 uuid = entry.hasNonNull("uuid") ? UuidUtil.parseOrNull(entry.get("uuid").asText()) : null;
47 final var address = new RecipientAddress(uuid, name);
48 ProfileKey profileKey = null;
49 try {
50 profileKey = new ProfileKey(Base64.getDecoder().decode(entry.get("profileKey").asText()));
51 } catch (InvalidInputException ignored) {
52 }
53 var lastUpdateTimestamp = entry.get("lastUpdateTimestamp").asLong();
54 var profile = jsonProcessor.treeToValue(entry.get("profile"), LegacySignalProfile.class);
55 profileEntries.add(new LegacySignalProfileEntry(address, profileKey, lastUpdateTimestamp, profile));
56 }
57 }
58
59 return profileEntries;
60 }
61 }
62 }