@@ -1382,6 +1382,21 @@ def get_path_parts(self):
1382
1382
return path_parts [1 :] # remove extra '' added by split
1383
1383
return path_parts
1384
1384
1385
+ def _get_path_prefix_permission (self , path_parts ):
1386
+ # type: (List[str]) -> Tuple[Optional[Str], PermissionRequested]
1387
+ cfg = self .get_config ()
1388
+ # first to favor BROWSE over READ prefix conflicts
1389
+ for prefixes , permission in ((cfg ["metadata_type" ]["prefixes" ], Permission .BROWSE ),
1390
+ (cfg ["data_type" ]["prefixes" ], Permission .READ )):
1391
+ for pattern_prefix in prefixes :
1392
+ if not path_parts and pattern_prefix is None :
1393
+ return pattern_prefix , permission
1394
+ if pattern_prefix is not None :
1395
+ path_prefix = "/" .join (path_parts [:pattern_prefix .count ("/" ) + 1 ])
1396
+ if self .is_match (path_prefix , pattern_prefix ) is not None :
1397
+ return path_prefix , permission
1398
+ return None , None
1399
+
1385
1400
@staticmethod
1386
1401
def is_match (value , pattern ):
1387
1402
# type: (Str, Str) -> Optional[Str]
@@ -1396,11 +1411,14 @@ def is_match(value, pattern):
1396
1411
def resource_requested (self ):
1397
1412
# type: () -> TargetResourceRequested
1398
1413
path_parts = self .get_path_parts ()
1399
-
1414
+ path_prefix , _ = self . _get_path_prefix_permission ( path_parts )
1400
1415
# handle optional prefix as targeting the service directly
1401
1416
if not path_parts or len (path_parts ) < 2 :
1402
1417
return self .service , True
1403
- path_parts = path_parts [1 :]
1418
+ if path_prefix :
1419
+ path_parts = path_parts [path_prefix .count ("/" ) + 1 :]
1420
+ else :
1421
+ path_parts = path_parts [1 :]
1404
1422
cfg = self .get_config ()
1405
1423
1406
1424
# find deepest possible resource matching either Directory or File by name
@@ -1431,21 +1449,9 @@ def resource_requested(self):
1431
1449
1432
1450
def permission_requested (self ):
1433
1451
# type: () -> PermissionRequested
1434
- cfg = self .get_config ()
1435
1452
path_parts = self .get_path_parts ()
1436
- path_prefix = None # in case of no `<prefix>`, simulate as `null`
1437
- if path_parts :
1438
- path_prefix = path_parts [0 ]
1439
- for prefixes , permission in [
1440
- (cfg ["metadata_type" ]["prefixes" ], Permission .BROWSE ), # first to favor BROWSE over READ prefix conflicts
1441
- (cfg ["data_type" ]["prefixes" ], Permission .READ ),
1442
- ]:
1443
- for pattern_prefix in prefixes : # type: Str
1444
- if path_prefix is None and pattern_prefix is None :
1445
- return permission
1446
- if self .is_match (path_prefix , pattern_prefix ) is not None :
1447
- return permission
1448
- return None # automatically deny
1453
+ _ , permission = self ._get_path_prefix_permission (path_parts )
1454
+ return permission
1449
1455
1450
1456
1451
1457
class ServiceGeoserverWPS (ServiceGeoserverBase , ServiceWPS ): # order important to call overridden class properties
0 commit comments