Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[auth system] Data source integration for OWS connections
  • Loading branch information
dakcarto committed Sep 21, 2015
1 parent 0d2b945 commit 907b019
Show file tree
Hide file tree
Showing 22 changed files with 376 additions and 132 deletions.
3 changes: 2 additions & 1 deletion python/core/qgsgml.sip
Expand Up @@ -19,9 +19,10 @@ class QgsGml: QObject
* @param extent retrieved extents
* @param userName username for authentication
* @param password password for authentication
* @param authcfg authentication configuration id
* @return 0 in case of success
*/
int getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangle* extent = 0, const QString& userName = QString(), const QString& password = QString() ) /PyName=getFeaturesUri/;
int getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangle* extent = 0, const QString& userName = QString(), const QString& password = QString(), const QString& authcfg = QString() ) /PyName=getFeaturesUri/;

/** Read from GML data. Constructor uri param is ignored
* Supports only UTF-8, UTF-16, ISO-8859-1, ISO-8859-1 XML encodings.
Expand Down
17 changes: 15 additions & 2 deletions src/core/qgsgml.cpp
Expand Up @@ -13,6 +13,7 @@
* *
***************************************************************************/
#include "qgsgml.h"
#include "qgsauthmanager.h"
#include "qgsrectangle.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsgeometry.h"
Expand Down Expand Up @@ -69,7 +70,7 @@ QgsGml::~QgsGml()
{
}

int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangle* extent, const QString& userName, const QString& password )
int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangle* extent, const QString& userName, const QString& password , const QString& authcfg )
{
mUri = uri;
mWkbType = wkbType;
Expand All @@ -83,7 +84,19 @@ int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangl
mExtent.setMinimal();

QNetworkRequest request( mUri );
if ( !userName.isNull() || !password.isNull() )
if ( !authcfg.isEmpty() )
{
if ( !QgsAuthManager::instance()->updateNetworkRequest( request, authcfg ) )
{
QgsMessageLog::logMessage(
tr( "GML Getfeature network request update failed for authcfg %1" ).arg( authcfg ),
tr( "Network" ),
QgsMessageLog::CRITICAL
);
return 1;
}
}
else if ( !userName.isNull() || !password.isNull() )
{
request.setRawHeader( "Authorization", "Basic " + QString( "%1:%2" ).arg( userName ).arg( password ).toAscii().toBase64() );
}
Expand Down
8 changes: 7 additions & 1 deletion src/core/qgsgml.h
Expand Up @@ -56,9 +56,15 @@ class CORE_EXPORT QgsGml : public QObject
* @param extent retrieved extents
* @param userName username for authentication
* @param password password for authentication
* @param authcfg authentication configuration id
* @return 0 in case of success
*/
int getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangle* extent = 0, const QString& userName = QString(), const QString& password = QString() );
int getFeatures( const QString& uri,
QGis::WkbType* wkbType,
QgsRectangle* extent = 0,
const QString& userName = QString(),
const QString& password = QString(),
const QString& authcfg = QString() );

/** Read from GML data. Constructor uri param is ignored
* Supports only UTF-8, UTF-16, ISO-8859-1, ISO-8859-1 XML encodings.
Expand Down
7 changes: 7 additions & 0 deletions src/core/qgsowsconnection.cpp
Expand Up @@ -61,6 +61,13 @@ QgsOWSConnection::QgsOWSConnection( const QString & theService, const QString &
mUri.setParam( "password", password );
}

QString authcfg = settings.value( credentialsKey + "/authcfg" ).toString();
if ( !authcfg.isEmpty() )
{
mUri.setParam( "authcfg", authcfg );
}
mConnectionInfo.append( ",authcfg=" + authcfg );

bool ignoreGetMap = settings.value( key + "/ignoreGetMapURI", false ).toBool();
bool ignoreGetFeatureInfo = settings.value( key + "/ignoreGetFeatureInfoURI", false ).toBool();
bool ignoreAxisOrientation = settings.value( key + "/ignoreAxisOrientation", false ).toBool();
Expand Down
21 changes: 17 additions & 4 deletions src/gui/qgsnewhttpconnection.cpp
Expand Up @@ -23,10 +23,11 @@
#include <QRegExpValidator>

QgsNewHttpConnection::QgsNewHttpConnection(
QWidget *parent, const QString& baseKey, const QString& connName, Qt::WindowFlags fl ):
QDialog( parent, fl ),
mBaseKey( baseKey ),
mOriginalConnName( connName )
QWidget *parent, const QString& baseKey, const QString& connName, Qt::WindowFlags fl )
: QDialog( parent, fl )
, mBaseKey( baseKey )
, mOriginalConnName( connName )
, mAuthConfigSelect( 0 )
{
setupUi( this );

Expand All @@ -49,6 +50,9 @@ QgsNewHttpConnection::QgsNewHttpConnection(
cmbDpiMode->addItem( tr( "UMN" ) );
cmbDpiMode->addItem( tr( "GeoServer" ) );

mAuthConfigSelect = new QgsAuthConfigSelect( this );
tabAuth->insertTab( 1, mAuthConfigSelect, tr( "Configurations" ) );

if ( !connName.isEmpty() )
{
// populate the dialog with the information stored for the connection
Expand Down Expand Up @@ -92,6 +96,13 @@ QgsNewHttpConnection::QgsNewHttpConnection(

txtUserName->setText( settings.value( credentialsKey + "/username" ).toString() );
txtPassword->setText( settings.value( credentialsKey + "/password" ).toString() );

QString authcfg = settings.value( credentialsKey + "/authcfg" ).toString();
mAuthConfigSelect->setConfigId( authcfg );
if ( !authcfg.isEmpty() )
{
tabAuth->setCurrentIndex( tabAuth->indexOf( mAuthConfigSelect ) );
}
}

if ( mBaseKey != "/Qgis/connections-wms/" )
Expand Down Expand Up @@ -247,6 +258,8 @@ void QgsNewHttpConnection::accept()
settings.setValue( credentialsKey + "/username", txtUserName->text() );
settings.setValue( credentialsKey + "/password", txtPassword->text() );

settings.setValue( credentialsKey + "/authcfg", mAuthConfigSelect->configId() );

settings.setValue( mBaseKey + "/selected", txtName->text() );

QDialog::accept();
Expand Down
3 changes: 3 additions & 0 deletions src/gui/qgsnewhttpconnection.h
Expand Up @@ -19,6 +19,8 @@
#include "ui_qgsnewhttpconnectionbase.h"
#include "qgisgui.h"
#include "qgscontexthelp.h"
#include "qgsauthconfigselect.h"

/*!
* \brief Dialog to allow the user to configure and save connection
* information for an HTTP Server for WMS, etc.
Expand Down Expand Up @@ -46,6 +48,7 @@ class GUI_EXPORT QgsNewHttpConnection : public QDialog, private Ui::QgsNewHttpCo
QString mBaseKey;
QString mCredentialsBaseKey;
QString mOriginalConnName; //store initial name to delete entry in case of rename
QgsAuthConfigSelect * mAuthConfigSelect;
};

#endif // QGSNEWHTTPCONNECTION_H
2 changes: 2 additions & 0 deletions src/providers/ows/CMakeLists.txt
Expand Up @@ -9,7 +9,9 @@ SET(OWS_MOC_HDRS

INCLUDE_DIRECTORIES (
../../core
../../core/auth
../../gui
../../gui/auth
${CMAKE_CURRENT_BINARY_DIR}/../../ui
)

Expand Down
9 changes: 8 additions & 1 deletion src/providers/wcs/CMakeLists.txt
Expand Up @@ -16,10 +16,17 @@ SET (WCS_MOC_HDRS

QT4_WRAP_CPP (WCS_MOC_SRCS ${WCS_MOC_HDRS})

INCLUDE_DIRECTORIES( . ../../core ../../core/raster ../../gui
INCLUDE_DIRECTORIES(
.
../../core
../../core/auth
../../core/raster
../../gui
../../gui/auth
../gdal
${CMAKE_CURRENT_BINARY_DIR}/../../ui
${GDAL_INCLUDE_DIR}
${QCA_INCLUDE_DIR}
)

ADD_LIBRARY(wcsprovider MODULE ${WCS_SRCS} ${WCS_MOC_SRCS})
Expand Down
25 changes: 21 additions & 4 deletions src/providers/wcs/qgswcscapabilities.cpp
Expand Up @@ -26,6 +26,7 @@

#include <cmath>

#include "qgsauthmanager.h"
#include "qgscoordinatetransform.h"
#include "qgsdatasourceuri.h"
#include "qgsrasterlayer.h"
Expand Down Expand Up @@ -159,7 +160,12 @@ bool QgsWcsCapabilities::sendRequest( QString const & url )
QgsDebugMsg( "url = " + url );
mError = "";
QNetworkRequest request( url );
setAuthorization( request );
if ( !setAuthorization( request ) )
{
mError = tr( "Download of capabilities failed: network request update failed for authentication config" );
QgsMessageLog::logMessage( mError, tr( "WCS" ) );
return false;
}
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, mCacheLoadControl );
QgsDebugMsg( QString( "mCacheLoadControl = %1" ).arg( mCacheLoadControl ) );
Expand Down Expand Up @@ -359,7 +365,13 @@ void QgsWcsCapabilities::capabilitiesReplyFinished()
emit statusChanged( tr( "Capabilities request redirected." ) );

QNetworkRequest request( redirect.toUrl() );
setAuthorization( request );
if ( !setAuthorization( request ) )
{
mCapabilitiesResponse.clear();
mError = tr( "Download of capabilities failed: network request update failed for authentication config" );
QgsMessageLog::logMessage( mError, tr( "WCS" ) );
return;
}
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );

Expand Down Expand Up @@ -1162,14 +1174,19 @@ QString QgsWcsCapabilities::lastErrorFormat()
return mErrorFormat;
}

void QgsWcsCapabilities::setAuthorization( QNetworkRequest &request ) const
bool QgsWcsCapabilities::setAuthorization( QNetworkRequest &request ) const
{
QgsDebugMsg( "entered" );
if ( mUri.hasParam( "username" ) && mUri.hasParam( "password" ) )
if ( mUri.hasParam( "authcfg" ) && !mUri.param( "authcfg" ).isEmpty() )
{
return QgsAuthManager::instance()->updateNetworkRequest( request, mUri.param( "authcfg" ) );
}
else if ( mUri.hasParam( "username" ) && mUri.hasParam( "password" ) )
{
QgsDebugMsg( "setAuthorization " + mUri.param( "username" ) );
request.setRawHeader( "Authorization", "Basic " + QString( "%1:%2" ).arg( mUri.param( "username" ) ).arg( mUri.param( "password" ) ).toAscii().toBase64() );
}
return true;
}

void QgsWcsCapabilities::showMessageBox( const QString& title, const QString& text )
Expand Down
2 changes: 1 addition & 1 deletion src/providers/wcs/qgswcscapabilities.h
Expand Up @@ -153,7 +153,7 @@ class QgsWcsCapabilities : public QObject
bool parseDescribeCoverageDom11( QByteArray const &xml, QgsWcsCoverageSummary *coverage );

//! set authorization header
void setAuthorization( QNetworkRequest &request ) const;
bool setAuthorization( QNetworkRequest &request ) const;

QString version() const { return mCapabilities.version; }

Expand Down
23 changes: 21 additions & 2 deletions src/providers/wcs/qgswcsprovider.cpp
Expand Up @@ -408,6 +408,12 @@ bool QgsWcsProvider::parseUri( QString uriString )
mAuth.mPassword = uri.param( "password" );
QgsDebugMsg( "set password to " + mAuth.mPassword );

if ( uri.hasParam( "authcfg" ) )
{
mAuth.mAuthCfg = uri.param( "authcfg" );
}
QgsDebugMsg( "set authcfg to " + mAuth.mAuthCfg );

mIdentifier = uri.param( "identifier" );

mTime = uri.param( "time" );
Expand Down Expand Up @@ -1667,6 +1673,7 @@ int QgsWcsDownloadHandler::sErrors = 0;

QgsWcsDownloadHandler::QgsWcsDownloadHandler( const QUrl& url, QgsWcsAuthorization& auth, QNetworkRequest::CacheLoadControl cacheLoadControl, QByteArray& cachedData, const QString& wcsVersion, QgsError& cachedError )
: mNAM( new QgsNetworkAccessManager )
, mAuth( auth )
, mEventLoop( new QEventLoop )
, mCachedData( cachedData )
, mWcsVersion( wcsVersion )
Expand All @@ -1675,7 +1682,12 @@ QgsWcsDownloadHandler::QgsWcsDownloadHandler( const QUrl& url, QgsWcsAuthorizati
mNAM->setupDefaultProxyAndCache();

QNetworkRequest request( url );
auth.setAuthorization( request );
if ( !mAuth.setAuthorization( request ) )
{
QgsMessageLog::logMessage( tr( "Network request update failed for authentication config" ),
tr( "WCS" ) );
return;
}
request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, cacheLoadControl );

Expand Down Expand Up @@ -1708,7 +1720,14 @@ void QgsWcsDownloadHandler::cacheReplyFinished()
mCacheReply->deleteLater();

QgsDebugMsg( QString( "redirected getmap: %1" ).arg( redirect.toString() ) );
mCacheReply = mNAM->get( QNetworkRequest( redirect.toUrl() ) );
QNetworkRequest request( redirect.toUrl() );
if ( !mAuth.setAuthorization( request ) )
{
QgsMessageLog::logMessage( tr( "Network request update failed for authentication config" ),
tr( "WCS" ) );
return;
}
mCacheReply = mNAM->get( request );
connect( mCacheReply, SIGNAL( finished() ), this, SLOT( cacheReplyFinished() ) );
connect( mCacheReply, SIGNAL( downloadProgress( qint64, qint64 ) ), this, SLOT( cacheReplyProgress( qint64, qint64 ) ) );

Expand Down
20 changes: 17 additions & 3 deletions src/providers/wcs/qgswcsprovider.h
Expand Up @@ -24,6 +24,7 @@

#include "qgserror.h"
#include "qgswcscapabilities.h"
#include "qgsauthmanager.h"
#include "qgsrasterdataprovider.h"
#include "qgsgdalproviderbase.h"
#include "qgsrectangle.h"
Expand All @@ -50,22 +51,34 @@ class QNetworkRequest;
// TODO: merge with QgsWmsAuthorization?
struct QgsWcsAuthorization
{
QgsWcsAuthorization( const QString& userName = QString(), const QString& password = QString() ) : mUserName( userName ), mPassword( password ) {}
QgsWcsAuthorization( const QString& userName = QString(), const QString& password = QString(), const QString& authcfg = QString() )
: mUserName( userName )
, mPassword( password )
, mAuthCfg( authcfg )
{}

//! set authorization header
void setAuthorization( QNetworkRequest &request ) const
bool setAuthorization( QNetworkRequest &request ) const
{
if ( !mUserName.isNull() || !mPassword.isNull() )
if ( !mAuthCfg.isEmpty() )
{
return QgsAuthManager::instance()->updateNetworkRequest( request, mAuthCfg );
}
else if ( !mUserName.isNull() || !mPassword.isNull() )
{
request.setRawHeader( "Authorization", "Basic " + QString( "%1:%2" ).arg( mUserName ).arg( mPassword ).toAscii().toBase64() );
}
return true;
}

//! Username for basic http authentication
QString mUserName;

//! Password for basic http authentication
QString mPassword;

//! Authentication configuration ID
QString mAuthCfg;
};

/**
Expand Down Expand Up @@ -424,6 +437,7 @@ class QgsWcsDownloadHandler : public QObject
void finish() { QMetaObject::invokeMethod( mEventLoop, "quit", Qt::QueuedConnection ); }

QgsNetworkAccessManager* mNAM;
QgsWcsAuthorization& mAuth;
QEventLoop* mEventLoop;

QNetworkReply* mCacheReply;
Expand Down
3 changes: 3 additions & 0 deletions src/providers/wfs/CMakeLists.txt
Expand Up @@ -25,13 +25,16 @@ QT4_WRAP_CPP(WFS_MOC_SRCS ${WFS_MOC_HDRS})

INCLUDE_DIRECTORIES (
../../core
../../core/auth
../../core/geometry
../../gui
../../gui/auth
${CMAKE_CURRENT_BINARY_DIR}/../../ui
${GEOS_INCLUDE_DIR}
${GEOS_INCLUDE_DIR}/geos
${EXPAT_INCLUDE_DIR}
${QSCINTILLA_INCLUDE_DIR}
${QCA_INCLUDE_DIR}
)

ADD_LIBRARY (wfsprovider MODULE ${WFS_SRCS} ${WFS_MOC_SRCS})
Expand Down

0 comments on commit 907b019

Please sign in to comment.