]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/manager/storage/protocol/JsonPreKeyStore.java
8529d0dd139f6d98151b4f1a6e1395e336965c9b
[signal-cli] / src / main / java / org / asamk / signal / manager / storage / protocol / JsonPreKeyStore.java
1 package org.asamk.signal.manager.storage.protocol;
2
3 import com.fasterxml.jackson.core.JsonGenerator;
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.JsonSerializer;
9 import com.fasterxml.jackson.databind.SerializerProvider;
10
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 import org.whispersystems.libsignal.InvalidKeyIdException;
14 import org.whispersystems.libsignal.state.PreKeyRecord;
15 import org.whispersystems.libsignal.state.PreKeyStore;
16
17 import java.io.IOException;
18 import java.util.Base64;
19 import java.util.HashMap;
20 import java.util.Map;
21
22 class JsonPreKeyStore implements PreKeyStore {
23
24 private final static Logger logger = LoggerFactory.getLogger(JsonPreKeyStore.class);
25
26 private final Map<Integer, byte[]> store = new HashMap<>();
27
28 public JsonPreKeyStore() {
29
30 }
31
32 private void addPreKeys(Map<Integer, byte[]> preKeys) {
33 store.putAll(preKeys);
34 }
35
36 @Override
37 public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException {
38 try {
39 if (!store.containsKey(preKeyId)) {
40 throw new InvalidKeyIdException("No such prekeyrecord!");
41 }
42
43 return new PreKeyRecord(store.get(preKeyId));
44 } catch (IOException e) {
45 throw new AssertionError(e);
46 }
47 }
48
49 @Override
50 public void storePreKey(int preKeyId, PreKeyRecord record) {
51 store.put(preKeyId, record.serialize());
52 }
53
54 @Override
55 public boolean containsPreKey(int preKeyId) {
56 return store.containsKey(preKeyId);
57 }
58
59 @Override
60 public void removePreKey(int preKeyId) {
61 store.remove(preKeyId);
62 }
63
64 public static class JsonPreKeyStoreDeserializer extends JsonDeserializer<JsonPreKeyStore> {
65
66 @Override
67 public JsonPreKeyStore deserialize(
68 JsonParser jsonParser, DeserializationContext deserializationContext
69 ) throws IOException {
70 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
71
72 Map<Integer, byte[]> preKeyMap = new HashMap<>();
73 if (node.isArray()) {
74 for (JsonNode preKey : node) {
75 final int preKeyId = preKey.get("id").asInt();
76 final byte[] preKeyRecord = Base64.getDecoder().decode(preKey.get("record").asText());
77 preKeyMap.put(preKeyId, preKeyRecord);
78 }
79 }
80
81 JsonPreKeyStore keyStore = new JsonPreKeyStore();
82 keyStore.addPreKeys(preKeyMap);
83
84 return keyStore;
85 }
86 }
87
88 public static class JsonPreKeyStoreSerializer extends JsonSerializer<JsonPreKeyStore> {
89
90 @Override
91 public void serialize(
92 JsonPreKeyStore jsonPreKeyStore, JsonGenerator json, SerializerProvider serializerProvider
93 ) throws IOException {
94 json.writeStartArray();
95 for (Map.Entry<Integer, byte[]> preKey : jsonPreKeyStore.store.entrySet()) {
96 json.writeStartObject();
97 json.writeNumberField("id", preKey.getKey());
98 json.writeStringField("record", Base64.getEncoder().encodeToString(preKey.getValue()));
99 json.writeEndObject();
100 }
101 json.writeEndArray();
102 }
103 }
104 }