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
Exemple #2
0
    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}'"