17#include "ui_qgsauthidentitieseditor.h"
34#include "moc_qgsauthidentitieseditor.cpp"
36using namespace Qt::StringLiterals;
44 mAuthNotifyLayout =
new QVBoxLayout;
45 this->setLayout( mAuthNotifyLayout );
47 mAuthNotifyLayout->addWidget( mAuthNotify );
52 connect( btnAddIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnAddIdentity_clicked );
53 connect( btnRemoveIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnRemoveIdentity_clicked );
54 connect( btnInfoIdentity, &QToolButton::clicked,
this, &QgsAuthIdentitiesEditor::btnInfoIdentity_clicked );
55 connect( btnGroupByOrg, &QToolButton::toggled,
this, &QgsAuthIdentitiesEditor::btnGroupByOrg_toggled );
61 setupIdentitiesTree();
63 connect( treeIdentities->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsAuthIdentitiesEditor::selectionChanged );
65 connect( treeIdentities, &QTreeWidget::itemDoubleClicked,
this, &QgsAuthIdentitiesEditor::handleDoubleClick );
67 connect( btnViewRefresh, &QAbstractButton::clicked,
this, &QgsAuthIdentitiesEditor::refreshIdentitiesView );
69 btnGroupByOrg->setChecked(
false );
72 btnGroupByOrg->setChecked( sortbyval.toBool() );
74 populateIdentitiesView();
79void QgsAuthIdentitiesEditor::setupIdentitiesTree()
81 treeIdentities->setColumnCount( 3 );
82 treeIdentities->setHeaderLabels(
83 QStringList() << tr(
"Common Name" )
85 << tr(
"Expiry Date" )
87 treeIdentities->setColumnWidth( 0, 300 );
88 treeIdentities->setColumnWidth( 1, 75 );
91 mRootCertIdentItem =
new QTreeWidgetItem(
93 QStringList( tr(
"Certificate Bundles" ) ),
94 static_cast<int>( QgsAuthIdentitiesEditor::Section )
97 mRootCertIdentItem->setFlags( Qt::ItemIsEnabled );
98 mRootCertIdentItem->setExpanded(
true );
99 treeIdentities->insertTopLevelItem( 0, mRootCertIdentItem );
102void QgsAuthIdentitiesEditor::populateIdentitiesView()
106 populateIdentitiesSection( mRootCertIdentItem,
QgsApplication::authManager()->certIdentities(), QgsAuthIdentitiesEditor::CertIdentity );
109void QgsAuthIdentitiesEditor::refreshIdentitiesView()
111 populateIdentitiesView();
114void QgsAuthIdentitiesEditor::populateIdentitiesSection( QTreeWidgetItem *item,
const QList<QSslCertificate> &certs, QgsAuthIdentitiesEditor::IdentityType identype )
116 if ( btnGroupByOrg->isChecked() )
118 appendIdentitiesToGroup( certs, identype, item );
122 appendIdentitiesToItem( certs, identype, item );
126void QgsAuthIdentitiesEditor::appendIdentitiesToGroup(
const QList<QSslCertificate> &certs, QgsAuthIdentitiesEditor::IdentityType identype, QTreeWidgetItem *parent )
133 parent = treeIdentities->currentItem();
137 const QMap<QString, QList<QSslCertificate>> orgcerts(
138 QgsAuthCertUtils::certsGroupedByOrg( certs )
141 QMap<QString, QList<QSslCertificate>>::const_iterator it = orgcerts.constBegin();
142 for ( ; it != orgcerts.constEnd(); ++it )
144 QTreeWidgetItem *grpitem(
new QTreeWidgetItem( parent, QStringList() << it.key(),
static_cast<int>( QgsAuthIdentitiesEditor::OrgName ) ) );
145 grpitem->setFirstColumnSpanned(
true );
146 grpitem->setFlags( Qt::ItemIsEnabled );
147 grpitem->setExpanded(
true );
149 QBrush orgb( grpitem->foreground( 0 ) );
150 orgb.setColor( QColor::fromRgb( 90, 90, 90 ) );
151 grpitem->setForeground( 0, orgb );
152 QFont grpf( grpitem->font( 0 ) );
153 grpf.setItalic(
true );
154 grpitem->setFont( 0, grpf );
156 appendIdentitiesToItem( it.value(), identype, grpitem );
159 parent->sortChildren( 0, Qt::AscendingOrder );
162void QgsAuthIdentitiesEditor::appendIdentitiesToItem(
const QList<QSslCertificate> &certs, QgsAuthIdentitiesEditor::IdentityType identype, QTreeWidgetItem *parent )
169 parent = treeIdentities->currentItem();
175 const auto constCerts = certs;
176 for (
const QSslCertificate &cert : constCerts )
178 const QString id( QgsAuthCertUtils::shaHexForCert( cert ) );
181 coltxts << QgsAuthCertUtils::resolvedCertName( cert );
182 coltxts << QString( cert.serialNumber() );
183 coltxts << cert.expiryDate().toString();
185 QTreeWidgetItem *item(
new QTreeWidgetItem( parent, coltxts,
static_cast<int>( identype ) ) );
188 if ( !QgsAuthCertUtils::certIsViable( cert ) )
190 item->setForeground( 2, redb );
194 item->setData( 0, Qt::UserRole,
id );
197 parent->sortChildren( 0, Qt::AscendingOrder );
200void QgsAuthIdentitiesEditor::showCertInfo( QTreeWidgetItem *item )
205 const QString digest( item->data( 0, Qt::UserRole ).toString() );
209 QgsDebugError( u
"Certificate identity does not exist in database"_s );
215 QgsAuthCertInfoDialog *dlg =
new QgsAuthCertInfoDialog( cert,
false,
this );
216 dlg->setWindowModality( Qt::WindowModal );
217 dlg->resize( 675, 500 );
222void QgsAuthIdentitiesEditor::selectionChanged(
const QItemSelection &selected,
const QItemSelection &deselected )
225 Q_UNUSED( deselected )
229void QgsAuthIdentitiesEditor::checkSelection()
232 if ( treeIdentities->selectionModel()->selection().length() > 0 )
234 QTreeWidgetItem *item( treeIdentities->currentItem() );
236 switch ( ( QgsAuthIdentitiesEditor::IdentityType ) item->type() )
238 case QgsAuthIdentitiesEditor::CertIdentity:
246 btnRemoveIdentity->setEnabled( iscert );
247 btnInfoIdentity->setEnabled( iscert );
250void QgsAuthIdentitiesEditor::handleDoubleClick( QTreeWidgetItem *item,
int col )
255 switch ( ( QgsAuthIdentitiesEditor::IdentityType ) item->type() )
257 case QgsAuthIdentitiesEditor::Section:
260 case QgsAuthIdentitiesEditor::OrgName:
269 showCertInfo( item );
273void QgsAuthIdentitiesEditor::btnAddIdentity_clicked()
276 dlg->setWindowModality( Qt::WindowModal );
277 dlg->resize( 400, dlg->height() );
287 populateIdentitiesView();
288 mRootCertIdentItem->setExpanded(
true );
294void QgsAuthIdentitiesEditor::btnRemoveIdentity_clicked()
296 QTreeWidgetItem *item( treeIdentities->currentItem() );
304 const QString digest( item->data( 0, Qt::UserRole ).toString() );
306 if ( digest.isEmpty() )
314 QgsDebugError( u
"Certificate identity does not exist in database"_s );
318 if ( QMessageBox::warning(
319 this, tr(
"Remove Certificate Identity" ),
320 tr(
"Are you sure you want to remove the selected "
321 "certificate identity from the database?\n\n"
322 "Operation can NOT be undone!" ),
323 QMessageBox::Ok | QMessageBox::Cancel,
326 == QMessageBox::Cancel )
333 messageBar()->pushMessage( tr(
"ERROR removing cert identity from authentication storage for id %1:" ).arg( digest ),
Qgis::MessageLevel::Critical );
337 item->parent()->removeChild( item );
341void QgsAuthIdentitiesEditor::btnInfoIdentity_clicked()
343 if ( treeIdentities->selectionModel()->selection().length() > 0 )
345 QTreeWidgetItem *item( treeIdentities->currentItem() );
346 handleDoubleClick( item, 0 );
350void QgsAuthIdentitiesEditor::btnGroupByOrg_toggled(
bool checked )
354 authMessageLog( QObject::tr(
"Could not store sort by preference." ), QObject::tr(
"Authentication Identities" ),
Qgis::MessageLevel::Warning );
356 populateIdentitiesView();
359void QgsAuthIdentitiesEditor::authMessageLog(
const QString &message,
const QString &authtag,
Qgis::MessageLevel level )
361 messageBar()->pushMessage( authtag, message, level, 7 );
368 treeIdentities->setFocus();
370 QWidget::showEvent( e );
378int QgsAuthIdentitiesEditor::messageTimeout()
380 const QgsSettings settings;
381 return settings.
value( u
"qgis/messageTimeout"_s, 5 ).toInt();
MessageLevel
Level for messages This will be used both for message log and message bar in application.
@ Warning
Warning message.
@ Critical
Critical/error message.
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.
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.
void showEvent(QShowEvent *e) override
Overridden show event of base widget.
QgsAuthIdentitiesEditor(QWidget *parent=nullptr)
Widget for editing authentication configurations directly in database.
const QPair< QSslCertificate, QSslKey > certBundleToImport()
Gets certificate/key bundle to be imported.
QgsAuthImportIdentityDialog::IdentityType identityType() const
Gets identity type.
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)
Returns a previously set authentication setting.
void messageLog(const QString &message, const QString &tag=QgsAuthManager::AUTH_MAN_TAG, Qgis::MessageLevel level=Qgis::MessageLevel::Info) const
Custom logging signal to relay to console output and QgsMessageLog.
A bar for displaying non-blocking messages to the user.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)