18 #include "ui_qgsauthidentitieseditor.h"
21 #include <QMessageBox>
23 #include "qgssettings.h"
39 mAuthNotifyLayout =
new QVBoxLayout;
40 this->setLayout( mAuthNotifyLayout );
42 mAuthNotifyLayout->addWidget( mAuthNotify );
47 connect( btnAddIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnAddIdentity_clicked );
48 connect( btnRemoveIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnRemoveIdentity_clicked );
49 connect( btnInfoIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnInfoIdentity_clicked );
50 connect( btnGroupByOrg, &QToolButton::toggled,
this, &QgsAuthIdentitiesEditor::btnGroupByOrg_toggled );
53 this, &QgsAuthIdentitiesEditor::authMessageOut );
56 this, &QgsAuthIdentitiesEditor::refreshIdentitiesView );
58 setupIdentitiesTree();
60 connect( treeIdentities->selectionModel(), &QItemSelectionModel::selectionChanged,
61 this, &QgsAuthIdentitiesEditor::selectionChanged );
63 connect( treeIdentities, &QTreeWidget::itemDoubleClicked,
64 this, &QgsAuthIdentitiesEditor::handleDoubleClick );
66 connect( btnViewRefresh, &QAbstractButton::clicked,
this, &QgsAuthIdentitiesEditor::refreshIdentitiesView );
68 btnGroupByOrg->setChecked(
false );
70 if ( !sortbyval.isNull() )
71 btnGroupByOrg->setChecked( sortbyval.toBool() );
73 populateIdentitiesView();
78 static void setItemBold_( QTreeWidgetItem *item )
80 item->setFirstColumnSpanned(
true );
81 QFont secf( item->font( 0 ) );
83 item->setFont( 0, secf );
86 void QgsAuthIdentitiesEditor::setupIdentitiesTree()
88 treeIdentities->setColumnCount( 3 );
89 treeIdentities->setHeaderLabels(
90 QStringList() << tr(
"Common Name" )
92 << tr(
"Expiry Date" ) );
93 treeIdentities->setColumnWidth( 0, 300 );
94 treeIdentities->setColumnWidth( 1, 75 );
97 mRootCertIdentItem =
new QTreeWidgetItem(
99 QStringList( tr(
"Certificate Bundles" ) ),
100 static_cast<int>( QgsAuthIdentitiesEditor::Section ) );
101 setItemBold_( mRootCertIdentItem );
102 mRootCertIdentItem->setFlags( Qt::ItemIsEnabled );
103 mRootCertIdentItem->setExpanded(
true );
104 treeIdentities->insertTopLevelItem( 0, mRootCertIdentItem );
107 static void removeChildren_( QTreeWidgetItem *item )
109 const auto constTakeChildren = item->takeChildren();
110 for ( QTreeWidgetItem *child : constTakeChildren )
116 void QgsAuthIdentitiesEditor::populateIdentitiesView()
118 removeChildren_( mRootCertIdentItem );
120 populateIdentitiesSection( mRootCertIdentItem,
122 QgsAuthIdentitiesEditor::CertIdentity );
125 void QgsAuthIdentitiesEditor::refreshIdentitiesView()
127 populateIdentitiesView();
130 void QgsAuthIdentitiesEditor::populateIdentitiesSection( QTreeWidgetItem *item,
const QList<QSslCertificate> &certs,
131 QgsAuthIdentitiesEditor::IdentityType identype )
133 if ( btnGroupByOrg->isChecked() )
135 appendIdentitiesToGroup( certs, identype, item );
139 appendIdentitiesToItem( certs, identype, item );
143 void QgsAuthIdentitiesEditor::appendIdentitiesToGroup(
const QList<QSslCertificate> &certs,
144 QgsAuthIdentitiesEditor::IdentityType identype,
145 QTreeWidgetItem *parent )
152 parent = treeIdentities->currentItem();
156 QMap< QString, QList<QSslCertificate> > orgcerts(
159 QMap< QString, QList<QSslCertificate> >::const_iterator it = orgcerts.constBegin();
160 for ( ; it != orgcerts.constEnd(); ++it )
162 QTreeWidgetItem *grpitem(
new QTreeWidgetItem( parent,
163 QStringList() << it.key(),
164 static_cast<int>( QgsAuthIdentitiesEditor::OrgName ) ) );
165 grpitem->setFirstColumnSpanned(
true );
166 grpitem->setFlags( Qt::ItemIsEnabled );
167 grpitem->setExpanded(
true );
169 QBrush orgb( grpitem->foreground( 0 ) );
170 orgb.setColor( QColor::fromRgb( 90, 90, 90 ) );
171 grpitem->setForeground( 0, orgb );
172 QFont grpf( grpitem->font( 0 ) );
173 grpf.setItalic(
true );
174 grpitem->setFont( 0, grpf );
176 appendIdentitiesToItem( it.value(), identype, grpitem );
179 parent->sortChildren( 0, Qt::AscendingOrder );
182 void QgsAuthIdentitiesEditor::appendIdentitiesToItem(
const QList<QSslCertificate> &certs,
183 QgsAuthIdentitiesEditor::IdentityType identype,
184 QTreeWidgetItem *parent )
191 parent = treeIdentities->currentItem();
197 const auto constCerts = certs;
198 for (
const QSslCertificate &cert : constCerts )
204 coltxts << QString( cert.serialNumber() );
205 coltxts << cert.expiryDate().toString();
207 QTreeWidgetItem *item(
new QTreeWidgetItem( parent, coltxts,
static_cast<int>( identype ) ) );
212 item->setForeground( 2, redb );
216 item->setData( 0, Qt::UserRole,
id );
219 parent->sortChildren( 0, Qt::AscendingOrder );
222 void QgsAuthIdentitiesEditor::showCertInfo( QTreeWidgetItem *item )
227 QString digest( item->data( 0, Qt::UserRole ).toString() );
231 QgsDebugMsg( QStringLiteral(
"Certificate identity does not exist in database" ) );
238 dlg->setWindowModality( Qt::WindowModal );
239 dlg->resize( 675, 500 );
244 void QgsAuthIdentitiesEditor::selectionChanged(
const QItemSelection &selected,
const QItemSelection &deselected )
247 Q_UNUSED( deselected )
251 void QgsAuthIdentitiesEditor::checkSelection()
254 if ( treeIdentities->selectionModel()->selection().length() > 0 )
256 QTreeWidgetItem *item( treeIdentities->currentItem() );
258 switch ( ( QgsAuthIdentitiesEditor::IdentityType )item->type() )
260 case QgsAuthIdentitiesEditor::CertIdentity:
268 btnRemoveIdentity->setEnabled( iscert );
269 btnInfoIdentity->setEnabled( iscert );
272 void QgsAuthIdentitiesEditor::handleDoubleClick( QTreeWidgetItem *item,
int col )
277 switch ( ( QgsAuthIdentitiesEditor::IdentityType )item->type() )
279 case QgsAuthIdentitiesEditor::Section:
282 case QgsAuthIdentitiesEditor::OrgName:
291 showCertInfo( item );
295 void QgsAuthIdentitiesEditor::btnAddIdentity_clicked()
298 dlg->setWindowModality( Qt::WindowModal );
299 dlg->resize( 400, dlg->height() );
307 messageBar()->
pushMessage( tr(
"ERROR storing identity bundle in authentication database." ),
308 Qgis::MessageLevel::Critical );
310 populateIdentitiesView();
311 mRootCertIdentItem->setExpanded(
true );
317 void QgsAuthIdentitiesEditor::btnRemoveIdentity_clicked()
319 QTreeWidgetItem *item( treeIdentities->currentItem() );
323 QgsDebugMsg( QStringLiteral(
"Current tree widget item not set" ) );
327 QString digest( item->data( 0, Qt::UserRole ).toString() );
329 if ( digest.isEmpty() )
331 messageBar()->
pushMessage( tr(
"Certificate id missing." ),
332 Qgis::MessageLevel::Warning );
338 QgsDebugMsg( QStringLiteral(
"Certificate identity does not exist in database" ) );
342 if ( QMessageBox::warning(
343 this, tr(
"Remove Certificate Identity" ),
344 tr(
"Are you sure you want to remove the selected "
345 "certificate identity from the database?\n\n"
346 "Operation can NOT be undone!" ),
347 QMessageBox::Ok | QMessageBox::Cancel,
348 QMessageBox::Cancel ) == QMessageBox::Cancel )
355 messageBar()->
pushMessage( tr(
"ERROR removing cert identity from authentication database for id %1:" ).arg( digest ),
356 Qgis::MessageLevel::Critical );
360 item->parent()->removeChild( item );
364 void QgsAuthIdentitiesEditor::btnInfoIdentity_clicked()
366 if ( treeIdentities->selectionModel()->selection().length() > 0 )
368 QTreeWidgetItem *item( treeIdentities->currentItem() );
369 handleDoubleClick( item, 0 );
373 void QgsAuthIdentitiesEditor::btnGroupByOrg_toggled(
bool checked )
377 authMessageOut( QObject::tr(
"Could not store sort by preference." ),
378 QObject::tr(
"Authentication Identities" ),
381 populateIdentitiesView();
386 int levelint =
static_cast<int>( level );
394 treeIdentities->setFocus();
396 QWidget::showEvent( e );
404 int QgsAuthIdentitiesEditor::messageTimeout()
406 QgsSettings settings;
407 return settings.value( QStringLiteral(
"qgis/messageTimeout" ), 5 ).toInt();
MessageLevel
Level for messages This will be used both for message log and message bar in application.
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.
Dialog wrapper for widget displaying detailed info on a certificate and its hierarchical trust chain.
static QString resolvedCertName(const QSslCertificate &cert, bool issuer=false)
Gets the general name via RFC 5280 resolution.
static QMap< QString, QList< QSslCertificate > > certsGroupedByOrg(const QList< QSslCertificate > &certs)
Map certificates to their oraganization.
static QString shaHexForCert(const QSslCertificate &cert, bool formatted=false)
Gets the sha1 hash for certificate.
static bool certIsViable(const QSslCertificate &cert)
certIsViable checks for viability errors of cert and whether it is NULL
static QColor redColor()
Red color representing invalid, untrusted, etc. certificate.
void showEvent(QShowEvent *e) override
Overridden show event of base widget.
QgsAuthIdentitiesEditor(QWidget *parent=nullptr)
Widget for editing authentication configurations directly in database.
Widget for importing an identity certificate/key bundle into the authentication database.
QgsAuthImportIdentityDialog::IdentityType identityType()
Gets identity type.
const QPair< QSslCertificate, QSslKey > certBundleToImport()
Gets certificate/key bundle to be imported.
MessageLevel
Message log level (mirrors that of QgsMessageLog, so it can also output there)
void messageOut(const QString &message, const QString &tag=QgsAuthManager::AUTH_MAN_TAG, QgsAuthManager::MessageLevel level=QgsAuthManager::INFO) const
Custom logging signal to relay to console output and QgsMessageLog.
void authDatabaseChanged()
Emitted when the authentication db is significantly changed, e.g. large record removal,...
QVariant authSetting(const QString &key, const QVariant &defaultValue=QVariant(), bool decrypt=false)
authSetting get an authentication setting (retrieved as string and returned as QVariant( QString ))
A bar for displaying non-blocking messages to the user.
void pushMessage(const QString &text, Qgis::MessageLevel level=Qgis::MessageLevel::Info, int duration=-1)
A convenience method for pushing a message with the specified text to the bar.