]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/protocol/RecipientStore.java
60634ae53cc561904ec1bfdf85fd0e4de93e70ce
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / protocol / RecipientStore.java
1 package org.asamk.signal.manager.storage.protocol;
2
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;
13
14 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
15 import org.whispersystems.signalservice.api.util.UuidUtil;
16
17 import java.io.IOException;
18 import java.util.HashSet;
19 import java.util.Set;
20 import java.util.UUID;
21
22 public class RecipientStore {
23
24 @JsonProperty("recipientStore")
25 @JsonDeserialize(using = RecipientStoreDeserializer.class)
26 @JsonSerialize(using = RecipientStoreSerializer.class)
27 private final Set<SignalServiceAddress> addresses = new HashSet<>();
28
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;
34 }
35
36 for (SignalServiceAddress address : addresses) {
37 if (address.matches(serviceAddress)) {
38 return address;
39 }
40 }
41
42 if (serviceAddress.getNumber().isPresent() && serviceAddress.getUuid().isPresent()) {
43 addresses.add(serviceAddress);
44 }
45
46 return serviceAddress;
47 }
48
49 public static class RecipientStoreDeserializer extends JsonDeserializer<Set<SignalServiceAddress>> {
50
51 @Override
52 public Set<SignalServiceAddress> deserialize(
53 JsonParser jsonParser, DeserializationContext deserializationContext
54 ) throws IOException {
55 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
56
57 Set<SignalServiceAddress> addresses = new HashSet<>();
58
59 if (node.isArray()) {
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);
65 }
66 }
67
68 return addresses;
69 }
70 }
71
72 public static class RecipientStoreSerializer extends JsonSerializer<Set<SignalServiceAddress>> {
73
74 @Override
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();
84 }
85 json.writeEndArray();
86 }
87 }
88 }