Ejemplo n.º 1
0
    def smart_fill(self):
        """
        :return: Fills all the empty parameters (which should be filled)
                 using the smart_fill function.
        """
        file_variables = self.get_file_vars()

        for var_name, value, path, setter in self.iter_setters():
            if self.get_parameter_type(var_name) in self.AVOID_FILLING_FORM_TYPES:
                continue

            if isinstance(value, DataToken):
                # This is the value which is being fuzzed (the payload) and
                # I don't want to change/fill it
                continue

            # The basic idea here is that if the form has files in it, we'll
            # need to fill that input with a file (gif, txt, html) in order
            # to go through the form validations
            if var_name in file_variables:
                file_name = self.get_file_name(var_name, None)
                setter(smart_fill_file(var_name, file_name))

            #   Fill only if the parameter does NOT have a value set.
            #
            #   The reason of having this already set would be that the form
            #   has something like this:
            #
            #   <input type="text" name="p" value="foobar">
            #
            elif value == '':
                setter(smart_fill(var_name))
Ejemplo n.º 2
0
    def _get_param_value_for_type_and_spec(self, parameter_type,
                                           parameter_spec):
        """
        :param parameter_type: The type of parameter (string, int32, array, etc.)
        :param parameter_spec: The parameter spec
        :return: The parameter value
        """
        #
        # Easiest cases, the parameter already has a default or example value
        #
        default_value = parameter_spec.get('default', None)

        if default_value is not None:
            return default_value

        example_value = parameter_spec.get('example', None)

        if example_value is not None:
            return example_value

        # This handles the case where the value is an enum and can only be selected
        # from a predefined option list
        if 'enum' in parameter_spec:
            if parameter_spec['enum']:
                return parameter_spec['enum'][0]

        if parameter_type in ('integer', 'float', 'double', 'int32', 'int64'):
            _max = None
            _min = None

            if 'maximum' in parameter_spec:
                _max = parameter_spec['maximum']

            if 'minimum' in parameter_spec:
                _min = parameter_spec['minimum']

            # Only do something if max or min are set
            if _max is not None or _min is not None:
                _max = _max if _max is not None else 56
                _min = _min if _min is not None else 0

                # We always want to generate the same number for the same range
                r = random.Random()
                r.seed(1)

                return r.randint(_min, _max)

        default_value = self.DEFAULT_VALUES_BY_TYPE.get(parameter_type, None)
        if default_value is not None:
            return default_value

        parameter_name = parameter_spec.get('name', None)

        if parameter_type == 'string':
            parameter_name = 'unknown' if parameter_name is None else parameter_name
            return smart_fill(parameter_name)

        if parameter_type == 'file':
            parameter_name = 'unknown' if parameter_name is None else parameter_name
            return smart_fill_file(parameter_name, 'cat.png')
Ejemplo n.º 3
0
    def test_multipart_with_files(self):
        params = {'hello': 'world', 'file': smart_fill_file('image', 'cat.png')}
        dc = dc_from_content_type_and_raw_params('multipart/form-data', params)

        self.assertIsInstance(dc, MultipartContainer)
        self.assertEqual(dc['hello'], ['world'])
        self.assertIn('file', dc.get_file_vars())
Ejemplo n.º 4
0
    def smart_fill(self):
        """
        :return: Fills all the empty parameters (which should be filled)
                 using the smart_fill function.
        """
        file_variables = self.get_file_vars()

        for var_name, value, path, setter in self.iter_setters():
            if self.get_parameter_type(
                    var_name) in self.AVOID_FILLING_FORM_TYPES:
                continue

            if isinstance(value, DataToken):
                # This is the value which is being fuzzed (the payload) and
                # I don't want to change/fill it
                continue

            # The basic idea here is that if the form has files in it, we'll
            # need to fill that input with a file (gif, txt, html) in order
            # to go through the form validations
            if var_name in file_variables:
                file_name = self.get_file_name(var_name, None)
                setter(smart_fill_file(var_name, file_name))

            #   Fill only if the parameter does NOT have a value set.
            #
            #   The reason of having this already set would be that the form
            #   has something like this:
            #
            #   <input type="text" name="p" value="foobar">
            #
            elif value == '':
                setter(smart_fill(var_name))
Ejemplo n.º 5
0
    def _get_param_value_for_type_and_spec(self, parameter_type, parameter_spec):
        """
        :param parameter_type: The type of parameter (string, int32, array, etc.)
        :param parameter_spec: The parameter spec
        :return: The parameter value
        """
        parameter_name = parameter_spec.get('name', None)

        # This handles the case where the value is an enum and can only be selected
        # from a predefined option list
        if 'enum' in parameter_spec:
            if parameter_spec['enum']:
                return parameter_spec['enum'][0]

        if parameter_type in ('integer', 'float', 'double', 'int32', 'int64'):
            _max = None
            _min = None

            if 'maximum' in parameter_spec:
                _max = parameter_spec['maximum']

            if 'minimum' in parameter_spec:
                _min = parameter_spec['minimum']

            # Only do something if max or min are set
            if _max is not None or _min is not None:
                _max = _max if _max is not None else 56
                _min = _min if _min is not None else 0

                # We always want to generate the same number for the same range
                r = random.Random()
                r.seed(1)

                return r.randint(_min, _max)

        default_value = self.DEFAULT_VALUES_BY_TYPE.get(parameter_type, None)
        if default_value is not None:
            return default_value

        if parameter_type == 'string':
            parameter_name = 'unknown' if parameter_name is None else parameter_name
            return smart_fill(parameter_name)

        if parameter_type == 'file':
            parameter_name = 'unknown' if parameter_name is None else parameter_name
            return smart_fill_file(parameter_name, 'cat.png')