X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/5859e7b9f78b5d8963c56c66b75530ee3f094bee..27d9424f1e7f607ac2dfad5b2164d065ffb79ef7:/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java diff --git a/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java b/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java new file mode 100644 index 00000000..d8dbeb9a --- /dev/null +++ b/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java @@ -0,0 +1,114 @@ +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.SignedPreKeyRecord; +import org.whispersystems.libaxolotl.state.SignedPreKeyStore; + +import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +class JsonSignedPreKeyStore implements SignedPreKeyStore { + + private final Map store = new HashMap<>(); + + public JsonSignedPreKeyStore() { + + } + + + public void addSignedPreKeys(Map preKeys) { + store.putAll(preKeys); + } + + @Override + public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException { + try { + if (!store.containsKey(signedPreKeyId)) { + throw new InvalidKeyIdException("No such signedprekeyrecord! " + signedPreKeyId); + } + + return new SignedPreKeyRecord(store.get(signedPreKeyId)); + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public List loadSignedPreKeys() { + try { + List results = new LinkedList<>(); + + for (byte[] serialized : store.values()) { + results.add(new SignedPreKeyRecord(serialized)); + } + + return results; + } catch (IOException e) { + throw new AssertionError(e); + } + } + + @Override + public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) { + store.put(signedPreKeyId, record.serialize()); + } + + @Override + public boolean containsSignedPreKey(int signedPreKeyId) { + return store.containsKey(signedPreKeyId); + } + + @Override + public void removeSignedPreKey(int signedPreKeyId) { + store.remove(signedPreKeyId); + } + + public static class JsonSignedPreKeyStoreDeserializer extends JsonDeserializer { + + @Override + public JsonSignedPreKeyStore 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)); + } + } + } + + JsonSignedPreKeyStore keyStore = new JsonSignedPreKeyStore(); + keyStore.addSignedPreKeys(preKeyMap); + + return keyStore; + + } + } + + public static class JsonSignedPreKeyStoreSerializer extends JsonSerializer { + + @Override + public void serialize(JsonSignedPreKeyStore jsonPreKeyStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { + json.writeStartArray(); + for (Map.Entry signedPreKey : jsonPreKeyStore.store.entrySet()) { + json.writeStartObject(); + json.writeNumberField("id", signedPreKey.getKey()); + json.writeStringField("record", Base64.encodeBytes(signedPreKey.getValue())); + json.writeEndObject(); + } + json.writeEndArray(); + } + } +}