1 package org
.asamk
.signal
.manager
.storage
.protocol
;
3 import com
.fasterxml
.jackson
.annotation
.JsonProperty
;
4 import com
.fasterxml
.jackson
.core
.JsonGenerator
;
5 import com
.fasterxml
.jackson
.core
.JsonParser
;
6 import com
.fasterxml
.jackson
.databind
.DeserializationContext
;
7 import com
.fasterxml
.jackson
.databind
.JsonDeserializer
;
8 import com
.fasterxml
.jackson
.databind
.JsonNode
;
9 import com
.fasterxml
.jackson
.databind
.JsonSerializer
;
10 import com
.fasterxml
.jackson
.databind
.SerializerProvider
;
11 import com
.fasterxml
.jackson
.databind
.annotation
.JsonDeserialize
;
12 import com
.fasterxml
.jackson
.databind
.annotation
.JsonSerialize
;
14 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
15 import org
.whispersystems
.signalservice
.api
.util
.UuidUtil
;
17 import java
.io
.IOException
;
18 import java
.util
.HashSet
;
20 import java
.util
.UUID
;
22 public class RecipientStore
{
24 @JsonProperty("recipientStore")
25 @JsonDeserialize(using
= RecipientStoreDeserializer
.class)
26 @JsonSerialize(using
= RecipientStoreSerializer
.class)
27 private final Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
29 public SignalServiceAddress
resolveServiceAddress(SignalServiceAddress serviceAddress
) {
30 if (addresses
.contains(serviceAddress
)) {
31 // If the Set already contains the exact address with UUID and Number,
32 // we can just return it here.
33 return serviceAddress
;
36 for (SignalServiceAddress address
: addresses
) {
37 if (address
.matches(serviceAddress
)) {
42 if (serviceAddress
.getNumber().isPresent() && serviceAddress
.getUuid().isPresent()) {
43 addresses
.add(serviceAddress
);
46 return serviceAddress
;
49 public static class RecipientStoreDeserializer
extends JsonDeserializer
<Set
<SignalServiceAddress
>> {
52 public Set
<SignalServiceAddress
> deserialize(
53 JsonParser jsonParser
, DeserializationContext deserializationContext
54 ) throws IOException
{
55 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
57 Set
<SignalServiceAddress
> addresses
= new HashSet
<>();
60 for (JsonNode recipient
: node
) {
61 String recipientName
= recipient
.get("name").asText();
62 UUID uuid
= UuidUtil
.parseOrThrow(recipient
.get("uuid").asText());
63 final SignalServiceAddress serviceAddress
= new SignalServiceAddress(uuid
, recipientName
);
64 addresses
.add(serviceAddress
);
72 public static class RecipientStoreSerializer
extends JsonSerializer
<Set
<SignalServiceAddress
>> {
75 public void serialize(
76 Set
<SignalServiceAddress
> addresses
, JsonGenerator json
, SerializerProvider serializerProvider
77 ) throws IOException
{
78 json
.writeStartArray();
79 for (SignalServiceAddress address
: addresses
) {
80 json
.writeStartObject();
81 json
.writeStringField("name", address
.getNumber().get());
82 json
.writeStringField("uuid", address
.getUuid().get().toString());
83 json
.writeEndObject();