]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/protocol/SignalProtocolStore.java
f804bc6dabc978543ebfd740ee7366192a812a9e
[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.signal.libsignal.protocol.IdentityKey;
4 import org.signal.libsignal.protocol.IdentityKeyPair;
5 import org.signal.libsignal.protocol.InvalidKeyIdException;
6 import org.signal.libsignal.protocol.NoSessionException;
7 import org.signal.libsignal.protocol.SignalProtocolAddress;
8 import org.signal.libsignal.protocol.groups.state.SenderKeyRecord;
9 import org.signal.libsignal.protocol.state.IdentityKeyStore;
10 import org.signal.libsignal.protocol.state.PreKeyRecord;
11 import org.signal.libsignal.protocol.state.PreKeyStore;
12 import org.signal.libsignal.protocol.state.SessionRecord;
13 import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
14 import org.signal.libsignal.protocol.state.SignedPreKeyStore;
15 import org.whispersystems.signalservice.api.SignalServiceAccountDataStore;
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 SignalServiceAccountDataStore {
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 senderKeyStore.clearSenderKeySharedWith(List.of(address));
135 }
136
137 @Override
138 public Set<SignalProtocolAddress> getAllAddressesWithActiveSessions(final List<String> addressNames) {
139 return sessionStore.getAllAddressesWithActiveSessions(addressNames);
140 }
141
142 @Override
143 public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException {
144 return signedPreKeyStore.loadSignedPreKey(signedPreKeyId);
145 }
146
147 @Override
148 public List<SignedPreKeyRecord> loadSignedPreKeys() {
149 return signedPreKeyStore.loadSignedPreKeys();
150 }
151
152 @Override
153 public void storeSignedPreKey(int signedPreKeyId, SignedPreKeyRecord record) {
154 signedPreKeyStore.storeSignedPreKey(signedPreKeyId, record);
155 }
156
157 @Override
158 public boolean containsSignedPreKey(int signedPreKeyId) {
159 return signedPreKeyStore.containsSignedPreKey(signedPreKeyId);
160 }
161
162 @Override
163 public void removeSignedPreKey(int signedPreKeyId) {
164 signedPreKeyStore.removeSignedPreKey(signedPreKeyId);
165 }
166
167 @Override
168 public void storeSenderKey(
169 final SignalProtocolAddress sender, final UUID distributionId, final SenderKeyRecord record
170 ) {
171 senderKeyStore.storeSenderKey(sender, distributionId, record);
172 }
173
174 @Override
175 public SenderKeyRecord loadSenderKey(final SignalProtocolAddress sender, final UUID distributionId) {
176 return senderKeyStore.loadSenderKey(sender, distributionId);
177 }
178
179 @Override
180 public Set<SignalProtocolAddress> getSenderKeySharedWith(final DistributionId distributionId) {
181 return senderKeyStore.getSenderKeySharedWith(distributionId);
182 }
183
184 @Override
185 public void markSenderKeySharedWith(
186 final DistributionId distributionId, final Collection<SignalProtocolAddress> addresses
187 ) {
188 senderKeyStore.markSenderKeySharedWith(distributionId, addresses);
189 }
190
191 @Override
192 public void clearSenderKeySharedWith(final Collection<SignalProtocolAddress> addresses) {
193 senderKeyStore.clearSenderKeySharedWith(addresses);
194 }
195
196 @Override
197 public boolean isMultiDevice() {
198 return isMultiDevice.get();
199 }
200 }