From f01e04466230284e9fb5fb026cf6adfe1cf594d6 Mon Sep 17 00:00:00 2001 From: adel-signal Date: Mon, 1 Apr 2024 05:32:03 -0700 Subject: [PATCH] Update to new calling turn info endpoint, add support for turn server ips. Co-authored-by: Adel Lahlou --- .../service/webrtc/SignalCallManager.java | 16 +++++++++++++++- .../main/java/org/signal/core/util/ListUtil.java | 5 +++++ .../api/messages/calls/TurnServerInfo.java | 15 +++++++++++++++ .../internal/push/PushServiceSocket.java | 2 +- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index c02dcb40f1..c5a3054aa7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -14,6 +14,7 @@ import androidx.annotation.Nullable; import com.annimon.stream.Stream; import org.greenrobot.eventbus.EventBus; +import org.signal.core.util.ListUtil; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.util.Pair; @@ -994,7 +995,20 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. TurnServerInfo turnServerInfo = ApplicationDependencies.getSignalServiceAccountManager().getTurnServerInfo(); List iceServers = new LinkedList<>(); - for (String url : turnServerInfo.getUrls()) { + for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrlsWithIps())) { + if (url.startsWith("turn")) { + iceServers.add(PeerConnection.IceServer.builder(url) + .setUsername(turnServerInfo.getUsername()) + .setPassword(turnServerInfo.getPassword()) + .setHostname(turnServerInfo.getHostname()) + .createIceServer()); + } else { + iceServers.add(PeerConnection.IceServer.builder(url) + .setHostname(turnServerInfo.getHostname()) + .createIceServer()); + } + } + for (String url : ListUtil.emptyIfNull(turnServerInfo.getUrls())) { if (url.startsWith("turn")) { iceServers.add(PeerConnection.IceServer.builder(url) .setUsername(turnServerInfo.getUsername()) diff --git a/core-util/src/main/java/org/signal/core/util/ListUtil.java b/core-util/src/main/java/org/signal/core/util/ListUtil.java index 9669ccdb56..c3d569562e 100644 --- a/core-util/src/main/java/org/signal/core/util/ListUtil.java +++ b/core-util/src/main/java/org/signal/core/util/ListUtil.java @@ -4,6 +4,7 @@ import androidx.annotation.NonNull; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -31,4 +32,8 @@ public final class ListUtil { return concat; } + + public static List emptyIfNull(List list) { + return list == null ? Collections.emptyList() : list; + } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java index 182caf671a..5833d512c7 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/calls/TurnServerInfo.java @@ -13,9 +13,15 @@ public class TurnServerInfo { @JsonProperty private String password; + @JsonProperty + private String hostname; + @JsonProperty private List urls; + @JsonProperty + private List urlsWithIps; + public String getUsername() { return username; } @@ -24,7 +30,16 @@ public class TurnServerInfo { return password; } + // Hostname for the ips in urlsWithIps + public String getHostname() { + return hostname; + } + public List getUrls() { return urls; } + + public List getUrlsWithIps() { + return urlsWithIps; + } } 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 d6bdbbe924..f4d13021f3 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 @@ -216,7 +216,6 @@ public class PushServiceSocket { private static final String TAG = PushServiceSocket.class.getSimpleName(); private static final String REGISTER_GCM_PATH = "/v1/accounts/gcm/"; - private static final String TURN_SERVER_INFO = "/v1/accounts/turn"; private static final String SET_ACCOUNT_ATTRIBUTES = "/v1/accounts/attributes/"; private static final String PIN_PATH = "/v1/accounts/pin/"; private static final String REGISTRATION_LOCK_PATH = "/v1/accounts/registration_lock"; @@ -238,6 +237,7 @@ public class PushServiceSocket { private static final String PREKEY_DEVICE_PATH = "/v2/keys/%s/%s"; private static final String PREKEY_CHECK_PATH = "/v2/keys/check"; + private static final String TURN_SERVER_INFO = "/v1/calling/relays"; private static final String PROVISIONING_CODE_PATH = "/v1/devices/provisioning/code"; private static final String PROVISIONING_MESSAGE_PATH = "/v1/provisioning/%s";