Esempio n. 1
0
def safe_join(base, *paths):
    """
    Join one or more path components to the base path component intelligently.
    Return a normalized, absolute version of the final path.

    Raise ValueError if the final path isn't located inside of the base path
    component.
    """
    base = force_text(base)
    paths = [force_text(p) for p in paths]
    final_path = abspath(join(base, *paths))
    base_path = abspath(base)
    # Ensure final_path starts with base_path (using normcase to ensure we
    # don't false-negative on case insensitive operating systems like Windows),
    # further, one of the following conditions must be true:
    #  a) The next character is the path separator (to prevent conditions like
    #     safe_join("/dir", "/../d"))
    #  b) The final path must be the same as the base path.
    #  c) The base path must be the most root path (meaning either "/" or "C:\\")
    if (not normcase(final_path).startswith(normcase(base_path + sep))
            and normcase(final_path) != normcase(base_path)
            and dirname(normcase(base_path)) != normcase(base_path)):
        raise SuspiciousFileOperation(
            'The joined path ({}) is located outside of the base path '
            'component ({})'.format(final_path, base_path))
    return final_path
Esempio n. 2
0
 def test_force_text_DjangoUnicodeDecodeError(self):
     msg = (
         "'utf-8' codec can't decode byte 0xff in position 0: invalid "
         "start byte. You passed in b'\\xff' (<class 'bytes'>)"
     )
     with self.assertRaisesMessage(DjangoUnicodeDecodeError, msg):
         force_text(b'\xff')
Esempio n. 3
0
    def test_force_text_exception(self):
        """
        Broken __str__ actually raises an error.
        """
        class MyString:
            def __str__(self):
                return b'\xc3\xb6\xc3\xa4\xc3\xbc'

        # str(s) raises a TypeError if the result is not a text type.
        with self.assertRaises(TypeError):
            force_text(MyString())
Esempio n. 4
0
    def __init__(self, param, cursor, strings_only=False):
        # With raw SQL queries, datetimes can reach this function
        # without being converted by DateTimeField.get_db_prep_value.
        if settings.USE_TZ and (isinstance(param, datetime.datetime)
                                and not isinstance(param, Oracle_datetime)):
            param = Oracle_datetime.from_datetime(param)

        string_size = 0
        # Oracle doesn't recognize True and False correctly.
        if param is True:
            param = 1
        elif param is False:
            param = 0
        if hasattr(param, 'bind_parameter'):
            self.force_bytes = param.bind_parameter(cursor)
        elif isinstance(param, (Database.Binary, datetime.timedelta)):
            self.force_bytes = param
        else:
            # To transmit to the database, we need Unicode if supported
            # To get size right, we must consider bytes.
            self.force_bytes = force_text(param, cursor.charset, strings_only)
            if isinstance(self.force_bytes, str):
                # We could optimize by only converting up to 4000 bytes here
                string_size = len(
                    force_bytes(param, cursor.charset, strings_only))
        if hasattr(param, 'input_size'):
            # If parameter has `input_size` attribute, use that.
            self.input_size = param.input_size
        elif string_size > 4000:
            # Mark any string param greater than 4000 characters as a CLOB.
            self.input_size = Database.CLOB
        elif isinstance(param, datetime.datetime):
            self.input_size = Database.TIMESTAMP
        else:
            self.input_size = None
Esempio n. 5
0
 def fields(self):
     "Return a list of fields in the Feature."
     return [
         force_text(capi.get_field_name(
             capi.get_field_defn(self._layer._ldefn, i)),
                    self.encoding,
                    strings_only=True) for i in range(self.num_fields)
     ]
Esempio n. 6
0
 def fields(self):
     """
     Return a list of string names corresponding to each of the Fields
     available in this Layer.
     """
     return [force_text(capi.get_field_name(capi.get_field_defn(self._ldefn, i)),
                        self._ds.encoding, strings_only=True)
             for i in range(self.num_fields)]
Esempio n. 7
0
 def units(self):
     """
     Return a 2-tuple of the units value and the units name. Automatically
     determine whether to return the linear or angular units.
     """
     units, name = None, None
     if self.projected or self.local:
         units, name = capi.linear_units(self.ptr, byref(c_char_p()))
     elif self.geographic:
         units, name = capi.angular_units(self.ptr, byref(c_char_p()))
     if name is not None:
         name = force_text(name)
     return (units, name)
Esempio n. 8
0
 def as_string(self):
     "Retrieve the Field's value as a string."
     string = capi.get_field_as_string(self._feat.ptr, self._index)
     return force_text(string,
                       encoding=self._feat.encoding,
                       strings_only=True)
Esempio n. 9
0
 def name(self):
     """
     Return the name of this raster. Corresponds to filename
     for file-based rasters.
     """
     return force_text(capi.get_ds_description(self._ptr))
Esempio n. 10
0
 def name(self):
     "Return the name of this layer in the Data Source."
     name = capi.get_fd_name(self._ldefn)
     return force_text(name, self._ds.encoding, strings_only=True)
Esempio n. 11
0
    def __init__(self, geo_input, srid=None):
        """
        The base constructor for GEOS geometry objects. It may take the
        following inputs:

         * strings:
            - WKT
            - HEXEWKB (a PostGIS-specific canonical form)
            - GeoJSON (requires GDAL)
         * buffer:
            - WKB

        The `srid` keyword specifies the Source Reference Identifier (SRID)
        number for this Geometry. If not provided, it defaults to None.
        """
        input_srid = None
        if isinstance(geo_input, bytes):
            geo_input = force_text(geo_input)
        if isinstance(geo_input, str):
            wkt_m = wkt_regex.match(geo_input)
            if wkt_m:
                # Handle WKT input.
                if wkt_m.group('srid'):
                    input_srid = int(wkt_m.group('srid'))
                g = self._from_wkt(force_bytes(wkt_m.group('wkt')))
            elif hex_regex.match(geo_input):
                # Handle HEXEWKB input.
                g = wkb_r().read(force_bytes(geo_input))
            elif json_regex.match(geo_input):
                # Handle GeoJSON input.
                ogr = gdal.OGRGeometry.from_json(geo_input)
                g = ogr._geos_ptr()
                input_srid = ogr.srid
            else:
                raise ValueError(
                    'String input unrecognized as WKT EWKT, and HEXEWKB.')
        elif isinstance(geo_input, GEOM_PTR):
            # When the input is a pointer to a geometry (GEOM_PTR).
            g = geo_input
        elif isinstance(geo_input, memoryview):
            # When the input is a buffer (WKB).
            g = wkb_r().read(geo_input)
        elif isinstance(geo_input, GEOSGeometry):
            g = capi.geom_clone(geo_input.ptr)
        else:
            raise TypeError('Improper geometry input type: %s' %
                            type(geo_input))

        if not g:
            raise GEOSException(
                'Could not initialize GEOS Geometry with given input.')

        input_srid = input_srid or capi.geos_get_srid(g) or None
        if input_srid and srid and input_srid != srid:
            raise ValueError('Input geometry already has SRID: %d.' %
                             input_srid)

        super().__init__(g, None)
        # Set the SRID, if given.
        srid = input_srid or srid
        if srid and isinstance(srid, int):
            self.srid = srid
Esempio n. 12
0
 def name(self):
     """
     Return description/name string for this driver.
     """
     return force_text(rcapi.get_driver_description(self.ptr))
Esempio n. 13
0
 def convert_textfield_value(self, value, expression, connection):
     if value is not None:
         value = force_text(value)
     return value
Esempio n. 14
0
 def last_executed_query(self, cursor, sql, params):
     # With MySQLdb, cursor objects have an (undocumented) "_last_executed"
     # attribute where the exact query sent to the database is saved.
     # See MySQLdb/cursors.py in the source distribution.
     return force_text(getattr(cursor, '_last_executed', None),
                       errors='replace')
Esempio n. 15
0
 def test_force_text_lazy(self):
     s = SimpleLazyObject(lambda: 'x')
     self.assertIs(type(force_text(s)), str)
Esempio n. 16
0
 def layer_name(self):
     "Return the name of the layer for the feature."
     name = capi.get_feat_name(self._layer._ldefn)
     return force_text(name, self.encoding, strings_only=True)
Esempio n. 17
0
    def verify_ogr_field(self, ogr_field, model_field):
        """
        Verify if the OGR Field contents are acceptable to the model field. If
        they are, return the verified value, otherwise raise an exception.
        """
        if (isinstance(ogr_field, OFTString)
                and isinstance(model_field,
                               (models.CharField, models.TextField))):
            if self.encoding:
                # The encoding for OGR data sources may be specified here
                # (e.g., 'cp437' for Census Bureau boundary files).
                val = force_text(ogr_field.value, self.encoding)
            else:
                val = ogr_field.value
            if model_field.max_length and len(val) > model_field.max_length:
                raise InvalidString(
                    '%s model field maximum string length is %s, given %s characters.'
                    % (model_field.name, model_field.max_length, len(val)))
        elif isinstance(ogr_field, OFTReal) and isinstance(
                model_field, models.DecimalField):
            try:
                # Creating an instance of the Decimal value to use.
                d = Decimal(str(ogr_field.value))
            except DecimalInvalidOperation:
                raise InvalidDecimal('Could not construct decimal from: %s' %
                                     ogr_field.value)

            # Getting the decimal value as a tuple.
            dtup = d.as_tuple()
            digits = dtup[1]
            d_idx = dtup[2]  # index where the decimal is

            # Maximum amount of precision, or digits to the left of the decimal.
            max_prec = model_field.max_digits - model_field.decimal_places

            # Getting the digits to the left of the decimal place for the
            # given decimal.
            if d_idx < 0:
                n_prec = len(digits[:d_idx])
            else:
                n_prec = len(digits) + d_idx

            # If we have more than the maximum digits allowed, then throw an
            # InvalidDecimal exception.
            if n_prec > max_prec:
                raise InvalidDecimal(
                    'A DecimalField with max_digits %d, decimal_places %d must '
                    'round to an absolute value less than 10^%d.' %
                    (model_field.max_digits, model_field.decimal_places,
                     max_prec))
            val = d
        elif isinstance(ogr_field, (OFTReal, OFTString)) and isinstance(
                model_field, models.IntegerField):
            # Attempt to convert any OFTReal and OFTString value to an OFTInteger.
            try:
                val = int(ogr_field.value)
            except ValueError:
                raise InvalidInteger('Could not construct integer from: %s' %
                                     ogr_field.value)
        else:
            val = ogr_field.value
        return val
Esempio n. 18
0
 def to_string(s):
     return force_text(s, strings_only=True, errors='replace')
Esempio n. 19
0
 def name(self):
     "Return the name of the data source."
     name = capi.get_ds_name(self._ptr)
     return force_text(name, self.encoding, strings_only=True)
Esempio n. 20
0
 def description(self):
     """
     Return the description string of the band.
     """
     return force_text(capi.get_band_description(self._ptr))
Esempio n. 21
0
 def name(self):
     "Return the name of this Field."
     name = capi.get_field_name(self.ptr)
     return force_text(name,
                       encoding=self._feat.encoding,
                       strings_only=True)