]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java
7f2004592107190dda5789765002ff832eca8206
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / protocol / SignalProtocolStore.java
1 package org.asamk.signal.manager.storage.protocol;
2
3 import org.whispersystems.libsignal.IdentityKey;
4 import org.whispersystems.libsignal.IdentityKeyPair;
5 import org.whispersystems.libsignal.InvalidKeyIdException;
6 import org.whispersystems.libsignal.NoSessionException;
7 import org.whispersystems.libsignal.SignalProtocolAddress;
8 import org.whispersystems.libsignal.groups.state.SenderKeyRecord;
9 import org.whispersystems.libsignal.state.IdentityKeyStore;
10 import org.whispersystems.libsignal.state.PreKeyRecord;
11 import org.whispersystems.libsignal.state.PreKeyStore;
12 import org.whispersystems.libsignal.state.SessionRecord;
13 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
14 import org.whispersystems.libsignal.state.SignedPreKeyStore;
15 import org.whispersystems.signalservice.api.SignalServiceDataStore;
16 import org.whispersystems.signalservice.api.SignalServiceSenderKeyStore;
17 import org.whispersystems.signalservice.api.SignalServiceSessionStore;
18 import org.whispersystems.signalservice.api.push.DistributionId;
19
20 import java.util.Collection;
21 import java.util.List;
22 import java.util.Set;
23 import java.util.UUID;
24 import java.util.function.Supplier;
25
26 public class SignalProtocolStore implements SignalServiceDataStore {
27
28 private final PreKeyStore preKeyStore;
29 private final SignedPreKeyStore signedPreKeyStore;
30 private final SignalServiceSessionStore sessionStore;
31 private final IdentityKeyStore identityKeyStore;
32 private final SignalServiceSenderKeyStore senderKeyStore;
33 private final Supplier<Boolean> isMultiDevice;
34
35 public SignalProtocolStore(
36 final PreKeyStore preKeyStore,
37 final SignedPreKeyStore signedPreKeyStore,
38 final SignalServiceSessionStore sessionStore,
39 final IdentityKeyStore identityKeyStore,
40 final SignalServiceSenderKeyStore senderKeyStore,
41 final Supplier<Boolean> isMultiDevice
42 ) {
43 this.preKeyStore = preKeyStore;
44 this.signedPreKeyStore = signedPreKeyStore;
45 this.sessionStore = sessionStore;
46 this.identityKeyStore = identityKeyStore;
47 this.senderKeyStore = senderKeyStore;
48 this.isMultiDevice = isMultiDevice;
49 }
50
51 @Override
52 public IdentityKeyPair getIdentityKeyPair() {
53 return identityKeyStore.getIdentityKeyPair();
54 }
55
56 @Override
57 public int getLocalRegistrationId() {
58 return identityKeyStore.getLocalRegistrationId();
59 }
60
61 @Override
62 public boolean saveIdentity(SignalProtocolAddress address, IdentityKey identityKey) {
63 return identityKeyStore.saveIdentity(address, identityKey);
64 }
65
66 @Override
67 public boolean isTrustedIdentity(SignalProtocolAddress address, IdentityKey identityKey, Direction direction) {
68 return identityKeyStore.isTrustedIdentity(address, identityKey, direction);
69 }
70
71 @Override
72 public IdentityKey getIdentity(SignalProtocolAddress address) {
73 return identityKeyStore.getIdentity(address);
74 }
75
76 @Override
77 public PreKeyRecord loadPreKey(int preKeyId) throws InvalidKeyIdException {
78 return preKeyStore.loadPreKey(preKeyId);
79 }
80
81 @Override
82 public void storePreKey(int preKeyId, PreKeyRecord record) {
83 preKeyStore.storePreKey(preKeyId, record);
84 }
85
86 @Override
87 public boolean containsPreKey(int preKeyId) {
88 return preKeyStore.containsPreKey(preKeyId);
89 }
90
91 @Override
92 public void removePreKey(int preKeyId) {
93 preKeyStore.removePreKey(preKeyId);
94 }
95
96 @Override
97 public SessionRecord loadSession(SignalProtocolAddress address) {
98 return sessionStore.loadSession(address);
99 }
100
101 @Override
102 public List<SessionRecord> loadExistingSessions(final List<SignalProtocolAddress> addresses) throws NoSessionException {
103 return sessionStore.loadExistingSessions(addresses);
104 }
105
106 @Override
107 public List<Integer> getSubDeviceSessions(String name) {
108 return sessionStore.getSubDeviceSessions(name);
109 }
110
111 @Override
112 public void storeSession(SignalProtocolAddress address, SessionRecord record) {
113 sessionStore.storeSession(address, record);
114 }
115
116 @Override
117 public boolean containsSession(SignalProtocolAddress address) {
118 return sessionStore.containsSession(address);
119 }
120
121 @Override
122 public void deleteSession(SignalProtocolAddress address) {
123 sessionStore.deleteSession(address);
124 }
125
126 @Override
127 public void deleteAllSessions(String name) {
128 sessionStore.deleteAllSessions(name);
129 }
130
131 @Override
132 public void archiveSession(final SignalProtocolAddress address) {
133 sessionStore.archiveSession(address);
134 }
135
136 @Override
137 public Set<SignalProtocolAddress> getAllAddressesWithActiveSessions(final List<String> addressNames) {
138 return sessionStore.getAllAddressesWithActiveSessions(addressNames);
139 }
140
141 @Override
142 public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException {
143 return signedPreKeyStore.loadSignedPreKey(signedPreKeyId);
144 }
145
146 @Override
147 public List<SignedPreKeyRecord> loadSignedPreKeys() {
148 return signedPreKeyStore.loadSignedPreKeys();
149 }
150
151 @Override
152 public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) {
153 signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record);
154 }
155
156 @Override
157 public boolean containsSignedPreKey(int signedPreKeyId) {
158 return signedPreKeyStore.containsSignedPreKey(signedPreKeyId);
159 }
160
161 @Override
162 public void removeSignedPreKey(int signedPreKeyId) {
163 signedPreKeyStore.removeSignedPreKey(signedPreKeyId);
164 }
165
166 @Override
167 public void storeSenderKey(
168 final SignalProtocolAddress sender, final UUID distributionId, final SenderKeyRecord record
169 ) {
170 senderKeyStore.storeSenderKey(sender, distributionId, record);
171 }
172
173 @Override
174 public SenderKeyRecord loadSenderKey(final SignalProtocolAddress sender, final UUID distributionId) {
175 return senderKeyStore.loadSenderKey(sender, distributionId);
176 }
177
178 @Override
179 public Set<SignalProtocolAddress> getSenderKeySharedWith(final DistributionId distributionId) {
180 return senderKeyStore.getSenderKeySharedWith(distributionId);
181 }
182
183 @Override
184 public void markSenderKeySharedWith(
185 final DistributionId distributionId, final Collection<SignalProtocolAddress> addresses
186 ) {
187 senderKeyStore.markSenderKeySharedWith(distributionId, addresses);
188 }
189
190 @Override
191 public void clearSenderKeySharedWith(final Collection<SignalProtocolAddress> addresses) {
192 senderKeyStore.clearSenderKeySharedWith(addresses);
193 }
194
195 @Override
196 public boolean isMultiDevice() {
197 return isMultiDevice.get();
198 }
199
200 @Override
201 public Transaction beginTransaction() {
202 return () -> {
203 // No-op transaction should be safe, as it's only a performance improvement
204 };
205 }
206 }