diff --git a/assets/languages/en.ts b/assets/languages/en.ts
index cb4705e18..1e50a415a 100644
--- a/assets/languages/en.ts
+++ b/assets/languages/en.ts
@@ -1386,6 +1386,34 @@ your friend's SIP address or username.
invalidRoute
Invalid route.
+
+ enableIceLabel
+ Enable ICE
+
+
+ stunServerLabel
+ STUN/TURN server
+
+
+ enableTurnLabel
+ Enable TURN
+
+
+ turnUserLabel
+ TURN user
+
+
+ turnPasswordLabel
+ TURN password
+
+
+ natAndFirewallTitle
+ NAT and Firewall
+
+
+ mainSipAccountSettingsTitle
+ Main SIP account settings
+
SettingsUi
diff --git a/assets/languages/fr_FR.ts b/assets/languages/fr_FR.ts
index 111018d24..ebe3f8ee9 100644
--- a/assets/languages/fr_FR.ts
+++ b/assets/languages/fr_FR.ts
@@ -1384,6 +1384,34 @@ Cliquez ici : <a href="%1">%1</a>
invalidRoute
Route invalide.
+
+ enableIceLabel
+ Activer ICE
+
+
+ stunServerLabel
+ Serveur STUN/TURN
+
+
+ enableTurnLabel
+ Activer TURN
+
+
+ turnUserLabel
+ Utilisateur TURN
+
+
+ turnPasswordLabel
+ Mot de passe TURN
+
+
+ natAndFirewallTitle
+ NAT et Pare-feu
+
+
+ mainSipAccountSettingsTitle
+ Paramètres principaux du compte SIP
+
SettingsUi
diff --git a/assets/languages/ru.ts b/assets/languages/ru.ts
index ed291acb3..812f0c1cd 100644
--- a/assets/languages/ru.ts
+++ b/assets/languages/ru.ts
@@ -1384,6 +1384,34 @@
invalidRoute
Неверный маршрут.
+
+ enableIceLabel
+ Включить ICE
+
+
+ stunServerLabel
+ Сервер STUN/TURN
+
+
+ enableTurnLabel
+ Включить TURN
+
+
+ turnUserLabel
+ Пользователь TURN
+
+
+ turnPasswordLabel
+ Пароль TURN
+
+
+ natAndFirewallTitle
+ NAT и межсетевой экран
+
+
+ mainSipAccountSettingsTitle
+
+
SettingsUi
diff --git a/assets/languages/tr.ts b/assets/languages/tr.ts
index 824157fed..af0bf6664 100644
--- a/assets/languages/tr.ts
+++ b/assets/languages/tr.ts
@@ -1386,6 +1386,34 @@ arkadaşınızın SIP adresini veya kullanıcı adını girin.
invalidRoute
Geçersiz rota.
+
+ enableIceLabel
+ ICE'yi etkinleştir
+
+
+ stunServerLabel
+ STUN/TURN sunucusu
+
+
+ enableTurnLabel
+ TURN'u etkinleştir
+
+
+ turnUserLabel
+ TURN kullanıcısı
+
+
+ turnPasswordLabel
+ TURN parolası
+
+
+ natAndFirewallTitle
+ NAT ve Güvenlik Duvarı
+
+
+ mainSipAccountSettingsTitle
+
+
SettingsUi
diff --git a/src/components/settings/AccountSettingsModel.cpp b/src/components/settings/AccountSettingsModel.cpp
index d63ab1ceb..d731f9b49 100644
--- a/src/components/settings/AccountSettingsModel.cpp
+++ b/src/components/settings/AccountSettingsModel.cpp
@@ -96,7 +96,6 @@ QVariantMap AccountSettingsModel::getProxyConfigDescription (const shared_ptrgetIdentityAddress()->asString())
: QString("");
}
-
map["serverAddress"] = ::Utils::coreStringToAppString(proxyConfig->getServerAddr());
map["registrationDuration"] = proxyConfig->getPublishExpires();
map["transport"] = ::Utils::coreStringToAppString(proxyConfig->getTransport());
@@ -108,6 +107,14 @@ QVariantMap AccountSettingsModel::getProxyConfigDescription (const shared_ptrgetAvpfMode() == linphone::AVPFMode::AVPFModeEnabled;
map["registrationState"] = ::mapLinphoneRegistrationStateToUi(proxyConfig->getState());
+ shared_ptr natPolicy = proxyConfig->getNatPolicy();
+ map["iceEnabled"] = natPolicy->iceEnabled();
+ map["turnEnabled"] = natPolicy->turnEnabled();
+ map["stunServer"] = ::Utils::coreStringToAppString(natPolicy->getStunServer());
+ map["turnUser"] = ::Utils::coreStringToAppString(natPolicy->getStunServerUsername());
+ shared_ptr authInfo = proxyConfig->findAuthInfo();
+ map["turnPassword"] = authInfo ? ::Utils::coreStringToAppString(authInfo->getPasswd()) : QString("");
+
return map;
}
@@ -172,6 +179,33 @@ bool AccountSettingsModel::addOrUpdateProxyConfig (
: linphone::AVPFMode::AVPFModeDefault
);
+ shared_ptr natPolicy = proxyConfig->getNatPolicy();
+ natPolicy->enableIce(data["iceEnabled"].toBool());
+ natPolicy->enableStun(data["iceEnabled"].toBool());
+ natPolicy->enableTurn(data["turnEnabled"].toBool());
+ natPolicy->setStunServer(::Utils::appStringToCoreString(data["stunServer"].toString()));
+ natPolicy->setStunServerUsername(::Utils::appStringToCoreString(data["turnUser"].toString()));
+
+ shared_ptr authInfo = proxyConfig->findAuthInfo();
+ shared_ptr core = proxyConfig->getCore();
+ if (authInfo) {
+ shared_ptr clonedAuthInfo = authInfo->clone();
+ clonedAuthInfo->setPasswd(::Utils::appStringToCoreString(data["turnPassword"].toString()));
+
+ core->removeAuthInfo(authInfo);
+ core->addAuthInfo(clonedAuthInfo);
+ } else {
+ authInfo = linphone::Factory::get()->createAuthInfo(
+ ::Utils::appStringToCoreString(data["turnUser"].toString()),
+ ::Utils::appStringToCoreString(data["turnUser"].toString()),
+ ::Utils::appStringToCoreString(data["turnPassword"].toString()),
+ "",
+ "",
+ ""
+ );
+ core->addAuthInfo(authInfo);
+ }
+
return addOrUpdateProxyConfig(proxyConfig);
}
diff --git a/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.js b/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.js
index 15461fa6c..83b5aa9f9 100644
--- a/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.js
+++ b/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.js
@@ -36,6 +36,11 @@ function initForm (account) {
registerEnabled.checked = config.registerEnabled
publishPresence.checked = config.publishPresence
avpfEnabled.checked = config.avpfEnabled
+ iceEnabled.checked = config.iceEnabled
+ turnEnabled.checked = config.turnEnabled
+ stunServer.text = config.stunServer
+ turnPassword.text = config.turnPassword
+ turnUser.text = config.turnUser
if (account) {
dialog._sipAddressOk = true
@@ -62,7 +67,12 @@ function validProxyConfig () {
avpfInterval: avpfInterval.text,
registerEnabled: registerEnabled.checked,
publishPresence: publishPresence.checked,
- avpfEnabled: avpfEnabled.checked
+ avpfEnabled: avpfEnabled.checked,
+ iceEnabled: iceEnabled.checked,
+ turnEnabled: turnEnabled.checked,
+ stunServer: stunServer.text,
+ turnUser: turnUser.text,
+ turnPassword: turnPassword.text
})) {
dialog.exit(1)
} else {
@@ -108,3 +118,5 @@ function handleTransportChanged (transport) {
dialog._serverAddressOk = false
}
}
+
+// -----------------------------------------------------------------------------
diff --git a/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.qml b/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.qml
index e9f252166..c1bfd97f3 100644
--- a/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.qml
+++ b/ui/views/App/Settings/Dialogs/SettingsSipAccountsEdit.qml
@@ -42,131 +42,206 @@ DialogPlus {
// ---------------------------------------------------------------------------
- Form {
- anchors.fill: parent
+ TabContainer {
+ Column {
+ width: parent.width
- FormLine {
- FormGroup {
- label: qsTr('sipAddressLabel') + '*'
+ Form {
+ title: qsTr('mainSipAccountSettingsTitle')
+ width: parent.width
- TextField {
- id: sipAddress
+ FormLine {
+ FormGroup {
+ label: qsTr('sipAddressLabel') + '*'
- error: dialog._sipAddressOk ? '' : qsTr('invalidSipAddress')
+ TextField {
+ id: sipAddress
- onTextChanged: Logic.handleSipAddressChanged(text)
+ error: dialog._sipAddressOk ? '' : qsTr('invalidSipAddress')
+
+ onTextChanged: Logic.handleSipAddressChanged(text)
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('serverAddressLabel') + '*'
+
+ TextField {
+ id: serverAddress
+
+ error: dialog._serverAddressOk ? '' : qsTr('invalidServerAddress')
+
+ onTextChanged: Logic.handleServerAddressChanged(text)
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('registrationDurationLabel')
+
+ NumericField {
+ id: registrationDuration
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('transportLabel')
+
+ ComboBox {
+ id: transport
+
+ enabled: dialog._serverAddressOk
+ model: [ 'UDP', 'TCP', 'TLS', 'DTLS' ]
+
+ onActivated: Logic.handleTransportChanged(model[index])
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('routeLabel')
+
+ TextField {
+ id: route
+
+ error: dialog._routeOk ? '' : qsTr('invalidRoute')
+
+ onTextChanged: Logic.handleRouteChanged(text)
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('contactParamsLabel')
+
+ TextField {
+ id: contactParams
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('avpfIntervalLabel')
+
+ NumericField {
+ id: avpfInterval
+
+ maxValue: 5
+ minValue: 1
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('registerEnabledLabel')
+
+ Switch {
+ id: registerEnabled
+
+ onClicked: checked = !checked
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('publishPresenceLabel')
+
+ Switch {
+ id: publishPresence
+
+ onClicked: checked = !checked
+ }
+ }
+ }
+
+ FormLine {
+ FormGroup {
+ label: qsTr('avpfEnabledLabel')
+
+ Switch {
+ id: avpfEnabled
+
+ onClicked: checked = !checked
+ }
+ }
}
}
- }
- FormLine {
- FormGroup {
- label: qsTr('serverAddressLabel') + '*'
+ // -----------------------------------------------------------------------
+ // NAT and Firewall.
+ // -----------------------------------------------------------------------
- TextField {
- id: serverAddress
+ Form {
+ title: qsTr('natAndFirewallTitle')
+ width: parent.width
- error: dialog._serverAddressOk ? '' : qsTr('invalidServerAddress')
+ FormLine {
+ FormGroup {
+ label: qsTr('enableIceLabel')
- onTextChanged: Logic.handleServerAddressChanged(text)
+ Switch {
+ id: iceEnabled
+
+ onClicked: checked = !checked
+ }
+ }
+
+ FormGroup {
+ label: qsTr('stunServerLabel')
+
+ TextField {
+ id: stunServer
+
+ readOnly: !iceEnabled.checked
+ }
+ }
}
- }
- }
- FormLine {
- FormGroup {
- label: qsTr('registrationDurationLabel')
+ FormLine {
+ FormGroup {
+ label: qsTr('enableTurnLabel')
- NumericField {
- id: registrationDuration
+ Switch {
+ id: turnEnabled
+
+ enabled: iceEnabled.checked
+
+ onClicked: checked = !checked
+ }
+ }
+
+ FormGroup {
+ label: qsTr('turnUserLabel')
+
+ TextField {
+ id: turnUser
+
+ readOnly: !turnEnabled.checked || !turnEnabled.enabled
+ }
+ }
}
- }
- }
- FormLine {
- FormGroup {
- label: qsTr('transportLabel')
+ FormLine {
+ FormGroup {}
- ComboBox {
- id: transport
+ FormGroup {
+ label: qsTr('turnPasswordLabel')
- enabled: dialog._serverAddressOk
- model: [ 'UDP', 'TCP', 'TLS', 'DTLS' ]
-
- onActivated: Logic.handleTransportChanged(model[index])
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('routeLabel')
-
- TextField {
- id: route
-
- error: dialog._routeOk ? '' : qsTr('invalidRoute')
-
- onTextChanged: Logic.handleRouteChanged(text)
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('contactParamsLabel')
-
- TextField {
- id: contactParams
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('avpfIntervalLabel')
-
- NumericField {
- id: avpfInterval
-
- maxValue: 5
- minValue: 1
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('registerEnabledLabel')
-
- Switch {
- id: registerEnabled
-
- onClicked: checked = !checked
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('publishPresenceLabel')
-
- Switch {
- id: publishPresence
-
- onClicked: checked = !checked
- }
- }
- }
-
- FormLine {
- FormGroup {
- label: qsTr('avpfEnabledLabel')
-
- Switch {
- id: avpfEnabled
-
- onClicked: checked = !checked
+ TextField {
+ id: turnPassword
+ readOnly: !turnEnabled.checked || !turnEnabled.enabled || !turnUser.text.length
+ }
+ }
}
}
}
diff --git a/ui/views/App/Styles/Settings/Dialogs/SettingsSipAccountsEditStyle.qml b/ui/views/App/Styles/Settings/Dialogs/SettingsSipAccountsEditStyle.qml
index dfc7d4f24..3ec7165cc 100644
--- a/ui/views/App/Styles/Settings/Dialogs/SettingsSipAccountsEditStyle.qml
+++ b/ui/views/App/Styles/Settings/Dialogs/SettingsSipAccountsEditStyle.qml
@@ -5,5 +5,5 @@ import QtQml 2.2
QtObject {
property int height: 550
- property int width: 600
+ property int width: 934
}