[yocto] [meta-swupd][PATCH 1/1] bundles.py: allow username/password encoded in URLs

Patrick Ohly patrick.ohly at intel.com
Tue Jan 9 08:57:30 PST 2018


On Thu, 2017-12-21 at 00:18 +0100, Ingo Flaschberger wrote:
> Dear Patrick,
> 
> this doesn't work:
>       0162:    """
>       0163:    parsed_url = urllib.parse.urlsplit(url)
>       0164:    if parsed_url.username != None:
>       0165:        # Use the netloc with just the hostname, without 
> username/password.
>   *** 0166:        parsed_url.netloc = parsed_url.hostname
>       0167:        # The username/password are installed permanently
> in 
> the urllib.request module
>       0168:        # for future use with all URLs beneath url.
>       0169:        manager = 
> urllib.request.HTTPPasswordMgrWithDefaultRealm()
>       0170:        manager.add_password(None, parsed_url, 
> parsed_url.username, parsed_url.password)
> Exception: AttributeError: can't set attribute

Looks like netloc is a read-only attribute. That means one has to
construct a new urllib.parse.SplitResult instead of updating the old
one.

> Using hostname as netloc will also remove an additional portnumber - 
> could this be a problem?

Yes, that's also something that needs to be fixed.

Can you update the patch as shown below, test it, and it if works send
the final version to the list? Obviously I am not doing a good job with
posting code that I can't test :-/

Am 20.12.2017 um 16:50 schrieb Patrick Ohly:
> > Downloading content and version information via HTTP may need a
> > username/password for basic authentication. To support this,
> > SWUPD_VERSION_URL and SWUPD_CONTENT_URL can now contain URLs of the
> > form http(s)://<user>:<password>@<host>/.
> > 
> > Original patch from: Ingo Flaschberger <ingo.flaschberger at gmail.com
> > >
> > 
> > Signed-off-by: Patrick Ohly <patrick.ohly at intel.com>
> > ---
> >   lib/swupd/bundles.py | 26 ++++++++++++++++++++++++--
> >   1 file changed, 24 insertions(+), 2 deletions(-)
> > 
> > diff --git a/lib/swupd/bundles.py b/lib/swupd/bundles.py
> > index e1eec5a..48c7455 100644
> > --- a/lib/swupd/bundles.py
> > +++ b/lib/swupd/bundles.py
> > @@ -5,6 +5,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
> > @@ -153,6 +154,27 @@ 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://us
> > er:password at 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.
> > +        parsed_url.netloc = parsed_url.hostname

Instead:

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, parsed_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_source)

Instead:

return urllib.parse.urlunsplit(new_url)


-- 
Best Regards, Patrick Ohly

The content of this message is my personal opinion only and although
I am an employee of Intel, the statements I make here in no way
represent Intel's position on the issue, nor am I authorized to speak
on behalf of Intel on this matter.





More information about the yocto mailing list