Skip to content

Commit

Permalink
Support layer short names and WMSUseLayerIDs
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaud-morvan committed Sep 11, 2019
1 parent 23574b6 commit df3e032
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions docker/qgisserver/geomapfish_qgisserver/accesscontrol.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import zope.event.classhandler
from c2c.template.config import config
from enum import Enum
from qgis.core import QgsMessageLog, QgsDataSourceUri, QgsProject
from qgis.core import QgsMessageLog, QgsDataSourceUri, QgsProject, QgsLayerTreeLayer, QgsLayerTreeGroup
from qgis.server import QgsAccessControlFilter
from shapely import ops
from sqlalchemy.orm import configure_mappers, scoped_session, sessionmaker
Expand Down Expand Up @@ -165,6 +165,12 @@ def handle(event: InvalidateCacheEvent):
QgsMessageLog.logMessage(''.join(traceback.format_exception(*sys.exc_info())))
raise

def ogc_layer_name(self, layer):
if self.user_layer_ids:
return layer.id()
else:
return layer.shortName() or layer.name()

def get_layers(self):
"""
Get the list of GMF WMS layers that can give access to each QGIS layer or group.
Expand All @@ -182,17 +188,25 @@ def get_layers(self):
return self.layers

self.project = QgsProject.instance()
self.user_layer_ids, ok = self.project.readBoolEntry("WMSUseLayerIDs", "/", False)

nodes = {} # dict { node name : list of ancestor node names }

def browse(path, node):
nodes[node.name()] = [node.name()]
if isinstance(node, QgsLayerTreeLayer):
ogc_name = self.ogc_layer_name(node.layer())
elif isinstance(node, QgsLayerTreeGroup):
ogc_name = node.customProperty("wmsShortName") or node.name()
else:
ogc_name = node.name()

nodes[ogc_name] = [ogc_name]

for name in path:
nodes[name].append(node.name())
nodes[ogc_name].append(name)

for l in node.children():
browse(path + [node.name()], l)
browse(path + [ogc_name], l)

browse([], self.project.layerTreeRoot())

Expand Down Expand Up @@ -296,12 +310,13 @@ def get_area(self, layer, rw=False):
- Access area as WKT or None
"""
roles = self.get_roles()
key = (layer.name(), tuple(sorted(role.id for role in roles)), rw)
ogc_name = self.ogc_layer_name(layer)
key = (ogc_name, tuple(sorted(role.id for role in roles)), rw)

if key in self.area_cache:
return self.area_cache[key]

gmf_layers = self.get_layers().get(layer.name(), None)
gmf_layers = self.get_layers().get(ogc_name, None)
if gmf_layers is None:
raise Exception("Access to an unknown layer")

Expand Down Expand Up @@ -392,10 +407,11 @@ def layerPermissions(self, layer): # NOQA
rights = QgsAccessControlFilter.LayerPermissions()
rights.canRead = rights.canInsert = rights.canUpdate = rights.canDelete = False

if layer.name() not in self.get_layers():
layers = self.get_layers()
ogc_layer_name = self.ogc_layer_name(layer)
if ogc_layer_name not in layers:
return rights

gmf_layers = self.get_layers()[layer.name()]
gmf_layers = self.get_layers()[ogc_layer_name]

roles = self.get_roles()
access, _ = self.get_restriction_areas(gmf_layers, roles=roles)
Expand Down

0 comments on commit df3e032

Please sign in to comment.