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