Skip to content

Commit 3919cc2

Browse files
committed
[auth][ogr][feature] Add basic authentication to selected OGR sources
- Protocol - DB (integration with QGIS auth system)
1 parent fe4f150 commit 3919cc2

9 files changed

+933
-225
lines changed

src/auth/basic/qgsauthbasicmethod.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ QgsAuthBasicMethod::QgsAuthBasicMethod()
4242
<< QStringLiteral( "wfs" ) // convert to lowercase
4343
<< QStringLiteral( "wcs" )
4444
<< QStringLiteral( "wms" )
45+
<< QStringLiteral( "ogr" )
4546
<< QStringLiteral( "proxy" ) );
4647
}
4748

@@ -85,7 +86,6 @@ bool QgsAuthBasicMethod::updateNetworkRequest( QNetworkRequest &request, const Q
8586
bool QgsAuthBasicMethod::updateDataSourceUriItems( QStringList &connectionItems, const QString &authcfg,
8687
const QString &dataprovider )
8788
{
88-
Q_UNUSED( dataprovider )
8989
QgsAuthMethodConfig mconfig = getMethodConfig( authcfg );
9090
if ( !mconfig.isValid() )
9191
{
@@ -102,6 +102,21 @@ bool QgsAuthBasicMethod::updateDataSourceUriItems( QStringList &connectionItems,
102102
return false;
103103
}
104104

105+
// Branch for OGR protocol:
106+
if ( dataprovider == QStringLiteral( "ogr" ) )
107+
{
108+
if ( ! password.isEmpty() )
109+
{
110+
// inject username and password into the URL
111+
connectionItems.replaceInStrings( QStringLiteral( "://" ), QStringLiteral( "://%1:%2@" ).arg( username, password ) );
112+
}
113+
else
114+
{
115+
QgsDebugMsg( QString( "Update URI items FAILED for authcfg: %1: password empty" ).arg( authcfg ) );
116+
}
117+
}
118+
119+
// OGR database might use the standard URI way, we need to process this part in all cases
105120
QString userparam = "user='" + escapeUserPass( username ) + '\'';
106121
int userindx = connectionItems.indexOf( QRegExp( "^user='.*" ) );
107122
if ( userindx != -1 )

src/gui/ogr/qgsnewogrconnection.cpp

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,25 @@ QgsNewOgrConnection::QgsNewOgrConnection( QWidget *parent, const QString &connTy
5757
txtDatabase->setText( settings.value( key + "/database" ).toString() );
5858
QString port = settings.value( key + "/port" ).toString();
5959
txtPort->setText( port );
60-
txtUsername->setText( settings.value( key + "/username" ).toString() );
61-
if ( settings.value( key + "/save" ).toString() == QLatin1String( "true" ) )
60+
if ( settings.value( key + "/store_username" ).toString() == QLatin1String( "true" ) )
6261
{
63-
txtPassword->setText( settings.value( key + "/password" ).toString() );
64-
chkStorePassword->setChecked( true );
62+
mAuthSettingsDatabase->setUsername( settings.value( key + "/username" ).toString() );
63+
mAuthSettingsDatabase->setStoreUsernameChecked( true );
6564
}
65+
if ( settings.value( key + "/store_password" ).toString() == QLatin1String( "true" ) )
66+
{
67+
mAuthSettingsDatabase->setPassword( settings.value( key + "/password" ).toString() );
68+
mAuthSettingsDatabase->setStorePasswordChecked( true );
69+
}
70+
mAuthSettingsDatabase->setConfigId( settings.value( key + "/configid" ).toString() );
6671
cmbDatabaseTypes->setCurrentIndex( cmbDatabaseTypes->findText( connType ) );
6772
txtName->setText( connName );
6873
txtName->setEnabled( false );
6974
cmbDatabaseTypes->setEnabled( false );
7075
}
7176
txtName->setValidator( new QRegExpValidator( QRegExp( "[^\\/]+" ), txtName ) );
77+
mAuthSettingsDatabase->setDataprovider( QStringLiteral( "ogr" ) );
78+
mAuthSettingsDatabase->showStoreCheckboxes( true );
7279
}
7380

7481
QgsNewOgrConnection::~QgsNewOgrConnection()
@@ -80,9 +87,13 @@ QgsNewOgrConnection::~QgsNewOgrConnection()
8087
void QgsNewOgrConnection::testConnection()
8188
{
8289
QString uri;
83-
uri = createDatabaseURI( cmbDatabaseTypes->currentText(), txtHost->text(),
84-
txtDatabase->text(), txtPort->text(),
85-
txtUsername->text(), txtPassword->text() );
90+
uri = createDatabaseURI( cmbDatabaseTypes->currentText(),
91+
txtHost->text(),
92+
txtDatabase->text(),
93+
txtPort->text(),
94+
mAuthSettingsDatabase->configId(),
95+
mAuthSettingsDatabase->username(),
96+
mAuthSettingsDatabase->password() );
8697
QgsDebugMsg( "Connecting using uri = " + uri );
8798
OGRRegisterAll();
8899
OGRDataSourceH poDS;
@@ -133,9 +144,11 @@ void QgsNewOgrConnection::accept()
133144
settings.setValue( baseKey + "/host", txtHost->text() );
134145
settings.setValue( baseKey + "/database", txtDatabase->text() );
135146
settings.setValue( baseKey + "/port", txtPort->text() );
136-
settings.setValue( baseKey + "/username", txtUsername->text() );
137-
settings.setValue( baseKey + "/password", chkStorePassword->isChecked() ? txtPassword->text() : QLatin1String( "" ) );
138-
settings.setValue( baseKey + "/save", chkStorePassword->isChecked() ? "true" : "false" );
147+
settings.setValue( baseKey + "/username", mAuthSettingsDatabase->storeUsernameIsChecked() ? mAuthSettingsDatabase->username() : QLatin1String( "" ) );
148+
settings.setValue( baseKey + "/password", mAuthSettingsDatabase->storePasswordIsChecked() ? mAuthSettingsDatabase->password() : QLatin1String( "" ) );
149+
settings.setValue( baseKey + "/store_username", mAuthSettingsDatabase->storeUsernameIsChecked() ? "true" : "false" );
150+
settings.setValue( baseKey + "/store_password", mAuthSettingsDatabase->storePasswordIsChecked() ? "true" : "false" );
151+
settings.setValue( baseKey + "/configid", mAuthSettingsDatabase->configId() );
139152

140153
QDialog::accept();
141154
}

src/gui/ogr/qgsogrhelperfunctions.cpp

Lines changed: 52 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,31 @@
1818

1919
#include "qgsogrhelperfunctions.h"
2020
#include "qgslogger.h"
21+
#include "qgsapplication.h"
22+
#include "qgsauthmanager.h"
2123
#include <QRegExp>
2224

23-
QString createDatabaseURI( const QString &connectionType, const QString &host, const QString &database, QString port, const QString &user, const QString &password )
25+
QString createDatabaseURI( const QString &connectionType, const QString &host, const QString &database, QString port, const QString &configId, QString username, QString password )
2426
{
2527
QString uri;
2628

29+
// If an auth configuration is set, override username and password
30+
// Note that only Basic auth (username/password) is for now supported for OGR connections
31+
if ( ! configId.isEmpty() )
32+
{
33+
// Pass to updateDataSourceUriItems empty user/password in the format it likes
34+
QStringList connectionItems;
35+
connectionItems << QStringLiteral( "user=''" ) << QStringLiteral( "password=''" );
36+
if ( QgsApplication::authManager()->updateDataSourceUriItems( connectionItems, configId, QStringLiteral( "ogr" ) ) )
37+
{
38+
QRegExp userRe( "^user='([^']+)'" );
39+
QRegExp passRe( "^password='([^']+)'" );
40+
// Extracts the username and password
41+
username = QString( connectionItems.at( 0 ) ).replace( userRe, "\\1" );
42+
password = QString( connectionItems.at( 1 ) ).replace( passRe, "\\1" );
43+
}
44+
}
45+
2746
//todo:add default ports for all kind of databases
2847
if ( connectionType == QLatin1String( "ESRI Personal GeoDatabase" ) )
2948
{
@@ -34,7 +53,7 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
3453
if ( port.isEmpty() )
3554
port = QStringLiteral( "5151" );
3655

37-
uri = "SDE:" + host + ",PORT:" + port + ',' + database + ',' + user + ',' + password;
56+
uri = "SDE:" + host + ",PORT:" + port + ',' + database + ',' + username + ',' + password;
3857
}
3958
else if ( connectionType == QLatin1String( "Informix DataBlade" ) )
4059
{
@@ -44,9 +63,9 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
4463
if ( !host.isEmpty() )
4564
uri += QStringLiteral( " server=%1" ).arg( host );
4665

47-
if ( !user.isEmpty() )
66+
if ( !username.isEmpty() )
4867
{
49-
uri += QStringLiteral( " user=%1" ).arg( user );
68+
uri += QStringLiteral( " user=%1" ).arg( username );
5069

5170
if ( !password.isEmpty() )
5271
uri += QStringLiteral( " pass=%1" ).arg( password );
@@ -56,9 +75,9 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
5675
{
5776
//not tested
5877
uri = "@driver=ingres,dbname=" + database;
59-
if ( !user.isEmpty() )
78+
if ( !username.isEmpty() )
6079
{
61-
uri += QStringLiteral( ",userid=%1" ).arg( user );
80+
uri += QStringLiteral( ",userid=%1" ).arg( username );
6281

6382
if ( !password.isEmpty() )
6483
uri += QStringLiteral( ",password=%1" ).arg( password );
@@ -76,9 +95,9 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
7695
uri += QStringLiteral( ",port=%1" ).arg( port );
7796
}
7897

79-
if ( !user.isEmpty() )
98+
if ( !username.isEmpty() )
8099
{
81-
uri += QStringLiteral( ",user=%1" ).arg( user );
100+
uri += QStringLiteral( ",user=%1" ).arg( username );
82101

83102
if ( !password.isEmpty() )
84103
uri += QStringLiteral( ",password=%1" ).arg( password );
@@ -96,9 +115,9 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
96115
uri += QStringLiteral( ",%1" ).arg( port );
97116
}
98117

99-
if ( !user.isEmpty() )
118+
if ( !username.isEmpty() )
100119
{
101-
uri += QStringLiteral( ";uid=%1" ).arg( user );
120+
uri += QStringLiteral( ";uid=%1" ).arg( username );
102121

103122
if ( !password.isEmpty() )
104123
uri += QStringLiteral( ";pwd=%1" ).arg( password );
@@ -111,10 +130,10 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
111130
}
112131
else if ( connectionType == QLatin1String( "Oracle Spatial" ) )
113132
{
114-
uri = "OCI:" + user;
133+
uri = "OCI:" + username;
115134

116-
if ( ( !user.isEmpty() && !password.isEmpty() ) ||
117-
( user.isEmpty() && password.isEmpty() ) )
135+
if ( ( !username.isEmpty() && !password.isEmpty() ) ||
136+
( username.isEmpty() && password.isEmpty() ) )
118137
{
119138
uri += '/';
120139
if ( !password.isEmpty() )
@@ -142,15 +161,15 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
142161
}
143162
else if ( connectionType == QLatin1String( "ODBC" ) )
144163
{
145-
if ( !user.isEmpty() )
164+
if ( !username.isEmpty() )
146165
{
147166
if ( password.isEmpty() )
148167
{
149-
uri = "ODBC:" + user + '@' + database;
168+
uri = "ODBC:" + username + '@' + database;
150169
}
151170
else
152171
{
153-
uri = "ODBC:" + user + '/' + password + '@' + database;
172+
uri = "ODBC:" + username + '/' + password + '@' + database;
154173
}
155174

156175
}
@@ -174,9 +193,9 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
174193
uri += QStringLiteral( " port='%1'" ).arg( port );
175194
}
176195

177-
if ( !user.isEmpty() )
196+
if ( !username.isEmpty() )
178197
{
179-
uri += QStringLiteral( " user='%1'" ).arg( user );
198+
uri += QStringLiteral( " user='%1'" ).arg( username );
180199

181200
if ( !password.isEmpty() )
182201
uri += QStringLiteral( " password='%1'" ).arg( password );
@@ -190,7 +209,7 @@ QString createDatabaseURI( const QString &connectionType, const QString &host, c
190209
}
191210

192211

193-
QString createProtocolURI( const QString &type, const QString &url )
212+
QString createProtocolURI( const QString &type, const QString &url, const QString &configId, const QString &username, const QString &password )
194213
{
195214
QString uri;
196215
if ( type == QLatin1String( "GeoJSON" ) )
@@ -206,5 +225,19 @@ QString createProtocolURI( const QString &type, const QString &url )
206225
uri = QStringLiteral( "DODS:%1" ).arg( url );
207226
}
208227
QgsDebugMsg( "Connection type is=" + type + " and uri=" + uri );
228+
// Update URI with authentication information
229+
if ( ! configId.isEmpty() )
230+
{
231+
QStringList connectionItems;
232+
connectionItems << uri;
233+
if ( QgsApplication::authManager()->updateDataSourceUriItems( connectionItems, configId, QStringLiteral( "ogr" ) ) )
234+
{
235+
uri = connectionItems.join( QString() );
236+
}
237+
}
238+
else if ( !( username.isEmpty() || password.isEmpty( ) ) )
239+
{
240+
uri.replace( QStringLiteral( "://" ), QStringLiteral( "://%1:%2@" ).arg( username, password ) );
241+
}
209242
return uri;
210243
}

src/gui/ogr/qgsogrhelperfunctions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
* \brief Create database uri from connection parameters
2727
* \note not available in python bindings
2828
*/
29-
QString GUI_EXPORT createDatabaseURI( const QString &connectionType, const QString &host, const QString &database, QString port, const QString &user, const QString &password );
29+
QString GUI_EXPORT createDatabaseURI( const QString &connectionType, const QString &host, const QString &database, QString port, const QString &configId, QString username, QString password );
3030

3131
/**
3232
* CreateProtocolURI
3333
* \brief Create protocol uri from connection parameters
3434
* \note not available in python bindings
3535
*/
36-
QString GUI_EXPORT createProtocolURI( const QString &type, const QString &url );
36+
QString GUI_EXPORT createProtocolURI( const QString &type, const QString &url, const QString &configId, const QString &username, const QString &password );

0 commit comments

Comments
 (0)