Skip to content

Commit 2c78cf5

Browse files
committed
filter prefix when checking resource as well
1 parent b4eb2bd commit 2c78cf5

File tree

1 file changed

+21
-16
lines changed

1 file changed

+21
-16
lines changed

magpie/services.py

+21-16
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,20 @@ def get_path_parts(self):
13821382
return path_parts[1:] # remove extra '' added by split
13831383
return path_parts
13841384

1385+
def _get_path_prefix_permission(self, path_parts):
1386+
# type: (List[str]) -> Tuple[Optional[Str], PermissionRequested]
1387+
cfg = self.get_config()
1388+
for prefixes, permission in ((cfg["metadata_type"]["prefixes"], Permission.BROWSE),
1389+
(cfg["data_type"]["prefixes"], Permission.READ)):
1390+
for prefix in prefixes:
1391+
if not path_parts and prefix is None:
1392+
return prefix, permission
1393+
if prefix is not None:
1394+
path_prefix = "/".join(path_parts[:prefix.count("/") + 1])
1395+
if self.is_match(path_prefix, prefix) is not None:
1396+
return path_prefix, permission
1397+
return None, None
1398+
13851399
@staticmethod
13861400
def is_match(value, pattern):
13871401
# type: (Str, Str) -> Optional[Str]
@@ -1396,11 +1410,14 @@ def is_match(value, pattern):
13961410
def resource_requested(self):
13971411
# type: () -> TargetResourceRequested
13981412
path_parts = self.get_path_parts()
1399-
1413+
path_prefix, _ = self._get_path_prefix_permission(path_parts)
14001414
# handle optional prefix as targeting the service directly
14011415
if not path_parts or len(path_parts) < 2:
14021416
return self.service, True
1403-
path_parts = path_parts[1:]
1417+
if path_prefix:
1418+
path_parts = path_parts[path_prefix.count("/") + 1:]
1419+
else:
1420+
path_parts = path_parts[1:]
14041421
cfg = self.get_config()
14051422

14061423
# find deepest possible resource matching either Directory or File by name
@@ -1431,21 +1448,9 @@ def resource_requested(self):
14311448

14321449
def permission_requested(self):
14331450
# type: () -> PermissionRequested
1434-
cfg = self.get_config()
14351451
path_parts = self.get_path_parts()
1436-
for prefixes, permission in [
1437-
(cfg["metadata_type"]["prefixes"], Permission.BROWSE), # first to favor BROWSE over READ prefix conflicts
1438-
(cfg["data_type"]["prefixes"], Permission.READ),
1439-
]:
1440-
for pattern_prefix in prefixes: # type: Str
1441-
if not path_parts and pattern_prefix is None:
1442-
return permission
1443-
if pattern_prefix is not None:
1444-
pattern_prefix = pattern_prefix.strip("/")
1445-
path_prefix = "/".join(path_parts[:pattern_prefix.count("/") + 1])
1446-
if self.is_match(path_prefix, pattern_prefix) is not None:
1447-
return permission
1448-
return None # automatically deny
1452+
_, permission = self._get_path_prefix_permission(path_parts)
1453+
return permission
14491454

14501455

14511456
class ServiceGeoserverWPS(ServiceGeoserverBase, ServiceWPS): # order important to call overridden class properties

0 commit comments

Comments
 (0)