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