18#include "ui_qgsauthcertificateinfo.h"
27#include <QDialogButtonBox>
29#include <QPlainTextEdit>
34#include "moc_qgsauthcertificateinfo.cpp"
38 , mConnectionCAs( connectionCAs )
39 , mDefaultItemForeground( QBrush() )
40 , mManageTrust( manageCertTrust )
44 mAuthNotifyLayout =
new QVBoxLayout;
45 this->setLayout( mAuthNotifyLayout );
47 mAuthNotifyLayout->addWidget( mAuthNotify );
52 connect( btnSaveTrust, &QToolButton::clicked,
this, &QgsAuthCertInfo::btnSaveTrust_clicked );
54 lblError->setHidden(
true );
56 treeHierarchy->setRootIsDecorated(
false );
58 connect( treeHierarchy, &QTreeWidget::currentItemChanged,
this, &QgsAuthCertInfo::currentCertItemChanged );
62 setUpCertDetailsTree();
64 grpbxTrust->setVisible( mManageTrust );
71 res = populateQcaCertCollection();
73 res = setQcaCertificate( cert );
75 res = populateCertChain();
79 connect( cmbbxTrust,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsAuthCertInfo::currentPolicyIndexChanged );
83void QgsAuthCertInfo::setupError(
const QString &msg )
85 lblError->setVisible(
true );
86 QString out = tr(
"<b>Setup ERROR:</b>\n\n" );
88 lblError->setText( out );
92void QgsAuthCertInfo::currentCertItemChanged( QTreeWidgetItem *current, QTreeWidgetItem *previous )
95 updateCurrentCert( current );
98void QgsAuthCertInfo::updateCurrentCert( QTreeWidgetItem *item )
101 item = treeHierarchy->currentItem();
105 const int indx( item->data( 0, Qt::UserRole ).toInt() );
106 updateCurrentCertInfo( indx );
109bool QgsAuthCertInfo::populateQcaCertCollection()
111 const QList<QPair<QgsAuthCertUtils::CaCertSource, QSslCertificate>> &certpairs( mCaCertsCache.values() );
112 for (
int i = 0; i < certpairs.size(); ++i )
114 QCA::ConvertResult res;
115 const QCA::Certificate acert = QCA::Certificate::fromPEM( certpairs.at( i ).second.toPem(), &res, QStringLiteral(
"qca-ossl" ) );
116 if ( res == QCA::ConvertGood && !acert.isNull() )
118 mCaCerts.addCertificate( acert );
121 if ( !mConnectionCAs.isEmpty() )
123 const auto constMConnectionCAs = mConnectionCAs;
124 for (
const QSslCertificate &cert : constMConnectionCAs )
126 QCA::ConvertResult res;
127 const QCA::Certificate acert = QCA::Certificate::fromPEM( cert.toPem(), &res, QStringLiteral(
"qca-ossl" ) );
128 if ( res == QCA::ConvertGood && !acert.isNull() )
130 mCaCerts.addCertificate( acert );
135 if ( mCaCerts.certificates().empty() )
137 setupError( tr(
"Could not populate QCA certificate collection" ) );
143bool QgsAuthCertInfo::setQcaCertificate(
const QSslCertificate &cert )
145 QCA::ConvertResult res;
146 mCert = QCA::Certificate::fromPEM( cert.toPem(), &res, QStringLiteral(
"qca-ossl" ) );
147 if ( res != QCA::ConvertGood || mCert.isNull() )
149 setupError( tr(
"Could not set QCA certificate" ) );
155bool QgsAuthCertInfo::populateCertChain()
157 const QCA::CertificateChain certchain( mCert );
159 mACertChain = certchain.complete( mCaCerts.certificates(), &valid );
160 if ( valid != QCA::ValidityGood && valid != QCA::ErrorInvalidCA )
163 setupError( tr(
"Invalid population of QCA certificate chain.<br><br>"
164 "Validity message: %1" )
169 if ( mACertChain.isEmpty() )
171 QgsDebugError( QStringLiteral(
"Could not populate QCA certificate chain" ) );
172 mACertChain = certchain;
175 if ( !mACertChain.last().isSelfSigned() )
178 mACertChain.append( QCA::Certificate() );
182 const auto constMACertChain = mACertChain;
183 for (
const QCA::Certificate &cert : constMACertChain )
185 QSslCertificate qcert;
186 if ( !cert.isNull() )
188 qcert = QSslCertificate( cert.toPEM().toLatin1() );
190 mQCertChain.append( qcert );
195void QgsAuthCertInfo::setCertHierarchy()
197 QListIterator<QSslCertificate> it( mQCertChain );
199 int i = mQCertChain.size();
200 QTreeWidgetItem *item =
nullptr;
201 QTreeWidgetItem *previtem =
nullptr;
202 while ( it.hasPrevious() )
204 const QSslCertificate cert( it.previous() );
205 const bool missingCA = cert.isNull();
207 if ( missingCA && it.hasPrevious() )
210 cert_source += QStringLiteral(
" (%1)" ).arg( tr(
"Missing CA" ) );
216 if ( mCaCertsCache.contains( sha ) )
218 const QPair<QgsAuthCertUtils::CaCertSource, QSslCertificate> &certpair( mCaCertsCache.value( sha ) );
221 else if ( mConnectionCAs.contains( cert ) )
223 cert_source += QStringLiteral(
" (%1)" )
230 item =
new QTreeWidgetItem( treeHierarchy, QStringList() << cert_source );
234 item =
new QTreeWidgetItem( previtem, QStringList() << cert_source );
236 if ( missingCA && it.hasPrevious() )
238 item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
241 item->setData( 0, Qt::UserRole, --i );
243 if ( mDefaultItemForeground.style() == Qt::NoBrush )
245 mDefaultItemForeground = item->foreground( 0 );
250 item->setFirstColumnSpanned(
true );
252 treeHierarchy->addTopLevelItem( item );
255 treeHierarchy->setCurrentItem( item, 0, QItemSelectionModel::ClearAndSelect );
256 treeHierarchy->expandAll();
259void QgsAuthCertInfo::updateCurrentCertInfo(
int chainindx )
261 btnSaveTrust->setEnabled(
false );
263 mCurrentQCert = mQCertChain.at( chainindx );
264 mCurrentACert = mACertChain.at( chainindx );
268 grpbxTrust->setHidden( mCurrentQCert.isNull() );
271 if ( !mCurrentQCert.isNull() )
274 mCurrentTrustPolicy = trustpolicy;
276 cmbbxTrust->setTrustPolicy( trustpolicy );
286void QgsAuthCertInfo::setUpCertDetailsTree()
288 treeDetails->setColumnCount( 2 );
289 treeDetails->setHeaderLabels( QStringList() << tr(
"Field" ) << tr(
"Value" ) );
290 treeDetails->setColumnWidth( 0, 200 );
292 QTreeWidgetItem *headeritem = treeDetails->headerItem();
293 headeritem->setTextAlignment( 0, Qt::AlignRight );
294 headeritem->setTextAlignment( 1, Qt::AlignLeft );
296 treeDetails->setRootIsDecorated(
true );
297 treeDetails->setWordWrap(
true );
300 mSecGeneral =
new QTreeWidgetItem(
302 QStringList( tr(
"General" ) ),
303 static_cast<int>( DetailsSection )
306 mSecGeneral->setFirstColumnSpanned(
true );
307 mSecGeneral->setFlags( Qt::ItemIsEnabled );
308 mSecGeneral->setExpanded(
true );
309 treeDetails->insertTopLevelItem( 0, mSecGeneral );
311 mSecDetails =
new QTreeWidgetItem(
313 QStringList( tr(
"Details" ) ),
314 static_cast<int>( DetailsSection )
317 mSecDetails->setFirstColumnSpanned(
true );
318 mSecDetails->setFlags( Qt::ItemIsEnabled );
319 mSecDetails->setExpanded(
false );
320 treeDetails->insertTopLevelItem( 0, mSecDetails );
323 mGrpSubj = addGroupItem( mSecDetails, tr(
"Subject Info" ) );
324 mGrpIssu = addGroupItem( mSecDetails, tr(
"Issuer Info" ) );
325 mGrpCert = addGroupItem( mSecDetails, tr(
"Certificate Info" ) );
326 mGrpPkey = addGroupItem( mSecDetails, tr(
"Public Key Info" ) );
327 mGrpExts = addGroupItem( mSecDetails, tr(
"Extensions" ) );
329 mSecPemText =
new QTreeWidgetItem(
331 QStringList( tr(
"PEM Text" ) ),
332 static_cast<int>( DetailsSection )
335 mSecPemText->setFirstColumnSpanned(
true );
336 mSecPemText->setFlags( Qt::ItemIsEnabled );
337 mSecPemText->setExpanded(
false );
338 treeDetails->insertTopLevelItem( 0, mSecPemText );
341void QgsAuthCertInfo::populateCertInfo()
343 mSecDetails->setHidden(
false );
344 mSecPemText->setHidden(
false );
346 populateInfoGeneralSection();
347 populateInfoDetailsSection();
348 populateInfoPemTextSection();
351QTreeWidgetItem *QgsAuthCertInfo::addGroupItem( QTreeWidgetItem *parent,
const QString &group )
353 QTreeWidgetItem *grpitem =
new QTreeWidgetItem(
355 QStringList( group ),
356 static_cast<int>( DetailsGroup )
359 grpitem->setFirstColumnSpanned(
true );
360 grpitem->setFlags( Qt::ItemIsEnabled );
361 grpitem->setExpanded(
true );
363 QBrush orgb( grpitem->foreground( 0 ) );
364 orgb.setColor( QColor::fromRgb( 90, 90, 90 ) );
365 grpitem->setForeground( 0, orgb );
366 QFont grpf( grpitem->font( 0 ) );
367 grpf.setItalic(
true );
368 grpitem->setFont( 0, grpf );
373void QgsAuthCertInfo::addFieldItem( QTreeWidgetItem *parent,
const QString &field,
const QString &value, QgsAuthCertInfo::FieldWidget wdgt,
const QColor &color )
375 if ( value.isEmpty() )
378 QTreeWidgetItem *item =
new QTreeWidgetItem(
380 QStringList() << field << ( wdgt == NoWidget ? value : QString() ),
381 static_cast<int>( DetailsField )
384 item->setTextAlignment( 0, Qt::AlignRight );
385 item->setTextAlignment( 1, Qt::AlignLeft );
387 QBrush fieldb( item->foreground( 0 ) );
388 fieldb.setColor( QColor::fromRgb( 90, 90, 90 ) );
389 item->setForeground( 0, fieldb );
391 if ( wdgt == NoWidget )
393 if ( color.isValid() )
395 QBrush valueb( item->foreground( 1 ) );
396 valueb.setColor( color );
397 item->setForeground( 1, valueb );
400 else if ( wdgt == LineEdit )
402 QLineEdit *le =
new QLineEdit( value, treeDetails );
403 le->setReadOnly(
true );
404 le->setAlignment( Qt::AlignLeft );
405 le->setCursorPosition( 0 );
406 if ( color.isValid() )
408 le->setStyleSheet( QStringLiteral(
"QLineEdit { color: %1; }" ).arg( color.name() ) );
410 item->treeWidget()->setItemWidget( item, 1, le );
412 else if ( wdgt == TextEdit )
414 QPlainTextEdit *pte =
new QPlainTextEdit( value, treeDetails );
415 pte->setReadOnly(
true );
416 pte->setMinimumHeight( 75 );
417 pte->setMaximumHeight( 75 );
418 pte->moveCursor( QTextCursor::Start );
419 if ( color.isValid() )
421 pte->setStyleSheet( QStringLiteral(
"QPlainTextEdit { color: %1; }" ).arg( color.name() ) );
423 item->treeWidget()->setItemWidget( item, 1, pte );
427void QgsAuthCertInfo::populateInfoGeneralSection()
431 if ( mCurrentQCert.isNull() )
433 addFieldItem( mSecGeneral, tr(
"Type" ), tr(
"Missing CA (incomplete local CA chain)" ), LineEdit );
434 mSecGeneral->setExpanded(
true );
435 mSecDetails->setHidden(
true );
436 mSecPemText->setHidden(
true );
441 const bool isselfsigned = mCurrentACert.isSelfSigned();
442 const QString selfsigned( tr(
"self-signed" ) );
444 const QList<QgsAuthCertUtils::CertUsageType> usagetypes(
460 if ( isissuer || ( isca && !isselfsigned ) )
464 if ( ( isissuer || isca ) && isselfsigned )
466 certype = QStringLiteral(
"%1 %2" )
471 certype.append( certype.isEmpty() ? selfsigned : QStringLiteral(
" (%1)" ).arg( selfsigned ) );
474 addFieldItem( mSecGeneral, tr(
"Usage type" ), certype, LineEdit );
477 addFieldItem( mSecGeneral, tr(
"Not valid after" ), mCurrentQCert.expiryDate().toString(), LineEdit, mCurrentQCert.expiryDate() < QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
479 const QSslKey pubkey( mCurrentQCert.publicKey() );
480 const QString alg( pubkey.algorithm() == QSsl::Rsa ?
"RSA" :
"DSA" );
481 const int bitsize( pubkey.length() );
482 addFieldItem( mSecGeneral, tr(
"Public key" ), QStringLiteral(
"%1, %2 bits" ).arg( alg, bitsize == -1 ? QStringLiteral(
"?" ) : QString::number( bitsize ) ), LineEdit );
486void QgsAuthCertInfo::populateInfoDetailsSection()
494 if ( mCurrentQCert.isNull() )
498 addFieldItem( mGrpSubj, tr(
"Country (C)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::CountryName ), LineEdit );
499 addFieldItem( mGrpSubj, tr(
"State/Province (ST)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::StateOrProvinceName ), LineEdit );
500 addFieldItem( mGrpSubj, tr(
"Locality (L)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::LocalityName ), LineEdit );
501 addFieldItem( mGrpSubj, tr(
"Organization (O)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::Organization ), LineEdit );
502 addFieldItem( mGrpSubj, tr(
"Organizational unit (OU)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::OrganizationalUnitName ), LineEdit );
503 addFieldItem( mGrpSubj, tr(
"Common name (CN)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::CommonName ), LineEdit );
504 addFieldItem( mGrpSubj, tr(
"Email address (E)" ), mCurrentACert.subjectInfo().value( QCA::Email ), LineEdit );
506 addFieldItem( mGrpSubj, tr(
"Email Legacy" ), mCurrentACert.subjectInfo().value( QCA::EmailLegacy ), LineEdit );
507 addFieldItem( mGrpSubj, tr(
"Incorporation Country" ), mCurrentACert.subjectInfo().value( QCA::IncorporationCountry ), LineEdit );
508 addFieldItem( mGrpSubj, tr(
"Incorporation State/Province" ), mCurrentACert.subjectInfo().value( QCA::IncorporationState ), LineEdit );
509 addFieldItem( mGrpSubj, tr(
"Incorporation Locality" ), mCurrentACert.subjectInfo().value( QCA::IncorporationLocality ), LineEdit );
510 addFieldItem( mGrpSubj, tr(
"URI" ), mCurrentACert.subjectInfo().value( QCA::URI ), LineEdit );
511 addFieldItem( mGrpSubj, tr(
"DNS" ), mCurrentACert.subjectInfo().value( QCA::DNS ), LineEdit );
512 addFieldItem( mGrpSubj, tr(
"IP Address" ), mCurrentACert.subjectInfo().value( QCA::IPAddress ), LineEdit );
513 addFieldItem( mGrpSubj, tr(
"XMPP" ), mCurrentACert.subjectInfo().value( QCA::XMPP ), LineEdit );
515 const QMultiMap<QSsl::AlternativeNameEntryType, QString> alts( mCurrentQCert.subjectAlternativeNames() );
516 QStringList altslist;
517 const QString email( tr(
"Email: " ) );
518 const QStringList emails( alts.values( QSsl::EmailEntry ) );
519 if ( !emails.isEmpty() )
521 altslist << email + emails.join(
'\n' + email );
523 const QString dns( tr(
"DNS: " ) );
524 const QStringList dnss( alts.values( QSsl::DnsEntry ) );
525 if ( !dnss.isEmpty() )
527 altslist << dns + dnss.join(
'\n' + dns );
529 addFieldItem( mGrpSubj, tr(
"Alternate names" ), altslist.join( QLatin1Char(
'\n' ) ), TextEdit );
532 addFieldItem( mGrpIssu, tr(
"Country (C)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::CountryName ), LineEdit );
533 addFieldItem( mGrpIssu, tr(
"State/Province (ST)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::StateOrProvinceName ), LineEdit );
534 addFieldItem( mGrpIssu, tr(
"Locality (L)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::LocalityName ), LineEdit );
535 addFieldItem( mGrpIssu, tr(
"Organization (O)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::Organization ), LineEdit );
536 addFieldItem( mGrpIssu, tr(
"Organizational unit (OU)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::OrganizationalUnitName ), LineEdit );
537 addFieldItem( mGrpIssu, tr(
"Common name (CN)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::CommonName ), LineEdit );
538 addFieldItem( mGrpIssu, tr(
"Email address (E)" ), mCurrentACert.issuerInfo().value( QCA::Email ), LineEdit );
540 addFieldItem( mGrpIssu, tr(
"Email Legacy" ), mCurrentACert.issuerInfo().value( QCA::EmailLegacy ), LineEdit );
541 addFieldItem( mGrpIssu, tr(
"Incorporation Country" ), mCurrentACert.issuerInfo().value( QCA::IncorporationCountry ), LineEdit );
542 addFieldItem( mGrpIssu, tr(
"Incorporation State/Province" ), mCurrentACert.issuerInfo().value( QCA::IncorporationState ), LineEdit );
543 addFieldItem( mGrpIssu, tr(
"Incorporation Locality" ), mCurrentACert.issuerInfo().value( QCA::IncorporationLocality ), LineEdit );
544 addFieldItem( mGrpIssu, tr(
"URI" ), mCurrentACert.issuerInfo().value( QCA::URI ), LineEdit );
545 addFieldItem( mGrpIssu, tr(
"DNS" ), mCurrentACert.issuerInfo().value( QCA::DNS ), LineEdit );
546 addFieldItem( mGrpIssu, tr(
"IP Address" ), mCurrentACert.issuerInfo().value( QCA::IPAddress ), LineEdit );
547 addFieldItem( mGrpIssu, tr(
"XMPP" ), mCurrentACert.issuerInfo().value( QCA::XMPP ), LineEdit );
550 addFieldItem( mGrpCert, tr(
"Version" ), mCurrentQCert.version(), LineEdit );
551 addFieldItem( mGrpCert, tr(
"Serial #" ), mCurrentQCert.serialNumber(), LineEdit );
552 addFieldItem( mGrpCert, tr(
"Not valid before" ), mCurrentQCert.effectiveDate().toString(), LineEdit, mCurrentQCert.effectiveDate() > QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
553 addFieldItem( mGrpCert, tr(
"Not valid after" ), mCurrentQCert.expiryDate().toString(), LineEdit, mCurrentQCert.expiryDate() < QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
558 const QStringList crllocs( mCurrentACert.crlLocations() );
559 if ( !crllocs.isEmpty() )
561 addFieldItem( mGrpCert, tr(
"CRL locations" ), crllocs.join( QLatin1Char(
'\n' ) ), TextEdit );
563 const QStringList issulocs( mCurrentACert.issuerLocations() );
564 if ( !issulocs.isEmpty() )
566 addFieldItem( mGrpCert, tr(
"Issuer locations" ), issulocs.join( QLatin1Char(
'\n' ) ), TextEdit );
568 const QStringList ocsplocs( mCurrentACert.ocspLocations() );
569 if ( !ocsplocs.isEmpty() )
571 addFieldItem( mGrpCert, tr(
"OCSP locations" ), ocsplocs.join( QLatin1Char(
'\n' ) ), TextEdit );
576 const QSslKey pubqkey( mCurrentQCert.publicKey() );
577 const QString alg( pubqkey.algorithm() == QSsl::Rsa ?
"RSA" :
"DSA" );
578 const int bitsize( pubqkey.length() );
579 addFieldItem( mGrpPkey, tr(
"Algorithm" ), bitsize == -1 ? QStringLiteral(
"Unknown (possibly Elliptic Curve)" ) : alg, LineEdit );
580 addFieldItem( mGrpPkey, tr(
"Key size" ), bitsize == -1 ? QStringLiteral(
"?" ) : QString::number( bitsize ), LineEdit );
583 const QCA::PublicKey pubakey( mCurrentACert.subjectPublicKey() );
585 if ( pubqkey.algorithm() == QSsl::Rsa )
587 const QCA::RSAPublicKey rsakey( pubakey.toRSA() );
588 const QCA::BigInteger modulus = rsakey.n();
589 QByteArray modarray( modulus.toArray().toByteArray().toHex() );
590 if ( modarray.size() > 2 && modarray.mid( 0, 2 ) == QByteArray(
"00" ) )
592 modarray = modarray.mid( 2 );
594 const QCA::BigInteger exponent = rsakey.e();
596 addFieldItem( mGrpPkey, tr(
"Exponent" ), exponent.toString(), LineEdit );
608 if ( pubakey.canVerify() )
610 usage.append( tr(
"Verify" ) );
614 if ( pubakey.canEncrypt() )
616 usage.append( tr(
"Encrypt" ) );
618#if QCA_VERSION >= 0x020100
619 if ( pubakey.canDecrypt() )
621 usage.append( tr(
"Decrypt" ) );
624 if ( pubakey.canKeyAgree() )
626 usage.append( tr(
"Key agreement" ) );
628 if ( pubakey.canExport() )
630 usage.append( tr(
"Export" ) );
632 if ( !usage.isEmpty() )
634 addFieldItem( mGrpPkey, tr(
"Key usage" ), usage.join( QLatin1String(
", " ) ), LineEdit );
639 QStringList basicconst;
640 basicconst << tr(
"Certificate Authority: %1" ).arg( mCurrentACert.isCA() ? tr(
"Yes" ) : tr(
"No" ) )
641 << tr(
"Chain Path Limit: %1" ).arg( mCurrentACert.pathLimit() );
642 addFieldItem( mGrpExts, tr(
"Basic constraints" ), basicconst.join( QLatin1Char(
'\n' ) ), TextEdit );
644 QStringList keyusage;
645 QStringList extkeyusage;
646 const QList<QCA::ConstraintType> certconsts = mCurrentACert.constraints();
647 const auto constCertconsts = certconsts;
648 for (
const QCA::ConstraintType &certconst : constCertconsts )
650 if ( certconst.section() == QCA::ConstraintType::KeyUsage )
654 else if ( certconst.section() == QCA::ConstraintType::ExtendedKeyUsage )
659 if ( !keyusage.isEmpty() )
661 addFieldItem( mGrpExts, tr(
"Key usage" ), keyusage.join( QLatin1Char(
'\n' ) ), TextEdit );
663 if ( !extkeyusage.isEmpty() )
665 addFieldItem( mGrpExts, tr(
"Extended key usage" ), extkeyusage.join( QLatin1Char(
'\n' ) ), TextEdit );
672void QgsAuthCertInfo::populateInfoPemTextSection()
676 if ( mCurrentQCert.isNull() )
679 QTreeWidgetItem *item =
new QTreeWidgetItem(
681 QStringList( QString() ),
682 static_cast<int>( DetailsField )
685 item->setFirstColumnSpanned(
true );
687 QPlainTextEdit *pte =
new QPlainTextEdit( mCurrentQCert.toPem(), treeDetails );
688 pte->setReadOnly(
true );
689 pte->setMinimumHeight( 150 );
690 pte->setMaximumHeight( 150 );
691 pte->moveCursor( QTextCursor::Start );
692 item->treeWidget()->setItemWidget( item, 0, pte );
695void QgsAuthCertInfo::btnSaveTrust_clicked()
700 QgsDebugError( QStringLiteral(
"Could not set trust policy for certificate" ) );
702 mCurrentTrustPolicy = newpolicy;
703 decorateCertTreeItem( mCurrentQCert, newpolicy,
nullptr );
704 btnSaveTrust->setEnabled(
false );
708 mTrustCacheRebuilt =
true;
712void QgsAuthCertInfo::currentPolicyIndexChanged(
int indx )
715 btnSaveTrust->setEnabled( newpolicy != mCurrentTrustPolicy );
722 item = treeHierarchy->currentItem();
733 QBrush b( item->foreground( 0 ) );
734 b.setColor( QColor::fromRgb( 90, 90, 90 ) );
735 item->setForeground( 0, b );
736 QFont f( item->font( 0 ) );
738 item->setFont( 0, f );
769 setWindowTitle( tr(
"Certificate Information" ) );
770 QVBoxLayout *layout =
new QVBoxLayout(
this );
771 layout->setContentsMargins( 6, 6, 6, 6 );
773 mCertInfoWdgt =
new QgsAuthCertInfo( cert, manageCertTrust,
this, connectionCAs );
774 layout->addWidget( mCertInfoWdgt );
776 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Close, Qt::Horizontal,
this );
777 buttonBox->button( QDialogButtonBox::Close )->setDefault(
true );
778 connect( buttonBox, &QDialogButtonBox::rejected,
this, &QWidget::close );
779 layout->addWidget( buttonBox );
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
QgsAuthCertInfoDialog(const QSslCertificate &cert, bool manageCertTrust, QWidget *parent=nullptr, const QList< QSslCertificate > &connectionCAs=QList< QSslCertificate >())
Construct a dialog displaying detailed info on a certificate and its hierarchical trust chain.
Widget for viewing detailed info on a certificate and its hierarchical trust chain.
QgsAuthCertInfo(const QSslCertificate &cert, bool manageCertTrust=false, QWidget *parent=nullptr, const QList< QSslCertificate > &connectionCAs=QList< QSslCertificate >())
Constructor for QgsAuthCertInfo.
static QString qcaValidityMessage(QCA::Validity validity)
Certificate validity check messages per enum.
static QList< QgsAuthCertUtils::CertUsageType > certificateUsageTypes(const QSslCertificate &cert)
Try to determine the certificates usage types.
static QString qcaSignatureAlgorithm(QCA::SignatureAlgorithm algorithm)
Certificate signature algorithm strings per enum.
static QString resolvedCertName(const QSslCertificate &cert, bool issuer=false)
Gets the general name via RFC 5280 resolution.
static QString certificateUsageTypeString(QgsAuthCertUtils::CertUsageType usagetype)
Certificate usage type strings per enum.
static QString shaHexForCert(const QSslCertificate &cert, bool formatted=false)
Gets the sha1 hash for certificate.
CertTrustPolicy
Type of certificate trust policy.
static QString qcaKnownConstraint(QCA::ConstraintTypeKnown constraint)
Certificate well-known constraint strings per enum.
static bool certIsViable(const QSslCertificate &cert)
certIsViable checks for viability errors of cert and whether it is NULL
static QString getColonDelimited(const QString &txt)
Gets string with colon delimiters every 2 characters.
static QString getCaSourceName(QgsAuthCertUtils::CaCertSource source, bool single=false)
Gets the general name for CA source enum type.
static QString getCertDistinguishedName(const QSslCertificate &qcert, const QCA::Certificate &acert=QCA::Certificate(), bool issuer=false)
Gets combined distinguished name for certificate.
static QString redTextStyleSheet(const QString &selector="*")
Red text stylesheet representing invalid, untrusted, etc. certificate.
static void setItemBold(QTreeWidgetItem *item)
Call setFirstColumnSpanned(true) on the item and make its font bold.
static void removeChildren(QTreeWidgetItem *item)
Remove the children of the passed item.
static QColor redColor()
Red color representing invalid, untrusted, etc. certificate.
QgsAuthCertUtils::CertTrustPolicy defaultCertTrustPolicy()
Gets the default certificate trust policy preferred by user.
bool rebuildCertTrustCache()
Rebuild certificate authority cache.
const QMap< QString, QPair< QgsAuthCertUtils::CaCertSource, QSslCertificate > > caCertsCache()
caCertsCache get all CA certs mapped to their sha1 from cache.
bool rebuildTrustedCaCertsCache()
Rebuild trusted certificate authorities cache.
#define SSL_SUBJECT_INFO(var, prop)
#define SSL_ISSUER_INFO(var, prop)
#define QgsDebugError(str)