wrap: Support netrc files
This commit is contained in:
parent
27748f9cd1
commit
83c6fc5b02
|
@ -30,6 +30,8 @@ import time
|
||||||
import typing as T
|
import typing as T
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
|
from base64 import b64encode
|
||||||
|
from netrc import netrc
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from . import WrapMode
|
from . import WrapMode
|
||||||
from .. import coredata
|
from .. import coredata
|
||||||
|
@ -246,9 +248,19 @@ class Resolver:
|
||||||
self.subdir_root = os.path.join(self.source_dir, self.subdir)
|
self.subdir_root = os.path.join(self.source_dir, self.subdir)
|
||||||
self.cachedir = os.path.join(self.subdir_root, 'packagecache')
|
self.cachedir = os.path.join(self.subdir_root, 'packagecache')
|
||||||
self.wraps = {} # type: T.Dict[str, PackageDefinition]
|
self.wraps = {} # type: T.Dict[str, PackageDefinition]
|
||||||
|
self.netrc: T.Optional[netrc] = None
|
||||||
self.provided_deps = {} # type: T.Dict[str, PackageDefinition]
|
self.provided_deps = {} # type: T.Dict[str, PackageDefinition]
|
||||||
self.provided_programs = {} # type: T.Dict[str, PackageDefinition]
|
self.provided_programs = {} # type: T.Dict[str, PackageDefinition]
|
||||||
self.load_wraps()
|
self.load_wraps()
|
||||||
|
self.load_netrc()
|
||||||
|
|
||||||
|
def load_netrc(self) -> None:
|
||||||
|
try:
|
||||||
|
self.netrc = netrc()
|
||||||
|
except FileNotFoundError:
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
mlog.warning(f'failed to process netrc file: {e}.', fatal=False)
|
||||||
|
|
||||||
def load_wraps(self) -> None:
|
def load_wraps(self) -> None:
|
||||||
if not os.path.isdir(self.subdir_root):
|
if not os.path.isdir(self.subdir_root):
|
||||||
|
@ -515,6 +527,16 @@ class Resolver:
|
||||||
subprocess.check_call([svn, 'checkout', '-r', revno, self.wrap.get('url'),
|
subprocess.check_call([svn, 'checkout', '-r', revno, self.wrap.get('url'),
|
||||||
self.directory], cwd=self.subdir_root)
|
self.directory], cwd=self.subdir_root)
|
||||||
|
|
||||||
|
def get_netrc_credentials(self, netloc: str) -> T.Optional[T.Tuple[str, str]]:
|
||||||
|
if self.netrc is None or netloc not in self.netrc.hosts:
|
||||||
|
return None
|
||||||
|
|
||||||
|
login, account, password = self.netrc.authenticators(netloc)
|
||||||
|
if account is not None:
|
||||||
|
login = account
|
||||||
|
|
||||||
|
return login, password
|
||||||
|
|
||||||
def get_data(self, urlstring: str) -> T.Tuple[str, str]:
|
def get_data(self, urlstring: str) -> T.Tuple[str, str]:
|
||||||
blocksize = 10 * 1024
|
blocksize = 10 * 1024
|
||||||
h = hashlib.sha256()
|
h = hashlib.sha256()
|
||||||
|
@ -525,8 +547,22 @@ class Resolver:
|
||||||
elif WHITELIST_SUBDOMAIN in urlstring:
|
elif WHITELIST_SUBDOMAIN in urlstring:
|
||||||
raise WrapException(f'{urlstring} may be a WrapDB-impersonating URL')
|
raise WrapException(f'{urlstring} may be a WrapDB-impersonating URL')
|
||||||
else:
|
else:
|
||||||
|
headers = {'User-Agent': f'mesonbuild/{coredata.version}'}
|
||||||
|
creds = self.get_netrc_credentials(url.netloc)
|
||||||
|
|
||||||
|
if creds is not None and '@' not in url.netloc:
|
||||||
|
login, password = creds
|
||||||
|
if url.scheme == 'https':
|
||||||
|
enc_creds = b64encode(f'{login}:{password}'.encode()).decode()
|
||||||
|
headers.update({'Authorization': f'Basic {enc_creds}'})
|
||||||
|
elif url.scheme == 'ftp':
|
||||||
|
urlstring = urllib.parse.urlunparse(url._replace(netloc=f'{login}:{password}@{url.netloc}'))
|
||||||
|
else:
|
||||||
|
mlog.warning(f'Meson is not going to use netrc credentials for protocols other than https/ftp',
|
||||||
|
fatal=False)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
req = urllib.request.Request(urlstring, headers={'User-Agent': f'mesonbuild/{coredata.version}'})
|
req = urllib.request.Request(urlstring, headers=headers)
|
||||||
resp = urllib.request.urlopen(req, timeout=REQ_TIMEOUT)
|
resp = urllib.request.urlopen(req, timeout=REQ_TIMEOUT)
|
||||||
except urllib.error.URLError as e:
|
except urllib.error.URLError as e:
|
||||||
mlog.log(str(e))
|
mlog.log(str(e))
|
||||||
|
|
Loading…
Reference in New Issue