sharing: review create, check handling of boolean, update doc

This commit is contained in:
Peter Bieringer
2026-03-03 19:08:29 +01:00
parent c74365cd8a
commit ac4ff709d7
4 changed files with 200 additions and 149 deletions

View File

@@ -167,18 +167,31 @@ curl -u user:pass --silent -H "accept: application/json" -d "" http://localhost:
``` ```
##### API Hook "*/create" ##### API Hook "(token|map)/create"
Create a share * Authorization
Authenticated user is `Owner`
###### API Hook "token/create" ###### API Hook "token/create"
Create a share by mapping a collection of an `Owner` to a token.
* Authorization
Authenticated user as `Owner` has at least read access to `PathMapped`
* Input * Input
| Parameter | Mandatory | Default | | Parameter | Owner |
| - | - | - | | - | - |
| PathMapped | yes | | | Owner | implicit(by authentication) |
| Permissions | no | r | PathMapped | mandatory |
| User | optional(default:owner) |
| Permissions | optional(default:r) |
| Enabled | optional(owner) |
| Hidden | optional(owner) |
| Properties | optional |
* Output * Output
@@ -195,17 +208,28 @@ Status=success
PathOrToken=v1/VQR7AmsVRi2ZlFj_JwGpFx-ES5Goyku-gP_YkLh1zUw= PathOrToken=v1/VQR7AmsVRi2ZlFj_JwGpFx-ES5Goyku-gP_YkLh1zUw=
``` ```
###### API Hook "map/create" ###### API Hook "map/create"
Create a share by mapping a collection of an `Owner` to an `User`.
* Authorization
Authenticated user as `Owner` has at least read access to `PathMapped`
Provided `User` has at least read access to `PathOrToken`
* Input * Input
| Parameter | Mandatory | Default | | Parameter | Value |
| - | - | - | | - | - |
| PathOrToken | yes | | | Owner | implicit(by authentication) |
| PathMapped | yes | | | PathOrToken | mandatory |
| Permissions | no | r | PathMapped | mandatory |
| User | yes | | | User | mandatory |
| Permissions | optional(default:r) |
| Enabled | optional(owner) |
| Hidden | optional(owner) |
| Properties | optional |
* Output: result status * Output: result status
@@ -218,17 +242,22 @@ Status=success
``` ```
##### API Hook "*/list" ##### API Hook "(map|token|all)/list"
List shares (optional with filter) List shares (optional with filter) either owned or assigned as user.
* Authorization
Authenticated user as `Owner` or `User`
* Input * Input
| Parameter | Mandatory | Default | | Parameter | Filter |
| - | - | - | | - | - |
| PathMapped | no | (all) | | Owner | implicit(by authentication) |
| Owner | no | (owned ones) | | User | implicit(by authentication) |
| User | no | (filtered) | | PathOrToken | optional |
| PathMapped | optional |
* Output: plain/csv/json * Output: plain/csv/json

View File

@@ -91,6 +91,8 @@ class BaseSharing:
_storage: storage.BaseStorage _storage: storage.BaseStorage
_rights: rights.BaseRights _rights: rights.BaseRights
_enabled: bool = False _enabled: bool = False
default_permissions_create_token: str
default_permissions_create_map: str
def __init__(self, configuration: "config.Configuration") -> None: def __init__(self, configuration: "config.Configuration") -> None:
"""Initialize Sharing. """Initialize Sharing.
@@ -476,6 +478,12 @@ class BaseSharing:
request_data = json.loads(request_body) request_data = json.loads(request_body)
except json.JSONDecodeError: except json.JSONDecodeError:
return httputils.bad_request("Invalid JSON") return httputils.bad_request("Invalid JSON")
for key in ["Enabled", "Hidden"]:
# convert JSON boolean
if key in request_data:
if type(request_data[key]) is not bool:
logger.error(api_info + ": unsupported (non-boolean) " + key + ": " + request_data[key])
return httputils.bad_request("Invalid non-boolean value for " + key + ": " + request_data[key])
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + " (json): %r", f"{request_data}") logger.debug("TRACE/" + api_info + " (json): %r", f"{request_data}")
elif 'application/x-www-form-urlencoded' in content_type: elif 'application/x-www-form-urlencoded' in content_type:
@@ -496,12 +504,12 @@ class BaseSharing:
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/sharing/API: converted Properties from form into dict: %r", properties_dict) logger.debug("TRACE/sharing/API: converted Properties from form into dict: %r", properties_dict)
request_data[key] = properties_dict request_data[key] = properties_dict
elif key == "Enabled" or key == "Hidden": elif key in ["Enabled", "Hidden"]:
try: try:
request_data[key] = config._convert_to_bool(request_parsed[key]) request_data[key] = config._convert_to_bool(request_parsed[key][0])
except ValueError: except ValueError:
logger.error(api_info + ": unsupported " + key) logger.error(api_info + ": unsupported (non-boolean) " + key + ": " + request_parsed[key][0])
return httputils.bad_request("Invalid value for " + key) return httputils.bad_request("Invalid non-boolean value for " + key + ": " + request_parsed[key][0])
else: else:
request_data[key] = request_parsed[key][0] request_data[key] = request_parsed[key][0]
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
@@ -536,16 +544,15 @@ class BaseSharing:
Owner: str = user Owner: str = user
User: Union[str, None] = None User: Union[str, None] = None
Permissions: Union[str, None] = None # no permissions by default Permissions: Union[str, None] = None # no permissions by default
EnabledByOwner: Union[bool, None] = None Enabled: Union[bool, None] = None
HiddenByOwner: Union[bool, None] = None Hidden: Union[bool, None] = None
EnabledByUser: Union[bool, None] = None
HiddenByUser: Union[bool, None] = None
Properties: Union[dict, None] = None Properties: Union[dict, None] = None
# parameters sanity check # parameters sanity check
for key in request_data: for key in request_data:
if key == "Permissions": if key == "Permissions":
if not re.search('^[a-zA-Z]+$', request_data[key]): for permission in request_data[key]:
if permission not in rights.INTERNAL_PERMISSIONS:
return httputils.bad_request("Invalid value for Permissions") return httputils.bad_request("Invalid value for Permissions")
elif key == "PathOrToken": elif key == "PathOrToken":
if ShareType == "token": if ShareType == "token":
@@ -569,19 +576,9 @@ class BaseSharing:
logger.error(api_info + ": unsupported " + key) logger.error(api_info + ": unsupported " + key)
return httputils.bad_request("Invalid value for User") return httputils.bad_request("Invalid value for User")
# check for mandatory parameters # check for optional parameters
if 'PathMapped' not in request_data: if 'PathMapped' in request_data:
if action in ['info', 'list', 'update', 'delete', 'enable', 'disable', 'hide', 'unhide']: # used by create or list(filter)
# ignored
pass
else:
if ShareType == "token" and action != 'create':
# optional
pass
else:
logger.error(api_info + ": missing PathMapped")
return httputils.bad_request("Missing PathMapped")
else:
PathMapped = request_data['PathMapped'] PathMapped = request_data['PathMapped']
if 'PathOrToken' not in request_data: if 'PathOrToken' not in request_data:
@@ -621,20 +618,10 @@ class BaseSharing:
else: else:
Hidden = None Hidden = None
if ShareType == "map": if 'User' in request_data:
if action == 'info':
# ignored
pass
else:
if 'User' not in request_data:
if action not in ['list', 'delete', 'update', 'enable', 'disable', 'hide', 'unhide']:
logger.warning(api_info + ": missing User")
return httputils.bad_request("Missing User")
else:
# optional
pass
else:
User = request_data['User'] User = request_data['User']
else:
User = None
answer: dict = {} answer: dict = {}
result: dict = {} result: dict = {}
@@ -651,20 +638,20 @@ class BaseSharing:
if action == "list": if action == "list":
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": start") logger.debug("TRACE/" + api_info + ": start")
if 'PathOrToken' in request_data:
PathOrToken = request_data['PathOrToken'] if PathOrToken is not None:
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": filter: %r", PathOrToken) logger.debug("TRACE/" + api_info + ": filter: %r", PathOrToken)
if ShareType != "all": if ShareType != "all":
result_array = self.list_sharing( result_array = self.list_sharing(
ShareType=ShareType, ShareType=ShareType,
OwnerOrUser=Owner, OwnerOrUser=user,
PathMapped=PathMapped, PathMapped=PathMapped,
PathOrToken=PathOrToken) PathOrToken=PathOrToken)
else: else:
result_array = self.list_sharing( result_array = self.list_sharing(
OwnerOrUser=Owner, OwnerOrUser=user,
PathMapped=PathMapped, PathMapped=PathMapped,
PathOrToken=PathOrToken) PathOrToken=PathOrToken)
@@ -679,7 +666,12 @@ class BaseSharing:
elif action == "create": elif action == "create":
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": start") logger.debug("TRACE/" + api_info + ": start")
if 'Permissions' not in request_data:
if PathMapped is None:
logger.error(api_info + ": missing PathMapped")
return httputils.bad_request("Missing PathMapped")
if Permissions is None:
if ShareType == "token": if ShareType == "token":
Permissions = self.default_permissions_create_token Permissions = self.default_permissions_create_token
elif ShareType == "map": elif ShareType == "map":
@@ -687,23 +679,27 @@ class BaseSharing:
else: else:
# default # default
Permissions = "r" Permissions = "r"
if 'Enabled' in request_data:
EnabledByOwner = config._convert_to_bool(request_data['Enabled'])
else: else:
EnabledByOwner = False # security by default Permissions = str(Permissions)
if 'Hidden' in request_data: if Enabled is None:
HiddenByOwner = config._convert_to_bool(request_data['Hidden']) Enabled = False # security by default
else:
HiddenByOwner = True # security by default
EnabledByUser = False # security by default if Hidden is None:
HiddenByUser = True # security by default Hidden = True # security by default
# create token share with security-by-default for User
EnabledByUser: bool = False
HiddenByUser: bool = True
if user == User:
# create token share with same flags
EnabledByUser = Enabled
HiddenByUser = Hidden
if ShareType == "token": if ShareType == "token":
# check access Permissions # check access Permissions
access = Access(self._rights, user, str(PathMapped)) # PathMapped is mandatory access = Access(self._rights, user, PathMapped)
if not access.check("r"): if not access.check("r"):
logger.info("Add sharing-by-token: access to %r not allowed for user %r", PathMapped, user) logger.info("Add sharing-by-token: access to %r not allowed for user %r", PathMapped, user)
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
@@ -717,20 +713,32 @@ class BaseSharing:
logger.info("Add sharing-by-token: access to %r not allowed for user %r (permit=True but denied by 'T')", PathMapped, user) logger.info("Add sharing-by-token: access to %r not allowed for user %r (permit=True but denied by 'T')", PathMapped, user)
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
if User is not None:
# user is optional on tokens, otherwise it's the owner itself
User = str(User)
else:
User = user
# v1: create uuid token with 2x 32 bytes = 256 bit # v1: create uuid token with 2x 32 bytes = 256 bit
token = "v1/" + str(base64.urlsafe_b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes), 'utf-8') token = "v1/" + str(base64.urlsafe_b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes), 'utf-8')
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": %r (Permissions=%r token=%r)", PathMapped, Permissions, token) logger.debug("TRACE/" + api_info + ": %r (Permissions=%r token=%r)", PathMapped, Permissions, token)
result = self.create_sharing( result = self.create_sharing(
ShareType=ShareType, ShareType=ShareType,
PathOrToken=token, PathOrToken=token,
PathMapped=str(PathMapped), # mandatory PathMapped=PathMapped,
Owner=Owner, User=Owner, Owner=user,
Permissions=str(Permissions), # mandantory User=User,
EnabledByOwner=EnabledByOwner, HiddenByOwner=HiddenByOwner, Permissions=Permissions,
EnabledByOwner=Enabled,
EnabledByUser=EnabledByUser,
HiddenByOwner=Hidden,
HiddenByUser=HiddenByUser,
Timestamp=Timestamp, Timestamp=Timestamp,
Properties=Properties) Properties=Properties)
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": result=%r", result) logger.debug("TRACE/" + api_info + ": result=%r", result)
@@ -741,13 +749,19 @@ class BaseSharing:
else: else:
PathOrToken = str(PathOrToken) PathOrToken = str(PathOrToken)
# retrieve existing share
share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False)
if share is not None:
logger.error("Sharing/create/%s: already exists: %r", ShareType, PathOrToken)
return httputils.CONFLICT
if User is None: if User is None:
return httputils.bad_request("Missing User") return httputils.bad_request("Missing User")
else: else:
User = str(User) User = str(User)
# check access Permissions # check access Permissions
access = Access(self._rights, Owner, str(PathMapped), None) # PathMapped is mandatory access = Access(self._rights, Owner, PathMapped, None) # PathMapped is mandatory
if not access.check("r") and "i" not in access.permissions: if not access.check("r") and "i" not in access.permissions:
logger.info("Add sharing-by-map: access to path(mapped) %r not allowed for owner %r", PathMapped, Owner) logger.info("Add sharing-by-map: access to path(mapped) %r not allowed for owner %r", PathMapped, Owner)
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
@@ -761,7 +775,7 @@ class BaseSharing:
logger.info("Add sharing-by-map: access to %r not allowed for user %r (permit=True but denied by 'M')", PathMapped, user) logger.info("Add sharing-by-map: access to %r not allowed for user %r (permit=True but denied by 'M')", PathMapped, user)
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
access = Access(self._rights, str(User), PathOrToken) access = Access(self._rights, User, PathOrToken)
if not access.check("r"): if not access.check("r"):
logger.info("Add sharing-by-map: access to path %r not allowed for user %r", PathOrToken, User) logger.info("Add sharing-by-map: access to path %r not allowed for user %r", PathOrToken, User)
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
@@ -777,15 +791,18 @@ class BaseSharing:
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/" + api_info + ": %r (Permissions=%r PathOrToken=%r user=%r)", PathMapped, Permissions, PathOrToken, User) logger.debug("TRACE/" + api_info + ": %r (Permissions=%r PathOrToken=%r user=%r)", PathMapped, Permissions, PathOrToken, User)
result = self.create_sharing( result = self.create_sharing(
ShareType=ShareType, ShareType=ShareType,
PathOrToken=PathOrToken, # verification above that it is not None PathOrToken=PathOrToken,
PathMapped=str(PathMapped), # mandatory PathMapped=PathMapped,
Owner=Owner, Owner=user,
User=User, # verification above that it is not None User=User,
Permissions=str(Permissions), # mandatory Permissions=Permissions,
EnabledByOwner=EnabledByOwner, HiddenByOwner=HiddenByOwner, EnabledByOwner=Enabled,
EnabledByUser=EnabledByUser, HiddenByUser=HiddenByUser, EnabledByUser=EnabledByUser,
HiddenByOwner=Hidden,
HiddenByUser=HiddenByUser,
Timestamp=Timestamp, Timestamp=Timestamp,
Properties=Properties) Properties=Properties)
@@ -819,8 +836,10 @@ class BaseSharing:
if PathOrToken is None: if PathOrToken is None:
return httputils.bad_request("Missing PathOrToken") return httputils.bad_request("Missing PathOrToken")
else:
PathOrToken = str(PathOrToken)
# check for permissions to update # retrieve existing share
share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False) share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False)
if share is None: if share is None:
return httputils.NOT_FOUND return httputils.NOT_FOUND
@@ -839,7 +858,7 @@ class BaseSharing:
Permissions=Permissions, Permissions=Permissions,
EnabledByOwner=Enabled, EnabledByOwner=Enabled,
HiddenByOwner=Hidden, HiddenByOwner=Hidden,
PathOrToken=str(PathOrToken), # verification above that it is not None PathOrToken=PathOrToken,
OwnerOrUser=user, OwnerOrUser=user,
User=User, User=User,
Timestamp=Timestamp, Timestamp=Timestamp,
@@ -847,7 +866,7 @@ class BaseSharing:
elif user == share['User']: elif user == share['User']:
# User is only allowed to update Properties # User is only allowed to update Properties
if PathMapped is not None or EnabledByOwner is not None or HiddenByOwner is not None or Permissions is not None or User is not None: if PathMapped is not None or Permissions is not None or User is not None:
logger.info("Update sharing: access to %r not allowed for user %r to adjust anything beside: %s", PathOrToken, user, " ".join(DB_FIELDS_V1_USER_PERMITTED)) logger.info("Update sharing: access to %r not allowed for user %r to adjust anything beside: %s", PathOrToken, user, " ".join(DB_FIELDS_V1_USER_PERMITTED))
return httputils.NOT_ALLOWED return httputils.NOT_ALLOWED
if Properties is not None: if Properties is not None:
@@ -907,6 +926,8 @@ class BaseSharing:
if PathOrToken is None: if PathOrToken is None:
return httputils.bad_request("Missing PathOrToken") return httputils.bad_request("Missing PathOrToken")
else:
PathOrToken = str(PathOrToken)
# check whether share exists # check whether share exists
share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False) share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False)
@@ -916,7 +937,7 @@ class BaseSharing:
if user == share['Owner']: if user == share['Owner']:
result = self.delete_sharing( result = self.delete_sharing(
ShareType=ShareType, ShareType=ShareType,
PathOrToken=str(PathOrToken)) # verification above that it is not None PathOrToken=PathOrToken) # verification above that it is not None
else: else:
# only owner is permitted to delete a share # only owner is permitted to delete a share
logger.warning("Delete sharing of %r not permitted for user %r", PathOrToken, user) logger.warning("Delete sharing of %r not permitted for user %r", PathOrToken, user)
@@ -958,6 +979,8 @@ class BaseSharing:
if PathOrToken is None: if PathOrToken is None:
return httputils.bad_request("Missing PathOrToken") return httputils.bad_request("Missing PathOrToken")
else:
PathOrToken = str(PathOrToken)
share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False) share = self.get_sharing(ShareType=ShareType, PathOrToken=PathOrToken, OnlyEnabled=False)
if share is None: if share is None:
@@ -980,7 +1003,7 @@ class BaseSharing:
# user is Owner and User # user is Owner and User
result = self.update_sharing( result = self.update_sharing(
ShareType=ShareType, ShareType=ShareType,
PathOrToken=str(PathOrToken), # verification above that it is not None PathOrToken=PathOrToken,
EnabledByOwner=Enabled, EnabledByOwner=Enabled,
EnabledByUser=Enabled, EnabledByUser=Enabled,
HiddenByOwner=Hidden, HiddenByOwner=Hidden,
@@ -989,7 +1012,7 @@ class BaseSharing:
else: else:
result = self.update_sharing( result = self.update_sharing(
ShareType=ShareType, ShareType=ShareType,
PathOrToken=str(PathOrToken), # verification above that it is not None PathOrToken=PathOrToken,
EnabledByOwner=Enabled, EnabledByOwner=Enabled,
HiddenByOwner=Hidden, HiddenByOwner=Hidden,
Timestamp=Timestamp) Timestamp=Timestamp)

View File

@@ -96,7 +96,7 @@ class Sharing(sharing.BaseSharing):
""" retrieve sharing target and attributes by map """ """ retrieve sharing target and attributes by map """
# Lookup # Lookup
if logger.isEnabledFor(logging.DEBUG): if logger.isEnabledFor(logging.DEBUG):
logger.debug("TRACE/sharing: lookup ShareType=%r PathOrToken=%r User=%r)", ShareType, PathOrToken, User) logger.debug("TRACE/sharing: lookup ShareType=%r PathOrToken=%r User=%r OnlyEnabled=%s)", ShareType, PathOrToken, User, OnlyEnabled)
index = 0 index = 0
found = False found = False
@@ -115,15 +115,11 @@ class Sharing(sharing.BaseSharing):
pass pass
elif OnlyEnabled is True and row['EnabledByOwner'] is not True: elif OnlyEnabled is True and row['EnabledByOwner'] is not True:
pass pass
elif row['ShareType'] == "map": elif OnlyEnabled is True and row['EnabledByUser'] is not True:
if OnlyEnabled is True and row['EnabledByUser'] is not True:
pass pass
else: else:
found = True found = True
break break
else:
found = True
break
index += 1 index += 1
if found: if found:

View File

@@ -1198,12 +1198,12 @@ class TestSharingApiSanity(BaseTest):
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
logging.info("\n*** create map user2/owner1 -> fail") logging.info("\n*** create map user2/owner1 -> 409 (conflict)")
json_dict = {} json_dict = {}
json_dict['User'] = "user2" json_dict['User'] = "user2"
json_dict['PathMapped'] = path_mapped2 json_dict['PathMapped'] = path_mapped2
json_dict['PathOrToken'] = path_share1 json_dict['PathOrToken'] = path_share1
_, headers, answer = self._sharing_api_json("map", "create", check=403, login="owner2:owner2pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=409, login="owner2:owner2pw", json_dict=json_dict)
logging.info("\n*** delete map user1 -> ok") logging.info("\n*** delete map user1 -> ok")
json_dict = {} json_dict = {}
@@ -1256,13 +1256,22 @@ class TestSharingApiSanity(BaseTest):
_, headers, answer = self.request("GET", path_mapped + "event1.ics", check=200, login="owner:ownerpw") _, headers, answer = self.request("GET", path_mapped + "event1.ics", check=200, login="owner:ownerpw")
# create maps # create maps
logging.info("\n*** create map user/owner:r -> ok") logging.info("\n*** create map user/owner:r -> 400 (Enabled is not boolean)")
json_dict = {} json_dict = {}
json_dict['User'] = "user" json_dict['User'] = "user"
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = "True"
_, headers, answer = self._sharing_api_json("map", "create", check=400, login="owner:ownerpw", json_dict=json_dict)
logging.info("\n*** create map user/owner:r -> ok")
json_dict = {}
json_dict['User'] = "user"
json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "r"
json_dict['Enabled'] = True
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1273,7 +1282,7 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_w json_dict['PathOrToken'] = path_shared_w
json_dict['Permissions'] = "w" json_dict['Permissions'] = "w"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1284,7 +1293,7 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_rw json_dict['PathOrToken'] = path_shared_rw
json_dict['Permissions'] = "rw" json_dict['Permissions'] = "rw"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1307,22 +1316,16 @@ class TestSharingApiSanity(BaseTest):
# enable maps by user # enable maps by user
logging.info("\n*** enable map by user:r") logging.info("\n*** enable map by user:r")
json_dict = {} json_dict = {}
json_dict['User'] = "user"
json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
_, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict)
logging.info("\n*** enable map by user:w") logging.info("\n*** enable map by user:w")
json_dict = {} json_dict = {}
json_dict['User'] = "user"
json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_w json_dict['PathOrToken'] = path_shared_w
_, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict)
logging.info("\n*** enable map by user:rw") logging.info("\n*** enable map by user:rw")
json_dict = {} json_dict = {}
json_dict['User'] = "user"
json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_rw json_dict['PathOrToken'] = path_shared_rw
_, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "enable", check=200, login="user:userpw", json_dict=json_dict)
@@ -1470,8 +1473,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared json_dict['PathOrToken'] = path_shared
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1581,8 +1584,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared json_dict['PathOrToken'] = path_shared
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1714,8 +1717,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared json_dict['PathOrToken'] = path_shared
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1833,8 +1836,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1845,8 +1848,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_w json_dict['PathOrToken'] = path_shared_w
json_dict['Permissions'] = "w" json_dict['Permissions'] = "w"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1857,8 +1860,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_rw json_dict['PathOrToken'] = path_shared_rw
json_dict['Permissions'] = "rw" json_dict['Permissions'] = "rw"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -1995,8 +1998,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped1 json_dict['PathMapped'] = path_mapped1
json_dict['PathOrToken'] = path_shared1_r json_dict['PathOrToken'] = path_shared1_r
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2007,8 +2010,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped1 json_dict['PathMapped'] = path_mapped1
json_dict['PathOrToken'] = path_shared1_rw json_dict['PathOrToken'] = path_shared1_rw
json_dict['Permissions'] = "rw" json_dict['Permissions'] = "rw"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2019,8 +2022,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped2 json_dict['PathMapped'] = path_mapped2
json_dict['PathOrToken'] = path_shared2_rw json_dict['PathOrToken'] = path_shared2_rw
json_dict['Permissions'] = "rw" json_dict['Permissions'] = "rw"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2166,8 +2169,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_mapped1 json_dict['PathMapped'] = path_mapped1
json_dict['PathOrToken'] = path_shared1 json_dict['PathOrToken'] = path_shared1
json_dict['Permissions'] = "w" json_dict['Permissions'] = "w"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2305,8 +2308,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner1 json_dict['PathMapped'] = path_owner1
json_dict['PathOrToken'] = path_user1_shared1 json_dict['PathOrToken'] = path_user1_shared1
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2332,8 +2335,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner2 json_dict['PathMapped'] = path_owner2
json_dict['PathOrToken'] = path_user1_shared2 json_dict['PathOrToken'] = path_user1_shared2
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner2:owner2pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner2:owner2pw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2352,8 +2355,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner1 json_dict['PathMapped'] = path_owner1
json_dict['PathOrToken'] = path_user2_shared1 json_dict['PathOrToken'] = path_user2_shared1
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2426,8 +2429,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner1 json_dict['PathMapped'] = path_owner1
json_dict['PathOrToken'] = path_user1_shared1 json_dict['PathOrToken'] = path_user1_shared1
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2442,8 +2445,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner1 json_dict['PathMapped'] = path_owner1
json_dict['PathOrToken'] = path_user2_shared1 json_dict['PathOrToken'] = path_user2_shared1
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner1:owner1pw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -2458,8 +2461,8 @@ class TestSharingApiSanity(BaseTest):
json_dict['PathMapped'] = path_owner1 json_dict['PathMapped'] = path_owner1
json_dict['PathOrToken'] = path_user2 json_dict['PathOrToken'] = path_user2
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=409, login="owner1:owner1pw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=409, login="owner1:owner1pw", json_dict=json_dict)
def test_sharing_api_permissions_global(self) -> None: def test_sharing_api_permissions_global(self) -> None:
@@ -2881,8 +2884,8 @@ permissions: RrWw""")
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -3050,8 +3053,8 @@ permissions: RrWw""")
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "r" json_dict['Permissions'] = "r"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"
@@ -3238,8 +3241,8 @@ permissions: RrWw""")
json_dict['PathMapped'] = path_mapped json_dict['PathMapped'] = path_mapped
json_dict['PathOrToken'] = path_shared_r json_dict['PathOrToken'] = path_shared_r
json_dict['Permissions'] = "rP" json_dict['Permissions'] = "rP"
json_dict['Enabled'] = "True" json_dict['Enabled'] = True
json_dict['Hidden'] = "False" json_dict['Hidden'] = False
_, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict) _, headers, answer = self._sharing_api_json("map", "create", check=200, login="owner:ownerpw", json_dict=json_dict)
answer_dict = json.loads(answer) answer_dict = json.loads(answer)
assert answer_dict['Status'] == "success" assert answer_dict['Status'] == "success"