import org.asamk.signal.manager.config.ServiceConfig;
import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
+import org.asamk.signal.manager.util.Utils;
import org.signal.libsignal.metadata.certificate.CertificateValidator;
import org.signal.libsignal.net.Network;
import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.SignalServiceAccountManager;
import org.whispersystems.signalservice.api.SignalServiceDataStore;
import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api;
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
+import org.whispersystems.signalservice.api.link.LinkDeviceApi;
import org.whispersystems.signalservice.api.push.ServiceIdType;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.registration.RegistrationApi;
import org.whispersystems.signalservice.api.services.ProfileService;
+import org.whispersystems.signalservice.api.storage.StorageServiceApi;
+import org.whispersystems.signalservice.api.storage.StorageServiceRepository;
import org.whispersystems.signalservice.api.svr.SecureValueRecovery;
import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
import org.whispersystems.signalservice.internal.websocket.OkHttpWebSocketConnection;
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
public class SignalDependencies {
+ private static final Logger logger = LoggerFactory.getLogger(SignalDependencies.class);
+
private final Object LOCK = new Object();
private final ServiceEnvironmentConfig serviceEnvironmentConfig;
private SignalServiceAccountManager accountManager;
private GroupsV2Api groupsV2Api;
private RegistrationApi registrationApi;
+ private LinkDeviceApi linkDeviceApi;
+ private StorageServiceApi storageServiceApi;
private GroupsV2Operations groupsV2Operations;
private ClientZkOperations clientZkOperations;
}
public Network getLibSignalNetwork() {
- return getOrCreate(() -> libSignalNetwork,
- () -> libSignalNetwork = new Network(serviceEnvironmentConfig.netEnvironment(), userAgent));
+ return getOrCreate(() -> libSignalNetwork, () -> {
+ libSignalNetwork = new Network(serviceEnvironmentConfig.netEnvironment(), userAgent);
+ setSignalNetworkProxy(libSignalNetwork);
+ });
+ }
+
+ private void setSignalNetworkProxy(Network libSignalNetwork) {
+ final var proxy = Utils.getHttpsProxy();
+ if (proxy.address() instanceof InetSocketAddress addr) {
+ switch (proxy.type()) {
+ case Proxy.Type.DIRECT -> {
+ }
+ case Proxy.Type.HTTP -> {
+ try {
+ libSignalNetwork.setProxy("http", addr.getHostName(), addr.getPort(), null, null);
+ } catch (IOException e) {
+ logger.warn("Failed to set http proxy", e);
+ }
+ }
+ case Proxy.Type.SOCKS -> {
+ try {
+ libSignalNetwork.setProxy("socks", addr.getHostName(), addr.getPort(), null, null);
+ } catch (IOException e) {
+ logger.warn("Failed to set socks proxy", e);
+ }
+ }
+ }
+ }
}
public SignalServiceAccountManager getAccountManager() {
return getOrCreate(() -> registrationApi, () -> registrationApi = getAccountManager().getRegistrationApi());
}
+ public LinkDeviceApi getLinkDeviceApi() {
+ return getOrCreate(() -> linkDeviceApi, () -> linkDeviceApi = new LinkDeviceApi(getPushServiceSocket()));
+ }
+
+ private StorageServiceApi getStorageServiceApi() {
+ return getOrCreate(() -> storageServiceApi,
+ () -> storageServiceApi = new StorageServiceApi(getPushServiceSocket()));
+ }
+
+ public StorageServiceRepository getStorageServiceRepository() {
+ return new StorageServiceRepository(getStorageServiceApi());
+ }
+
public GroupsV2Operations getGroupsV2Operations() {
return getOrCreate(() -> groupsV2Operations,
() -> groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()),