def __taste_href(self, href): """ Internal helper to taste the given href node and, if it is a duplicity file, collect it as a result file. @return: A matching filename, or None if the href did not match. """ raw_filename = self._getText(href.childNodes).strip() parsed_url = urlparser.urlparse(urllib.unquote(raw_filename)) filename = parsed_url.path log.Debug("vCenter path decoding and translation: " "%s -> %s" % (raw_filename, filename)) if filename.startswith(self.directory): filename = filename.replace(self.directory, '', 1) return filename else: return None
def __taste_href(self, href): """ Internal helper to taste the given href node and, if it is a duplicity file, collect it as a result file. @return: A matching filename, or None if the href did not match. """ raw_filename = self._getText(href.childNodes).strip() parsed_url = urlparser.urlparse(urllib.unquote(raw_filename)) filename = parsed_url.path log.Debug("vCenter path decoding and translation: " "%s -> %s" % (raw_filename, filename)) if filename.startswith(self.directory): filename = filename.replace(self.directory,'',1) return filename else: return None
def __taste_href(self, href): """ Internal helper to taste the given href node and, if it is a duplicity file, collect it as a result file. @return: A matching filename, or None if the href did not match. """ raw_filename = self._getText(href.childNodes).strip() parsed_url = urlparser.urlparse(urllib.unquote(raw_filename)) filename = parsed_url.path log.Debug("webdav path decoding and translation: " "%s -> %s" % (raw_filename, filename)) # at least one WebDAV server returns files in the form # of full URL:s. this may or may not be # according to the standard, but regardless we # feel we want to bail out if the hostname # does not match until someone has looked into # what the WebDAV protocol mandages. if not parsed_url.hostname is None \ and not (parsed_url.hostname == self.parsed_url.hostname): m = "Received filename was in the form of a "\ "full url, but the hostname (%s) did "\ "not match that of the webdav backend "\ "url (%s) - aborting as a conservative "\ "safety measure. If this happens to you, "\ "please report the problem"\ "" % (parsed_url.hostname, self.parsed_url.hostname) raise BackendException(m) if filename.startswith(self.directory): filename = filename.replace(self.directory,'',1) return filename else: return None
def __taste_href(self, href): """ Internal helper to taste the given href node and, if it is a duplicity file, collect it as a result file. @return: A matching filename, or None if the href did not match. """ raw_filename = self._getText(href.childNodes).strip() parsed_url = urlparser.urlparse(urllib.unquote(raw_filename)) filename = parsed_url.path log.Debug("webdav path decoding and translation: " "%s -> %s" % (raw_filename, filename)) # at least one WebDAV server returns files in the form # of full URL:s. this may or may not be # according to the standard, but regardless we # feel we want to bail out if the hostname # does not match until someone has looked into # what the WebDAV protocol mandages. if not parsed_url.hostname is None \ and not (parsed_url.hostname == self.parsed_url.hostname): m = "Received filename was in the form of a "\ "full url, but the hostname (%s) did "\ "not match that of the webdav backend "\ "url (%s) - aborting as a conservative "\ "safety measure. If this happens to you, "\ "please report the problem"\ "" % (parsed_url.hostname, self.parsed_url.hostname) raise BackendException(m) if filename.startswith(self.directory): filename = filename.replace(self.directory, '', 1) return filename else: return None
def __init__(self, url_string): self.url_string = url_string _ensure_urlparser_initialized() # While useful in some cases, the fact is that the urlparser makes # all the properties in the URL deferred or lazy. This means that # problems don't get detected till called. We'll try to trap those # problems here, so they will be caught early. try: pu = urlparser.urlparse(url_string) except Exception: raise InvalidBackendURL("Syntax error in: %s" % url_string) try: self.scheme = pu.scheme except Exception: raise InvalidBackendURL("Syntax error (scheme) in: %s" % url_string) try: self.netloc = pu.netloc except Exception: raise InvalidBackendURL("Syntax error (netloc) in: %s" % url_string) try: self.path = pu.path except Exception: raise InvalidBackendURL("Syntax error (path) in: %s" % url_string) try: self.username = pu.username except Exception: raise InvalidBackendURL("Syntax error (username) in: %s" % url_string) if self.username: self.username = urllib.unquote(pu.username) else: self.username = None try: self.password = pu.password except Exception: raise InvalidBackendURL("Syntax error (password) in: %s" % url_string) if self.password: self.password = urllib.unquote(self.password) else: self.password = None try: self.hostname = pu.hostname except Exception: raise InvalidBackendURL("Syntax error (hostname) in: %s" % url_string) # init to None, overwrite with actual value on success self.port = None try: self.port = pu.port except Exception: # old style rsync://host::[/]dest, are still valid, though they contain no port if not ( self.scheme in ['rsync'] and re.search('::[^:]*$', self.url_string)): raise InvalidBackendURL("Syntax error (port) in: %s A%s B%s C%s" % (url_string, (self.scheme in ['rsync']), re.search('::[^:]+$', self.netloc), self.netloc ) ) # This happens for implicit local paths. if not pu.scheme: return # Our backends do not handle implicit hosts. if pu.scheme in urlparser.uses_netloc and not pu.hostname: raise InvalidBackendURL("Missing hostname in a backend URL which " "requires an explicit hostname: %s" "" % (url_string)) # Our backends do not handle implicit relative paths. if pu.scheme not in urlparser.uses_netloc and not pu.path.startswith('//'): raise InvalidBackendURL("missing // - relative paths not supported " "for scheme %s: %s" "" % (pu.scheme, url_string))
def __init__(self, url_string): self.url_string = url_string _ensure_urlparser_initialized() # While useful in some cases, the fact is that the urlparser makes # all the properties in the URL deferred or lazy. This means that # problems don't get detected till called. We'll try to trap those # problems here, so they will be caught early. try: pu = urlparser.urlparse(url_string) except Exception: raise InvalidBackendURL("Syntax error in: %s" % url_string) try: self.scheme = pu.scheme except Exception: raise InvalidBackendURL("Syntax error (scheme) in: %s" % url_string) try: self.netloc = pu.netloc except Exception: raise InvalidBackendURL("Syntax error (netloc) in: %s" % url_string) try: self.path = pu.path except Exception: raise InvalidBackendURL("Syntax error (path) in: %s" % url_string) try: self.username = pu.username except Exception: raise InvalidBackendURL("Syntax error (username) in: %s" % url_string) if self.username: self.username = urllib.unquote(pu.username) else: self.username = None try: self.password = pu.password except Exception: raise InvalidBackendURL("Syntax error (password) in: %s" % url_string) if self.password: self.password = urllib.unquote(self.password) else: self.password = None try: self.hostname = pu.hostname except Exception: raise InvalidBackendURL("Syntax error (hostname) in: %s" % url_string) # init to None, overwrite with actual value on success self.port = None try: self.port = pu.port except Exception: # old style rsync://host::[/]dest, are still valid, though they contain no port if not (self.scheme in ['rsync'] and re.search('::[^:]*$', self.url_string)): raise InvalidBackendURL( "Syntax error (port) in: %s A%s B%s C%s" % (url_string, (self.scheme in ['rsync']), re.search('::[^:]+$', self.netloc), self.netloc)) # This happens for implicit local paths. if not pu.scheme: return # Our backends do not handle implicit hosts. if pu.scheme in urlparser.uses_netloc and not pu.hostname: raise InvalidBackendURL("Missing hostname in a backend URL which " "requires an explicit hostname: %s" "" % (url_string)) # Our backends do not handle implicit relative paths. if pu.scheme not in urlparser.uses_netloc and not pu.path.startswith( '//'): raise InvalidBackendURL( "missing // - relative paths not supported " "for scheme %s: %s" "" % (pu.scheme, url_string))