]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java
5f301aebaee00301d72903a064e08c82cbd415fe
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / protocol / LegacyJsonSessionStore.java
1 package org.asamk.signal.manager.storage.protocol;
2
3 import com.fasterxml.jackson.core.JsonParser;
4 import com.fasterxml.jackson.databind.DeserializationContext;
5 import com.fasterxml.jackson.databind.JsonDeserializer;
6 import com.fasterxml.jackson.databind.JsonNode;
7
8 import org.asamk.signal.manager.util.Utils;
9 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
10 import org.whispersystems.signalservice.api.util.UuidUtil;
11
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.Base64;
15 import java.util.List;
16
17 public class LegacyJsonSessionStore {
18
19 private final List<LegacySessionInfo> sessions;
20
21 private LegacyJsonSessionStore(final List<LegacySessionInfo> sessions) {
22 this.sessions = sessions;
23 }
24
25 public List<LegacySessionInfo> getSessions() {
26 return sessions;
27 }
28
29 public static class JsonSessionStoreDeserializer extends JsonDeserializer<LegacyJsonSessionStore> {
30
31 @Override
32 public LegacyJsonSessionStore deserialize(
33 JsonParser jsonParser, DeserializationContext deserializationContext
34 ) throws IOException {
35 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
36
37 var sessions = new ArrayList<LegacySessionInfo>();
38
39 if (node.isArray()) {
40 for (var session : node) {
41 var sessionName = session.hasNonNull("name") ? session.get("name").asText() : null;
42 if (UuidUtil.isUuid(sessionName)) {
43 // Ignore sessions that were incorrectly created with UUIDs as name
44 continue;
45 }
46
47 var uuid = session.hasNonNull("uuid") ? UuidUtil.parseOrNull(session.get("uuid").asText()) : null;
48 final var serviceAddress = uuid == null
49 ? Utils.getSignalServiceAddressFromIdentifier(sessionName)
50 : new SignalServiceAddress(uuid, sessionName);
51 final var deviceId = session.get("deviceId").asInt();
52 final var record = Base64.getDecoder().decode(session.get("record").asText());
53 var sessionInfo = new LegacySessionInfo(serviceAddress, deviceId, record);
54 sessions.add(sessionInfo);
55 }
56 }
57
58 return new LegacyJsonSessionStore(sessions);
59 }
60 }
61 }