@@ -1382,6 +1382,20 @@ 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
+ 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
+
1385
1399
@staticmethod
1386
1400
def is_match (value , pattern ):
1387
1401
# type: (Str, Str) -> Optional[Str]
@@ -1396,11 +1410,14 @@ def is_match(value, pattern):
1396
1410
def resource_requested (self ):
1397
1411
# type: () -> TargetResourceRequested
1398
1412
path_parts = self .get_path_parts ()
1399
-
1413
+ path_prefix , _ = self . _get_path_prefix_permission ( path_parts )
1400
1414
# handle optional prefix as targeting the service directly
1401
1415
if not path_parts or len (path_parts ) < 2 :
1402
1416
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 :]
1404
1421
cfg = self .get_config ()
1405
1422
1406
1423
# find deepest possible resource matching either Directory or File by name
@@ -1431,21 +1448,9 @@ def resource_requested(self):
1431
1448
1432
1449
def permission_requested (self ):
1433
1450
# type: () -> PermissionRequested
1434
- cfg = self .get_config ()
1435
1451
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
1449
1454
1450
1455
1451
1456
class ServiceGeoserverWPS (ServiceGeoserverBase , ServiceWPS ): # order important to call overridden class properties
0 commit comments