Skip to content

Commit a46dca5

Browse files
committedFeb 22, 2016
Correctly restore layer subsetStrings after wfs/wms requests...
by switching storage/restoration of subset strings to use QgsMapLayer pointers instead of layer ids. It seems that the majority of layers created by server are not registered in the map layer registry, so retrieving layers by layer id under server is not reliable.
1 parent 90a4ae8 commit a46dca5

File tree

6 files changed

+44
-29
lines changed

6 files changed

+44
-29
lines changed
 

‎src/server/qgsaccesscontrol.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ QgsFeatureFilterProvider* QgsAccessControl::clone() const
5151
/** Return an additional subset string (typically SQL) filter */
5252
QString QgsAccessControl::extraSubsetString( const QgsVectorLayer* layer ) const
5353
{
54-
QStringList sqls = QStringList();
54+
QStringList sqls;
5555
QgsAccessControlFilterMap::const_iterator acIterator;
5656
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
5757
{

‎src/server/qgsowsserver.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,18 @@
2121
#include "qgsvectorlayer.h"
2222
#include "qgsvectordataprovider.h"
2323

24-
2524
#ifdef HAVE_SERVER_PYTHON_PLUGINS
2625
/** Apply filter from AccessControl */
27-
void QgsOWSServer::applyAccessControlLayerFilters( QgsMapLayer* mapLayer, QMap<QString, QString>& originalLayerFilters ) const
26+
void QgsOWSServer::applyAccessControlLayerFilters( QgsMapLayer* mapLayer, QHash<QgsMapLayer*, QString>& originalLayerFilters ) const
2827
{
2928
if ( QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( mapLayer ) )
3029
{
3130
QString sql = mAccessControl->extraSubsetString( layer );
3231
if ( !sql.isEmpty() )
3332
{
34-
if ( !originalLayerFilters.contains( layer->id() ) )
33+
if ( !originalLayerFilters.contains( layer ) )
3534
{
36-
originalLayerFilters.insert( layer->id(), layer->subsetString() );
35+
originalLayerFilters.insert( layer, layer->subsetString() );
3736
}
3837
if ( !layer->subsetString().isEmpty() )
3938
{
@@ -50,12 +49,12 @@ void QgsOWSServer::applyAccessControlLayerFilters( QgsMapLayer* mapLayer, QMap<Q
5049
#endif
5150

5251
/** Restore layer filter as original */
53-
void QgsOWSServer::restoreLayerFilters( const QMap<QString, QString>& filterMap ) const
52+
void QgsOWSServer::restoreLayerFilters( const QHash<QgsMapLayer*, QString>& filterMap ) const
5453
{
55-
QMap<QString, QString>::const_iterator filterIt = filterMap.constBegin();
54+
QHash<QgsMapLayer*, QString>::const_iterator filterIt = filterMap.constBegin();
5655
for ( ; filterIt != filterMap.constEnd(); ++filterIt )
5756
{
58-
QgsVectorLayer* filteredLayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( filterIt.key() ) );
57+
QgsVectorLayer* filteredLayer = dynamic_cast<QgsVectorLayer*>( filterIt.key() );
5958
if ( filteredLayer )
6059
{
6160
QgsVectorDataProvider* dp = filteredLayer->dataProvider();

‎src/server/qgsowsserver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ class QgsOWSServer
6161
* @param originalLayerFilters the original layer filter
6262
*
6363
*/
64-
void applyAccessControlLayerFilters( QgsMapLayer* layer, QMap<QString, QString>& originalLayerFilters ) const;
64+
void applyAccessControlLayerFilters( QgsMapLayer* layer, QHash<QgsMapLayer*, QString>& originalLayerFilters ) const;
6565
#endif
6666

6767
/** Restores the original layer filters
6868
* @param filterMap the original layer filter
6969
*/
70-
void restoreLayerFilters( const QMap < QString, QString >& filterMap ) const;
70+
void restoreLayerFilters( const QHash < QgsMapLayer*, QString >& filterMap ) const;
7171
};
7272

7373
#endif // QGSOWSSERVER_H

‎src/server/qgswfsserver.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
422422

423423
QDomDocument doc;
424424
QString errorMsg;
425+
QHash<QgsMapLayer*, QString> originalLayerFilters;
425426
if ( doc.setContent( mParameters.value( "REQUEST_BODY" ), true, &errorMsg ) )
426427
{
427428
QDomElement docElem = doc.documentElement();
@@ -465,10 +466,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
465466
#ifdef HAVE_SERVER_PYTHON_PLUGINS
466467
if ( !mAccessControl->layerReadPermission( currentLayer ) )
467468
{
469+
restoreLayerFilters( originalLayerFilters );
468470
throw QgsMapServiceException( "Security", "Feature access permission denied" );
469471
}
470-
471-
QMap<QString, QString> originalLayerFilters;
472472
applyAccessControlLayerFilters( currentLayer, originalLayerFilters );
473473
#endif
474474

@@ -646,6 +646,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
646646
{
647647
if ( filter->hasParserError() )
648648
{
649+
#ifdef HAVE_SERVER_PYTHON_PLUGINS
650+
restoreLayerFilters( originalLayerFilters );
651+
#endif
649652
throw QgsMapServiceException( "RequestNotWellFormed", filter->parserErrorString() );
650653
}
651654
while ( fit.nextFeature( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat + startIndex ) )
@@ -655,6 +658,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
655658
QVariant res = filter->evaluate( &expressionContext );
656659
if ( filter->hasEvalError() )
657660
{
661+
662+
#ifdef HAVE_SERVER_PYTHON_PLUGINS
663+
restoreLayerFilters( originalLayerFilters );
664+
#endif
658665
throw QgsMapServiceException( "RequestNotWellFormed", filter->evalErrorString() );
659666
}
660667
if ( res.toInt() != 0 )
@@ -688,10 +695,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
688695
++featureCounter;
689696
}
690697
}
691-
692-
#ifdef HAVE_SERVER_PYTHON_PLUGINS
693-
restoreLayerFilters( originalLayerFilters );
694-
#endif
695698
}
696699
else
697700
{
@@ -700,6 +703,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
700703

701704
}
702705

706+
#ifdef HAVE_SERVER_PYTHON_PLUGINS
707+
restoreLayerFilters( originalLayerFilters );
708+
#endif
709+
703710
QgsMessageLog::logMessage( mErrors.join( "\n" ) );
704711

705712
QgsMapLayerRegistry::instance()->removeAllMapLayers();

‎src/server/qgswmsserver.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,8 +1247,6 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
12471247
}
12481248
delete theImage;
12491249

1250-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
1251-
12521250
#ifdef HAVE_SERVER_PYTHON_PLUGINS
12531251
Q_FOREACH ( QgsMapLayer *layer, QgsMapLayerRegistry::instance()->mapLayers() )
12541252
{
@@ -1257,7 +1255,11 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
12571255
throw QgsMapServiceException( "Security", "You are not allowed to access to the layer: " + layer->name() );
12581256
}
12591257
}
1258+
#endif
1259+
1260+
QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
12601261

1262+
#ifdef HAVE_SERVER_PYTHON_PLUGINS
12611263
applyAccessControlLayersFilters( layersList, originalLayerFilters );
12621264
#endif
12631265

@@ -1266,6 +1268,8 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
12661268
//GetPrint request needs a template parameter
12671269
if ( !mParameters.contains( "TEMPLATE" ) )
12681270
{
1271+
restoreLayerFilters( originalLayerFilters );
1272+
clearFeatureSelections( selectedLayerIdList );
12691273
throw QgsMapServiceException( "ParameterMissing", "The TEMPLATE parameter is required for the GetPrint request" );
12701274
}
12711275

@@ -1340,6 +1344,8 @@ QByteArray* QgsWMSServer::getPrint( const QString& formatString )
13401344
}
13411345
else //unknown format
13421346
{
1347+
restoreLayerFilters( originalLayerFilters );
1348+
clearFeatureSelections( selectedLayerIdList );
13431349
throw QgsMapServiceException( "InvalidFormat", "Output format '" + formatString + "' is not supported in the GetPrint request" );
13441350
}
13451351

@@ -1381,8 +1387,6 @@ QImage* QgsWMSServer::getMap( HitTest* hitTest )
13811387
QPainter thePainter( theImage );
13821388
thePainter.setRenderHint( QPainter::Antialiasing ); //make it look nicer
13831389

1384-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
1385-
13861390
#ifdef HAVE_SERVER_PYTHON_PLUGINS
13871391
Q_FOREACH ( QgsMapLayer *layer, QgsMapLayerRegistry::instance()->mapLayers() )
13881392
{
@@ -1391,7 +1395,11 @@ QImage* QgsWMSServer::getMap( HitTest* hitTest )
13911395
throw QgsMapServiceException( "Security", "You are not allowed to access to the layer: " + layer->name() );
13921396
}
13931397
}
1398+
#endif
1399+
1400+
QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
13941401

1402+
#ifdef HAVE_SERVER_PYTHON_PLUGINS
13951403
applyAccessControlLayersFilters( layersList, originalLayerFilters );
13961404
#endif
13971405

@@ -1618,7 +1626,7 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, const QString& version )
16181626

16191627
//get the layer registered in QgsMapLayerRegistry and apply possible filters
16201628
QStringList layerIds = layerSet( layersList, stylesList, mMapRenderer->destinationCrs() );
1621-
QMap<QString, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
1629+
QHash<QgsMapLayer*, QString> originalLayerFilters = applyRequestedLayerFilters( layersList );
16221630
#ifdef HAVE_SERVER_PYTHON_PLUGINS
16231631
applyAccessControlLayersFilters( layersList, originalLayerFilters );
16241632
#endif
@@ -1702,6 +1710,7 @@ int QgsWMSServer::getFeatureInfo( QDomDocument& result, const QString& version )
17021710
#ifdef HAVE_SERVER_PYTHON_PLUGINS
17031711
if ( !mAccessControl->layerReadPermission( currentLayer ) )
17041712
{
1713+
restoreLayerFilters( originalLayerFilters );
17051714
throw QgsMapServiceException( "Security", "You are not allowed to access to the layer: " + currentLayer->name() );
17061715
}
17071716
#endif
@@ -2486,9 +2495,9 @@ QStringList QgsWMSServer::layerSet( const QStringList &layersList,
24862495
}
24872496

24882497

2489-
QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringList& layerList ) const
2498+
QHash<QgsMapLayer*, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringList& layerList ) const
24902499
{
2491-
QMap<QString, QString> filterMap;
2500+
QHash<QgsMapLayer*, QString> filterMap;
24922501

24932502
if ( layerList.isEmpty() )
24942503
{
@@ -2539,7 +2548,7 @@ QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringLi
25392548
QgsVectorLayer* filteredLayer = dynamic_cast<QgsVectorLayer*>( filter );
25402549
if ( filteredLayer )
25412550
{
2542-
filterMap.insert( filteredLayer->id(), filteredLayer->subsetString() );
2551+
filterMap.insert( filteredLayer, filteredLayer->subsetString() );
25432552
QString newSubsetString = eqSplit.at( 1 );
25442553
if ( !filteredLayer->subsetString().isEmpty() )
25452554
{
@@ -2556,10 +2565,10 @@ QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringLi
25562565
if ( mMapRenderer && mMapRenderer->extent().isEmpty() )
25572566
{
25582567
QgsRectangle filterExtent;
2559-
QMap<QString, QString>::const_iterator filterIt = filterMap.constBegin();
2568+
QHash<QgsMapLayer*, QString>::const_iterator filterIt = filterMap.constBegin();
25602569
for ( ; filterIt != filterMap.constEnd(); ++filterIt )
25612570
{
2562-
QgsMapLayer* mapLayer = QgsMapLayerRegistry::instance()->mapLayer( filterIt.key() );
2571+
QgsMapLayer* mapLayer = filterIt.key();
25632572
if ( !mapLayer )
25642573
{
25652574
continue;
@@ -2582,7 +2591,7 @@ QMap<QString, QString> QgsWMSServer::applyRequestedLayerFilters( const QStringLi
25822591
}
25832592

25842593
#ifdef HAVE_SERVER_PYTHON_PLUGINS
2585-
void QgsWMSServer::applyAccessControlLayersFilters( const QStringList& layerList, QMap<QString, QString>& originalLayerFilters ) const
2594+
void QgsWMSServer::applyAccessControlLayersFilters( const QStringList& layerList, QHash<QgsMapLayer*, QString>& originalLayerFilters ) const
25862595
{
25872596
Q_FOREACH ( const QString& layerName, layerList )
25882597
{

‎src/server/qgswmsserver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,13 @@ class QgsWMSServer: public QgsOWSServer
188188

189189
/** Apply filter (subset) strings from the request to the layers. Example: '&FILTER=<layer1>:"AND property > 100",<layer2>:"AND bla = 'hallo!'" '
190190
@return a map with the original filters ( layer id / filter string )*/
191-
QMap<QString, QString> applyRequestedLayerFilters( const QStringList& layerList ) const;
191+
QHash<QgsMapLayer*, QString> applyRequestedLayerFilters( const QStringList& layerList ) const;
192192
#ifdef HAVE_SERVER_PYTHON_PLUGINS
193193
/** Apply filter strings from the access control to the layers.
194194
* @param layerList layers to filter
195195
* @param originalLayerFilters the original layers filter dictionary
196196
*/
197-
void applyAccessControlLayersFilters( const QStringList& layerList, QMap<QString, QString>& originalLayerFilters ) const;
197+
void applyAccessControlLayersFilters( const QStringList& layerList, QHash<QgsMapLayer*, QString>& originalLayerFilters ) const;
198198
#endif
199199
/** Tests if a filter sql string is allowed (safe)
200200
@return true in case of success, false if string seems unsafe*/

0 commit comments

Comments
 (0)
Please sign in to comment.