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