canonical.py (1238B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\url_utils\client\canonical.py 2 import urlparse 3 ALLOWED_SCHEMES = ('http', 'https') 4 FORBIDDEN_CHARS = frozenset(u'\\<>"') 5 6 def canonicalize_http_url(url): 7 if not isinstance(url, basestring): 8 return None 9 if isinstance(url, bytes): 10 url = url.decode('latin-1') 11 u = url.strip() 12 for c in u: 13 if not 32 < ord(c) < 127 or c in FORBIDDEN_CHARS: 14 return None 15 16 try: 17 parsed = urlparse.urlparse(u) 18 scheme = parsed.scheme.lower() 19 if scheme not in ALLOWED_SCHEMES or not parsed.netloc: 20 return None 21 canonical = urlparse.urlunparse((scheme, 22 parsed.netloc, 23 parsed.path, 24 parsed.params, 25 parsed.query, 26 parsed.fragment)) 27 except Exception: 28 return None 29 30 if not canonical.startswith(scheme + u'://'): 31 return None 32 return canonical 33 34 35 def canonical_safe_url(url): 36 canonical = canonicalize_http_url(url) 37 if canonical is None: 38 return 39 if canonical.find(u'../') >= 0 or canonical.find(u'\\..') >= 0: 40 return 41 if canonical.lower().endswith(u'.exe'): 42 return 43 return canonical