QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgsauthguiutils.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsauthutils.cpp
3  ---------------------
4  begin : October 24, 2014
5  copyright : (C) 2014 by Boundless Spatial, Inc. USA
6  author : Larry Shaffer
7  email : lshaffer at boundlessgeo dot com
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include "qgsauthguiutils.h"
18 
19 #include <QFileDialog>
20 #include <QLineEdit>
21 #include <QMessageBox>
22 
23 #include "qgssettings.h"
24 #include "qgsauthmanager.h"
26 #include "qgslogger.h"
27 #include "qgsmessagebar.h"
28 #include "qgsapplication.h"
29 
30 
32 {
33  return QColor( 0, 170, 0 );
34 }
35 
37 {
38  return QColor( 255, 128, 0 );
39 }
40 
42 {
43  return QColor( 200, 0, 0 );
44 }
45 
47 {
48  return QColor( 255, 255, 125 );
49 }
50 
51 QString QgsAuthGuiUtils::greenTextStyleSheet( const QString &selector )
52 {
53  return QStringLiteral( "%1{color: %2;}" ).arg( selector, QgsAuthGuiUtils::greenColor().name() );
54 }
55 
56 QString QgsAuthGuiUtils::orangeTextStyleSheet( const QString &selector )
57 {
58  return QStringLiteral( "%1{color: %2;}" ).arg( selector, QgsAuthGuiUtils::orangeColor().name() );
59 }
60 
61 QString QgsAuthGuiUtils::redTextStyleSheet( const QString &selector )
62 {
63  return QStringLiteral( "%1{color: %2;}" ).arg( selector, QgsAuthGuiUtils::redColor().name() );
64 }
65 
67 {
69  {
70  msgbar->pushMessage( QObject::tr( "Authentication System" ),
71  QObject::tr( "DISABLED. Resources authenticating via the system can not be accessed" ),
73  return true;
74  }
75  return false;
76 }
77 
79 {
80  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
81  return;
82 
83  if ( QgsApplication::authManager()->masterPasswordIsSet() )
84  {
85  msgbar->pushMessage( QgsApplication::authManager()->authManTag(),
86  QObject::tr( "Master password already set." ),
87  Qgis::Info );
88  return;
89  }
91 }
92 
94 {
95  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
96  return;
97 
98  QString msg( QObject::tr( "Master password not cleared because it is not set." ) );
100 
101  if ( QgsApplication::authManager()->masterPasswordIsSet() )
102  {
104  msg = QObject::tr( "Master password cleared (NOTE: network connections may be cached)." );
105  if ( QgsApplication::authManager()->masterPasswordIsSet() )
106  {
107  msg = QObject::tr( "Master password FAILED to be cleared." );
108  level = Qgis::Warning;
109  }
110  }
111 
112  msgbar->pushMessage( QgsApplication::authManager()->authManTag(), msg, level );
113 }
114 
115 void QgsAuthGuiUtils::resetMasterPassword( QgsMessageBar *msgbar, QWidget *parent )
116 {
117  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
118  return;
119 
120  QString msg( QObject::tr( "Master password reset" ) );
122 
123  // check that a master password is even set in auth db
124  if ( !QgsApplication::authManager()->masterPasswordHashInDatabase() )
125  {
126  msg = QObject::tr( "Master password reset: NO current password hash in database" );
127  msgbar->pushMessage( QgsApplication::authManager()->authManTag(), msg, Qgis::Warning );
128  return;
129  }
130 
131  // get new password via dialog; do current password verification in-dialog
132  QString newpass;
133  QString oldpass;
134  bool keepbackup = false;
135  QgsMasterPasswordResetDialog dlg( parent );
136 
137  if ( !dlg.requestMasterPasswordReset( &newpass, &oldpass, &keepbackup ) )
138  {
139  QgsDebugMsg( QStringLiteral( "Master password reset: input canceled by user" ) );
140  return;
141  }
142 
143  QString backuppath;
144  if ( !QgsApplication::authManager()->resetMasterPassword( newpass, oldpass, keepbackup, &backuppath ) )
145  {
146  msg = QObject::tr( "Master password FAILED to be reset" );
147  level = Qgis::Warning;
148  }
149 
150  if ( !backuppath.isEmpty() )
151  {
152  msg += QObject::tr( " (database backup: %1)" ).arg( backuppath );
153  }
154 
155  msgbar->pushMessage( QgsApplication::authManager()->authManTag(), msg, level );
156 }
157 
159 {
160  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
161  return;
162 
164  QString msg = QObject::tr( "Cached authentication configurations for session cleared" );
165  msgbar->pushMessage( QgsApplication::authManager()->authManTag(), msg, Qgis::Info );
166 }
167 
169 {
170  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
171  return;
172 
173  if ( QMessageBox::warning( parent,
174  QObject::tr( "Remove Configurations" ),
175  QObject::tr( "Are you sure you want to remove ALL authentication configurations?\n\n"
176  "Operation can NOT be undone!" ),
177  QMessageBox::Ok | QMessageBox::Cancel,
178  QMessageBox::Cancel ) == QMessageBox::Cancel )
179  {
180  return;
181  }
182 
183  QString msg( QObject::tr( "Authentication configurations removed." ) );
185 
186  if ( !QgsApplication::authManager()->removeAllAuthenticationConfigs() )
187  {
188  msg = QObject::tr( "Authentication configurations FAILED to be removed." );
189  level = Qgis::Warning;
190  }
191 
192  msgbar->pushMessage( QgsApplication::authManager()->authManTag(), msg, level );
193 }
194 
196 {
197  if ( QgsAuthGuiUtils::isDisabled( msgbar ) )
198  return;
199 
200  QMessageBox::StandardButton btn = QMessageBox::warning(
201  parent,
202  QObject::tr( "Erase Database" ),
203  QObject::tr( "Are you sure you want to ERASE the entire authentication database?\n\n"
204  "Operation can NOT be undone!\n\n"
205  "(Current database will be backed up and new one created.)" ),
206  QMessageBox::Ok | QMessageBox::Cancel,
207  QMessageBox::Cancel );
208 
210 
211  if ( btn == QMessageBox::Cancel )
212  {
213  return;
214  }
215 
216  QString msg( QObject::tr( "Active authentication database erased." ) );
218 
219  QString backuppath;
220  if ( !QgsApplication::authManager()->eraseAuthenticationDatabase( true, &backuppath ) )
221  {
222  msg = QObject::tr( "Authentication database FAILED to be erased." );
223  level = Qgis::Warning;
224  }
225  else
226  {
227  if ( !backuppath.isEmpty() )
228  {
229  msg += QObject::tr( " (backup: %1)" ).arg( backuppath );
230  }
231  level = Qgis::Critical;
232  }
233 
234  msgbar->pushMessage( QObject::tr( "RESTART QGIS" ), msg, level );
235 }
236 
237 void QgsAuthGuiUtils::fileFound( bool found, QWidget *widget )
238 {
239  if ( !found )
240  {
241  widget->setStyleSheet( QgsAuthGuiUtils::redTextStyleSheet( QStringLiteral( "QLineEdit" ) ) );
242  widget->setToolTip( QObject::tr( "File not found" ) );
243  }
244  else
245  {
246  widget->setStyleSheet( QString() );
247  widget->setToolTip( QString() );
248  }
249 }
250 
251 QString QgsAuthGuiUtils::getOpenFileName( QWidget *parent, const QString &title, const QString &extfilter )
252 {
253  QgsSettings settings;
254  QString recentdir = settings.value( QStringLiteral( "UI/lastAuthOpenFileDir" ), QDir::homePath() ).toString();
255  QString f = QFileDialog::getOpenFileName( parent, title, recentdir, extfilter );
256  if ( !f.isEmpty() )
257  {
258  settings.setValue( QStringLiteral( "UI/lastAuthOpenFileDir" ), QFileInfo( f ).absoluteDir().path() );
259  }
260  return f;
261 }
262 
263 void QgsAuthGuiUtils::passwordHelperDelete( QgsMessageBar *msgbar, QWidget *parent )
264 {
265  if ( QMessageBox::warning( parent,
266  QObject::tr( "Delete Password" ),
267  QObject::tr( "Do you really want to delete the master password from your %1?" )
269  QMessageBox::Ok | QMessageBox::Cancel,
270  QMessageBox::Cancel ) == QMessageBox::Cancel )
271  {
272  return;
273  }
274  QString msg;
275  Qgis::MessageLevel level;
277  {
279  level = Qgis::Warning;
280  }
281  else
282  {
283  msg = QObject::tr( "Master password was successfully deleted from your %1" )
285 
286  level = Qgis::Info;
287  }
288  msgbar->pushMessage( QObject::tr( "Password helper delete" ), msg, level );
289 }
290 
292 {
293  QString msg;
294  Qgis::MessageLevel level;
295  if ( ! QgsApplication::authManager()->masterPasswordIsSet() )
296  {
297  msg = QObject::tr( "Master password is not set and cannot be stored in your %1." )
299  level = Qgis::Warning;
300  }
302  {
304  level = Qgis::Warning;
305  }
306  else
307  {
308  msg = QObject::tr( "Master password has been successfully stored in your %1." )
310 
311  level = Qgis::Info;
312  }
313  msgbar->pushMessage( QObject::tr( "Password helper write" ), msg, level );
314 }
315 
317 {
319  QString msg = enabled ? QObject::tr( "Your %1 will be <b>used from now</b> on to store and retrieve the master password." )
321  QObject::tr( "Your %1 will <b>not be used anymore</b> to store and retrieve the master password." )
323  msgbar->pushMessage( QObject::tr( "Password helper write" ), msg, Qgis::Info );
324 }
325 
326 void QgsAuthGuiUtils::passwordHelperLoggingEnable( bool enabled, QgsMessageBar *msgbar, int timeout )
327 {
328  Q_UNUSED( msgbar )
329  Q_UNUSED( timeout )
331 }
MessageLevel
Level for messages This will be used both for message log and message bar in application.
Definition: qgis.h:89
@ Warning
Definition: qgis.h:91
@ Critical
Definition: qgis.h:92
@ Info
Definition: qgis.h:90
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
static QString greenTextStyleSheet(const QString &selector="*")
Green text stylesheet representing valid, trusted, etc. certificate.
static void resetMasterPassword(QgsMessageBar *msgbar, QWidget *parent=nullptr)
Reset the cached master password, updating its hash in authentication database and resetting all exis...
static QColor greenColor()
Green color representing valid, trusted, etc. certificate.
static QColor orangeColor()
Orange color representing loaded component, but not stored in database.
static QString redTextStyleSheet(const QString &selector="*")
Red text stylesheet representing invalid, untrusted, etc. certificate.
static void clearCachedMasterPassword(QgsMessageBar *msgbar)
Clear the currently cached master password (not its hash in database)
static void passwordHelperEnable(bool enabled, QgsMessageBar *msgbar)
Sets password helper enabled (enable/disable)
static QString orangeTextStyleSheet(const QString &selector="*")
Orange text stylesheet representing loaded component, but not stored in database.
static void clearCachedAuthenticationConfigs(QgsMessageBar *msgbar)
Clear all cached authentication configs for session.
static bool isDisabled(QgsMessageBar *msgbar)
Verify the authentication system is active, else notify user.
static void passwordHelperLoggingEnable(bool enabled, QgsMessageBar *msgbar, int timeout=0)
Sets password helper logging enabled (enable/disable)
static void eraseAuthenticationDatabase(QgsMessageBar *msgbar, QWidget *parent=nullptr)
Completely clear out the authentication database (configs and master password)
static void removeAuthenticationConfigs(QgsMessageBar *msgbar, QWidget *parent=nullptr)
Remove all authentication configs.
static QColor yellowColor()
Yellow color representing caution regarding action.
static void fileFound(bool found, QWidget *widget)
Color a widget via a stylesheet if a file path is found or not.
static void setMasterPassword(QgsMessageBar *msgbar)
Sets the cached master password (and verifies it if its hash is in authentication database)
static QString getOpenFileName(QWidget *parent, const QString &title, const QString &extfilter)
Open file dialog for auth associated widgets.
static void passwordHelperDelete(QgsMessageBar *msgbar, QWidget *parent=nullptr)
Remove master password from wallet.
static void passwordHelperSync(QgsMessageBar *msgbar)
Store master password into the wallet.
static QColor redColor()
Red color representing invalid, untrusted, etc. certificate.
void clearAllCachedConfigs()
Clear all authentication configs from authentication method caches.
void setPasswordHelperEnabled(bool enabled)
Password helper enabled setter.
void setScheduledAuthDatabaseErase(bool scheduleErase)
Schedule an optional erase of authentication database, starting when mutex is lockable.
void clearMasterPassword()
Clear supplied master password.
const QString passwordHelperErrorMessage()
Error message getter.
void setPasswordHelperLoggingEnabled(bool enabled)
Password helper logging enabled setter.
bool setMasterPassword(bool verify=false)
Main call to initially set or continually check master password is set.
static const QString AUTH_PASSWORD_HELPER_DISPLAY_NAME
The display name of the password helper (platform dependent)
Dialog to verify current master password and initiate reset of authentication database with a new pas...
bool requestMasterPasswordReset(QString *newpass, QString *oldpass, bool *keepbackup)
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:61
void pushMessage(const QString &text, Qgis::MessageLevel level=Qgis::Info, int duration=-1)
A convenience method for pushing a message with the specified text to the bar.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38