Commit 05966ae3 authored by Ming Rui Zhang's avatar Ming Rui Zhang Committed by Andreas Traczyk

advancedSIPsetting: add security settings into the SIP advanced setting & LineEdit signal change

- change Line edit signal from textEdited to textChanged

Change-Id: Ib0476d9e97903dc7b9963de68fe11294626c7fd5
parent e52278b6
......@@ -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();
}
......@@ -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();
......
......@@ -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>