diff --git a/app/src/main/kotlin/com/tutpro/baresip/Config.kt b/app/src/main/kotlin/com/tutpro/baresip/Config.kt index 4d79f8a3..418ee394 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Config.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Config.kt @@ -53,6 +53,10 @@ object Config { BaresipService.addressFamily = addressFamily } + val transportProtocols = previousVariable("sip_transports") + if (transportProtocols != "") + config = "${config}sip_transports $transportProtocols\n" + val sipCertificate = previousVariable("sip_certificate") if (sipCertificate != "") config = "${config}sip_certificate $sipCertificate\n" diff --git a/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt index c83c1fba..768eb259 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt @@ -397,6 +397,34 @@ private fun SettingsContent( } } + @Composable + fun TransportProtocols() { + Row( + Modifier.fillMaxWidth().padding(end = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start + ) { + val ctx = LocalContext.current + val transportProtocols by viewModel.transportProtocols.collectAsState() + OutlinedTextField( + value = transportProtocols, + onValueChange = { + viewModel.transportProtocols.value = it + }, + modifier = Modifier + .fillMaxWidth() + .clickable { + alertTitle.value = ctx.getString(R.string.transport_protocols) + alertMessage.value = ctx.getString(R.string.transport_protocols_help) + showAlert.value = true + }, + textStyle = androidx.compose.ui.text.TextStyle(fontSize = 18.sp), + label = { Text(stringResource(R.string.transport_protocols)) }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text) + ) + } + } + @Composable fun DnsServers() { Row( @@ -1193,6 +1221,7 @@ private fun SettingsContent( item { StartAutomatically() } item { ListenAddress() } item { AddressFamily() } + item { TransportProtocols() } item { DnsServers() } item { TlsCertificateFile(activity) } item { VerifyServer() } @@ -1246,6 +1275,23 @@ private fun checkOnClick(ctx: Context, viewModel: SettingsViewModel): Boolean { restart = true } + val transportProtocols = viewModel.transportProtocols.value + .lowercase(Locale.ROOT).replace(" ", "") + if (transportProtocols != viewModel.oldTransportProtocols) { + if (!checkTransportProtocols(transportProtocols)) { + alertTitle.value = ctx.getString(R.string.notice) + alertMessage.value = "${ctx.getString(R.string.invalid_transport_protocols)}: " + + transportProtocols + showAlert.value = true + return false + } + Config.removeVariable("sip_transports") + if (transportProtocols.isNotEmpty()) + Config.replaceVariable("sip_transports", transportProtocols) + save = true + restart = true + } + val dnsServers = addMissingPorts(viewModel.dnsServers.value .lowercase(Locale.ROOT).replace(" ", "")) if (dnsServers != viewModel.oldDnsServers) { @@ -1414,6 +1460,15 @@ private fun addMissingPorts(addressList: String): String { return result.substring(1) } +private fun checkTransportProtocols(transportProtocols: String): Boolean { + if (transportProtocols.isEmpty()) + return true + for (protocol in transportProtocols.split(",")) + if (protocol !in listOf("udp", "tcp", "tls", "ws", "wss")) + return false + return true +} + private fun checkDnsServers(dnsServers: String): Boolean { if (dnsServers.isEmpty()) return true for (server in dnsServers.split(",")) diff --git a/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt b/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt index 848e4aca..da281b32 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt @@ -18,8 +18,11 @@ class SettingsViewModel: ViewModel() { val autoStart = MutableStateFlow(false) val listenAddress = MutableStateFlow("") val addressFamily = MutableStateFlow("") - val dnsServers = MutableStateFlow("") + val transportProtocols = MutableStateFlow("") + val oldTransportProtocols = Config.variable("sip_transports") + + val dnsServers = MutableStateFlow("") val oldDnsServers = if (Config.variable("dyn_dns") == "yes") "" else { @@ -59,6 +62,8 @@ class SettingsViewModel: ViewModel() { mutableIntStateOf(familyValues.indexOf(Config.variable("net_af").lowercase())) addressFamily.value = familyValues[itemPosition.intValue] + transportProtocols.value = oldTransportProtocols + dnsServers.value = oldDnsServers tlsCertificateFile.value = File(BaresipService.filesPath + "/cert.pem").exists() diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index bbcb2f24..2110871f 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -338,6 +338,12 @@ on valittu, baresip käyttää ainoastaan IPv4- tai IPv6-osoitteita. Jos kumpaakaan ei ole valittu, baresip käyttää sekä IPv4- että IPv6-osoitteita. + Kuljetusprotokollat + Pilkulla toisistaan erotettu lista tuettuja SIP sanomien + kuljetusprotokollia. Jos jätetään tyhjäksi, oletusarvo on \'udp,tcp,tls,ws,wss\', joka + kaikki tuetut siirtoprotokollat. + + Virheellinen kuljetusprotokollalistas DNS-palvelimet Pilkulla toisistaan erotettu luettelo DNS-palvelijoiden osoitteita. Jos jätetään antamatta (oletus), osoitteet hankitaan dynaamisesti järjestelmästä. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd93ed61..b4d461e8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -324,6 +324,12 @@ using. If IPv4 or IPv6 is chosen, baresip uses only IPv4 or IPv6 addresses. If neither is chosen, baresip uses both IPv4 and IPv6 addresses. + Transport Protocols + Comma separated list of supported SIP request/response + transport protocols. If left empty, default value is \'udp,tcp,tls,ws,wss\' that includes + all supported transport protocols. + + Invalid Transport Protocols list DNS Servers Comma separated list of addresses of DNS servers. If not given, DNS server addresses are obtained dynamically from the system. Each DNS address is of form