]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/protocol/JsonSignedPreKeyStore.java
255dd4e0e14a6f324bb49005dced828c53533875
[signal-cli] / src / main / java / org / asamk / signal / storage / protocol / JsonSignedPreKeyStore.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.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.whispersystems.libsignal.InvalidKeyIdException;
12 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
13 import org.whispersystems.libsignal.state.SignedPreKeyStore;
14 import org.whispersystems.util.Base64;
15
16 import java.io.IOException;
17 import java.util.HashMap;
18 import java.util.LinkedList;
19 import java.util.List;
20 import java.util.Map;
21
22 class JsonSignedPreKeyStore implements SignedPreKeyStore {
23
24 private final Map<Integer, byte[]> store = new HashMap<>();
25
26 public JsonSignedPreKeyStore() {
27
28 }
29
30 private void addSignedPreKeys(Map<Integer, byte[]> preKeys) {
31 store.putAll(preKeys);
32 }
33
34 @Override
35 public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException {
36 try {
37 if (!store.containsKey(signedPreKeyId)) {
38 throw new InvalidKeyIdException("No such signedprekeyrecord! " + signedPreKeyId);
39 }
40
41 return new SignedPreKeyRecord(store.get(signedPreKeyId));
42 } catch (IOException e) {
43 throw new AssertionError(e);
44 }
45 }
46
47 @Override
48 public List<SignedPreKeyRecord> loadSignedPreKeys() {
49 try {
50 List<SignedPreKeyRecord> results = new LinkedList<>();
51
52 for (byte[] serialized : store.values()) {
53 results.add(new SignedPreKeyRecord(serialized));
54 }
55
56 return results;
57 } catch (IOException e) {
58 throw new AssertionError(e);
59 }
60 }
61
62 @Override
63 public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) {
64 store.put(signedPreKeyId, record.serialize());
65 }
66
67 @Override
68 public boolean containsSignedPreKey(int signedPreKeyId) {
69 return store.containsKey(signedPreKeyId);
70 }
71
72 @Override
73 public void removeSignedPreKey(int signedPreKeyId) {
74 store.remove(signedPreKeyId);
75 }
76
77 public static class JsonSignedPreKeyStoreDeserializer extends JsonDeserializer<JsonSignedPreKeyStore> {
78
79 @Override
80 public JsonSignedPreKeyStore deserialize(
81 JsonParser jsonParser, DeserializationContext deserializationContext
82 ) throws IOException {
83 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
84
85 Map<Integer, byte[]> preKeyMap = new HashMap<>();
86 if (node.isArray()) {
87 for (JsonNode preKey : node) {
88 Integer preKeyId = preKey.get("id").asInt();
89 try {
90 preKeyMap.put(preKeyId, Base64.decode(preKey.get("record").asText()));
91 } catch (IOException e) {
92 System.err.println(String.format("Error while decoding prekey for: %s", preKeyId));
93 }
94 }
95 }
96
97 JsonSignedPreKeyStore keyStore = new JsonSignedPreKeyStore();
98 keyStore.addSignedPreKeys(preKeyMap);
99
100 return keyStore;
101
102 }
103 }
104
105 public static class JsonSignedPreKeyStoreSerializer extends JsonSerializer<JsonSignedPreKeyStore> {
106
107 @Override
108 public void serialize(
109 JsonSignedPreKeyStore jsonPreKeyStore, JsonGenerator json, SerializerProvider serializerProvider
110 ) throws IOException {
111 json.writeStartArray();
112 for (Map.Entry<Integer, byte[]> signedPreKey : jsonPreKeyStore.store.entrySet()) {
113 json.writeStartObject();
114 json.writeNumberField("id", signedPreKey.getKey());
115 json.writeStringField("record", Base64.encodeBytes(signedPreKey.getValue()));
116 json.writeEndObject();
117 }
118 json.writeEndArray();
119 }
120 }
121 }