]> nmode's Git Repositories - signal-cli/blob - src/main/java/cli/JsonSessionStore.java
Correctly send to multiple recipients
[signal-cli] / src / main / java / cli / JsonSessionStore.java
1 package cli;
2
3 import org.json.JSONArray;
4 import org.json.JSONObject;
5 import org.whispersystems.libaxolotl.AxolotlAddress;
6 import org.whispersystems.libaxolotl.state.SessionRecord;
7 import org.whispersystems.libaxolotl.state.SessionStore;
8
9 import java.io.IOException;
10 import java.util.HashMap;
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.Map;
14
15 public class JsonSessionStore implements SessionStore {
16
17 private Map<AxolotlAddress, byte[]> sessions = new HashMap<>();
18
19 public JsonSessionStore() {
20
21 }
22
23 public JsonSessionStore(JSONArray list) throws IOException {
24 for (int i = 0; i < list.length(); i++) {
25 JSONObject k = list.getJSONObject(i);
26 try {
27 sessions.put(new AxolotlAddress(k.getString("name"), k.getInt("deviceId")), Base64.decode(k.getString("record")));
28 } catch (IOException e) {
29 System.out.println("Error while decoding prekey for: " + k.getString("name"));
30 }
31 }
32 }
33
34 public JSONArray getJson() {
35 JSONArray result = new JSONArray();
36 for (AxolotlAddress address : sessions.keySet()) {
37 result.put(new JSONObject().put("name", address.getName()).
38 put("deviceId", address.getDeviceId()).
39 put("record", Base64.encodeBytes(sessions.get(address))));
40 }
41 return result;
42 }
43
44 @Override
45 public synchronized SessionRecord loadSession(AxolotlAddress remoteAddress) {
46 try {
47 if (containsSession(remoteAddress)) {
48 return new SessionRecord(sessions.get(remoteAddress));
49 } else {
50 return new SessionRecord();
51 }
52 } catch (IOException e) {
53 throw new AssertionError(e);
54 }
55 }
56
57 @Override
58 public synchronized List<Integer> getSubDeviceSessions(String name) {
59 List<Integer> deviceIds = new LinkedList<>();
60
61 for (AxolotlAddress key : sessions.keySet()) {
62 if (key.getName().equals(name) &&
63 key.getDeviceId() != 1) {
64 deviceIds.add(key.getDeviceId());
65 }
66 }
67
68 return deviceIds;
69 }
70
71 @Override
72 public synchronized void storeSession(AxolotlAddress address, SessionRecord record) {
73 sessions.put(address, record.serialize());
74 }
75
76 @Override
77 public synchronized boolean containsSession(AxolotlAddress address) {
78 return sessions.containsKey(address);
79 }
80
81 @Override
82 public synchronized void deleteSession(AxolotlAddress address) {
83 sessions.remove(address);
84 }
85
86 @Override
87 public synchronized void deleteAllSessions(String name) {
88 for (AxolotlAddress key : sessions.keySet()) {
89 if (key.getName().equals(name)) {
90 sessions.remove(key);
91 }
92 }
93 }
94 }