Skip to content

Commit 8356c76

Browse files
authored
Merge pull request #4637 from rldhont/server-wms-configparser-describelayer
[Server] WMS DescribeLayer refactoring
2 parents d996cf2 + 8a0261c commit 8356c76

9 files changed

+124
-8
lines changed

python/server/qgsserverprojectutils.sip

+1-1
Original file line numberDiff line numberDiff line change
@@ -243,5 +243,5 @@ namespace QgsServerProjectUtils
243243
* @param project the QGIS project
244244
* @return the Layer ids list.
245245
*/
246-
QStringList wcsLayers( const QgsProject &project );
246+
QStringList wcsLayerIds( const QgsProject &project );
247247
};

src/server/qgsserverprojectutils.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ QString QgsServerProjectUtils::wcsServiceUrl( const QgsProject &project )
263263
return project.readEntry( QStringLiteral( "WCSUrl" ), QStringLiteral( "/" ), "" );
264264
}
265265

266-
QStringList QgsServerProjectUtils::wcsLayers( const QgsProject &project )
266+
QStringList QgsServerProjectUtils::wcsLayerIds( const QgsProject &project )
267267
{
268268
return project.readListEntry( QStringLiteral( "WCSLayers" ), QStringLiteral( "/" ) );
269269
}

src/server/qgsserverprojectutils.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ namespace QgsServerProjectUtils
245245
* \param project the QGIS project
246246
* \returns the Layer ids list.
247247
*/
248-
SERVER_EXPORT QStringList wcsLayers( const QgsProject &project );
248+
SERVER_EXPORT QStringList wcsLayerIds( const QgsProject &project );
249249
};
250250

251251
#endif

src/server/services/wcs/qgswcsdescribecoverage.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ namespace QgsWcs
9494
}
9595
}
9696

97-
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayers( *project );
97+
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
9898
for ( int i = 0; i < wcsLayersId.size(); ++i )
9999
{
100100
QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );

src/server/services/wcs/qgswcsgetcapabilities.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ namespace QgsWcs
260260
*/
261261
QDomElement contentMetadataElement = doc.createElement( QStringLiteral( "ContentMetadata" )/*wcs:ContentMetadata*/ );
262262

263-
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayers( *project );
263+
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
264264
for ( int i = 0; i < wcsLayersId.size(); ++i )
265265
{
266266
QgsMapLayer *layer = project->mapLayer( wcsLayersId.at( i ) );

src/server/services/wcs/qgswcsgetcoverage.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ namespace QgsWcs
7373
}
7474

7575
//get the raster layer
76-
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayers( *project );
76+
QStringList wcsLayersId = QgsServerProjectUtils::wcsLayerIds( *project );
7777

7878
QgsRasterLayer *rLayer = nullptr;
7979
for ( int i = 0; i < wcsLayersId.size(); ++i )

src/server/services/wms/qgswmsdescribelayer.cpp

+98-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ namespace QgsWms
4040
Q_UNUSED( version );
4141

4242
QgsServerRequest::Parameters parameters = request.parameters();
43-
QgsWmsConfigParser *configParser = getConfigParser( serverIface );
4443

4544
if ( !parameters.contains( QStringLiteral( "SLD_VERSION" ) ) )
4645
{
@@ -64,6 +63,24 @@ namespace QgsWms
6463
{
6564
throw QgsServiceException( QStringLiteral( "InvalidParameterValue" ), QStringLiteral( "Layers is empty" ), 400 );
6665
}
66+
QDomDocument myDocument = QDomDocument();
67+
68+
QDomNode header = myDocument.createProcessingInstruction( QStringLiteral( "xml" ), QStringLiteral( "version=\"1.0\" encoding=\"UTF-8\"" ) );
69+
myDocument.appendChild( header );
70+
71+
// Create the root element
72+
QDomElement root = myDocument.createElementNS( QStringLiteral( "http://www.opengis.net/sld" ), QStringLiteral( "DescribeLayerResponse" ) );
73+
root.setAttribute( QStringLiteral( "xsi:schemaLocation" ), QStringLiteral( "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/DescribeLayer.xsd" ) );
74+
root.setAttribute( QStringLiteral( "xmlns:ows" ), QStringLiteral( "http://www.opengis.net/ows" ) );
75+
root.setAttribute( QStringLiteral( "xmlns:se" ), QStringLiteral( "http://www.opengis.net/se" ) );
76+
root.setAttribute( QStringLiteral( "xmlns:xlink" ), QStringLiteral( "http://www.w3.org/1999/xlink" ) );
77+
root.setAttribute( QStringLiteral( "xmlns:xsi" ), QStringLiteral( "http://www.w3.org/2001/XMLSchema-instance" ) );
78+
myDocument.appendChild( root );
79+
80+
// store the Version element
81+
QDomElement versionNode = myDocument.createElement( QStringLiteral( "Version" ) );
82+
versionNode.appendChild( myDocument.createTextNode( QStringLiteral( "1.1.0" ) ) );
83+
root.appendChild( versionNode );
6784

6885
// get the wms service url defined in project or keep the one from the
6986
// request url
@@ -85,7 +102,86 @@ namespace QgsWms
85102
wcsHrefString = wmsHrefString;
86103
}
87104

88-
return configParser->describeLayer( layersList, wfsHrefString, wcsHrefString );
105+
// access control
106+
QgsAccessControl *accessControl = serverIface->accessControls();
107+
// Use layer ids
108+
bool useLayerIds = QgsServerProjectUtils::wmsUseLayerIds( *project );
109+
// WMS restricted layers
110+
QStringList restrictedLayers = QgsServerProjectUtils::wmsRestrictedLayers( *project );
111+
// WFS layers
112+
QStringList wfsLayerIds = QgsServerProjectUtils::wfsLayerIds( *project );
113+
// WCS layers
114+
QStringList wcsLayerIds = QgsServerProjectUtils::wcsLayerIds( *project );
115+
116+
Q_FOREACH ( QgsMapLayer *layer, project->mapLayers() )
117+
{
118+
QString name = layer->name();
119+
if ( useLayerIds )
120+
name = layer->id();
121+
else if ( !layer->shortName().isEmpty() )
122+
name = layer->shortName();
123+
124+
if ( !layersList.contains( name ) )
125+
{
126+
continue;
127+
}
128+
129+
//unpublished layer
130+
if ( restrictedLayers.contains( layer->name() ) )
131+
{
132+
throw QgsSecurityException( QStringLiteral( "You are not allowed to access to this layer" ) );
133+
}
134+
135+
if ( accessControl && !accessControl->layerReadPermission( layer ) )
136+
{
137+
throw QgsSecurityException( QStringLiteral( "You are not allowed to access to this layer" ) );
138+
}
139+
140+
// Create the NamedLayer element
141+
QDomElement layerNode = myDocument.createElement( QStringLiteral( "LayerDescription" ) );
142+
root.appendChild( layerNode );
143+
144+
// store the owsType element
145+
QDomElement typeNode = myDocument.createElement( QStringLiteral( "owsType" ) );
146+
// store the se:OnlineResource element
147+
QDomElement oResNode = myDocument.createElement( QStringLiteral( "se:OnlineResource" ) );
148+
oResNode.setAttribute( QStringLiteral( "xlink:type" ), QStringLiteral( "simple" ) );
149+
// store the TypeName element
150+
QDomElement nameNode = myDocument.createElement( QStringLiteral( "TypeName" ) );
151+
if ( layer->type() == QgsMapLayer::VectorLayer )
152+
{
153+
typeNode.appendChild( myDocument.createTextNode( QStringLiteral( "wfs" ) ) );
154+
155+
if ( wfsLayerIds.indexOf( layer->id() ) != -1 )
156+
{
157+
oResNode.setAttribute( QStringLiteral( "xlink:href" ), wfsHrefString );
158+
}
159+
160+
// store the se:FeatureTypeName element
161+
QDomElement typeNameNode = myDocument.createElement( QStringLiteral( "se:FeatureTypeName" ) );
162+
typeNameNode.appendChild( myDocument.createTextNode( name ) );
163+
nameNode.appendChild( typeNameNode );
164+
}
165+
else if ( layer->type() == QgsMapLayer::RasterLayer )
166+
{
167+
typeNode.appendChild( myDocument.createTextNode( QStringLiteral( "wcs" ) ) );
168+
169+
if ( wcsLayerIds.indexOf( layer->id() ) != -1 )
170+
{
171+
oResNode.setAttribute( QStringLiteral( "xlink:href" ), wcsHrefString );
172+
}
173+
174+
// store the se:CoverageTypeName element
175+
QDomElement typeNameNode = myDocument.createElement( QStringLiteral( "se:CoverageTypeName" ) );
176+
typeNameNode.appendChild( myDocument.createTextNode( name ) );
177+
nameNode.appendChild( typeNameNode );
178+
}
179+
layerNode.appendChild( typeNode );
180+
layerNode.appendChild( oResNode );
181+
layerNode.appendChild( nameNode );
182+
}
183+
184+
return myDocument;
89185
}
90186

91187
} // samespace QgsWms

tests/src/python/test_qgsserver_wms.py

+6
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ def test_project_wms(self):
125125
'FEATURE_COUNT=10&FILTER=testlayer%20%C3%A8%C3%A9' + urllib.parse.quote(':"NAME" = \'two\' OR "utf8nameè" = \'three èé↓\''),
126126
'wms_getfeatureinfo_filter_or_utf8')
127127

128+
# Test DescribeLayer
129+
self.wms_request_compare('DescribeLayer',
130+
'&layers=testlayer%20%C3%A8%C3%A9&' +
131+
'SLD_VERSION=1.1.0',
132+
'describelayer')
133+
128134
def wms_inspire_request_compare(self, request):
129135
"""WMS INSPIRE tests"""
130136
project = self.testdata_path + "test_project_inspire.qgs"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
*****
2+
Content-Type: text/xml; charset=utf-8
3+
4+
<?xml version="1.0" encoding="utf-8"?>
5+
<DescribeLayerResponse xmlns="http://www.opengis.net/sld" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/DescribeLayer.xsd" xmlns:se="http://www.opengis.net/se" xmlns:xlink="http://www.w3.org/1999/xlink">
6+
<Version>1.1.0</Version>
7+
<LayerDescription>
8+
<owsType>wfs</owsType>
9+
<se:OnlineResource xlink:type="simple" xlink:href="https://www.qgis.org/?*****"/>
10+
<TypeName>
11+
<se:FeatureTypeName>testlayer èé</se:FeatureTypeName>
12+
</TypeName>
13+
</LayerDescription>
14+
</DescribeLayerResponse>

0 commit comments

Comments
 (0)