18#include "ui_qgsauthcertificateinfo.h"
27#include <QDialogButtonBox>
29#include <QPlainTextEdit>
35#include "moc_qgsauthcertificateinfo.cpp"
37using namespace Qt::StringLiterals;
41 , mConnectionCAs( connectionCAs )
42 , mDefaultItemForeground( QBrush() )
43 , mManageTrust( manageCertTrust )
47 mAuthNotifyLayout =
new QVBoxLayout;
48 this->setLayout( mAuthNotifyLayout );
50 mAuthNotifyLayout->addWidget( mAuthNotify );
55 connect( btnSaveTrust, &QToolButton::clicked,
this, &QgsAuthCertInfo::btnSaveTrust_clicked );
57 lblError->setHidden(
true );
59 treeHierarchy->setRootIsDecorated(
false );
61 connect( treeHierarchy, &QTreeWidget::currentItemChanged,
this, &QgsAuthCertInfo::currentCertItemChanged );
65 setUpCertDetailsTree();
67 grpbxTrust->setVisible( mManageTrust );
74 res = populateQcaCertCollection();
76 res = setQcaCertificate( cert );
78 res = populateCertChain();
82 connect( cmbbxTrust,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsAuthCertInfo::currentPolicyIndexChanged );
86void QgsAuthCertInfo::setupError(
const QString &msg )
88 lblError->setVisible(
true );
89 QString out = tr(
"<b>Setup ERROR:</b>\n\n" );
91 lblError->setText( out );
95void QgsAuthCertInfo::currentCertItemChanged( QTreeWidgetItem *current, QTreeWidgetItem *previous )
98 updateCurrentCert( current );
101void QgsAuthCertInfo::updateCurrentCert( QTreeWidgetItem *item )
104 item = treeHierarchy->currentItem();
108 const int indx( item->data( 0, Qt::UserRole ).toInt() );
109 updateCurrentCertInfo( indx );
112bool QgsAuthCertInfo::populateQcaCertCollection()
114 const QList<QPair<QgsAuthCertUtils::CaCertSource, QSslCertificate>> &certpairs( mCaCertsCache.values() );
115 for (
int i = 0; i < certpairs.size(); ++i )
117 QCA::ConvertResult res;
118 const QCA::Certificate acert = QCA::Certificate::fromPEM( certpairs.at( i ).second.toPem(), &res, u
"qca-ossl"_s );
119 if ( res == QCA::ConvertGood && !acert.isNull() )
121 mCaCerts.addCertificate( acert );
124 if ( !mConnectionCAs.isEmpty() )
126 const auto constMConnectionCAs = mConnectionCAs;
127 for (
const QSslCertificate &cert : constMConnectionCAs )
129 QCA::ConvertResult res;
130 const QCA::Certificate acert = QCA::Certificate::fromPEM( cert.toPem(), &res, u
"qca-ossl"_s );
131 if ( res == QCA::ConvertGood && !acert.isNull() )
133 mCaCerts.addCertificate( acert );
138 if ( mCaCerts.certificates().empty() )
140 setupError( tr(
"Could not populate QCA certificate collection" ) );
146bool QgsAuthCertInfo::setQcaCertificate(
const QSslCertificate &cert )
148 QCA::ConvertResult res;
149 mCert = QCA::Certificate::fromPEM( cert.toPem(), &res, u
"qca-ossl"_s );
150 if ( res != QCA::ConvertGood || mCert.isNull() )
152 setupError( tr(
"Could not set QCA certificate" ) );
158bool QgsAuthCertInfo::populateCertChain()
160 const QCA::CertificateChain certchain( mCert );
162 mACertChain = certchain.complete( mCaCerts.certificates(), &valid );
163 if ( valid != QCA::ValidityGood && valid != QCA::ErrorInvalidCA )
167 "Invalid population of QCA certificate chain.<br><br>"
168 "Validity message: %1"
170 .arg( QgsAuthCertUtils::qcaValidityMessage( valid ) ) );
174 if ( mACertChain.isEmpty() )
176 QgsDebugError( u
"Could not populate QCA certificate chain"_s );
177 mACertChain = certchain;
180 if ( !mACertChain.last().isSelfSigned() )
183 mACertChain.append( QCA::Certificate() );
187 const auto constMACertChain = mACertChain;
188 for (
const QCA::Certificate &cert : constMACertChain )
190 QSslCertificate qcert;
191 if ( !cert.isNull() )
193 qcert = QSslCertificate( cert.toPEM().toLatin1() );
195 mQCertChain.append( qcert );
200void QgsAuthCertInfo::setCertHierarchy()
202 QListIterator<QSslCertificate> it( mQCertChain );
204 int i = mQCertChain.size();
205 QTreeWidgetItem *item =
nullptr;
206 QTreeWidgetItem *previtem =
nullptr;
207 while ( it.hasPrevious() )
209 const QSslCertificate cert( it.previous() );
210 const bool missingCA = cert.isNull();
212 if ( missingCA && it.hasPrevious() )
214 cert_source = QgsAuthCertUtils::resolvedCertName( it.peekPrevious(),
true );
215 cert_source += u
" (%1)"_s.arg( tr(
"Missing CA" ) );
219 cert_source = QgsAuthCertUtils::resolvedCertName( cert );
220 const QString sha = QgsAuthCertUtils::shaHexForCert( cert );
221 if ( mCaCertsCache.contains( sha ) )
223 const QPair<QgsAuthCertUtils::CaCertSource, QSslCertificate> &certpair( mCaCertsCache.value( sha ) );
224 cert_source += u
" (%1)"_s.arg( QgsAuthCertUtils::getCaSourceName( certpair.first,
true ) );
226 else if ( mConnectionCAs.contains( cert ) )
234 item =
new QTreeWidgetItem( treeHierarchy, QStringList() << cert_source );
238 item =
new QTreeWidgetItem( previtem, QStringList() << cert_source );
240 if ( missingCA && it.hasPrevious() )
242 item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
245 item->setData( 0, Qt::UserRole, --i );
247 if ( mDefaultItemForeground.style() == Qt::NoBrush )
249 mDefaultItemForeground = item->foreground( 0 );
254 item->setFirstColumnSpanned(
true );
256 treeHierarchy->addTopLevelItem( item );
259 treeHierarchy->setCurrentItem( item, 0, QItemSelectionModel::ClearAndSelect );
260 treeHierarchy->expandAll();
263void QgsAuthCertInfo::updateCurrentCertInfo(
int chainindx )
265 btnSaveTrust->setEnabled(
false );
267 mCurrentQCert = mQCertChain.at( chainindx );
268 mCurrentACert = mACertChain.at( chainindx );
272 grpbxTrust->setHidden( mCurrentQCert.isNull() );
275 if ( !mCurrentQCert.isNull() )
278 mCurrentTrustPolicy = trustpolicy;
280 cmbbxTrust->setTrustPolicy( trustpolicy );
281 if ( !QgsAuthCertUtils::certIsViable( mCurrentQCert ) )
290void QgsAuthCertInfo::setUpCertDetailsTree()
292 treeDetails->setColumnCount( 2 );
293 treeDetails->setHeaderLabels( QStringList() << tr(
"Field" ) << tr(
"Value" ) );
294 treeDetails->setColumnWidth( 0, 200 );
296 QTreeWidgetItem *headeritem = treeDetails->headerItem();
297 headeritem->setTextAlignment( 0, Qt::AlignRight );
298 headeritem->setTextAlignment( 1, Qt::AlignLeft );
300 treeDetails->setRootIsDecorated(
true );
301 treeDetails->setWordWrap(
true );
304 mSecGeneral =
new QTreeWidgetItem( treeDetails, QStringList( tr(
"General" ) ),
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( treeDetails, QStringList( tr(
"Details" ) ),
static_cast<int>( DetailsSection ) );
313 mSecDetails->setFirstColumnSpanned(
true );
314 mSecDetails->setFlags( Qt::ItemIsEnabled );
315 mSecDetails->setExpanded(
false );
316 treeDetails->insertTopLevelItem( 0, mSecDetails );
319 mGrpSubj = addGroupItem( mSecDetails, tr(
"Subject Info" ) );
320 mGrpIssu = addGroupItem( mSecDetails, tr(
"Issuer Info" ) );
321 mGrpCert = addGroupItem( mSecDetails, tr(
"Certificate Info" ) );
322 mGrpPkey = addGroupItem( mSecDetails, tr(
"Public Key Info" ) );
323 mGrpExts = addGroupItem( mSecDetails, tr(
"Extensions" ) );
325 mSecPemText =
new QTreeWidgetItem( treeDetails, QStringList( tr(
"PEM Text" ) ),
static_cast<int>( DetailsSection ) );
327 mSecPemText->setFirstColumnSpanned(
true );
328 mSecPemText->setFlags( Qt::ItemIsEnabled );
329 mSecPemText->setExpanded(
false );
330 treeDetails->insertTopLevelItem( 0, mSecPemText );
333void QgsAuthCertInfo::populateCertInfo()
335 mSecDetails->setHidden(
false );
336 mSecPemText->setHidden(
false );
338 populateInfoGeneralSection();
339 populateInfoDetailsSection();
340 populateInfoPemTextSection();
343QTreeWidgetItem *QgsAuthCertInfo::addGroupItem( QTreeWidgetItem *parent,
const QString &group )
345 QTreeWidgetItem *grpitem =
new QTreeWidgetItem( parent, QStringList( group ),
static_cast<int>( DetailsGroup ) );
347 grpitem->setFirstColumnSpanned(
true );
348 grpitem->setFlags( Qt::ItemIsEnabled );
349 grpitem->setExpanded(
true );
351 QBrush orgb( grpitem->foreground( 0 ) );
352 orgb.setColor( QColor::fromRgb( 90, 90, 90 ) );
353 grpitem->setForeground( 0, orgb );
354 QFont grpf( grpitem->font( 0 ) );
355 grpf.setItalic(
true );
356 grpitem->setFont( 0, grpf );
361void QgsAuthCertInfo::addFieldItem( QTreeWidgetItem *parent,
const QString &field,
const QString &value, QgsAuthCertInfo::FieldWidget wdgt,
const QColor &color )
363 if ( value.isEmpty() )
366 QTreeWidgetItem *item =
new QTreeWidgetItem( parent, QStringList() << field << ( wdgt == NoWidget ? value : QString() ),
static_cast<int>( DetailsField ) );
368 item->setTextAlignment( 0, Qt::AlignRight );
369 item->setTextAlignment( 1, Qt::AlignLeft );
371 QBrush fieldb( item->foreground( 0 ) );
372 fieldb.setColor( QColor::fromRgb( 90, 90, 90 ) );
373 item->setForeground( 0, fieldb );
375 if ( wdgt == NoWidget )
377 if ( color.isValid() )
379 QBrush valueb( item->foreground( 1 ) );
380 valueb.setColor( color );
381 item->setForeground( 1, valueb );
384 else if ( wdgt == LineEdit )
386 QLineEdit *le =
new QLineEdit( value, treeDetails );
387 le->setReadOnly(
true );
388 le->setAlignment( Qt::AlignLeft );
389 le->setCursorPosition( 0 );
390 if ( color.isValid() )
392 le->setStyleSheet( u
"QLineEdit { color: %1; }"_s.arg( color.name() ) );
394 item->treeWidget()->setItemWidget( item, 1, le );
396 else if ( wdgt == TextEdit )
398 QPlainTextEdit *pte =
new QPlainTextEdit( value, treeDetails );
399 pte->setReadOnly(
true );
400 pte->setMinimumHeight( 75 );
401 pte->setMaximumHeight( 75 );
402 pte->moveCursor( QTextCursor::Start );
403 if ( color.isValid() )
405 pte->setStyleSheet( u
"QPlainTextEdit { color: %1; }"_s.arg( color.name() ) );
407 item->treeWidget()->setItemWidget( item, 1, pte );
411void QgsAuthCertInfo::populateInfoGeneralSection()
415 if ( mCurrentQCert.isNull() )
417 addFieldItem( mSecGeneral, tr(
"Type" ), tr(
"Missing CA (incomplete local CA chain)" ), LineEdit );
418 mSecGeneral->setExpanded(
true );
419 mSecDetails->setHidden(
true );
420 mSecPemText->setHidden(
true );
425 const bool isselfsigned = mCurrentACert.isSelfSigned();
426 const QString selfsigned( tr(
"self-signed" ) );
428 const QList<QgsAuthCertUtils::CertUsageType> usagetypes( QgsAuthCertUtils::certificateUsageTypes( mCurrentQCert ) );
442 if ( isissuer || ( isca && !isselfsigned ) )
446 if ( ( isissuer || isca ) && isselfsigned )
452 certype.append( certype.isEmpty() ? selfsigned : u
" (%1)"_s.arg( selfsigned ) );
455 addFieldItem( mSecGeneral, tr(
"Usage type" ), certype, LineEdit );
456 addFieldItem( mSecGeneral, tr(
"Subject" ), QgsAuthCertUtils::resolvedCertName( mCurrentQCert ), LineEdit );
457 addFieldItem( mSecGeneral, tr(
"Issuer" ), QgsAuthCertUtils::resolvedCertName( mCurrentQCert,
true ), LineEdit );
458 addFieldItem( mSecGeneral, tr(
"Not valid after" ), mCurrentQCert.expiryDate().toString(), LineEdit, mCurrentQCert.expiryDate() < QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
460 const QSslKey pubkey( mCurrentQCert.publicKey() );
461 const QString alg( pubkey.algorithm() == QSsl::Rsa ?
"RSA" :
"DSA" );
462 const int bitsize( pubkey.length() );
463 addFieldItem( mSecGeneral, tr(
"Public key" ), u
"%1, %2 bits"_s.arg( alg, bitsize == -1 ? u
"?"_s : QString::number( bitsize ) ), LineEdit );
464 addFieldItem( mSecGeneral, tr(
"Signature algorithm" ), QgsAuthCertUtils::qcaSignatureAlgorithm( mCurrentACert.signatureAlgorithm() ), LineEdit );
467void QgsAuthCertInfo::populateInfoDetailsSection()
475 if ( mCurrentQCert.isNull() )
479 addFieldItem( mGrpSubj, tr(
"Country (C)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::CountryName ), LineEdit );
480 addFieldItem( mGrpSubj, tr(
"State/Province (ST)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::StateOrProvinceName ), LineEdit );
481 addFieldItem( mGrpSubj, tr(
"Locality (L)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::LocalityName ), LineEdit );
482 addFieldItem( mGrpSubj, tr(
"Organization (O)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::Organization ), LineEdit );
483 addFieldItem( mGrpSubj, tr(
"Organizational unit (OU)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::OrganizationalUnitName ), LineEdit );
484 addFieldItem( mGrpSubj, tr(
"Common name (CN)" ),
SSL_SUBJECT_INFO( mCurrentQCert, QSslCertificate::CommonName ), LineEdit );
485 addFieldItem( mGrpSubj, tr(
"Email address (E)" ), mCurrentACert.subjectInfo().value( QCA::Email ), LineEdit );
486 addFieldItem( mGrpSubj, tr(
"Distinguished name" ), QgsAuthCertUtils::getCertDistinguishedName( mCurrentQCert, mCurrentACert,
false ), LineEdit );
487 addFieldItem( mGrpSubj, tr(
"Email Legacy" ), mCurrentACert.subjectInfo().value( QCA::EmailLegacy ), LineEdit );
488 addFieldItem( mGrpSubj, tr(
"Incorporation Country" ), mCurrentACert.subjectInfo().value( QCA::IncorporationCountry ), LineEdit );
489 addFieldItem( mGrpSubj, tr(
"Incorporation State/Province" ), mCurrentACert.subjectInfo().value( QCA::IncorporationState ), LineEdit );
490 addFieldItem( mGrpSubj, tr(
"Incorporation Locality" ), mCurrentACert.subjectInfo().value( QCA::IncorporationLocality ), LineEdit );
491 addFieldItem( mGrpSubj, tr(
"URI" ), mCurrentACert.subjectInfo().value( QCA::URI ), LineEdit );
492 addFieldItem( mGrpSubj, tr(
"DNS" ), mCurrentACert.subjectInfo().value( QCA::DNS ), LineEdit );
493 addFieldItem( mGrpSubj, tr(
"IP Address" ), mCurrentACert.subjectInfo().value( QCA::IPAddress ), LineEdit );
494 addFieldItem( mGrpSubj, tr(
"XMPP" ), mCurrentACert.subjectInfo().value( QCA::XMPP ), LineEdit );
496 const QMultiMap<QSsl::AlternativeNameEntryType, QString> alts( mCurrentQCert.subjectAlternativeNames() );
497 QStringList altslist;
498 const QString email( tr(
"Email: " ) );
499 const QStringList emails( alts.values( QSsl::EmailEntry ) );
500 if ( !emails.isEmpty() )
502 altslist << email + emails.join(
'\n' + email );
504 const QString dns( tr(
"DNS: " ) );
505 const QStringList dnss( alts.values( QSsl::DnsEntry ) );
506 if ( !dnss.isEmpty() )
508 altslist << dns + dnss.join(
'\n' + dns );
510 addFieldItem( mGrpSubj, tr(
"Alternate names" ), altslist.join( QLatin1Char(
'\n' ) ), TextEdit );
513 addFieldItem( mGrpIssu, tr(
"Country (C)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::CountryName ), LineEdit );
514 addFieldItem( mGrpIssu, tr(
"State/Province (ST)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::StateOrProvinceName ), LineEdit );
515 addFieldItem( mGrpIssu, tr(
"Locality (L)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::LocalityName ), LineEdit );
516 addFieldItem( mGrpIssu, tr(
"Organization (O)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::Organization ), LineEdit );
517 addFieldItem( mGrpIssu, tr(
"Organizational unit (OU)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::OrganizationalUnitName ), LineEdit );
518 addFieldItem( mGrpIssu, tr(
"Common name (CN)" ),
SSL_ISSUER_INFO( mCurrentQCert, QSslCertificate::CommonName ), LineEdit );
519 addFieldItem( mGrpIssu, tr(
"Email address (E)" ), mCurrentACert.issuerInfo().value( QCA::Email ), LineEdit );
520 addFieldItem( mGrpIssu, tr(
"Distinguished name" ), QgsAuthCertUtils::getCertDistinguishedName( mCurrentQCert, mCurrentACert,
true ), LineEdit );
521 addFieldItem( mGrpIssu, tr(
"Email Legacy" ), mCurrentACert.issuerInfo().value( QCA::EmailLegacy ), LineEdit );
522 addFieldItem( mGrpIssu, tr(
"Incorporation Country" ), mCurrentACert.issuerInfo().value( QCA::IncorporationCountry ), LineEdit );
523 addFieldItem( mGrpIssu, tr(
"Incorporation State/Province" ), mCurrentACert.issuerInfo().value( QCA::IncorporationState ), LineEdit );
524 addFieldItem( mGrpIssu, tr(
"Incorporation Locality" ), mCurrentACert.issuerInfo().value( QCA::IncorporationLocality ), LineEdit );
525 addFieldItem( mGrpIssu, tr(
"URI" ), mCurrentACert.issuerInfo().value( QCA::URI ), LineEdit );
526 addFieldItem( mGrpIssu, tr(
"DNS" ), mCurrentACert.issuerInfo().value( QCA::DNS ), LineEdit );
527 addFieldItem( mGrpIssu, tr(
"IP Address" ), mCurrentACert.issuerInfo().value( QCA::IPAddress ), LineEdit );
528 addFieldItem( mGrpIssu, tr(
"XMPP" ), mCurrentACert.issuerInfo().value( QCA::XMPP ), LineEdit );
531 addFieldItem( mGrpCert, tr(
"Version" ), mCurrentQCert.version(), LineEdit );
532 addFieldItem( mGrpCert, tr(
"Serial #" ), mCurrentQCert.serialNumber(), LineEdit );
533 addFieldItem( mGrpCert, tr(
"Not valid before" ), mCurrentQCert.effectiveDate().toString(), LineEdit, mCurrentQCert.effectiveDate() > QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
534 addFieldItem( mGrpCert, tr(
"Not valid after" ), mCurrentQCert.expiryDate().toString(), LineEdit, mCurrentQCert.expiryDate() < QDateTime::currentDateTime() ?
QgsAuthGuiUtils::redColor() : QColor() );
535 addFieldItem( mGrpCert, tr(
"Signature algorithm" ), QgsAuthCertUtils::qcaSignatureAlgorithm( mCurrentACert.signatureAlgorithm() ), LineEdit );
536 addFieldItem( mGrpCert, tr(
"MD5 fingerprint" ), QgsAuthCertUtils::getColonDelimited( mCurrentQCert.digest().toHex().toUpper() ), LineEdit );
537 addFieldItem( mGrpCert, tr(
"SHA1 fingerprint" ), QgsAuthCertUtils::shaHexForCert( mCurrentQCert,
true ).toUpper(), LineEdit );
539 const QStringList crllocs( mCurrentACert.crlLocations() );
540 if ( !crllocs.isEmpty() )
542 addFieldItem( mGrpCert, tr(
"CRL locations" ), crllocs.join( QLatin1Char(
'\n' ) ), TextEdit );
544 const QStringList issulocs( mCurrentACert.issuerLocations() );
545 if ( !issulocs.isEmpty() )
547 addFieldItem( mGrpCert, tr(
"Issuer locations" ), issulocs.join( QLatin1Char(
'\n' ) ), TextEdit );
549 const QStringList ocsplocs( mCurrentACert.ocspLocations() );
550 if ( !ocsplocs.isEmpty() )
552 addFieldItem( mGrpCert, tr(
"OCSP locations" ), ocsplocs.join( QLatin1Char(
'\n' ) ), TextEdit );
557 const QSslKey pubqkey( mCurrentQCert.publicKey() );
558 const QString alg( pubqkey.algorithm() == QSsl::Rsa ?
"RSA" :
"DSA" );
559 const int bitsize( pubqkey.length() );
560 addFieldItem( mGrpPkey, tr(
"Algorithm" ), bitsize == -1 ? u
"Unknown (possibly Elliptic Curve)"_s : alg, LineEdit );
561 addFieldItem( mGrpPkey, tr(
"Key size" ), bitsize == -1 ? u
"?"_s : QString::number( bitsize ), LineEdit );
564 const QCA::PublicKey pubakey( mCurrentACert.subjectPublicKey() );
566 if ( pubqkey.algorithm() == QSsl::Rsa )
568 const QCA::RSAPublicKey rsakey( pubakey.toRSA() );
569 const QCA::BigInteger modulus = rsakey.n();
570 QByteArray modarray( modulus.toArray().toByteArray().toHex() );
571 if ( modarray.size() > 2 && modarray.mid( 0, 2 ) == QByteArray(
"00" ) )
573 modarray = modarray.mid( 2 );
575 const QCA::BigInteger exponent = rsakey.e();
576 addFieldItem( mGrpPkey, tr(
"Public key" ), QgsAuthCertUtils::getColonDelimited( modarray ).toUpper(), TextEdit );
577 addFieldItem( mGrpPkey, tr(
"Exponent" ), exponent.toString(), LineEdit );
589 if ( pubakey.canVerify() )
591 usage.append( tr(
"Verify" ) );
595 if ( pubakey.canEncrypt() )
597 usage.append( tr(
"Encrypt" ) );
599#if QCA_VERSION >= 0x020100
600 if ( pubakey.canDecrypt() )
602 usage.append( tr(
"Decrypt" ) );
605 if ( pubakey.canKeyAgree() )
607 usage.append( tr(
"Key agreement" ) );
609 if ( pubakey.canExport() )
611 usage.append( tr(
"Export" ) );
613 if ( !usage.isEmpty() )
615 addFieldItem( mGrpPkey, tr(
"Key usage" ), usage.join(
", "_L1 ), LineEdit );
620 QStringList basicconst;
621 basicconst << tr(
"Certificate Authority: %1" ).arg( mCurrentACert.isCA() ? tr(
"Yes" ) : tr(
"No" ) ) << tr(
"Chain Path Limit: %1" ).arg( mCurrentACert.pathLimit() );
622 addFieldItem( mGrpExts, tr(
"Basic constraints" ), basicconst.join( QLatin1Char(
'\n' ) ), TextEdit );
624 QStringList keyusage;
625 QStringList extkeyusage;
626 const QList<QCA::ConstraintType> certconsts = mCurrentACert.constraints();
627 const auto constCertconsts = certconsts;
628 for (
const QCA::ConstraintType &certconst : constCertconsts )
630 if ( certconst.section() == QCA::ConstraintType::KeyUsage )
632 keyusage.append( QgsAuthCertUtils::qcaKnownConstraint( certconst.known() ) );
634 else if ( certconst.section() == QCA::ConstraintType::ExtendedKeyUsage )
636 extkeyusage.append( QgsAuthCertUtils::qcaKnownConstraint( certconst.known() ) );
639 if ( !keyusage.isEmpty() )
641 addFieldItem( mGrpExts, tr(
"Key usage" ), keyusage.join( QLatin1Char(
'\n' ) ), TextEdit );
643 if ( !extkeyusage.isEmpty() )
645 addFieldItem( mGrpExts, tr(
"Extended key usage" ), extkeyusage.join( QLatin1Char(
'\n' ) ), TextEdit );
648 addFieldItem( mGrpExts, tr(
"Subject key ID" ), QgsAuthCertUtils::getColonDelimited( mCurrentACert.subjectKeyId().toHex() ).toUpper(), LineEdit );
649 addFieldItem( mGrpExts, tr(
"Authority key ID" ), QgsAuthCertUtils::getColonDelimited( mCurrentACert.issuerKeyId().toHex() ).toUpper(), LineEdit );
652void QgsAuthCertInfo::populateInfoPemTextSection()
656 if ( mCurrentQCert.isNull() )
659 QTreeWidgetItem *item =
new QTreeWidgetItem( mSecPemText, QStringList( QString() ),
static_cast<int>( DetailsField ) );
661 item->setFirstColumnSpanned(
true );
663 QPlainTextEdit *pte =
new QPlainTextEdit( mCurrentQCert.toPem(), treeDetails );
664 pte->setReadOnly(
true );
665 pte->setMinimumHeight( 150 );
666 pte->setMaximumHeight( 150 );
667 pte->moveCursor( QTextCursor::Start );
668 item->treeWidget()->setItemWidget( item, 0, pte );
671void QgsAuthCertInfo::btnSaveTrust_clicked()
676 QgsDebugError( u
"Could not set trust policy for certificate"_s );
678 mCurrentTrustPolicy = newpolicy;
679 decorateCertTreeItem( mCurrentQCert, newpolicy,
nullptr );
680 btnSaveTrust->setEnabled(
false );
684 mTrustCacheRebuilt =
true;
688void QgsAuthCertInfo::currentPolicyIndexChanged(
int indx )
691 btnSaveTrust->setEnabled( newpolicy != mCurrentTrustPolicy );
698 item = treeHierarchy->currentItem();
709 QBrush b( item->foreground( 0 ) );
710 b.setColor( QColor::fromRgb( 90, 90, 90 ) );
711 item->setForeground( 0, b );
712 QFont f( item->font( 0 ) );
714 item->setFont( 0, f );
718 if ( !QgsAuthCertUtils::certIsViable( cert ) )
744 setWindowTitle( tr(
"Certificate Information" ) );
745 QVBoxLayout *layout =
new QVBoxLayout(
this );
746 layout->setContentsMargins( 6, 6, 6, 6 );
748 mCertInfoWdgt =
new QgsAuthCertInfo( cert, manageCertTrust,
this, connectionCAs );
749 layout->addWidget( mCertInfoWdgt );
751 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Close, Qt::Horizontal,
this );
752 buttonBox->button( QDialogButtonBox::Close )->setDefault(
true );
753 connect( buttonBox, &QDialogButtonBox::rejected,
this, &QWidget::close );
754 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.
CertTrustPolicy
Type of certificate trust policy.
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)