From 0a9cc38a66ded0cf0e5b534cb24b970fc9c21920 Mon Sep 17 00:00:00 2001 From: Arfrever Frehtes Taifersar Arahesis Date: Tue, 1 May 2012 21:51:16 +0200 Subject: Bug #413983: Add portage.util.urlopen(), which transparently handles authentication in the way compatible with Python 3. --- bin/repoman | 9 ++------- pym/portage/dbapi/bintree.py | 7 +++---- pym/portage/glsa.py | 10 +++------- pym/portage/util/__init__.py | 21 ++++++++++++++++++++- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/bin/repoman b/bin/repoman index 1cdfcf674..cfe4b8e01 100755 --- a/bin/repoman +++ b/bin/repoman @@ -25,11 +25,6 @@ import textwrap import time import platform -try: - from urllib.request import urlopen as urllib_request_urlopen -except ImportError: - from urllib import urlopen as urllib_request_urlopen - from itertools import chain from stat import S_ISDIR @@ -75,7 +70,7 @@ from portage.process import find_binary, spawn from portage.output import bold, create_color_func, \ green, nocolor, red from portage.output import ConsoleStyleFile, StyleWriter -from portage.util import cmp_sort_key, writemsg_level +from portage.util import cmp_sort_key, urlopen, writemsg_level from portage.util._desktop_entry import validate_desktop_entry from portage.package.ebuild.digestgen import digestgen from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use @@ -1051,7 +1046,7 @@ def fetch_metadata_dtd(): "needs to be refetched, doing that now") print() try: - url_f = urllib_request_urlopen(metadata_dtd_uri) + url_f = urlopen(metadata_dtd_uri) msg_info = url_f.info() last_modified = msg_info.get('last-modified') if last_modified is not None: diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index 2295b9f59..810163d0f 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -1,4 +1,4 @@ -# Copyright 1998-2011 Gentoo Foundation +# Copyright 1998-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 __all__ = ["bindbapi", "binarytree"] @@ -26,6 +26,7 @@ from portage.dep import Atom, use_reduce, paren_enclose from portage.exception import AlarmSignal, InvalidPackageName, \ PermissionDenied, PortageException from portage.localization import _ +from portage.util import urlopen from portage import _movefile from portage import os from portage import _encodings @@ -45,10 +46,8 @@ import warnings from itertools import chain try: from urllib.parse import urlparse - from urllib.request import urlopen as urllib_request_urlopen except ImportError: from urlparse import urlparse - from urllib import urlopen as urllib_request_urlopen if sys.hexversion >= 0x3000000: basestring = str @@ -843,7 +842,7 @@ class binarytree(object): # slash, so join manually... url = base_url.rstrip("/") + "/Packages" try: - f = urllib_request_urlopen(url) + f = urlopen(url) except IOError: path = parsed_url.path.rstrip("/") + "/Packages" diff --git a/pym/portage/glsa.py b/pym/portage/glsa.py index 2df7ec3a7..16f662f0d 100644 --- a/pym/portage/glsa.py +++ b/pym/portage/glsa.py @@ -1,14 +1,10 @@ -# Copyright 2003-2011 Gentoo Foundation +# Copyright 2003-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from __future__ import absolute_import import io import sys -try: - from urllib.request import urlopen as urllib_request_urlopen -except ImportError: - from urllib import urlopen as urllib_request_urlopen import re import xml.dom.minidom @@ -18,7 +14,7 @@ from portage import _encodings from portage import _unicode_decode from portage import _unicode_encode from portage.versions import pkgsplit, catpkgsplit, pkgcmp, best -from portage.util import grabfile +from portage.util import grabfile, urlopen from portage.const import CACHE_PATH from portage.localization import _ from portage.dep import _slot_separator @@ -476,7 +472,7 @@ class Glsa: myurl = "file://"+self.nr else: myurl = repository + "glsa-%s.xml" % str(self.nr) - self.parse(urllib_request_urlopen(myurl)) + self.parse(urlopen(myurl)) return None def parse(self, myfile): diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py index d6ac46c83..2b50733c5 100644 --- a/pym/portage/util/__init__.py +++ b/pym/portage/util/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2004-2011 Gentoo Foundation +# Copyright 2004-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 __all__ = ['apply_permissions', 'apply_recursive_permissions', @@ -26,6 +26,14 @@ import string import sys import traceback import glob +try: + import urllib.parse as urllib_parse + import urllib.request as urllib_request + from urllib.parse import splituser as urllib_parse_splituser +except ImportError: + import urlparse as urllib_parse + import urllib2 as urllib_request + from urllib import splituser as urllib_parse_splituser import portage portage.proxy.lazyimport.lazyimport(globals(), @@ -1640,3 +1648,14 @@ def getlibpaths(root, env=None): rval.append("/lib") return [normalize_path(x) for x in rval if x] + +def urlopen(url): + parse_result = urllib_parse.urlparse(url) + netloc = urllib_parse_splituser(parse_result.netloc)[1] + url = urllib_parse.urlunparse((parse_result.scheme, netloc, parse_result.path, parse_result.params, parse_result.query, parse_result.fragment)) + password_manager = urllib_request.HTTPPasswordMgrWithDefaultRealm() + if parse_result.username is not None: + password_manager.add_password(None, url, parse_result.username, parse_result.password) + auth_handler = urllib_request.HTTPBasicAuthHandler(password_manager) + opener = urllib_request.build_opener(auth_handler) + return opener.open(url) -- cgit v1.2.3-1-g7c22