X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/5859e7b9f78b5d8963c56c66b75530ee3f094bee..27d9424f1e7f607ac2dfad5b2164d065ffb79ef7:/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java diff --git a/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java b/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java new file mode 100644 index 00000000..9688cf3e --- /dev/null +++ b/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java @@ -0,0 +1,97 @@ +package org.asamk.textsecure; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.*; +import org.whispersystems.libaxolotl.InvalidKeyIdException; +import org.whispersystems.libaxolotl.state.PreKeyRecord; +import org.whispersystems.libaxolotl.state.PreKeyStore; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +class JsonPreKeyStore implements PreKeyStore { + + private final Map store = new HashMap<>(); + + + public JsonPreKeyStore() { + + } + + public void addPreKeys(Map preKeys) { + store.putAll(preKeys); + } + + @Override + public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException { + try { + if (!store.containsKey(preKeyId)) { + throw new InvalidKeyIdException("No such prekeyrecord!"); + } + + return new PreKeyRecord(store.get(preKeyId)); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public void storePreKey(int preKeyId, PreKeyRecord record) { + store.put(preKeyId, record.serialize()); + } + + @Override + public boolean containsPreKey(int preKeyId) { + return store.containsKey(preKeyId); + } + + @Override + public void removePreKey(int preKeyId) { + store.remove(preKeyId); + } + + public static class JsonPreKeyStoreDeserializer extends JsonDeserializer { + + @Override + public JsonPreKeyStore deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { + JsonNode node = jsonParser.getCodec().readTree(jsonParser); + + + Map preKeyMap = new HashMap<>(); + if (node.isArray()) { + for (JsonNode preKey : node) { + Integer preKeyId = preKey.get("id").asInt(); + try { + preKeyMap.put(preKeyId, Base64.decode(preKey.get("record").asText())); + } catch (IOException e) { + System.out.println(String.format("Error while decoding prekey for: %s", preKeyId)); + } + } + } + + JsonPreKeyStore keyStore = new JsonPreKeyStore(); + keyStore.addPreKeys(preKeyMap); + + return keyStore; + + } + } + + public static class JsonPreKeyStoreSerializer extends JsonSerializer { + + @Override + public void serialize(JsonPreKeyStore jsonPreKeyStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + json.writeStartArray(); + for (Map.Entry preKey : jsonPreKeyStore.store.entrySet()) { + json.writeStartObject(); + json.writeNumberField("id", preKey.getKey()); + json.writeStringField("record", Base64.encodeBytes(preKey.getValue())); + json.writeEndObject(); + } + json.writeEndArray(); + } + } +}