Make sure not more than one libsignal Network instance is ever created

Co-authored-by: Greyson Parrelli <greyson@signal.org>
This commit is contained in:
moiseev-signal
2024-04-01 11:33:10 -07:00
committed by Greyson Parrelli
parent 544cc06f13
commit 78e36b85d4
6 changed files with 35 additions and 7 deletions

View File

@@ -98,7 +98,7 @@ object ContactDiscoveryRefreshV2 {
Optional.empty(),
BuildConfig.CDSI_MRENCLAVE,
10_000,
if (FeatureFlags.useLibsignalNetForCdsiLookup()) BuildConfig.LIBSIGNAL_NET_ENV else null
if (FeatureFlags.useLibsignalNetForCdsiLookup()) ApplicationDependencies.getLibsignalNetwork() else null
) {
Log.i(TAG, "Ignoring token for one-off lookup.")
}
@@ -163,7 +163,7 @@ object ContactDiscoveryRefreshV2 {
Optional.ofNullable(token),
BuildConfig.CDSI_MRENCLAVE,
timeoutMs,
if (FeatureFlags.useLibsignalNetForCdsiLookup()) BuildConfig.LIBSIGNAL_NET_ENV else null
if (FeatureFlags.useLibsignalNetForCdsiLookup()) ApplicationDependencies.getLibsignalNetwork() else null
) { tokenToSave ->
stopwatch.split("network-pre-token")
if (!isPartialRefresh) {

View File

@@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import org.signal.core.util.concurrent.DeadlockDetector;
import org.signal.libsignal.net.Network;
import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations;
import org.signal.libsignal.zkgroup.receipts.ClientZkReceiptOperations;
import org.thoughtcrime.securesms.components.TypingStatusRepository;
@@ -85,6 +86,7 @@ public class ApplicationDependencies {
private static final Object FRAME_RATE_TRACKER_LOCK = new Object();
private static final Object JOB_MANAGER_LOCK = new Object();
private static final Object SIGNAL_HTTP_CLIENT_LOCK = new Object();
private static final Object LIBSIGNAL_NETWORK_LOCK = new Object();
private static Application application;
private static Provider provider;
@@ -129,6 +131,7 @@ public class ApplicationDependencies {
private static volatile DeadlockDetector deadlockDetector;
private static volatile ClientZkReceiptOperations clientZkReceiptOperations;
private static volatile ScheduledMessageManager scheduledMessagesManager;
private static volatile Network libsignalNetwork;
@MainThread
public static void init(@NonNull Application application, @NonNull Provider provider) {
@@ -685,6 +688,17 @@ public class ApplicationDependencies {
return deadlockDetector;
}
public static @NonNull Network getLibsignalNetwork() {
if (libsignalNetwork == null) {
synchronized (LIBSIGNAL_NETWORK_LOCK) {
if (libsignalNetwork == null) {
libsignalNetwork = provider.provideLibsignalNetwork();
}
}
}
return libsignalNetwork;
}
public interface Provider {
@NonNull GroupsV2Operations provideGroupsV2Operations(@NonNull SignalServiceConfiguration signalServiceConfiguration);
@NonNull SignalServiceAccountManager provideSignalServiceAccountManager(@NonNull SignalServiceConfiguration signalServiceConfiguration, @NonNull GroupsV2Operations groupsV2Operations);
@@ -723,5 +737,6 @@ public class ApplicationDependencies {
@NonNull DeadlockDetector provideDeadlockDetector();
@NonNull ClientZkReceiptOperations provideClientZkReceiptOperations(@NonNull SignalServiceConfiguration signalServiceConfiguration);
@NonNull ScheduledMessageManager provideScheduledMessageManager();
@NonNull Network provideLibsignalNetwork();
}
}

View File

@@ -11,6 +11,7 @@ import androidx.annotation.VisibleForTesting;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.concurrent.DeadlockDetector;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.libsignal.net.Network;
import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations;
import org.signal.libsignal.zkgroup.receipts.ClientZkReceiptOperations;
import org.thoughtcrime.securesms.BuildConfig;
@@ -228,6 +229,11 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr
return new ScheduledMessageManager(context);
}
@Override
public @NonNull Network provideLibsignalNetwork() {
return new Network(BuildConfig.LIBSIGNAL_NET_ENV);
}
@Override
public @NonNull TypingStatusRepository provideTypingStatusRepository() {
return new TypingStatusRepository();