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