comparison mercurial/url.py @ 15025:0593e8f81c71 stable

http: pass user to readauthforuri() (fix 4a43e23b8c55) urllib2 never handles URIs with credentials, we have to extract them and store them in the password manager before handing the stripped URI. Half of the changes deducing the username from the URI in 4a43e23b8c55 were incorrect. Instead, we retrieve the username from the password manager before passing to readauthforuri(). test-hgweb-auth.py was passing because the test itself was flawed: it was passing URIs with credentials to find_password(), which never happens.
author Patrick Mezard <pmezard@gmail.com>
date Fri, 05 Aug 2011 21:05:41 +0200
parents 4a43e23b8c55
children 1e45b92f4fb2 02734d2baa79
comparison
equal deleted inserted replaced
15024:0f1311e829c9 15025:0593e8f81c71
24 if user and passwd: 24 if user and passwd:
25 self._writedebug(user, passwd) 25 self._writedebug(user, passwd)
26 return (user, passwd) 26 return (user, passwd)
27 27
28 if not user or not passwd: 28 if not user or not passwd:
29 res = httpconnectionmod.readauthforuri(self.ui, authuri) 29 res = httpconnectionmod.readauthforuri(self.ui, authuri, user)
30 if res: 30 if res:
31 group, auth = res 31 group, auth = res
32 user, passwd = auth.get('username'), auth.get('password') 32 user, passwd = auth.get('username'), auth.get('password')
33 self.ui.debug("using auth.%s.* for authentication\n" % group) 33 self.ui.debug("using auth.%s.* for authentication\n" % group)
34 if not user or not passwd: 34 if not user or not passwd:
50 return (user, passwd) 50 return (user, passwd)
51 51
52 def _writedebug(self, user, passwd): 52 def _writedebug(self, user, passwd):
53 msg = _('http auth: user %s, password %s\n') 53 msg = _('http auth: user %s, password %s\n')
54 self.ui.debug(msg % (user, passwd and '*' * len(passwd) or 'not set')) 54 self.ui.debug(msg % (user, passwd and '*' * len(passwd) or 'not set'))
55
56 def find_stored_password(self, authuri):
57 return urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password(
58 self, None, authuri)
55 59
56 class proxyhandler(urllib2.ProxyHandler): 60 class proxyhandler(urllib2.ProxyHandler):
57 def __init__(self, ui): 61 def __init__(self, ui):
58 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy') 62 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
59 # XXX proxyauthinfo = None 63 # XXX proxyauthinfo = None
340 def _start_transaction(self, h, req): 344 def _start_transaction(self, h, req):
341 _generic_start_transaction(self, h, req) 345 _generic_start_transaction(self, h, req)
342 return keepalive.KeepAliveHandler._start_transaction(self, h, req) 346 return keepalive.KeepAliveHandler._start_transaction(self, h, req)
343 347
344 def https_open(self, req): 348 def https_open(self, req):
345 res = httpconnectionmod.readauthforuri(self.ui, req.get_full_url()) 349 # req.get_full_url() does not contain credentials and we may
350 # need them to match the certificates.
351 url = req.get_full_url()
352 user, password = self.pwmgr.find_stored_password(url)
353 res = httpconnectionmod.readauthforuri(self.ui, url, user)
346 if res: 354 if res:
347 group, auth = res 355 group, auth = res
348 self.auth = auth 356 self.auth = auth
349 self.ui.debug("using auth.%s.* for authentication\n" % group) 357 self.ui.debug("using auth.%s.* for authentication\n" % group)
350 else: 358 else: