From af7e736de929b3b249b15d0d31e7422f3da9088c Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 3 Feb 2021 14:55:05 -0500 Subject: [PATCH] Use a simple check to verify proxies during registration. --- .../preferences/EditProxyFragment.java | 1 + .../securesms/util/SignalProxyUtil.java | 32 +++++++++++++++++-- .../api/SignalServiceAccountManager.java | 4 +++ .../internal/push/PushServiceSocket.java | 4 +++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java index ffdea7d6d..1693c9bb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/EditProxyFragment.java @@ -148,6 +148,7 @@ public class EditProxyFragment extends Fragment { requireActivity().onBackPressed(); }) .show(); + requireActivity().onBackPressed(); break; case PROXY_FAILURE: proxyStatus.setVisibility(View.INVISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalProxyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SignalProxyUtil.java index bff3ae276..717960376 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalProxyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalProxyUtil.java @@ -6,12 +6,16 @@ import androidx.annotation.WorkerThread; import androidx.lifecycle.Observer; import org.conscrypt.Conscrypt; +import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.net.PipeConnectivityListener; +import org.thoughtcrime.securesms.push.AccountManagerFactory; +import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.internal.configuration.SignalProxy; +import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.CountDownLatch; @@ -69,8 +73,8 @@ public final class SignalProxyUtil { startListeningToWebsocket(); if (TextSecurePreferences.getLocalNumber(ApplicationDependencies.getApplication()) == null) { - Log.i(TAG, "User is unregistered! Assuming success."); - return true; + Log.i(TAG, "User is unregistered! Doing simple check."); + return testWebsocketConnectionUnregistered(timeout); } CountDownLatch latch = new CountDownLatch(1); @@ -156,4 +160,28 @@ public final class SignalProxyUtil { return "https://" + PROXY_LINK_HOST + "/#" + host; } + + private static boolean testWebsocketConnectionUnregistered(long timeout) { + CountDownLatch latch = new CountDownLatch(1); + AtomicBoolean success = new AtomicBoolean(false); + SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(ApplicationDependencies.getApplication(), "", ""); + + SignalExecutors.UNBOUNDED.execute(() -> { + try { + accountManager.checkNetworkConnection(); + success.set(true); + latch.countDown(); + } catch (IOException e) { + latch.countDown(); + } + }); + + try { + latch.await(timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + Log.w(TAG, "Interrupted!", e); + } + + return success.get(); + } } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index ad26c3e2c..82ddc98f1 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -632,6 +632,10 @@ public class SignalServiceAccountManager { return this.pushServiceSocket.getTurnServerInfo(); } + public void checkNetworkConnection() throws IOException { + this.pushServiceSocket.pingStorageService(); + } + /** * @return The avatar URL path, if one was written. */ diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 786abd6dd..c94ce7de7 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -885,6 +885,10 @@ public class PushServiceSocket { } } + public void pingStorageService() throws IOException { + makeStorageRequest(null, "/ping", "GET", null); + } + public RemoteConfigResponse getRemoteConfig() throws IOException { String response = makeServiceRequest("/v1/config", "GET", null); return JsonUtil.fromJson(response, RemoteConfigResponse.class);