@@ -40,7 +40,6 @@ namespace QgsWms
40
40
Q_UNUSED ( version );
41
41
42
42
QgsServerRequest::Parameters parameters = request.parameters ();
43
- QgsWmsConfigParser *configParser = getConfigParser ( serverIface );
44
43
45
44
if ( !parameters.contains ( QStringLiteral ( " SLD_VERSION" ) ) )
46
45
{
@@ -64,6 +63,24 @@ namespace QgsWms
64
63
{
65
64
throw QgsServiceException ( QStringLiteral ( " InvalidParameterValue" ), QStringLiteral ( " Layers is empty" ), 400 );
66
65
}
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 );
67
84
68
85
// get the wms service url defined in project or keep the one from the
69
86
// request url
@@ -85,7 +102,86 @@ namespace QgsWms
85
102
wcsHrefString = wmsHrefString;
86
103
}
87
104
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;
89
185
}
90
186
91
187
} // samespace QgsWms
0 commit comments