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. """ base_path = force_text(base) base_path = base_path.rstrip('/') paths = [force_text(p) for p in paths] final_path = base_path for path in paths: final_path = urlparse.urljoin(final_path.rstrip('/') + "/", path) # 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('/')
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. """ base_path = force_text(base) base_path = base_path.rstrip("/") paths = [force_text(p) for p in paths] final_path = base_path for path in paths: final_path = urlparse.urljoin(final_path.rstrip("/") + "/", path) # 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("/")
def url(self, name): return urlparse.urljoin(self.base_url, os.path.join(urlparse.quote_plus(self.db.name), urlparse.quote_plus(name), 'content'))
def url(self, name): if self._base_url is None: raise ValueError("This file is not accessible via a URL.") return urlparse.urljoin(self._base_url, name).replace('\\', '/')
def url(self, filename): return urlparse.urljoin(self.base_url, filename).replace('\\', '/')
def url(self, name): return urlparse.urljoin( self.base_url, os.path.join(urlparse.quote_plus(self.db.name), urlparse.quote_plus(name), 'content'))
def url(self, name): if self.base_url is None: raise ValueError("This file is not accessible via a URL.") return urlparse.urljoin(self.base_url, name).replace("\\", "/")