Skip to content

Commit b0644ea

Browse files
committed
WMS server: add user setting if custom datasources are allowed in wms requests
1 parent 72fddb8 commit b0644ea

10 files changed

+94
-26
lines changed

python/server/qgswmsconfigparser.sip

+2
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ class QgsWmsConfigParser
123123

124124
virtual bool useLayerIds() const = 0;
125125

126+
virtual bool allowRequestDefinedDatasources() const;
127+
126128
private:
127129

128130
QgsWmsConfigParser();

python/server/qgswmsprojectparser.sip

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ class QgsWmsProjectParser : public QgsWmsConfigParser
111111

112112
bool useLayerIds() const /*override*/ ;
113113

114+
bool allowRequestDefinedDatasources() const;
115+
114116
private:
115117

116118
/** Returns an ID-list of layers which are not queryable (comes from <properties> -> <Identify> -> <disabledLayers in the project file*/

src/app/qgsprojectproperties.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,9 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
527527
bool addWktGeometry = QgsProject::instance()->readBoolEntry( QStringLiteral( "WMSAddWktGeometry" ), QStringLiteral( "/" ) );
528528
mAddWktGeometryCheckBox->setChecked( addWktGeometry );
529529

530+
bool requestDefinedSources = QgsProject::instance()->readBoolEntry( "WMSRequestDefinedDataSources", "/", false );
531+
mAllowRequestDefinedDataSourcesBox->setChecked( requestDefinedSources );
532+
530533
bool segmentizeFeatureInfoGeometry = QgsProject::instance()->readBoolEntry( QStringLiteral( "WMSSegmentizeFeatureInfoGeometry" ), QStringLiteral( "/" ) );
531534
mSegmentizeFeatureInfoGeometryCheckBox->setChecked( segmentizeFeatureInfoGeometry );
532535

@@ -1077,6 +1080,7 @@ void QgsProjectProperties::apply()
10771080
}
10781081

10791082
QgsProject::instance()->writeEntry( QStringLiteral( "WMSAddWktGeometry" ), QStringLiteral( "/" ), mAddWktGeometryCheckBox->isChecked() );
1083+
QgsProject::instance()->writeEntry( "WMSRequestDefinedDataSources", "/", mAllowRequestDefinedDataSourcesBox->isChecked() );
10801084
QgsProject::instance()->writeEntry( QStringLiteral( "WMSSegmentizeFeatureInfoGeometry" ), QStringLiteral( "/" ), mSegmentizeFeatureInfoGeometryCheckBox->isChecked() );
10811085
QgsProject::instance()->writeEntry( QStringLiteral( "WMSUseLayerIDs" ), QStringLiteral( "/" ), mWmsUseLayerIDs->isChecked() );
10821086

src/server/qgssldconfigparser.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "qgsconfigparserutils.h"
2121
#include "qgslogger.h"
2222
#include "qgsmapserviceexception.h"
23+
#include "qgsmessagelog.h"
2324
#include "qgsrasterlayer.h"
2425
#include "qgsrenderer.h"
2526
#include "qgssinglesymbolrenderer.h"
@@ -1204,6 +1205,17 @@ QDomElement QgsSLDConfigParser::findUserLayerElement( const QString& layerName )
12041205

12051206
QgsMapLayer* QgsSLDConfigParser::mapLayerFromUserLayer( const QDomElement& userLayerElem, const QString& layerName, bool allowCaching ) const
12061207
{
1208+
if ( !mFallbackParser )
1209+
{
1210+
return 0;
1211+
}
1212+
1213+
if ( !mFallbackParser->allowRequestDefinedDatasources() )
1214+
{
1215+
QgsMessageLog::logMessage( "The project configuration does not allow datasources defined in the request", "Server", QgsMessageLog::CRITICAL );
1216+
return 0;
1217+
}
1218+
12071219
QgsDebugMsg( "Entering." );
12081220
QgsMSLayerBuilder* layerBuilder = nullptr;
12091221
QDomElement builderRootElement;
@@ -1358,6 +1370,15 @@ void QgsSLDConfigParser::setCrsForLayer( const QDomElement& layerElem, QgsMapLay
13581370
}
13591371
}
13601372

1373+
bool QgsSLDConfigParser::allowRequestDefinedDatasources() const
1374+
{
1375+
if ( mFallbackParser )
1376+
{
1377+
return mFallbackParser->allowRequestDefinedDatasources();
1378+
}
1379+
return false;
1380+
}
1381+
13611382

13621383

13631384

src/server/qgssldconfigparser.h

+2
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ class QgsSLDConfigParser : public QgsWmsConfigParser
133133

134134
void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const override;
135135

136+
bool allowRequestDefinedDatasources() const;
137+
136138
private:
137139

138140
//! SLD as dom document

src/server/qgswmsconfigparser.h

+2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ class SERVER_EXPORT QgsWmsConfigParser
139139

140140
virtual bool useLayerIds() const = 0;
141141

142+
virtual bool allowRequestDefinedDatasources() const { return false; }
143+
142144
//! Adds highlight layers to the layer registry and to the layer set. Returns the ids of the newly created layers (for later removal)
143145
static QStringList addHighlightLayers( const QMap<QString, QString>& parameterMap, QStringList& layerSet, const QString& parameterPrefix = QString() );
144146
static void removeHighlightLayers( const QStringList& layerIds );

src/server/qgswmsprojectparser.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -2481,3 +2481,24 @@ QString QgsWmsProjectParser::getCapaServiceUrl( QDomDocument& doc ) const
24812481

24822482
return url;
24832483
}
2484+
2485+
bool QgsWmsProjectParser::allowRequestDefinedDatasources() const
2486+
{
2487+
if ( !mProjectParser->xmlDocument() )
2488+
{
2489+
return false;
2490+
}
2491+
2492+
QDomElement propertiesElem = mProjectParser->propertiesElem();
2493+
if ( propertiesElem.isNull() )
2494+
{
2495+
return false;
2496+
}
2497+
QDomElement dsElem = propertiesElem.firstChildElement( "WMSRequestDefinedDataSources" );
2498+
if ( dsElem.isNull() )
2499+
{
2500+
return false;
2501+
}
2502+
2503+
return ( dsElem.text().compare( "true", Qt::CaseInsensitive ) == 0 );
2504+
}

src/server/qgswmsprojectparser.h

+2
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ class SERVER_EXPORT QgsWmsProjectParser : public QgsWmsConfigParser
127127

128128
bool useLayerIds() const override { return mProjectParser->useLayerIds(); }
129129

130+
bool allowRequestDefinedDatasources() const;
131+
130132
private:
131133
QgsServerProjectParser* mProjectParser;
132134
#ifdef HAVE_SERVER_PYTHON_PLUGINS

src/server/qgswmsserver.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1894,6 +1894,11 @@ QImage* QgsWmsServer::initializeRendering( QStringList& layersList, QStringList&
18941894
QString gml = mParameters.value( QStringLiteral( "GML" ) );
18951895
if ( !gml.isEmpty() )
18961896
{
1897+
if ( !mConfigParser->allowRequestDefinedDatasources() )
1898+
{
1899+
QgsMessageLog::logMessage( "The project configuration does not allow datasources defined in the request", "Server", QgsMessageLog::CRITICAL );
1900+
return 0;
1901+
}
18971902
QDomDocument* gmlDoc = new QDomDocument();
18981903
if ( gmlDoc->setContent( gml, true ) )
18991904
{

src/ui/qgsprojectpropertiesbase.ui

+33-26
Original file line numberDiff line numberDiff line change
@@ -1238,7 +1238,7 @@
12381238
</widget>
12391239
</item>
12401240
<item row="0" column="0" rowspan="8">
1241-
<widget class="QgsColorSchemeList" name="mTreeProjectColors" native="true"/>
1241+
<widget class="QgsColorSchemeList" name="mTreeProjectColors"/>
12421242
</item>
12431243
<item row="4" column="1">
12441244
<widget class="QToolButton" name="mButtonImportColors">
@@ -1294,9 +1294,9 @@
12941294
<property name="geometry">
12951295
<rect>
12961296
<x>0</x>
1297-
<y>-961</y>
1297+
<y>-912</y>
12981298
<width>674</width>
1299-
<height>2470</height>
1299+
<height>2497</height>
13001300
</rect>
13011301
</property>
13021302
<layout class="QVBoxLayout" name="verticalLayout_13">
@@ -1845,7 +1845,7 @@
18451845
</property>
18461846
</widget>
18471847
</item>
1848-
<item row="11" column="0" colspan="2">
1848+
<item row="12" column="0" colspan="2">
18491849
<layout class="QHBoxLayout" name="horizontalLayout_10">
18501850
<item>
18511851
<widget class="QLabel" name="mWMSImageQualityLabel">
@@ -1879,7 +1879,7 @@
18791879
</property>
18801880
</widget>
18811881
</item>
1882-
<item row="10" column="0" colspan="2">
1882+
<item row="11" column="0" colspan="2">
18831883
<layout class="QGridLayout" name="gridLayout_3">
18841884
<item row="1" column="1">
18851885
<widget class="QLabel" name="mMaxWidthLabel">
@@ -1926,7 +1926,7 @@
19261926
</item>
19271927
</layout>
19281928
</item>
1929-
<item row="8" column="0" colspan="2">
1929+
<item row="9" column="0" colspan="2">
19301930
<layout class="QHBoxLayout" name="grpWMSPrecision">
19311931
<item>
19321932
<widget class="QLabel" name="label_5">
@@ -1950,7 +1950,7 @@
19501950
</item>
19511951
</layout>
19521952
</item>
1953-
<item row="9" column="0" colspan="2">
1953+
<item row="10" column="0" colspan="2">
19541954
<layout class="QHBoxLayout" name="horizontalLayout_2">
19551955
<item>
19561956
<widget class="QLabel" name="mWMSUrlLabel">
@@ -2096,13 +2096,20 @@
20962096
</layout>
20972097
</widget>
20982098
</item>
2099-
<item row="7" column="0">
2099+
<item row="8" column="0">
21002100
<widget class="QCheckBox" name="mSegmentizeFeatureInfoGeometryCheckBox">
21012101
<property name="text">
21022102
<string>Segmentize feature info geometry</string>
21032103
</property>
21042104
</widget>
21052105
</item>
2106+
<item row="7" column="0">
2107+
<widget class="QCheckBox" name="mAllowRequestDefinedDataSourcesBox">
2108+
<property name="text">
2109+
<string>Allow defining datasources in server requests</string>
2110+
</property>
2111+
</widget>
2112+
</item>
21062113
</layout>
21072114
</widget>
21082115
</item>
@@ -2359,8 +2366,8 @@
23592366
<rect>
23602367
<x>0</x>
23612368
<y>0</y>
2362-
<width>694</width>
2363-
<height>779</height>
2369+
<width>141</width>
2370+
<height>54</height>
23642371
</rect>
23652372
</property>
23662373
<layout class="QVBoxLayout" name="verticalLayout_17">
@@ -2486,39 +2493,39 @@
24862493
</widget>
24872494
<customwidgets>
24882495
<customwidget>
2489-
<class>QgsCollapsibleGroupBox</class>
2490-
<extends>QGroupBox</extends>
2491-
<header>qgscollapsiblegroupbox.h</header>
2496+
<class>QgsProjectionSelector</class>
2497+
<extends>QWidget</extends>
2498+
<header>qgsprojectionselector.h</header>
24922499
<container>1</container>
24932500
</customwidget>
24942501
<customwidget>
2495-
<class>QgsColorButton</class>
2496-
<extends>QToolButton</extends>
2497-
<header>qgscolorbutton.h</header>
2502+
<class>QgsCollapsibleGroupBox</class>
2503+
<extends>QGroupBox</extends>
2504+
<header>qgscollapsiblegroupbox.h</header>
24982505
<container>1</container>
24992506
</customwidget>
25002507
<customwidget>
2501-
<class>QgsColorSchemeList</class>
2508+
<class>QgsCodeEditorPython</class>
25022509
<extends>QWidget</extends>
2503-
<header location="global">qgscolorschemelist.h</header>
2510+
<header>qgscodeeditorpython.h</header>
25042511
<container>1</container>
25052512
</customwidget>
25062513
<customwidget>
2507-
<class>QgsVariableEditorWidget</class>
2508-
<extends>QWidget</extends>
2509-
<header location="global">qgsvariableeditorwidget.h</header>
2514+
<class>QgsColorSchemeList</class>
2515+
<extends>QTreeView</extends>
2516+
<header>qgscolorschemelist.h</header>
25102517
<container>1</container>
25112518
</customwidget>
25122519
<customwidget>
2513-
<class>QgsCodeEditorPython</class>
2514-
<extends>QWidget</extends>
2515-
<header>qgscodeeditorpython.h</header>
2520+
<class>QgsColorButton</class>
2521+
<extends>QToolButton</extends>
2522+
<header>qgscolorbutton.h</header>
25162523
<container>1</container>
25172524
</customwidget>
25182525
<customwidget>
2519-
<class>QgsProjectionSelector</class>
2526+
<class>QgsVariableEditorWidget</class>
25202527
<extends>QWidget</extends>
2521-
<header>qgsprojectionselector.h</header>
2528+
<header location="global">qgsvariableeditorwidget.h</header>
25222529
<container>1</container>
25232530
</customwidget>
25242531
</customwidgets>

0 commit comments

Comments
 (0)