[yocto] [meta-swupd][PATCH 1/1] bundles.py: allow username/password encoded in URLs
Ingo Flaschberger
ingo.flaschberger at gmail.com
Sat Feb 24 15:31:15 PST 2018
Dear Patrick,
attached requested patch.
Kind regards,
Ingo Flaschberger
Am 10.01.2018 um 10:58 schrieb Patrick Ohly:
> On Tue, 2018-01-09 at 19:28 +0100, Ingo Flaschberger wrote:
>> Dear Patrick,
>>
>> it works if you replace:
>> manager.add_password(None, parsed_url, parsed_url.username,
>> parsed_url.password)
>> with:
>> manager.add_password(None, new_url, parsed_url.username,
>> parsed_url.password)
> I assume this works on top of my proposal. To avoid such ambiguity and
> the risk that something gets merged that is still incomplete, please
> post the entire patch as tested by you. The right way would be "git
> send-email", but I can also take "git diff" attached to an email.
>
-------------- next part --------------
diff --git a/lib/swupd/bundles.py b/lib/swupd/bundles.py
index b4c6f49..bec95d4 100644
--- a/lib/swupd/bundles.py
+++ b/lib/swupd/bundles.py
@@ -4,6 +4,7 @@ import subprocess
import shutil
import urllib.request
import urllib.error
+import urllib.parse
from bb.utils import export_proxies
from oe.package_manager import RpmPM
from oe.package_manager import OpkgPM
@@ -152,6 +153,30 @@ def copy_bundle_contents(d):
for bndl in bundles:
stage_empty_bundle(d, bndl)
+def handle_plain_auth(url):
+ """
+ Check for special urls with username/password (as in http://user:password@host/),
+ extract those and install an auth handler which will provide them
+ to the HTTP server when needed. Returns the URL that is to be instead of the original one.
+ """
+ parsed_url = urllib.parse.urlsplit(url)
+ if parsed_url.username != None:
+ # Use the netloc with just the hostname, without username/password.
+ netloc = parsed_url.hostname
+ if parsed_url.port is not None:
+ netloc += ":%d" % parsed_url.port
+ new_url = urllib.parse.SplitResult(parsed_url.scheme, netloc, parsed_url.path, parsed_url.query, parsed_url.fragment)
+ # The username/password are installed permanently in the urllib.request module
+ # for future use with all URLs beneath url.
+ manager = urllib.request.HTTPPasswordMgrWithDefaultRealm()
+ manager.add_password(None, new_url, parsed_url.username, parsed_url.password)
+ authHandler = urllib.request.HTTPBasicAuthHandler(manager)
+ opener = urllib.request.build_opener(authHandler)
+ urllib.request.install_opener(opener)
+ return urllib.parse.urlunsplit(new_url)
+ else:
+ return url
+
def download_manifests(content_url, version, component, to_dir):
"""
Download one manifest file and recursively all manifests referenced by it.
@@ -203,7 +228,7 @@ def download_old_versions(d):
a normal build and thus is not on the critical path.
"""
- content_url = d.getVar('SWUPD_CONTENT_URL', True)
+ content_url = handle_plain_auth(d.getVar('SWUPD_CONTENT_URL', True))
version_url = d.getVar('SWUPD_VERSION_URL', True)
current_format = int(d.getVar('SWUPD_FORMAT', True))
deploy_dir = d.getVar('DEPLOY_DIR_SWUPD', True)
@@ -240,6 +265,11 @@ def download_old_versions(d):
bb.debug(1, '%s does not exist, skipping that format' % url)
else:
raise
+ except urllib.error.URLError as url_error:
+ if re.search( 'No such file or directory', str(url_error.reason)):
+ bb.debug(1, '%s does not exist, skipping that format' % url)
+ else:
+ raise
# Now get the Manifests of the latest versions and the
# versions we are supposed to provide a delta for, as a starting point.
More information about the yocto
mailing list