1 package org
.asamk
.signal
.manager
.internal
;
3 import org
.asamk
.signal
.manager
.config
.ServiceConfig
;
4 import org
.asamk
.signal
.manager
.config
.ServiceEnvironmentConfig
;
5 import org
.signal
.libsignal
.metadata
.certificate
.CertificateValidator
;
6 import org
.signal
.libsignal
.net
.Network
;
7 import org
.signal
.libsignal
.zkgroup
.profiles
.ClientZkProfileOperations
;
8 import org
.whispersystems
.signalservice
.api
.SignalServiceAccountManager
;
9 import org
.whispersystems
.signalservice
.api
.SignalServiceDataStore
;
10 import org
.whispersystems
.signalservice
.api
.SignalServiceMessageReceiver
;
11 import org
.whispersystems
.signalservice
.api
.SignalServiceMessageSender
;
12 import org
.whispersystems
.signalservice
.api
.SignalSessionLock
;
13 import org
.whispersystems
.signalservice
.api
.SignalWebSocket
;
14 import org
.whispersystems
.signalservice
.api
.crypto
.SignalServiceCipher
;
15 import org
.whispersystems
.signalservice
.api
.groupsv2
.ClientZkOperations
;
16 import org
.whispersystems
.signalservice
.api
.groupsv2
.GroupsV2Api
;
17 import org
.whispersystems
.signalservice
.api
.groupsv2
.GroupsV2Operations
;
18 import org
.whispersystems
.signalservice
.api
.push
.ServiceIdType
;
19 import org
.whispersystems
.signalservice
.api
.push
.SignalServiceAddress
;
20 import org
.whispersystems
.signalservice
.api
.services
.ProfileService
;
21 import org
.whispersystems
.signalservice
.api
.svr
.SecureValueRecovery
;
22 import org
.whispersystems
.signalservice
.api
.util
.CredentialsProvider
;
23 import org
.whispersystems
.signalservice
.api
.util
.UptimeSleepTimer
;
24 import org
.whispersystems
.signalservice
.api
.websocket
.WebSocketFactory
;
25 import org
.whispersystems
.signalservice
.internal
.push
.PushServiceSocket
;
26 import org
.whispersystems
.signalservice
.internal
.websocket
.LibSignalNetwork
;
27 import org
.whispersystems
.signalservice
.internal
.websocket
.OkHttpWebSocketConnection
;
28 import org
.whispersystems
.signalservice
.internal
.websocket
.WebSocketConnection
;
30 import java
.util
.List
;
31 import java
.util
.Optional
;
32 import java
.util
.concurrent
.ExecutorService
;
33 import java
.util
.function
.Supplier
;
35 public class SignalDependencies
{
37 private final Object LOCK
= new Object();
39 private final ServiceEnvironmentConfig serviceEnvironmentConfig
;
40 private final String userAgent
;
41 private final CredentialsProvider credentialsProvider
;
42 private final SignalServiceDataStore dataStore
;
43 private final ExecutorService executor
;
44 private final SignalSessionLock sessionLock
;
46 private boolean allowStories
= true;
48 private SignalServiceAccountManager accountManager
;
49 private GroupsV2Api groupsV2Api
;
50 private GroupsV2Operations groupsV2Operations
;
51 private ClientZkOperations clientZkOperations
;
53 private PushServiceSocket pushServiceSocket
;
54 private LibSignalNetwork libSignalNetwork
;
55 private SignalWebSocket signalWebSocket
;
56 private SignalServiceMessageReceiver messageReceiver
;
57 private SignalServiceMessageSender messageSender
;
59 private List
<SecureValueRecovery
> secureValueRecoveryV2
;
60 private ProfileService profileService
;
63 final ServiceEnvironmentConfig serviceEnvironmentConfig
,
64 final String userAgent
,
65 final CredentialsProvider credentialsProvider
,
66 final SignalServiceDataStore dataStore
,
67 final ExecutorService executor
,
68 final SignalSessionLock sessionLock
70 this.serviceEnvironmentConfig
= serviceEnvironmentConfig
;
71 this.userAgent
= userAgent
;
72 this.credentialsProvider
= credentialsProvider
;
73 this.dataStore
= dataStore
;
74 this.executor
= executor
;
75 this.sessionLock
= sessionLock
;
78 public void resetAfterAddressChange() {
79 if (this.pushServiceSocket
!= null) {
80 this.pushServiceSocket
.close();
81 this.pushServiceSocket
= null;
83 this.messageSender
= null;
84 getSignalWebSocket().forceNewWebSockets();
88 * This method needs to be called before the first websocket is created
90 public void setAllowStories(final boolean allowStories
) {
91 this.allowStories
= allowStories
;
94 public ServiceEnvironmentConfig
getServiceEnvironmentConfig() {
95 return serviceEnvironmentConfig
;
98 public SignalSessionLock
getSessionLock() {
102 public PushServiceSocket
getPushServiceSocket() {
103 return getOrCreate(() -> pushServiceSocket
,
104 () -> pushServiceSocket
= new PushServiceSocket(serviceEnvironmentConfig
.signalServiceConfiguration(),
107 getClientZkProfileOperations(),
108 ServiceConfig
.AUTOMATIC_NETWORK_RETRY
));
111 public LibSignalNetwork
getLibSignalNetwork() {
112 return getOrCreate(() -> libSignalNetwork
,
113 () -> libSignalNetwork
= new LibSignalNetwork(new Network(serviceEnvironmentConfig
.netEnvironment(),
114 userAgent
), serviceEnvironmentConfig
.signalServiceConfiguration()));
117 public SignalServiceAccountManager
getAccountManager() {
118 return getOrCreate(() -> accountManager
,
119 () -> accountManager
= new SignalServiceAccountManager(getPushServiceSocket(),
121 serviceEnvironmentConfig
.signalServiceConfiguration(),
123 getGroupsV2Operations()));
126 public SignalServiceAccountManager
createUnauthenticatedAccountManager(String number
, String password
) {
127 return new SignalServiceAccountManager(getServiceEnvironmentConfig().signalServiceConfiguration(),
131 SignalServiceAddress
.DEFAULT_DEVICE_ID
,
134 ServiceConfig
.AUTOMATIC_NETWORK_RETRY
,
135 ServiceConfig
.GROUP_MAX_SIZE
);
138 public GroupsV2Api
getGroupsV2Api() {
139 return getOrCreate(() -> groupsV2Api
, () -> groupsV2Api
= getAccountManager().getGroupsV2Api());
142 public GroupsV2Operations
getGroupsV2Operations() {
143 return getOrCreate(() -> groupsV2Operations
,
144 () -> groupsV2Operations
= new GroupsV2Operations(ClientZkOperations
.create(serviceEnvironmentConfig
.signalServiceConfiguration()),
145 ServiceConfig
.GROUP_MAX_SIZE
));
148 private ClientZkOperations
getClientZkOperations() {
149 return getOrCreate(() -> clientZkOperations
,
150 () -> clientZkOperations
= ClientZkOperations
.create(serviceEnvironmentConfig
.signalServiceConfiguration()));
153 private ClientZkProfileOperations
getClientZkProfileOperations() {
154 final var clientZkOperations
= getClientZkOperations();
155 return clientZkOperations
.getProfileOperations();
158 public SignalWebSocket
getSignalWebSocket() {
159 return getOrCreate(() -> signalWebSocket
, () -> {
160 final var timer
= new UptimeSleepTimer();
161 final var healthMonitor
= new SignalWebSocketHealthMonitor(timer
);
162 final var webSocketFactory
= new WebSocketFactory() {
164 public WebSocketConnection
createWebSocket() {
165 return new OkHttpWebSocketConnection("normal",
166 serviceEnvironmentConfig
.signalServiceConfiguration(),
167 Optional
.of(credentialsProvider
),
174 public WebSocketConnection
createUnidentifiedWebSocket() {
175 return new OkHttpWebSocketConnection("unidentified",
176 serviceEnvironmentConfig
.signalServiceConfiguration(),
183 signalWebSocket
= new SignalWebSocket(webSocketFactory
);
184 healthMonitor
.monitor(signalWebSocket
);
188 public SignalServiceMessageReceiver
getMessageReceiver() {
189 return getOrCreate(() -> messageReceiver
,
190 () -> messageReceiver
= new SignalServiceMessageReceiver(pushServiceSocket
));
193 public SignalServiceMessageSender
getMessageSender() {
194 return getOrCreate(() -> messageSender
,
195 () -> messageSender
= new SignalServiceMessageSender(credentialsProvider
,
198 getSignalWebSocket(),
201 ServiceConfig
.MAX_ENVELOPE_SIZE
,
206 public List
<SecureValueRecovery
> getSecureValueRecoveryV2() {
207 return getOrCreate(() -> secureValueRecoveryV2
,
208 () -> secureValueRecoveryV2
= serviceEnvironmentConfig
.svr2Mrenclaves()
210 .map(mr
-> (SecureValueRecovery
) getAccountManager().getSecureValueRecoveryV2(mr
))
214 public ProfileService
getProfileService() {
215 return getOrCreate(() -> profileService
,
216 () -> profileService
= new ProfileService(getClientZkProfileOperations(),
217 getMessageReceiver(),
218 getSignalWebSocket()));
221 public SignalServiceCipher
getCipher(ServiceIdType serviceIdType
) {
222 final var certificateValidator
= new CertificateValidator(serviceEnvironmentConfig
.unidentifiedSenderTrustRoot());
223 final var address
= new SignalServiceAddress(credentialsProvider
.getAci(), credentialsProvider
.getE164());
224 final var deviceId
= credentialsProvider
.getDeviceId();
225 return new SignalServiceCipher(address
,
227 serviceIdType
== ServiceIdType
.ACI ? dataStore
.aci() : dataStore
.pni(),
229 certificateValidator
);
232 private <T
> T
getOrCreate(Supplier
<T
> supplier
, Callable creator
) {
233 var value
= supplier
.get();
238 synchronized (LOCK
) {
239 value
= supplier
.get();
244 return supplier
.get();
248 private interface Callable
{