示例#1
0
def safe_join(base, *paths):
    """
    A version of django.utils._os.safe_join for S3 paths.

    Joins one or more path components to the base path component
    intelligently. Returns a normalized version of the final path.

    The final path must be located inside of the base path component
    (otherwise a ValueError is raised).

    Paths outside the base path indicate a possible security
    sensitive operation.
    """
    from urlparse import urljoin
    base_path = force_unicode(base)
    base_path = base_path.rstrip('/')
    paths = [force_unicode(p) for p in paths]

    final_path = base_path
    for path in paths:
        final_path = urljoin(final_path.rstrip('/') + "/", path.rstrip("/"))

    # Ensure final_path starts with base_path and that the next character after
    # the final path is '/' (or nothing, in which case final_path must be
    # equal to base_path).
    base_path_len = len(base_path)
    if (not final_path.startswith(base_path) or
            final_path[base_path_len:base_path_len + 1] not in ('', '/')):
        raise ValueError('the joined path is located outside of the base path'
                         ' component')

    return final_path.lstrip('/')
示例#2
0
 def _save(self, name, content):
     name = force_unicode(name).replace('\\', '/')
     content.open()
     file = self.fs.new_file(filename=name)
     if hasattr(content, 'chunks'):
         for chunk in content.chunks():
             file.write(chunk)
     else:
         file.write(content)
     file.close()
     content.close()
     return name
示例#3
0
 def _decode_name(self, name):
     return force_unicode(name, encoding=self.file_name_charset)
示例#4
0
 def get_valid_name(self, name):
     return force_unicode(name).strip().replace('\\', '/')