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