1 package org
.asamk
.signal
.manager
.storage
.profiles
;
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
;
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
;
16 import java
.io
.IOException
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Base64
;
19 import java
.util
.List
;
21 public class LegacyProfileStore
{
23 private static final ObjectMapper jsonProcessor
= new ObjectMapper();
25 @JsonProperty("profiles")
26 @JsonDeserialize(using
= ProfileStoreDeserializer
.class)
27 private final List
<LegacySignalProfileEntry
> profiles
= new ArrayList
<>();
29 public List
<LegacySignalProfileEntry
> getProfileEntries() {
33 public static class ProfileStoreDeserializer
extends JsonDeserializer
<List
<LegacySignalProfileEntry
>> {
36 public List
<LegacySignalProfileEntry
> deserialize(
37 JsonParser jsonParser
, DeserializationContext deserializationContext
38 ) throws IOException
{
39 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
41 var profileEntries
= new ArrayList
<LegacySignalProfileEntry
>();
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;
50 profileKey
= new ProfileKey(Base64
.getDecoder().decode(entry
.get("profileKey").asText()));
51 } catch (InvalidInputException ignored
) {
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
));
59 return profileEntries
;