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