def get(self): probe_parser = reqparse.RequestParser() probe_parser.add_argument('dest_addr', type=inputs.ip, location='args', required=True) probe_parser.add_argument('dest_port', type=inputs.int_range(0, 65535), location='args', required=True) probe_parser.add_argument('src_port', type=inputs.int_range(0, 65535), location='args', required=False) probe_parser.add_argument('proto', choices=('tcp', 'udp'), default='tcp', location='args', required=False) probe_parser.add_argument('ts', type=float, location='args', required=True) probe_parser.add_argument('h', type=inputs.regex('^[0-9a-f]{32,512}$'), location='args', required=True) args = probe_parser.parse_args(strict=True) remote_addr = request.remote_addr req_counter = args['ts'] context = zmq.Context() socket = context.socket(zmq.PUSH) socket.connect(app.config.get('ZMQ_BIND')) # Validate HMAC and timestamp or return HTTP 403 try: validate_request(args) app.logger.info('authenticated dispatch request from %s ' 'with valid HMAC', remote_addr) except RequestValidationError as e: msg = ('received invalid request from %s: %s') app.logger.warning(msg, remote_addr, e) abort(403, e) persist_counter(app.config['DB_PATH'], req_counter) app.logger.debug('stored new value %s in counter database', req_counter) # Remove counter from args and pass to task runner del args['ts'] socket.send_json(args) app.logger.debug('passed dispatch request parameters to message queue') return args
class Parser: # Session SessionPostRequest = reqparse.RequestParser() SessionPostRequest.add_argument("password", type=str, required=True, location="json") # Audit AuditListGetRequest = reqparse.RequestParser() AuditListGetRequest.add_argument("q", type=str, default="", location="args") AuditListGetRequest.add_argument("page", type=inputs.natural, default=0, location="args") AuditListGetRequest.add_argument( "count", type=inputs.int_range(1, AUDIT_LIST_MAX_COUNT), default=AUDIT_LIST_DEFAULT_COUNT, location="args", ) AuditListPostRequest = reqparse.RequestParser() AuditListPostRequest.add_argument("name", type=inputs.regex("^.{1,128}$"), required=True, location="json") AuditListPostRequest.add_argument("description", type=inputs.regex("^.{,128}$"), default="", location="json") AuditItemGetRequest = reqparse.RequestParser() AuditItemGetRequest.add_argument("include_results", type=inputs.boolean, default=False, location="args") AuditPatchRequest = AuditListPostRequest # Scan ScanPostRequest = reqparse.RequestParser() ScanPostRequest.add_argument("name", type=inputs.regex("^.{1,128}$"), required=True, location="json") ScanPostRequest.add_argument("description", type=inputs.regex("^.{,128}$"), default="", location="json") ScanPostRequest.add_argument("target", type=inputs.regex("^.{1,128}$"), required=True, location="json") ScanPostRequest.add_argument("detection_module", type=inputs.regex("^.{1,128}$"), required=True, location="json") ScanPostRequest.add_argument("detection_mode", type=inputs.regex("^.{1,128}$"), required=True, location="json") ScanSchedulePostRequest = reqparse.RequestParser() ScanSchedulePostRequest.add_argument("scheduled_at", type=inputs.datetime_from_iso8601, required=True, location="json") ScanSchedulePostRequest.add_argument("max_duration", type=inputs.int_range( 1, SCAN_MAX_DURATION_IN_HOUR), required=True, location="json") ScanSchedulePostRequest.add_argument("rrule", type=inputs.regex("^RRULE:.{,128}$"), default="", location="json") # Integration IntegrationPatchRequest = reqparse.RequestParser() IntegrationPatchRequest.add_argument("url", type=inputs.URL(schemes=["https"], check=False), required=True, location="json") IntegrationPatchRequest.add_argument("verbose", type=inputs.boolean, default=False, location="json")
def test_schema(self): assert inputs.int_range(1, 5).__schema__ == { 'type': 'integer', 'minimum': 1, 'maximum': 5 }
def test_higher(self): int_range = inputs.int_range(0, 5) with pytest.raises(ValueError): int_range(6)
def test_inclusive_range(self): int_range = inputs.int_range(1, 5) assert int_range(5) == 5
def test_valid_range(self): int_range = inputs.int_range(1, 5) assert int_range(3) == 3
def test_schema(self): assert inputs.int_range(1, 5).__schema__ == { "type": "integer", "minimum": 1, "maximum": 5, }