Add SIP proxy URL and outbound proxy to third party registration and account settings

This commit is contained in:
Benoit Martins 2026-02-24 12:08:12 +01:00
parent 0f6d8b1296
commit f08bb865aa
7 changed files with 93 additions and 18 deletions

View file

@ -2,6 +2,6 @@ import Foundation
public enum AppGitInfo {
public static let branch = "master"
public static let commit = "d39e4a0e3"
public static let commit = "0f6d8b129"
public static let tag = "6.1.0-alpha"
}

View file

@ -53,7 +53,8 @@
"account_settings_outbound_proxy_title" = "Outbound proxy";
"account_settings_push_notification_not_available_title" = "Push notifications aren't available!";
"account_settings_push_notification_title" = "Allow push notifications";
"account_settings_sip_proxy_url_title" = "SIP proxy server URL";
"account_settings_sip_proxy_url_title" = "Registrar URI";
"account_settings_outbound_proxy_title" = "Outbound SIP Proxy URI";
"account_settings_stun_server_url_title" = "STUN/TURN server URL";
"account_settings_title" = "Account settings";
"account_settings_turn_password_title" = "TURN password";

View file

@ -53,7 +53,8 @@
"account_settings_outbound_proxy_title" = "Serveur mandataire sortant";
"account_settings_push_notification_not_available_title" = "Notifications push non disponibles";
"account_settings_push_notification_title" = "Activer les notifications";
"account_settings_sip_proxy_url_title" = "URL du serveur mandataire";
"account_settings_sip_proxy_url_title" = "Registrar URI";
"account_settings_outbound_proxy_title" = "URI du proxy SIP sortant";
"account_settings_stun_server_url_title" = "URL du serveur STUN/TURN";
"account_settings_title" = "Paramètres de compte";
"account_settings_turn_password_title" = "Mot de passe TURN";

View file

@ -35,8 +35,8 @@ struct ThirdPartySipAccountLoginFragment: View {
@FocusState var isPasswordFocused: Bool
@FocusState var isDomainFocused: Bool
@FocusState var isDisplayNameFocused: Bool
@FocusState var isSipProxyUrlFocused: Bool
@FocusState var isAuthIdFocused: Bool
@FocusState var isSipProxyUrlFocused: Bool
@FocusState var isOutboundProxyFocused: Bool
var body: some View {
@ -289,13 +289,14 @@ struct ThirdPartySipAccountLoginFragment: View {
)
.focused($isAuthIdFocused)
}
.padding(.bottom)
VStack(alignment: .leading) {
Text("account_settings_sip_proxy_url_title")
.default_text_style_700(styleSize: 15)
.padding(.bottom, -5)
TextField("account_settings_sip_proxy_url_title", text: $accountLoginViewModel.outboundProxy)
TextField("account_settings_sip_proxy_url_title", text: $accountLoginViewModel.sipProxyUrl)
.id(2)
.default_text_style(styleSize: 15)
.frame(height: 25)
@ -306,11 +307,33 @@ struct ThirdPartySipAccountLoginFragment: View {
.overlay(
RoundedRectangle(cornerRadius: 60)
.inset(by: 0.5)
.stroke(isOutboundProxyFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1)
.stroke(isSipProxyUrlFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1)
)
.focused($isOutboundProxyFocused)
.focused($isSipProxyUrlFocused)
}
.padding(.bottom)
VStack(alignment: .leading) {
Text("account_settings_outbound_proxy_title")
.default_text_style_700(styleSize: 15)
.padding(.bottom, -5)
TextField("account_settings_outbound_proxy_title", text: $accountLoginViewModel.outboundProxy)
.id(3)
.default_text_style(styleSize: 15)
.frame(height: 25)
.padding(.horizontal, 20)
.padding(.vertical, 15)
.background(.white)
.cornerRadius(60)
.overlay(
RoundedRectangle(cornerRadius: 60)
.inset(by: 0.5)
.stroke(isOutboundProxyFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1)
)
.focused($isOutboundProxyFocused)
}
.padding(.bottom)
}
}
.frame(maxWidth: SharedMainViewModel.shared.maxWidth)

View file

@ -30,6 +30,7 @@ class AccountLoginViewModel: ObservableObject {
@Published var displayName: String = ""
@Published var transportType: String = "TLS"
@Published var authId: String = ""
@Published var sipProxyUrl: String = ""
@Published var outboundProxy: String = ""
private var mCoreDelegate: CoreDelegate!
@ -102,18 +103,27 @@ class AccountLoginViewModel: ObservableObject {
// We also need to configure where the proxy server is located
var serverAddress: Address
if (!self.outboundProxy.isEmpty) {
let server = self.outboundProxy.starts(with: "sip:") ? self.outboundProxy : String("sip:" + self.outboundProxy)
if (!self.sipProxyUrl.isEmpty) {
let server = self.sipProxyUrl.starts(with: "sip:") ? self.sipProxyUrl : String("sip:" + self.sipProxyUrl)
serverAddress = try Factory.Instance.createAddress(addr: server)
} else {
serverAddress = try Factory.Instance.createAddress(addr: String("sip:" + self.domain))
}
let address = serverAddress
// We use the Address object to easily set the transport protocol
try address.setTransport(newValue: transport)
try accountParams.setServeraddress(newValue: address)
try serverAddress.setTransport(newValue: transport)
try accountParams.setServeraddress(newValue: serverAddress)
var routeAddress: Address
if (!self.outboundProxy.isEmpty) {
let server = self.outboundProxy.starts(with: "sip:") ? self.outboundProxy : String("sip:" + self.outboundProxy)
routeAddress = try Factory.Instance.createAddress(addr: server)
try routeAddress.setTransport(newValue: transport)
try accountParams.setRoutesaddresses(newValue: [routeAddress])
} else {
try accountParams.setRoutesaddresses(newValue: [])
}
// And we ensure the account will start the registration process
accountParams.registerEnabled = true

View file

@ -36,6 +36,7 @@ struct AccountSettingsFragment: View {
@FocusState var isTurnUsernameFocused: Bool
@FocusState var isTurnPasswordFocused: Bool
@FocusState var isSipProxyUrlFocused: Bool
@FocusState var isOutboundProxyFocused: Bool
@FocusState var isSettingsExpireFocused: Bool
@FocusState var isConferenceFactoryUriFocused: Bool
@FocusState var isAudioVideoConferenceFactoryUriFocused: Bool
@ -354,8 +355,25 @@ struct AccountSettingsFragment: View {
.focused($isSipProxyUrlFocused)
}
Toggle("account_settings_outbound_proxy_title", isOn: $accountSettingsViewModel.outboundProxy)
.default_text_style_700(styleSize: 15)
VStack(alignment: .leading) {
Text("account_settings_outbound_proxy_title")
.default_text_style_700(styleSize: 15)
.padding(.bottom, -5)
TextField("account_settings_outbound_proxy_title", text: $accountSettingsViewModel.outboundProxy)
.default_text_style(styleSize: 15)
.frame(height: 25)
.padding(.horizontal, 20)
.padding(.vertical, 15)
.background(.white)
.cornerRadius(60)
.overlay(
RoundedRectangle(cornerRadius: 60)
.inset(by: 0.5)
.stroke(isOutboundProxyFocused ? Color.orangeMain500 : Color.gray200, lineWidth: 1)
)
.focused($isOutboundProxyFocused)
}
Toggle("account_settings_avpf_title", isOn: $accountSettingsViewModel.avpf)
.default_text_style_700(styleSize: 15)

View file

@ -39,7 +39,7 @@ class AccountSettingsViewModel: ObservableObject {
@Published var turnPassword: String
@Published var transport: String
@Published var sipProxyUrl: String
@Published var outboundProxy: Bool
@Published var outboundProxy: String
@Published var avpf: Bool
@Published var bundleMode: Bool
@Published var cpimInBasicConversations: Bool
@ -82,7 +82,7 @@ class AccountSettingsViewModel: ObservableObject {
}
self.sipProxyUrl = accountModel.account.params?.serverAddress?.asStringUriOnly() ?? ""
self.outboundProxy = accountModel.account.params?.outboundProxyEnabled ?? false
self.outboundProxy = accountModel.account.params?.routesAddresses.first?.asStringUriOnly() ?? ""
self.avpf = accountModel.account.avpfEnabled
self.bundleMode = accountModel.account.params?.rtpBundleEnabled ?? false
self.cpimInBasicConversations = accountModel.account.params?.cpimInBasicChatRoomEnabled ?? false
@ -140,7 +140,29 @@ class AccountSettingsViewModel: ObservableObject {
try? newParams.setServeraddress(newValue: serverAddress)
}
}
newParams.outboundProxyEnabled = self.outboundProxy
if !self.outboundProxy.isEmpty {
Log.info("\(AccountSettingsViewModel.TAG) Outbound proxy server set to \(self.outboundProxy)")
if let outboundProxyAddress = core.interpretUrl(url: self.outboundProxy, applyInternationalPrefix: false) {
var transportTmp: TransportType = .Tls
if self.transport == "TLS" {
transportTmp = .Tls
} else if self.transport == "TCP" {
transportTmp = .Tcp
} else if self.transport == "UDP" {
transportTmp = .Udp
} else {
transportTmp = .Dtls
}
try? outboundProxyAddress.setTransport(newValue: transportTmp)
try? newParams.setRoutesaddresses(newValue: [outboundProxyAddress])
} else {
Log.error("\(AccountSettingsViewModel.TAG) Failed to parse outbound proxy server!")
}
} else {
try? newParams.setRoutesaddresses(newValue: [])
}
if let natPolicy = self.natPolicy {
print("\(AccountSettingsViewModel.TAG) Also applying changes to NAT policy")