Exemplo n.º 1
0
    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
Exemplo n.º 2
0
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")
Exemplo n.º 3
0
 def test_schema(self):
     assert inputs.int_range(1, 5).__schema__ == {
         'type': 'integer',
         'minimum': 1,
         'maximum': 5
     }
Exemplo n.º 4
0
 def test_higher(self):
     int_range = inputs.int_range(0, 5)
     with pytest.raises(ValueError):
         int_range(6)
Exemplo n.º 5
0
 def test_inclusive_range(self):
     int_range = inputs.int_range(1, 5)
     assert int_range(5) == 5
Exemplo n.º 6
0
 def test_valid_range(self):
     int_range = inputs.int_range(1, 5)
     assert int_range(3) == 3
Exemplo n.º 7
0
 def test_schema(self):
     assert inputs.int_range(1, 5).__schema__ == {
         "type": "integer",
         "minimum": 1,
         "maximum": 5,
     }