def __condition_validation(self, condition): condition_type = condition.get('type') condition_body = condition.get('body') if condition_type in [ SCRIPTING_CONDITION_TYPE_AND, SCRIPTING_CONDITION_TYPE_OR ]: if not isinstance(condition_body, list): return False if len(condition_body) == 1: return self.__condition_validation(condition_body[0]) else: new_condition = { "type": condition.get('type'), "body": condition_body[1:] } return self.__condition_validation(condition_body[0]) and \ self.__condition_validation(new_condition) elif condition_type == SCRIPTING_CONDITION_TYPE_QUERY_HAS_RESULTS: err_message = check_json_param(condition, "condition", args=["type", "name", "body"]) if err_message: return False err_message = check_json_param(condition_body, "condition.body", args=["collection", "filter"]) if err_message: return False else: return False return True
def set_script(self): # Request Validation did, app_id, content, err = post_json_param_pre_proc(self.response, "name", "executable", access_vault=VAULT_ACCESS_WR) if err: return err # Anonymity Options content['allowAnonymousUser'] = content.get('allowAnonymousUser', False) content['allowAnonymousApp'] = content.get('allowAnonymousApp', False) logging.debug(f"Registering a script named '{content.get('name')}' with params: DID: '{did}', App DID: '{app_id}', " f"Anonymous User Access: {content['allowAnonymousUser']}, Anonymous App Access: {content['allowAnonymousApp']}") # Anonymity Validation if (content['allowAnonymousUser'] is True) and (content['allowAnonymousApp'] is False): err_message = "Error while validating anonymity options: Cannot set allowAnonymousUser to be True but " \ "allowAnonymousApp to be False as we cannot request an auth to prove an app identity without " \ "proving the user identity" logging.debug(err_message) return self.response.response_err(BAD_REQUEST, err_message) # Data Validation executable = content.get('executable') massage_keys_with_dollar_signs(executable) err_message = self.__executable_validation(executable) if err_message: logging.debug(f"Error while validating executables: {err_message}") return self.response.response_err(BAD_REQUEST, err_message) # Condition Validation condition = content.get('condition', None) if condition: err_message = check_json_param(condition, "condition", args=["type", "name", "body"]) if err_message: logging.debug(f"Error while validating conditions: {err_message}") return self.response.response_err(BAD_REQUEST, err_message) nested_count = self.__count_nested_condition(condition) for count in nested_count.values(): if count >= 5: err_message = "conditions cannot be nested more than 5 times" logging.debug(f"Error while validating conditions: {err_message}") return self.response.response_err(BAD_REQUEST, err_message) is_valid = self.__condition_validation(condition) if not is_valid: err_message = "some of the parameters are not set for 'condition'" logging.debug(f"Error while validating conditions: {err_message}") return self.response.response_err(BAD_REQUEST, err_message) # Create collection "scripts" if it doesn't exist and # create/update script in the database data, err_message = self.__upsert_script_to_db(did, app_id, content) if err_message: return self.response.response_err(INTERNAL_SERVER_ERROR, err_message) return self.response.response_ok(data)
def __executable_validation(self, executable): err_message = check_json_param(executable, "executable", args=["type", "body"]) if err_message: return err_message executable_type = executable.get('type') executable_body = executable.get('body') if executable_type == SCRIPTING_EXECUTABLE_TYPE_AGGREGATED: if not isinstance(executable_body, list): return f"Invalid parameters passed for executable type '{executable_type}'" if len(executable_body) == 1: return self.__executable_validation(executable_body[0]) else: new_executable = { "type": executable_type, "body": executable_body[1:] } return self.__executable_validation(new_executable) elif executable_type == SCRIPTING_EXECUTABLE_TYPE_FIND: return check_json_param(executable_body, f"{executable.get('name')}", args=["collection"]) elif executable_type == SCRIPTING_EXECUTABLE_TYPE_INSERT: return check_json_param(executable_body, f"{executable.get('name')}", args=["collection", "document"]) elif executable_type == SCRIPTING_EXECUTABLE_TYPE_DELETE: return check_json_param(executable_body, f"{executable.get('name')}", args=["collection", "filter"]) elif executable_type == SCRIPTING_EXECUTABLE_TYPE_UPDATE: return check_json_param(executable_body, f"{executable.get('name')}", args=["collection", "filter", "update"]) elif executable_type == SCRIPTING_EXECUTABLE_TYPE_FILE_DOWNLOAD: executable_name = executable.get('name') # We need to make sure that the script's name is not "_download" as it's a reserved field if executable_name == SCRIPTING_EXECUTABLE_DOWNLOADABLE: return f"invalid executable name '{executable_name}'. This name is reserved. Please use a different name" return check_json_param(executable_body, f"{executable_name}", args=["path"]) elif executable_type in [ SCRIPTING_EXECUTABLE_TYPE_FILE_UPLOAD, SCRIPTING_EXECUTABLE_TYPE_FILE_PROPERTIES, SCRIPTING_EXECUTABLE_TYPE_FILE_HASH ]: return check_json_param(executable_body, f"{executable.get('name')}", args=["path"]) else: return f"invalid executable type '{executable_type}'"