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_ptr
  • getIdentityAddress()->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_ptr
  • getAvpfMode() == 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 }