Prevent installing global url opener

This commit is contained in:
Alan Hamlett 2022-04-29 11:14:55 -07:00
parent 847223cdce
commit da17125b97
1 changed files with 81 additions and 56 deletions

View File

@ -40,9 +40,9 @@ try:
except ImportError: except ImportError:
from configparser import ConfigParser, Error as ConfigParserError from configparser import ConfigParser, Error as ConfigParserError
try: try:
from urllib2 import urlopen, urlretrieve, ProxyHandler, build_opener, install_opener, HTTPError from urllib2 import Request, urlopen, HTTPError
except ImportError: except ImportError:
from urllib.request import urlopen, urlretrieve, ProxyHandler, build_opener, install_opener from urllib.request import Request, urlopen
from urllib.error import HTTPError from urllib.error import HTTPError
@ -847,83 +847,98 @@ def reportMissingPlatformSupport(osname, arch):
def request(url, last_modified=None): def request(url, last_modified=None):
req = Request(url)
req.add_header('User-Agent', 'github.com/wakatime/sublime-wakatime')
proxy = SETTINGS.get('proxy') proxy = SETTINGS.get('proxy')
if proxy: if proxy:
opener = build_opener(ProxyHandler({ req.set_proxy(proxy, 'https')
'http': proxy,
'https': proxy,
}))
else:
opener = build_opener()
headers = [('User-Agent', 'github.com/wakatime/sublime-wakatime')]
if last_modified: if last_modified:
headers.append(('If-Modified-Since', last_modified)) req.add_header('If-Modified-Since', last_modified)
opener.addheaders = headers
install_opener(opener)
try: try:
resp = urlopen(url) resp = urlopen(req)
headers = dict(resp.getheaders()) if is_py2 else resp.headers headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode() return headers, resp.read(), resp.getcode()
except HTTPError as err: except HTTPError as err:
if err.code == 304: if err.code == 304:
return None, None, 304 return None, None, 304
if is_py2: if is_py2:
ssl._create_default_https_context = ssl._create_unverified_context with SSLCertVerificationDisabled():
try: try:
resp = urlopen(url) resp = urlopen(req)
headers = dict(resp.getheaders()) if is_py2 else resp.headers headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode() return headers, resp.read(), resp.getcode()
except HTTPError as err2: except HTTPError as err2:
if err2.code == 304: if err2.code == 304:
return None, None, 304 return None, None, 304
log(DEBUG, err.read().decode()) log(DEBUG, err.read().decode())
log(DEBUG, err2.read().decode()) log(DEBUG, err2.read().decode())
raise raise
except IOError: except IOError:
raise raise
log(DEBUG, err.read().decode()) log(DEBUG, err.read().decode())
raise raise
except IOError: except IOError:
if is_py2: if is_py2:
ssl._create_default_https_context = ssl._create_unverified_context with SSLCertVerificationDisabled():
try: try:
resp = urlopen(url) resp = urlopen(url)
headers = dict(resp.getheaders()) if is_py2 else resp.headers headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode() return headers, resp.read(), resp.getcode()
except HTTPError as err: except HTTPError as err:
if err.code == 304: if err.code == 304:
return None, None, 304 return None, None, 304
log(DEBUG, err.read().decode()) log(DEBUG, err.read().decode())
raise raise
except IOError: except IOError:
raise raise
raise raise
def download(url, filePath): def download(url, filePath):
req = Request(url)
req.add_header('User-Agent', 'github.com/wakatime/sublime-wakatime')
proxy = SETTINGS.get('proxy') proxy = SETTINGS.get('proxy')
if proxy: if proxy:
opener = build_opener(ProxyHandler({ req.set_proxy(proxy, 'https')
'http': proxy,
'https': proxy,
}))
else:
opener = build_opener()
opener.addheaders = [('User-Agent', 'github.com/wakatime/sublime-wakatime')]
install_opener(opener) with open(filePath, 'wb') as fh:
try:
try: resp = urlopen(req)
urlretrieve(url, filePath) fh.write(resp.read())
except IOError: except HTTPError as err:
if is_py2: if err.code == 304:
ssl._create_default_https_context = ssl._create_unverified_context return None, None, 304
urlretrieve(url, filePath) if is_py2:
raise with SSLCertVerificationDisabled():
try:
resp = urlopen(req)
fh.write(resp.read())
return
except HTTPError as err2:
log(DEBUG, err.read().decode())
log(DEBUG, err2.read().decode())
raise
except IOError:
raise
log(DEBUG, err.read().decode())
raise
except IOError:
if is_py2:
with SSLCertVerificationDisabled():
try:
resp = urlopen(url)
fh.write(resp.read())
return
except HTTPError as err:
log(DEBUG, err.read().decode())
raise
except IOError:
raise
raise
def is_symlink(path): def is_symlink(path):
@ -949,3 +964,13 @@ def createSymlink():
os.chmod(link, 509) # 755 os.chmod(link, 509) # 755
except: except:
log(traceback.format_exc()) log(traceback.format_exc())
class SSLCertVerificationDisabled(object):
def __enter__(self):
self.original_context = ssl._create_default_https_context
ssl._create_default_https_context = ssl._create_unverified_context
def __exit__(self, *args, **kwargs):
ssl._create_default_https_context = self.original_context