20 #include <QDialogButtonBox> 21 #include <QPushButton> 31 static void setItemBold_( QTreeWidgetItem *item )
33 item->setFirstColumnSpanned(
true );
34 QFont secf( item->font( 0 ) );
36 item->setFont( 0, secf );
39 static const QString configFoundText_() {
return QObject::tr(
"Configuration loaded from database" ); }
40 static const QString configNotFoundText_() {
return QObject::tr(
"Configuration not found in database" ); }
43 const QSslCertificate &cert,
44 const QString &hostport,
45 const QList<QSslCertificate> &connectionCAs )
48 , mConnectionCAs( connectionCAs )
53 mAuthNotifyLayout =
new QVBoxLayout;
54 this->setLayout( mAuthNotifyLayout );
56 mAuthNotifyLayout->addWidget( mAuthNotify );
61 connect( btnCertInfo, &QToolButton::clicked,
this, &QgsAuthSslConfigWidget::btnCertInfo_clicked );
69 lblLoadedConfig->setVisible(
false );
70 lblLoadedConfig->clear();
72 connect( leHost, &QLineEdit::textChanged,
97 return grpbxSslConfig;
101 QTreeWidgetItem *QgsAuthSslConfigWidget::addRootItem(
const QString &label )
103 QTreeWidgetItem *item =
new QTreeWidgetItem(
104 QStringList() << label,
105 static_cast<int>( ConfigParent ) );
106 setItemBold_( item );
107 item->setTextAlignment( 0, Qt::AlignVCenter );
108 item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
109 treeSslConfig->insertTopLevelItem( treeSslConfig->topLevelItemCount(), item );
114 void QgsAuthSslConfigWidget::setUpSslConfigTree()
116 treeSslConfig->setColumnCount( 1 );
119 mProtocolItem = addRootItem( tr(
"Protocol" ) );
120 mProtocolCmbBx =
new QComboBox( treeSslConfig );
122 static_cast<int>( QSsl::SecureProtocols ) );
124 static_cast<int>( QSsl::TlsV1SslV3 ) );
126 static_cast<int>( QSsl::TlsV1 ) );
128 static_cast<int>( QSsl::SslV3 ) );
130 static_cast<int>( QSsl::SslV2 ) );
131 mProtocolCmbBx->setMaximumWidth( 300 );
132 mProtocolCmbBx->setCurrentIndex( 0 );
133 QTreeWidgetItem *protocolitem =
new QTreeWidgetItem(
135 QStringList() << QString(),
136 static_cast<int>( ConfigItem ) );
137 protocolitem->setFlags( protocolitem->flags() & ~Qt::ItemIsSelectable );
138 treeSslConfig->setItemWidget( protocolitem, 0, mProtocolCmbBx );
139 mProtocolItem->setExpanded(
true );
141 mVerifyModeItem = addRootItem( tr(
"Peer verification" ) );
142 mVerifyPeerCmbBx =
new QComboBox( treeSslConfig );
143 mVerifyPeerCmbBx->addItem( tr(
"Verify peer certs" ),
144 static_cast<int>( QSslSocket::VerifyPeer ) );
145 mVerifyPeerCmbBx->addItem( tr(
"Do not verify peer certs" ),
146 static_cast<int>( QSslSocket::VerifyNone ) );
147 mVerifyPeerCmbBx->setMaximumWidth( 300 );
148 mVerifyPeerCmbBx->setCurrentIndex( 0 );
149 QTreeWidgetItem *peerverifycmbxitem =
new QTreeWidgetItem(
151 QStringList() << QString(),
152 static_cast<int>( ConfigItem ) );
153 peerverifycmbxitem->setFlags( peerverifycmbxitem->flags() & ~Qt::ItemIsSelectable );
154 treeSslConfig->setItemWidget( peerverifycmbxitem, 0, mVerifyPeerCmbBx );
155 mVerifyModeItem->setExpanded(
true );
157 mVerifyDepthItem = addRootItem( tr(
"Peer verification depth (0 = complete cert chain)" ) );
158 mVerifyDepthSpnBx =
new QSpinBox( treeSslConfig );
159 mVerifyDepthSpnBx->setMinimum( 0 );
160 mVerifyDepthSpnBx->setMaximum( 10 );
161 mVerifyDepthSpnBx->setMaximumWidth( 200 );
162 mVerifyDepthSpnBx->setAlignment( Qt::AlignHCenter );
163 QTreeWidgetItem *peerverifyspnbxitem =
new QTreeWidgetItem(
165 QStringList() << QString(),
166 static_cast<int>( ConfigItem ) );
167 peerverifyspnbxitem->setFlags( peerverifyspnbxitem->flags() & ~Qt::ItemIsSelectable );
168 treeSslConfig->setItemWidget( peerverifyspnbxitem, 0, mVerifyDepthSpnBx );
169 mVerifyDepthItem->setExpanded(
true );
171 mIgnoreErrorsItem = addRootItem( tr(
"Ignore errors" ) );
174 for (
int i = 0; i < errenums.size(); i++ )
176 QTreeWidgetItem *item =
new QTreeWidgetItem(
178 QStringList() << errenums.at( i ).second,
179 static_cast<int>( ConfigItem ) );
180 item->setCheckState( 0, Qt::Unchecked );
181 item->setTextAlignment( 0, Qt::AlignVCenter );
182 item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
183 item->setData( 0, Qt::UserRole, errenums.at( i ).first );
185 mIgnoreErrorsItem->setExpanded(
true );
208 return QSslCertificate();
219 return leHost->text();
228 if ( grpbxSslConfig->isCheckable() )
230 grpbxSslConfig->setChecked( enable );
246 if ( !hostport.isEmpty() )
257 lblLoadedConfig->setVisible(
true );
265 lblLoadedConfig->setText( configNotFoundText_() );
281 QgsDebugMsg( QStringLiteral(
"Passed-in SSL custom config is null" ) );
288 QgsDebugMsg( QStringLiteral(
"SSL custom config's cert is null" ) );
300 lblLoadedConfig->setVisible(
true );
301 lblLoadedConfig->setText( configFoundText_() );
312 QgsDebugMsg( QStringLiteral(
"SSL custom config FAILED to store in authentication database" ) );
323 mConnectionCAs.clear();
324 leCommonName->clear();
325 leCommonName->setStyleSheet( QString() );
328 lblLoadedConfig->setVisible(
false );
329 lblLoadedConfig->clear();
340 return QSsl::UnknownProtocol;
342 return ( QSsl::SslProtocol )mProtocolCmbBx->currentData().toInt();
351 int indx( mProtocolCmbBx->findData( static_cast<int>( protocol ) ) );
352 mProtocolCmbBx->setCurrentIndex( indx );
361 mProtocolCmbBx->setCurrentIndex( 0 );
372 QList<QSslError::SslError> errenums;
373 Q_FOREACH (
const QSslError &err, errors )
375 errenums << err.error();
378 for (
int i = 0; i < mIgnoreErrorsItem->childCount(); i++ )
380 QTreeWidgetItem *item( mIgnoreErrorsItem->child( i ) );
381 if ( errenums.contains( ( QSslError::SslError )item->data( 0, Qt::UserRole ).toInt() ) )
383 item->setCheckState( 0, Qt::Checked );
394 QList<QSslError> errors;
395 Q_FOREACH ( QSslError::SslError errorenum, errorenums )
397 errors << QSslError( errorenum );
408 if ( errors.isEmpty() )
415 QList<QSslError::SslError> errenums;
416 Q_FOREACH (
const QSslError &err, errors )
418 errenums << err.error();
421 for (
int i = 0; i < mIgnoreErrorsItem->childCount(); i++ )
423 QTreeWidgetItem *item( mIgnoreErrorsItem->child( i ) );
424 bool enable( errenums.contains( ( QSslError::SslError )item->data( 0, Qt::UserRole ).toInt() ) );
425 item->setCheckState( 0, enable ? Qt::Checked : Qt::Unchecked );
435 for (
int i = 0; i < mIgnoreErrorsItem->childCount(); i++ )
437 mIgnoreErrorsItem->child( i )->setCheckState( 0, Qt::Unchecked );
443 QList<QSslError::SslError> errs;
448 for (
int i = 0; i < mIgnoreErrorsItem->childCount(); i++ )
450 QTreeWidgetItem *item( mIgnoreErrorsItem->child( i ) );
451 if ( item->checkState( 0 ) == Qt::Checked )
453 errs.append( ( QSslError::SslError )item->data( 0, Qt::UserRole ).toInt() );
463 return QSslSocket::AutoVerifyPeer;
465 return ( QSslSocket::PeerVerifyMode )mVerifyPeerCmbBx->currentData().toInt();
474 return mVerifyDepthSpnBx->value();
485 int indx( mVerifyPeerCmbBx->findData( static_cast<int>( mode ) ) );
486 mVerifyPeerCmbBx->setCurrentIndex( indx );
488 mVerifyDepthSpnBx->setValue( modedepth );
497 mVerifyPeerCmbBx->setCurrentIndex( 0 );
498 mVerifyDepthSpnBx->setValue( 0 );
507 bool cansave = ( isEnabled()
508 && ( grpbxSslConfig->isCheckable() ? grpbxSslConfig->isChecked() : true )
509 && validateHostPort( leHost->text() ) );
510 if ( mCanSave != cansave )
524 leHost->setText( host );
527 bool QgsAuthSslConfigWidget::validateHostPort(
const QString &txt )
529 QString hostport( txt );
530 if ( hostport.isEmpty() )
537 QString urlbase( QStringLiteral(
"https://%1" ).arg( hostport ) );
539 return ( !url.host().isEmpty() && QString::number( url.port() ).size() > 0
540 && QStringLiteral(
"https://%1:%2" ).arg( url.host() ).arg( url.port() ) == urlbase );
549 bool valid = validateHostPort( txt );
561 grpbxSslConfig->setCheckable( checkable );
564 grpbxSslConfig->setEnabled(
true );
568 void QgsAuthSslConfigWidget::btnCertInfo_clicked()
570 if ( mCert.isNull() )
576 dlg->setWindowModality( Qt::WindowModal );
577 dlg->resize( 675, 500 );
589 setWindowTitle( tr(
"Custom Certificate Configuration" ) );
590 QVBoxLayout *layout =
new QVBoxLayout(
this );
591 layout->setMargin( 6 );
595 this, &QgsAuthSslConfigDialog::checkCanSave );
596 layout->addWidget( mSslConfigWdgt );
598 QDialogButtonBox *buttonBox =
new QDialogButtonBox(
599 QDialogButtonBox::Close | QDialogButtonBox::Save, Qt::Horizontal,
this );
601 buttonBox->button( QDialogButtonBox::Close )->setDefault(
true );
602 mSaveButton = buttonBox->button( QDialogButtonBox::Save );
603 connect( buttonBox, &QDialogButtonBox::rejected,
this, &QWidget::close );
605 layout->addWidget( buttonBox );
608 mSaveButton->setEnabled( mSslConfigWdgt->
readyToSave() );
617 void QgsAuthSslConfigDialog::checkCanSave(
bool cansave )
619 mSaveButton->setEnabled( cansave );
bool isNull() const
Whether configuration is null (missing components)
Configuration container for SSL server connection exceptions or overrides.
void setSslPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
Sets SSL client's peer verify mode to use in connections.
Dialog wrapper for widget displaying detailed info on a certificate and its hierarchical trust chain...
static QString greenTextStyleSheet(const QString &selector="*")
Green text stylesheet representing valid, trusted, etc. certificate.
QSslSocket::PeerVerifyMode sslPeerVerifyMode() const
SSL client's peer verify mode to use in connections.
QSsl::SslProtocol sslProtocol() const
SSL server protocol to use in connections.
QgsAuthSslConfigDialog(QWidget *parent=nullptr, const QSslCertificate &cert=QSslCertificate(), const QString &hostport=QString())
Construct wrapper dialog for the SSL config widget.
const QSslCertificate sslCertificate() const
Server certificate object.
void setSslHostPort(const QString &hostport)
Sets server host:port string.
static QString getSslProtocolName(QSsl::SslProtocol protocol)
SSL Protocol name strings per enum.
void setSslProtocol(QSsl::SslProtocol protocol)
Sets SSL server protocol to use in connections.
static QString shaHexForCert(const QSslCertificate &cert, bool formatted=false)
Gets the sha1 hash for certificate.
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
static QString redTextStyleSheet(const QString &selector="*")
Red text stylesheet representing invalid, untrusted, etc. certificate.
int sslPeerVerifyDepth() const
Number or SSL client's peer to verify in connections.
void setSslIgnoredErrorEnums(const QList< QSslError::SslError > &errors)
Sets SSL server errors (as enum list) to ignore in connections.
void setSslPeerVerifyDepth(int depth)
Set number or SSL client's peer to verify in connections.
const QString sslHostPort() const
Server host:port string.
static QList< QPair< QSslError::SslError, QString > > sslErrorEnumStrings()
Gets short strings describing SSL errors.
void setSslCertificate(const QSslCertificate &cert)
Sets server certificate object.
static QString resolvedCertName(const QSslCertificate &cert, bool issuer=false)
Gets the general name via RFC 5280 resolution.
static QString orangeTextStyleSheet(const QString &selector="*")
Orange text stylesheet representing loaded component, but not stored in database. ...
const QList< QSslError::SslError > sslIgnoredErrorEnums() const
SSL server errors (as enum list) to ignore in connections.