]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacyJsonSessionStore.java
c43bdb08dfabd87a99152b8e6bea803698db40b8
[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<SessionInfo> sessions = new ArrayList<>();
20
21 public LegacyJsonSessionStore() {
22 }
23
24 public List<SessionInfo> getSessions() {
25 return sessions;
26 }
27
28 public static class JsonSessionStoreDeserializer extends JsonDeserializer<LegacyJsonSessionStore> {
29
30 @Override
31 public LegacyJsonSessionStore deserialize(
32 JsonParser jsonParser, DeserializationContext deserializationContext
33 ) throws IOException {
34 JsonNode node = jsonParser.getCodec().readTree(jsonParser);
35
36 var sessionStore = new LegacyJsonSessionStore();
37
38 if (node.isArray()) {
39 for (var session : node) {
40 var sessionName = session.hasNonNull("name") ? session.get("name").asText() : null;
41 if (UuidUtil.isUuid(sessionName)) {
42 // Ignore sessions that were incorrectly created with UUIDs as name
43 continue;
44 }
45
46 var uuid = session.hasNonNull("uuid") ? UuidUtil.parseOrNull(session.get("uuid").asText()) : null;
47 final var serviceAddress = uuid == null
48 ? Utils.getSignalServiceAddressFromIdentifier(sessionName)
49 : new SignalServiceAddress(uuid, sessionName);
50 final var deviceId = session.get("deviceId").asInt();
51 final var record = Base64.getDecoder().decode(session.get("record").asText());
52 var sessionInfo = new SessionInfo(serviceAddress, deviceId, record);
53 sessionStore.sessions.add(sessionInfo);
54 }
55 }
56
57 return sessionStore;
58 }
59 }
60 }