1 package org
.asamk
.signal
.manager
.storage
.protocol
;
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
;
11 import org
.slf4j
.Logger
;
12 import org
.slf4j
.LoggerFactory
;
13 import org
.whispersystems
.libsignal
.InvalidKeyIdException
;
14 import org
.whispersystems
.libsignal
.state
.SignedPreKeyRecord
;
15 import org
.whispersystems
.libsignal
.state
.SignedPreKeyStore
;
17 import java
.io
.IOException
;
18 import java
.util
.Base64
;
19 import java
.util
.HashMap
;
20 import java
.util
.LinkedList
;
21 import java
.util
.List
;
24 class JsonSignedPreKeyStore
implements SignedPreKeyStore
{
26 private final static Logger logger
= LoggerFactory
.getLogger(JsonSignedPreKeyStore
.class);
28 private final Map
<Integer
, byte[]> store
= new HashMap
<>();
30 public JsonSignedPreKeyStore() {
34 private void addSignedPreKeys(Map
<Integer
, byte[]> preKeys
) {
35 store
.putAll(preKeys
);
39 public SignedPreKeyRecord
loadSignedPreKey(int signedPreKeyId
) throws InvalidKeyIdException
{
41 if (!store
.containsKey(signedPreKeyId
)) {
42 throw new InvalidKeyIdException("No such signedprekeyrecord! " + signedPreKeyId
);
45 return new SignedPreKeyRecord(store
.get(signedPreKeyId
));
46 } catch (IOException e
) {
47 throw new AssertionError(e
);
52 public List
<SignedPreKeyRecord
> loadSignedPreKeys() {
54 List
<SignedPreKeyRecord
> results
= new LinkedList
<>();
56 for (byte[] serialized
: store
.values()) {
57 results
.add(new SignedPreKeyRecord(serialized
));
61 } catch (IOException e
) {
62 throw new AssertionError(e
);
67 public void storeSignedPreKey(int signedPreKeyId
, SignedPreKeyRecord
record) {
68 store
.put(signedPreKeyId
, record.serialize());
72 public boolean containsSignedPreKey(int signedPreKeyId
) {
73 return store
.containsKey(signedPreKeyId
);
77 public void removeSignedPreKey(int signedPreKeyId
) {
78 store
.remove(signedPreKeyId
);
81 public static class JsonSignedPreKeyStoreDeserializer
extends JsonDeserializer
<JsonSignedPreKeyStore
> {
84 public JsonSignedPreKeyStore
deserialize(
85 JsonParser jsonParser
, DeserializationContext deserializationContext
86 ) throws IOException
{
87 JsonNode node
= jsonParser
.getCodec().readTree(jsonParser
);
89 Map
<Integer
, byte[]> preKeyMap
= new HashMap
<>();
91 for (JsonNode preKey
: node
) {
92 final int preKeyId
= preKey
.get("id").asInt();
93 final byte[] preKeyRecord
= Base64
.getDecoder().decode(preKey
.get("record").asText());
94 preKeyMap
.put(preKeyId
, preKeyRecord
);
98 JsonSignedPreKeyStore keyStore
= new JsonSignedPreKeyStore();
99 keyStore
.addSignedPreKeys(preKeyMap
);
105 public static class JsonSignedPreKeyStoreSerializer
extends JsonSerializer
<JsonSignedPreKeyStore
> {
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
.getEncoder().encodeToString(signedPreKey
.getValue()));
116 json
.writeEndObject();
118 json
.writeEndArray();