diff --git a/app/src/main/assets/config.static b/app/src/main/assets/config.static index 476d4e8a..0fec9245 100644 --- a/app/src/main/assets/config.static +++ b/app/src/main/assets/config.static @@ -21,7 +21,6 @@ audio_jitter_buffer_size 50 rtp_stats yes rtp_timeout 60 rtp_rxmode thread -sip_cuser_random yes module aaudio.so module stun.so module turn.so diff --git a/app/src/main/kotlin/com/tutpro/baresip/Config.kt b/app/src/main/kotlin/com/tutpro/baresip/Config.kt index fe0b07ed..f1f20994 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Config.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Config.kt @@ -115,6 +115,12 @@ object Config { if (userAgent != "") config = "${config}user_agent $userAgent\n" + val sipCuserRandom = previousVariable("sip_cuser_random") + config = if (sipCuserRandom != "") + "${config}sip_cuser_random $sipCuserRandom\n" + else + "${config}sip_cuser_random yes\n" + val darkTheme = previousVariable("dark_theme") Preferences(ctx).displayTheme = if (darkTheme == "yes") { config = "${config}dark_theme yes\n" diff --git a/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt b/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt index c93eef4f..181fdef0 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/SettingsScreen.kt @@ -762,6 +762,35 @@ private fun SettingsContent( } } + @Composable + fun UniqueContactUri() { + val uniqueContactUriTitle = stringResource(R.string.unique_contact_uri) + val uniqueContactUriHelp = stringResource(R.string.unique_contact_uri_help) + Row( + Modifier + .fillMaxWidth() + .padding(end = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Start + ) { + Text(text = uniqueContactUriTitle, + modifier = Modifier + .weight(1f) + .clickable { + alertTitle.value = uniqueContactUriTitle + alertMessage.value = uniqueContactUriHelp + showAlert.value = true + }, + fontSize = 18.sp + ) + val uniqueContactUri by viewModel.uniqueContactUri.collectAsState() + Switch( + checked = uniqueContactUri, + onCheckedChange = { viewModel.uniqueContactUri.value = it } + ) + } + } + @Composable fun AudioSettings(navController: NavController) { Row( @@ -1318,6 +1347,7 @@ private fun SettingsContent( VerifyServer() CaFile(activity) UserAgent() + UniqueContactUri() AudioSettings(navController) Contacts(activity) Ringtone() @@ -1435,6 +1465,13 @@ private fun checkOnClick(ctx: Context, viewModel: SettingsViewModel): Boolean { restart = true } + if ((Config.variable("sip_cuser_random") == "yes") != viewModel.uniqueContactUri.value) { + Config.replaceVariable("sip_cuser_random", + if (viewModel.uniqueContactUri.value) "yes" else "no") + save = true + restart = true + } + val ringtoneUri = viewModel.ringtoneUri.value Preferences(ctx).ringtoneUri = ringtoneUri BaresipService.rt = RingtoneManager.getRingtone(ctx, ringtoneUri.toUri()) diff --git a/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt b/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt index 2f31d436..a3aaa600 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/SettingsViewModel.kt @@ -24,6 +24,7 @@ class SettingsViewModel: ViewModel() { val verifyServer = MutableStateFlow(false) val caFile = MutableStateFlow(false) val userAgent = MutableStateFlow("") + val uniqueContactUri = MutableStateFlow(true) val contactsMode = MutableStateFlow("") val ringtoneUri = MutableStateFlow("") val batteryOptimizations = MutableStateFlow(false) @@ -62,6 +63,8 @@ class SettingsViewModel: ViewModel() { userAgent.value = Config.variable("user_agent") + uniqueContactUri.value = Config.variable("sip_cuser_random") == "yes" + contactsMode.value = Config.variable("contacts_mode").lowercase() ringtoneUri.value = if (Preferences(ctx).ringtoneUri == "") diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index c0e21ecf..c719cf37 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -382,6 +382,11 @@ nimeltään \'ca_certs.crt\' ladataan Download-kansiosta. Ei ulkoisen muistin lukuoikeutta + Uniikki Contact URI + Jos merkitty, Contact URI:n taataan olevan uniikki. + Merkittävä, jos on useammalla tilillä on same SIP URI:n käyttäjäosa, mutta myös + suojaa tilejä hyökkäyksiltä. + Audio-asetukset Kaiutin Jos merkitty, kaiutin kytketään sutomaattisesti päälle diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9cabcbef..04b2758e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -364,6 +364,10 @@ TLS certificates of such Certificate Authorities that are not included in Android OS. In Android version 9, a file called \'ca_certs.crt\' is loaded from Download folder. No External Storage read permission + Unique Contact URI + If checked, Contact URI is guaranteed to be unique. + Needs to be checked if there is more than one account with the same SIP URI userpart, + but also improves protection of the accounts from attacks. Audio Settings Speaker Phone If checked, speaker phone is turned automatically on