18 #include "ui_qgsauthserverseditor.h" 22 #include <QMessageBox> 38 mAuthNotifyLayout =
new QVBoxLayout;
39 this->setLayout( mAuthNotifyLayout );
41 mAuthNotifyLayout->addWidget( mAuthNotify );
46 connect( btnAddServer, &QToolButton::clicked,
this, &QgsAuthServersEditor::btnAddServer_clicked );
47 connect( btnRemoveServer, &QToolButton::clicked,
this, &QgsAuthServersEditor::btnRemoveServer_clicked );
48 connect( btnEditServer, &QToolButton::clicked,
this, &QgsAuthServersEditor::btnEditServer_clicked );
49 connect( btnGroupByOrg, &QToolButton::toggled,
this, &QgsAuthServersEditor::btnGroupByOrg_toggled );
52 this, &QgsAuthServersEditor::authMessageOut );
55 this, &QgsAuthServersEditor::refreshSslConfigsView );
57 setupSslConfigsTree();
59 connect( treeServerConfigs->selectionModel(), &QItemSelectionModel::selectionChanged,
60 this, &QgsAuthServersEditor::selectionChanged );
62 connect( treeServerConfigs, &QTreeWidget::itemDoubleClicked,
63 this, &QgsAuthServersEditor::handleDoubleClick );
65 connect( btnViewRefresh, &QAbstractButton::clicked,
this, &QgsAuthServersEditor::refreshSslConfigsView );
67 btnGroupByOrg->setChecked(
false );
69 if ( !sortbyval.isNull() )
70 btnGroupByOrg->setChecked( sortbyval.toBool() );
72 populateSslConfigsView();
77 static void setItemBold_( QTreeWidgetItem *item )
79 item->setFirstColumnSpanned(
true );
80 QFont secf( item->font( 0 ) );
82 item->setFont( 0, secf );
86 void QgsAuthServersEditor::setupSslConfigsTree()
88 treeServerConfigs->setColumnCount( 3 );
89 treeServerConfigs->setHeaderLabels(
90 QStringList() << tr(
"Common Name" )
92 << tr(
"Expiry Date" ) );
93 treeServerConfigs->setColumnWidth( 0, 275 );
94 treeServerConfigs->setColumnWidth( 1, 200 );
97 mRootSslConfigItem =
new QTreeWidgetItem(
99 QStringList( tr(
"SSL Server Configurations" ) ),
100 static_cast<int>( QgsAuthServersEditor::Section ) );
101 setItemBold_( mRootSslConfigItem );
102 mRootSslConfigItem->setFlags( Qt::ItemIsEnabled );
103 mRootSslConfigItem->setExpanded(
true );
104 treeServerConfigs->insertTopLevelItem( 0, mRootSslConfigItem );
107 static void removeChildren_( QTreeWidgetItem *item )
109 Q_FOREACH ( QTreeWidgetItem *child, item->takeChildren() )
115 void QgsAuthServersEditor::populateSslConfigsView()
117 removeChildren_( mRootSslConfigItem );
119 populateSslConfigsSection( mRootSslConfigItem,
121 QgsAuthServersEditor::ServerConfig );
124 void QgsAuthServersEditor::refreshSslConfigsView()
126 populateSslConfigsView();
129 void QgsAuthServersEditor::populateSslConfigsSection( QTreeWidgetItem *item,
130 const QList<QgsAuthConfigSslServer> &configs,
131 QgsAuthServersEditor::ConfigType conftype )
133 if ( btnGroupByOrg->isChecked() )
135 appendSslConfigsToGroup( configs, conftype, item );
139 appendSslConfigsToItem( configs, conftype, item );
143 void QgsAuthServersEditor::appendSslConfigsToGroup(
const QList<QgsAuthConfigSslServer> &configs,
144 QgsAuthServersEditor::ConfigType conftype,
145 QTreeWidgetItem *parent )
147 if ( configs.empty() )
152 parent = treeServerConfigs->currentItem();
156 QMap< QString, QList<QgsAuthConfigSslServer> > orgconfigs(
159 QMap< QString, QList<QgsAuthConfigSslServer> >::const_iterator it = orgconfigs.constBegin();
160 for ( ; it != orgconfigs.constEnd(); ++it )
162 QTreeWidgetItem *grpitem(
new QTreeWidgetItem( parent,
163 QStringList() << it.key(),
164 static_cast<int>( QgsAuthServersEditor::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 appendSslConfigsToItem( it.value(), conftype, grpitem );
179 parent->sortChildren( 0, Qt::AscendingOrder );
182 void QgsAuthServersEditor::appendSslConfigsToItem(
const QList<QgsAuthConfigSslServer> &configs,
183 QgsAuthServersEditor::ConfigType conftype,
184 QTreeWidgetItem *parent )
186 if ( configs.empty() )
191 parent = treeServerConfigs->currentItem();
205 coltxts << cert.expiryDate().toString();
207 QTreeWidgetItem *item(
new QTreeWidgetItem( parent, coltxts, static_cast<int>( conftype ) ) );
212 item->setForeground( 2, redb );
216 item->setData( 0, Qt::UserRole,
id );
219 parent->sortChildren( 0, Qt::AscendingOrder );
222 void QgsAuthServersEditor::selectionChanged(
const QItemSelection &selected,
const QItemSelection &deselected )
224 Q_UNUSED( selected );
225 Q_UNUSED( deselected );
229 void QgsAuthServersEditor::checkSelection()
231 bool isconfig =
false;
232 if ( treeServerConfigs->selectionModel()->selection().length() > 0 )
234 QTreeWidgetItem *item( treeServerConfigs->currentItem() );
236 switch ( ( QgsAuthServersEditor::ConfigType )item->type() )
238 case QgsAuthServersEditor::ServerConfig :
246 btnRemoveServer->setEnabled( isconfig );
247 btnEditServer->setEnabled( isconfig );
250 void QgsAuthServersEditor::handleDoubleClick( QTreeWidgetItem *item,
int col )
253 bool isconfig =
true;
255 switch ( ( QgsAuthServersEditor::ConfigType )item->type() )
257 case QgsAuthServersEditor::Section:
260 case QgsAuthServersEditor::OrgName:
269 btnEditServer_clicked();
273 void QgsAuthServersEditor::btnAddServer_clicked()
276 dlg->setWindowModality( Qt::WindowModal );
277 dlg->resize( 580, 512 );
280 refreshSslConfigsView();
285 void QgsAuthServersEditor::btnRemoveServer_clicked()
287 QTreeWidgetItem *item( treeServerConfigs->currentItem() );
291 QgsDebugMsg( QStringLiteral(
"Current tree widget item not set" ) );
295 QString digest( item->data( 0, Qt::UserRole ).toString() );
296 QString hostport( item->text( 1 ) );
298 if ( digest.isEmpty() )
300 messageBar()->
pushMessage( tr(
"SSL custom config id missing" ),
304 if ( hostport.isEmpty() )
306 messageBar()->
pushMessage( tr(
"SSL custom config host:port missing" ),
313 QgsDebugMsg( QStringLiteral(
"SSL custom config does not exist in database for host:port, id %1:" )
314 .arg( hostport, digest ) );
318 if ( QMessageBox::warning(
319 this, tr(
"Remove SSL Custom Configuration" ),
320 tr(
"Are you sure you want to remove the selected " 321 "SSL custom configuration from the database?\n\n" 322 "Operation can NOT be undone!" ),
323 QMessageBox::Ok | QMessageBox::Cancel,
324 QMessageBox::Cancel ) == QMessageBox::Cancel )
331 messageBar()->
pushMessage( tr(
"ERROR removing SSL custom config from authentication database for host:port, id %1:" )
332 .arg( hostport, digest ),
337 item->parent()->removeChild( item );
341 void QgsAuthServersEditor::btnEditServer_clicked()
343 QTreeWidgetItem *item( treeServerConfigs->currentItem() );
347 QgsDebugMsg( QStringLiteral(
"Current tree widget item not set" ) );
351 QString digest( item->data( 0, Qt::UserRole ).toString() );
352 QString hostport( item->text( 1 ) );
354 if ( digest.isEmpty() )
356 messageBar()->
pushMessage( tr(
"SSL custom config id missing." ),
360 if ( hostport.isEmpty() )
362 messageBar()->
pushMessage( tr(
"SSL custom config host:port missing." ),
369 QgsDebugMsg( QStringLiteral(
"SSL custom config does not exist in database" ) );
377 dlg->sslCustomConfigWidget()->setConfigCheckable(
false );
378 dlg->setWindowModality( Qt::WindowModal );
379 dlg->resize( 500, 500 );
382 refreshSslConfigsView();
387 void QgsAuthServersEditor::btnGroupByOrg_toggled(
bool checked )
391 authMessageOut( QObject::tr(
"Could not store sort by preference." ),
392 QObject::tr(
"Authentication SSL Configs" ),
395 populateSslConfigsView();
400 int levelint =
static_cast<int>( level );
408 treeServerConfigs->setFocus();
410 QWidget::showEvent( e );
418 int QgsAuthServersEditor::messageTimeout()
421 return settings.
value( QStringLiteral(
"qgis/messageTimeout" ), 5 ).toInt();
This class is a composition of two QSettings instances:
A bar for displaying non-blocking messages to the user.
Configuration container for SSL server connection exceptions or overrides.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
MessageLevel
Level for messages This will be used both for message log and message bar in application.
MessageLevel
Message log level (mirrors that of QgsMessageLog, so it can also output there)
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 authDatabaseChanged()
Emitted when the authentication db is significantly changed, e.g. large record removal, erased, etc.
static QMap< QString, QList< QgsAuthConfigSslServer > > sslConfigsGroupedByOrg(const QList< QgsAuthConfigSslServer > &configs)
Map SSL custom configs' certificates to their oraganization.
const QSslCertificate sslCertificate() const
Server certificate object.
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 pushMessage(const QString &text, Qgis::MessageLevel level=Qgis::Info, int duration=5)
convenience method for pushing a message to the bar
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.
Dialog wrapper of widget for editing an SSL server configuration.
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 )) ...
void showEvent(QShowEvent *e) override
QgsAuthServersEditor(QWidget *parent=nullptr)
Widget for editing authentication configurations directly in database.
Widget for importing an SSL server certificate exception into the authentication database.
const QString sslHostPort() const
Server host:port string.
static QString resolvedCertName(const QSslCertificate &cert, bool issuer=false)
Gets the general name via RFC 5280 resolution.