]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/storage/protocol/JsonSignedPreKeyStore.java
a8c400ce75b237038a85f003f2b0548a559f8eff
[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.core.JsonProcessingException;
6 import com.fasterxml.jackson.databind.*;
7 import org.whispersystems.libsignal.InvalidKeyIdException;
8 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
9 import org.whispersystems.libsignal.state.SignedPreKeyStore;
10 import org.whispersystems.signalservice.internal.util.Base64;
11
12 import java.io.IOException;
13 import java.util.HashMap;
14 import java.util.LinkedList;
15 import java.util.List;
16 import java.util.Map;
17
18 class JsonSignedPreKeyStore implements SignedPreKeyStore {
19
20 private final Map<Integer, byte[]> store = new HashMap<>();
21
22 public JsonSignedPreKeyStore() {
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 Map<Integer, byte[]> preKeyMap = new HashMap<>();
80 if (node.isArray()) {
81 for (JsonNode preKey : node) {
82 Integer preKeyId = preKey.get("id").asInt();
83 try {
84 preKeyMap.put(preKeyId, Base64.decode(preKey.get("record").asText()));
85 } catch (IOException e) {
86 System.out.println(String.format("Error while decoding prekey for: %s", preKeyId));
87 }
88 }
89 }
90
91 JsonSignedPreKeyStore keyStore = new JsonSignedPreKeyStore();
92 keyStore.addSignedPreKeys(preKeyMap);
93
94 return keyStore;
95
96 }
97 }
98
99 public static class JsonSignedPreKeyStoreSerializer extends JsonSerializer<JsonSignedPreKeyStore> {
100
101 @Override
102 public void serialize(JsonSignedPreKeyStore jsonPreKeyStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
103 json.writeStartArray();
104 for (Map.Entry<Integer, byte[]> signedPreKey : jsonPreKeyStore.store.entrySet()) {
105 json.writeStartObject();
106 json.writeNumberField("id", signedPreKey.getKey());
107 json.writeStringField("record", Base64.encodeBytes(signedPreKey.getValue()));
108 json.writeEndObject();
109 }
110 json.writeEndArray();
111 }
112 }
113 }