diff --git a/advancedsipsettingwidget.cpp b/advancedsipsettingwidget.cpp index 7641d4bb27905d707383119ba0c54499917cd443..01d0ec7a10afcfddc196755d78bea7643e40deef 100644 --- a/advancedsipsettingwidget.cpp +++ b/advancedsipsettingwidget.cpp @@ -36,20 +36,53 @@ AdvancedSIPSettingsWidget::AdvancedSIPSettingsWidget(QWidget* parent) // call settings connect(ui->checkBoxCustomRingtoneSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setEnableRingtone); connect(ui->checkBoxAutoAnswerSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setAutoAnswerCalls); - connect(ui->btnRingtoneSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::openFileCustomRingtone); + connect(ui->btnRingtoneSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::openFileCustomRingtone); connect(ui->checkBoxCustomRingtoneSIP, &QAbstractButton::clicked, [this](int state) { ui->btnRingtoneSIP->setEnabled((bool)state); }); + // security + connect(ui->encryptMediaStreamsToggle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseSRTP); + connect(ui->enableSDESToggle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseSDES); + connect(ui->fallbackRTPToggle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseRTPFallback); + connect(ui->encryptMediaStreamsToggle, &QAbstractButton::clicked, [this](int state) { + ui->enableSDESToggle->setEnabled((bool)state); + ui->fallbackRTPToggle->setEnabled((bool)state); + }); + + connect(ui->encryptNegotitationToggle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseTLS); + connect(ui->encryptNegotitationToggle, &QAbstractButton::clicked, [this](int state) { + ui->btnSIPCACert->setEnabled((bool)state); + ui->btnSIPUserCert->setEnabled((bool)state); + ui->btnSIPPrivateKey->setEnabled((bool)state); + ui->lineEditSIPCertPassword->setEnabled((bool)state); + }); + + connect(ui->btnSIPCACert, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::btnSIPCAClicked); + connect(ui->btnSIPUserCert, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::btnSIPUserCertClicked); + connect(ui->btnSIPPrivateKey, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::btnSIPPrivateKeyClicked); + + connect(ui->verifyIncomingCertificatesServerToogle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setVerifyCertificatesServer); + connect(ui->verifyIncomingCertificatesClientToogle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setVerifyCertificatesClient); + connect(ui->requireCeritificateForTLSIncomingToggle, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setRequireCertificatesIncomingTLS); + + connect(ui->lineEditSIPCertPassword, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::lineEditSIPCertPasswordLineEditTextChanged); + connect(ui->outgoingTLSServerNameLineEdit, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::outgoingTLSServerNameLineEditTextChanged); + + ui->tlsProtocolComboBox->insertItem(0, "Default"); + ui->tlsProtocolComboBox->insertItem(1, "TLSv1"); + ui->tlsProtocolComboBox->insertItem(2, "TLSv1.1"); + ui->tlsProtocolComboBox->insertItem(3, "TLSv1.2"); + // connectivity connect(ui->checkBoxUPnPSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseUPnP); connect(ui->checkBoxTurnEnableSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseTURN); connect(ui->checkBoxSTUNEnableSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setUseSTUN); - connect(ui->lineEditTurnAddressSIP, &QLineEdit::textEdited, this, &AdvancedSIPSettingsWidget::setTURNAddress); - connect(ui->lineEditTurnUsernameSIP, &QLineEdit::textEdited, this, &AdvancedSIPSettingsWidget::setTURNUsername); - connect(ui->lineEditTurnPsswdSIP, &QLineEdit::textEdited, this, &AdvancedSIPSettingsWidget::setTURNPsswd); - connect(ui->lineEditSTUNAddressSIP, &QLineEdit::textEdited, this, &AdvancedSIPSettingsWidget::setSTUNAddress); + connect(ui->lineEditTurnAddressSIP, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::setTURNAddress); + connect(ui->lineEditTurnUsernameSIP, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::setTURNUsername); + connect(ui->lineEditTurnPsswdSIP, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::setTURNPsswd); + connect(ui->lineEditSTUNAddressSIP, &QLineEdit::editingFinished, this, &AdvancedSIPSettingsWidget::setSTUNAddress); // codecs connect(ui->audioListWidgetSIP, &QListWidget::itemChanged, this, &AdvancedSIPSettingsWidget::audioCodecsStateChange); @@ -58,8 +91,8 @@ AdvancedSIPSettingsWidget::AdvancedSIPSettingsWidget(QWidget* parent) connect(ui->videoCheckBoxSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::setVideoState); // codec priority setting - connect(ui->audioDownPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseAudioCodecPriority); - connect(ui->audioUpPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::increaseAudioCodecPriority); + connect(ui->audioDownPushButtonSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseAudioCodecPriority); + connect(ui->audioUpPushButtonSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::increaseAudioCodecPriority); ui->audioDownPushButtonSIP->setEnabled(false); ui->audioUpPushButtonSIP->setEnabled(false); @@ -71,8 +104,8 @@ AdvancedSIPSettingsWidget::AdvancedSIPSettingsWidget(QWidget* parent) ui->audioUpPushButtonSIP->setEnabled(enabled); }); - connect(ui->videoDownPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseVideoCodecPriority); - connect(ui->videoUpPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::increaseVideoCodecPriority); + connect(ui->videoDownPushButtonSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseVideoCodecPriority); + connect(ui->videoUpPushButtonSIP, &QAbstractButton::clicked, this, &AdvancedSIPSettingsWidget::increaseVideoCodecPriority); ui->videoDownPushButtonSIP->setEnabled(false); ui->videoUpPushButtonSIP->setEnabled(false); @@ -93,10 +126,41 @@ AdvancedSIPSettingsWidget::~AdvancedSIPSettingsWidget() void AdvancedSIPSettingsWidget::updateAdvancedSIPSettings() { auto config = LRCInstance::getCurrAccConfig(); - //Call Settings + + // Call Settings ui->checkBoxAutoAnswerSIP->setChecked(config.autoAnswer); ui->checkBoxCustomRingtoneSIP->setChecked(config.Ringtone.ringtoneEnabled); + // security + ui->btnSIPCACert->setEnabled(config.TLS.enable); + ui->btnSIPUserCert->setEnabled(config.TLS.enable); + ui->btnSIPPrivateKey->setEnabled(config.TLS.enable); + ui->lineEditSIPCertPassword->setEnabled(config.TLS.enable); + ui->enableSDESToggle->setEnabled(config.SRTP.enable); + ui->fallbackRTPToggle->setEnabled(config.SRTP.enable); + + ui->btnSIPCACert->setText(QFileInfo(QString::fromStdString(config.TLS.certificateListFile)).fileName()); + ui->btnSIPUserCert->setText(QFileInfo(QString::fromStdString(config.TLS.certificateFile)).fileName()); + ui->btnSIPPrivateKey->setText(QFileInfo(QString::fromStdString(config.TLS.privateKeyFile)).fileName()); + ui->lineEditSIPCertPassword->setText(QString::fromStdString(config.TLS.password)); + + ui->encryptMediaStreamsToggle->setChecked(config.SRTP.enable); + ui->enableSDESToggle->setChecked(config.SRTP.keyExchange == lrc::api::account::KeyExchangeProtocol::SDES); + ui->fallbackRTPToggle->setChecked(config.SRTP.rtpFallback); + ui->encryptNegotitationToggle->setChecked(config.TLS.enable); + ui->verifyIncomingCertificatesServerToogle->setChecked(config.TLS.verifyServer); + ui->verifyIncomingCertificatesClientToogle->setChecked(config.TLS.verifyClient); + ui->requireCeritificateForTLSIncomingToggle->setChecked(config.TLS.requireClientCertificate); + + auto method = config.TLS.method; + ui->tlsProtocolComboBox->setCurrentIndex(static_cast<int>(method)); + connect(ui->tlsProtocolComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &AdvancedSIPSettingsWidget::tlsProtocolComboBoxIndexChanged); + + ui->outgoingTLSServerNameLineEdit->setText(QString::fromStdString(config.TLS.serverName)); + + ui->negotiationTimeoutSpinBox->setValue(config.TLS.negotiationTimeoutSec); + connect(ui->negotiationTimeoutSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), this, &AdvancedSIPSettingsWidget::negotiationTimeoutSpinBoxValueChanged); + // Connectivity ui->checkBoxUPnPSIP->setChecked(config.upnpEnabled); ui->checkBoxTurnEnableSIP->setChecked(config.TURN.enable); @@ -115,9 +179,9 @@ void AdvancedSIPSettingsWidget::updateAdvancedSIPSettings() connect(ui->audioListWidgetSIP, &QListWidget::itemChanged, this, &AdvancedSIPSettingsWidget::audioCodecsStateChange); connect(ui->videoListWidgetSIP, &QListWidget::itemChanged, this, &AdvancedSIPSettingsWidget::videoCodecsStateChange); - ui->btnRingtoneSIP->setEnabled(LRCInstance::getCurrAccConfig().Ringtone.ringtoneEnabled); - ui->btnRingtoneSIP->setText(QFileInfo(QString::fromStdString(LRCInstance::getCurrAccConfig().Ringtone.ringtonePath)).fileName()); - ui->lineEditSTUNAddressSIP->setEnabled(LRCInstance::getCurrAccConfig().STUN.enable); + ui->btnRingtoneSIP->setEnabled(config.Ringtone.ringtoneEnabled); + ui->btnRingtoneSIP->setText(QFileInfo(QString::fromStdString(config.Ringtone.ringtonePath)).fileName()); + ui->lineEditSTUNAddressSIP->setEnabled(config.STUN.enable); } // call settings @@ -139,7 +203,7 @@ void AdvancedSIPSettingsWidget::openFileCustomRingtone() QString fileUrl; auto oldPath = QString::fromStdString(LRCInstance::getCurrAccConfig().Ringtone.ringtonePath); auto openPath = oldPath.isEmpty() ? QDir::currentPath() + QString("/ringtones/") : QFileInfo(oldPath).absolutePath(); - fileUrl = QFileDialog::getOpenFileName(this, QString("Select a new ringtone"), openPath, tr("Audio Files") + " (*.wav *.ogg *.opus *.mp3 *.aiff *.wma)"); + fileUrl = QFileDialog::getOpenFileName(this, tr("Select a new ringtone"), openPath, tr("Audio Files") + " (*.wav *.ogg *.opus *.mp3 *.aiff *.wma)"); if (!fileUrl.isEmpty()) { auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); @@ -174,28 +238,28 @@ void AdvancedSIPSettingsWidget::setUseSTUN(bool state) state ? ui->lineEditSTUNAddressSIP->setEnabled(true) : ui->lineEditSTUNAddressSIP->setEnabled(false); } -void AdvancedSIPSettingsWidget::setTURNAddress(const QString& name) +void AdvancedSIPSettingsWidget::setTURNAddress() { auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); - confProps.TURN.server = name.toStdString(); + confProps.TURN.server = ui->lineEditTurnAddressSIP->text().toStdString(); LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); } -void AdvancedSIPSettingsWidget::setTURNUsername(const QString& name) +void AdvancedSIPSettingsWidget::setTURNUsername() { auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); - confProps.TURN.username = name.toStdString(); + confProps.TURN.username = ui->lineEditTurnUsernameSIP->text().toStdString(); LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); } -void AdvancedSIPSettingsWidget::setTURNPsswd(const QString& name) +void AdvancedSIPSettingsWidget::setTURNPsswd() { auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); - confProps.TURN.password = name.toStdString(); + confProps.TURN.password = ui->lineEditTurnPsswdSIP->text().toStdString(); LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); } -void AdvancedSIPSettingsWidget::setSTUNAddress(const QString& name) +void AdvancedSIPSettingsWidget::setSTUNAddress() { auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); - confProps.STUN.server = name.toStdString(); + confProps.STUN.server = ui->lineEditSTUNAddressSIP->text().toStdString(); LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); } @@ -312,3 +376,154 @@ void AdvancedSIPSettingsWidget::setVideoState(int state) confProps.Video.videoEnabled = (bool)state; LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); } + +void +AdvancedSIPSettingsWidget::setUseSRTP(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.SRTP.enable = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} +void +AdvancedSIPSettingsWidget::setUseTLS(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.enable = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::setVerifyCertificatesServer(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.verifyServer = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} +void +AdvancedSIPSettingsWidget::setVerifyCertificatesClient(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.verifyClient = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} +void +AdvancedSIPSettingsWidget::setRequireCertificatesIncomingTLS(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.requireClientCertificate = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::tlsProtocolComboBoxIndexChanged(const int& index) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + + if (static_cast<int>(confProps.TLS.method) != index) { + if (index == 0) { + confProps.TLS.method = lrc::api::account::TlsMethod::DEFAULT; + } else if (index == 1) { + confProps.TLS.method = lrc::api::account::TlsMethod::TLSv1; + } else if (index == 2) { + confProps.TLS.method = lrc::api::account::TlsMethod::TLSv1_1; + } else { + confProps.TLS.method = lrc::api::account::TlsMethod::TLSv1_2; + } + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); + } +} + +void +AdvancedSIPSettingsWidget::outgoingTLSServerNameLineEditTextChanged() +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.serverName = ui->outgoingTLSServerNameLineEdit->text().toStdString(); + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::negotiationTimeoutSpinBoxValueChanged(const int& value) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.negotiationTimeoutSec = value; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::setUseSDES(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.SRTP.keyExchange = state ? lrc::api::account::KeyExchangeProtocol::SDES : lrc::api::account::KeyExchangeProtocol::NONE; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::setUseRTPFallback(bool state) +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.SRTP.rtpFallback = state; + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::btnSIPCAClicked() +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.certificateListFile = openButtonFilePath(LRCInstance::getCurrAccConfig().TLS.certificateListFile, + "Select a CA Certificate File", + "Certificate File", + " (*.crt)", + ui->btnSIPCACert); + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::btnSIPUserCertClicked() +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.certificateFile = openButtonFilePath(LRCInstance::getCurrAccConfig().TLS.certificateFile, + "Select a User Certificate File", + "Certificate File", + " (*.crt)", + ui->btnSIPUserCert); + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::btnSIPPrivateKeyClicked() +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.privateKeyFile = openButtonFilePath(LRCInstance::getCurrAccConfig().TLS.privateKeyFile, + "Select a Private Key File", + "Key File", + " (*.key)", + ui->btnSIPPrivateKey); + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +void +AdvancedSIPSettingsWidget::lineEditSIPCertPasswordLineEditTextChanged() +{ + auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId()); + confProps.TLS.password = ui->lineEditSIPCertPassword->text().toStdString(); + LRCInstance::accountModel().setAccountConfig(LRCInstance::getCurrAccId(), confProps); +} + +std::string +AdvancedSIPSettingsWidget::openButtonFilePath(const std::string& accConfigFilePath, + const char* windowTitle, + const char* fileTypeDesp, + const QString& fileTypeFilter, + QPushButton* button) +{ + QString fileUrl; + auto oldPath = QString::fromStdString(accConfigFilePath); + auto openPath = oldPath.isEmpty() ? QDir::currentPath() : QFileInfo(oldPath).absolutePath(); + fileUrl = QFileDialog::getOpenFileName(this, tr(windowTitle), openPath, tr(fileTypeDesp) + fileTypeFilter); + if (!fileUrl.isEmpty()) { + button->setText(QFileInfo(fileUrl).fileName()); + } else { + button->setText(""); + } + return fileUrl.toStdString(); +} diff --git a/advancedsipsettingwidget.h b/advancedsipsettingwidget.h index 65ab5208b873ee4754fe750c40adde79bf206d2a..2d913977b209dc7723322063f0f4947a0b4261e0 100644 --- a/advancedsipsettingwidget.h +++ b/advancedsipsettingwidget.h @@ -21,6 +21,7 @@ #include <QListWidgetItem> #include <QWidget> +#include <QPushButton> namespace Ui { class AdvancedSIPSettingsWidget; @@ -36,6 +37,11 @@ public: ~AdvancedSIPSettingsWidget(); void updateAdvancedSIPSettings(); + std::string openButtonFilePath(const std::string& accConfigFilePath, + const char* windowTitle, + const char* fileTypeDesp, + const QString& fileTypeFilter, + QPushButton* button); private: Ui::AdvancedSIPSettingsWidget* ui; @@ -48,15 +54,33 @@ private slots: void openFileCustomRingtone(); + // security + void setUseSRTP(bool state); + void setUseSDES(bool state); + void setUseRTPFallback(bool state); + void setUseTLS(bool state); + void setVerifyCertificatesServer(bool state); + void setVerifyCertificatesClient(bool state); + void setRequireCertificatesIncomingTLS(bool state); + + void btnSIPCAClicked(); + void btnSIPUserCertClicked(); + void btnSIPPrivateKeyClicked(); + + void lineEditSIPCertPasswordLineEditTextChanged(); + void tlsProtocolComboBoxIndexChanged(const int& index); + void outgoingTLSServerNameLineEditTextChanged(); + void negotiationTimeoutSpinBoxValueChanged(const int& value); + // connectivity void setUseUPnP(bool state); void setUseTURN(bool state); void setUseSTUN(bool state); - void setTURNAddress(const QString& name); - void setTURNUsername(const QString& name); - void setTURNPsswd(const QString& name); - void setSTUNAddress(const QString& name); + void setTURNAddress(); + void setTURNUsername(); + void setTURNPsswd(); + void setSTUNAddress(); // codecs void updateAudioCodecs(); diff --git a/advancedsipsettingwidget.ui b/advancedsipsettingwidget.ui index 1eef72b9178e60fe5b02420df32aef0b2271bd14..4cfa4eb0fc30ec4e4abde8519f13fdb769a20130 100644 --- a/advancedsipsettingwidget.ui +++ b/advancedsipsettingwidget.ui @@ -6,14 +6,14 @@ <rect> <x>0</x> <y>0</y> - <width>688</width> - <height>821</height> + <width>731</width> + <height>1286</height> </rect> </property> <property name="windowTitle"> <string>Form</string> </property> - <layout class="QVBoxLayout" name="verticalLayout"> + <layout class="QVBoxLayout" name="verticalLayout_4"> <property name="leftMargin"> <number>0</number> </property> @@ -27,7 +27,7 @@ <number>0</number> </property> <item> - <spacer name="verticalSpacer"> + <spacer name="verticalSpacer_13"> <property name="orientation"> <enum>Qt::Vertical</enum> </property> @@ -159,6 +159,584 @@ </item> </layout> </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QLabel" name="label_3"> + <property name="font"> + <font> + <pointsize>13</pointsize> + </font> + </property> + <property name="text"> + <string>Security</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_8"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>13</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_16"> + <property name="leftMargin"> + <number>20</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <item> + <layout class="QGridLayout" name="gridLayout_3"> + <property name="leftMargin"> + <number>0</number> + </property> + <item row="11" column="2"> + <widget class="QComboBox" name="tlsProtocolComboBox"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="insertPolicy"> + <enum>QComboBox::InsertAtBottom</enum> + </property> + </widget> + </item> + <item row="8" column="0"> + <widget class="ToggleSwitch" name="verifyIncomingCertificatesServerToogle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Verify Certificates (Server Side)</string> + </property> + </widget> + </item> + <item row="11" column="0"> + <widget class="QLabel" name="label_11"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>TLS Protocol Method</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <spacer name="horizontalSpacer_22"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="4" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_5"> + <item> + <widget class="QPushButton" name="btnSIPCACert"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>250</width> + <height>30</height> + </size> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset> + <normaloff>images/icons/round-folder-24px.svg</normaloff>images/icons/round-folder-24px.svg</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="10" column="1"> + <spacer name="horizontalSpacer_15"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="10" column="0"> + <widget class="ToggleSwitch" name="requireCeritificateForTLSIncomingToggle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>TLS Connections Require Certificate</string> + </property> + </widget> + </item> + <item row="4" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_22"> + <item> + <spacer name="horizontalSpacer_16"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_18"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>CA Certificate</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="5" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_23"> + <item> + <spacer name="horizontalSpacer_19"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_19"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>User Certificate</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="12" column="0"> + <widget class="QLabel" name="label_10"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>Outgoing TLS Server Name</string> + </property> + </widget> + </item> + <item row="13" column="0"> + <widget class="QLabel" name="label_12"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>Negotitation Timeout (seconds)</string> + </property> + </widget> + </item> + <item row="5" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_6"> + <item> + <widget class="QPushButton" name="btnSIPUserCert"> + <property name="minimumSize"> + <size> + <width>250</width> + <height>30</height> + </size> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset> + <normaloff>images/icons/round-folder-24px.svg</normaloff>images/icons/round-folder-24px.svg</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="6" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_24"> + <item> + <spacer name="horizontalSpacer_20"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_20"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>Private Key</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="8" column="1"> + <spacer name="horizontalSpacer_18"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="ToggleSwitch" name="fallbackRTPToggle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Can Fallback on RTP</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="ToggleSwitch" name="enableSDESToggle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Enable SDES (Key Exchange)</string> + </property> + </widget> + </item> + <item row="13" column="2"> + <widget class="QSpinBox" name="negotiationTimeoutSpinBox"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + </widget> + </item> + <item row="7" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout_25"> + <item> + <spacer name="horizontalSpacer_21"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label_21"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>Private Key Password</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="0"> + <widget class="ToggleSwitch" name="encryptMediaStreamsToggle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Encrypt Media Streams (SRTP)</string> + </property> + </widget> + </item> + <item row="12" column="2"> + <widget class="QLineEdit" name="outgoingTLSServerNameLineEdit"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="echoMode"> + <enum>QLineEdit::PasswordEchoOnEdit</enum> + </property> + </widget> + </item> + <item row="6" column="2"> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QPushButton" name="btnSIPPrivateKey"> + <property name="minimumSize"> + <size> + <width>250</width> + <height>30</height> + </size> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="layoutDirection"> + <enum>Qt::LeftToRight</enum> + </property> + <property name="text"> + <string/> + </property> + <property name="icon"> + <iconset> + <normaloff>images/icons/round-folder-24px.svg</normaloff>images/icons/round-folder-24px.svg</iconset> + </property> + </widget> + </item> + </layout> + </item> + <item row="9" column="1"> + <spacer name="horizontalSpacer_14"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="9" column="0"> + <widget class="ToggleSwitch" name="verifyIncomingCertificatesClientToogle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Verify Certificates (Client Side)</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <spacer name="horizontalSpacer_17"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="3" column="0"> + <widget class="ToggleSwitch" name="encryptNegotitationToggle" native="true"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text" stdset="0"> + <string>Encrypt Negotiation (TLS)</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <spacer name="horizontalSpacer_23"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="1"> + <spacer name="horizontalSpacer_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item row="7" column="2"> + <widget class="QLineEdit" name="lineEditSIPCertPassword"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>300</width> + <height>0</height> + </size> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="echoMode"> + <enum>QLineEdit::PasswordEchoOnEdit</enum> + </property> + <property name="placeholderText"> + <string/> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </item> <item> <spacer name="verticalSpacer_4"> <property name="orientation">