# HG changeset patch # User Vadim Gelfer # Date 1147653454 25200 # Node ID 2efa636eb411552bce3c36946e4b64f381b3d127 # Parent 7761597b5da3d3a4bbc090a8341f589d472c50f7# Parent 09ed44225571cf4fc05fac6388198542c03086c7 merge with crew. diff -r 09ed44225571 -r 2efa636eb411 mercurial/httprepo.py --- a/mercurial/httprepo.py Sun May 14 18:24:32 2006 +0200 +++ b/mercurial/httprepo.py Sun May 14 17:37:34 2006 -0700 @@ -11,6 +11,25 @@ from demandload import * demandload(globals(), "hg os urllib urllib2 urlparse zlib util httplib") +class passwordmgr(urllib2.HTTPPasswordMgr): + def __init__(self, ui): + urllib2.HTTPPasswordMgr.__init__(self) + self.ui = ui + + def find_user_password(self, realm, authuri): + authinfo = urllib2.HTTPPasswordMgr.find_user_password( + self, realm, authuri) + if authinfo != (None, None): + return authinfo + + self.ui.write(_("http authorization required\n")) + self.ui.status(_("realm: %s\n") % realm) + user = self.ui.prompt(_("user:"), default=None) + passwd = self.ui.getpass() + + self.add_password(realm, authuri, user, passwd) + return (user, passwd) + class httprepository(remoterepository): def __init__(self, ui, path): # fix missing / after hostname @@ -53,13 +72,21 @@ if host and not no_proxy: proxy_handler = urllib2.ProxyHandler({"http" : "http://" + host}) - authinfo = None + proxyauthinfo = None if user and passwd: passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() passmgr.add_password(None, host, user, passwd) - authinfo = urllib2.ProxyBasicAuthHandler(passmgr) + proxyauthinfo = urllib2.ProxyBasicAuthHandler(passmgr) - opener = urllib2.build_opener(proxy_handler, authinfo) + if ui.interactive: + passmgr = passwordmgr(ui) + opener = urllib2.build_opener( + proxy_handler, proxyauthinfo, + urllib2.HTTPBasicAuthHandler(passmgr), + urllib2.HTTPDigestAuthHandler(passmgr)) + else: + opener = urllib2.build_opener(proxy_handler, proxyauthinfo) + # 1.0 here is the _protocol_ version opener.addheaders = [('User-agent', 'mercurial/proto-1.0')] urllib2.install_opener(opener) diff -r 09ed44225571 -r 2efa636eb411 mercurial/ui.py --- a/mercurial/ui.py Sun May 14 18:24:32 2006 +0200 +++ b/mercurial/ui.py Sun May 14 17:37:34 2006 -0700 @@ -8,7 +8,7 @@ import ConfigParser from i18n import gettext as _ from demandload import * -demandload(globals(), "errno os re smtplib socket sys tempfile util") +demandload(globals(), "errno getpass os re smtplib socket sys tempfile util") class ui(object): def __init__(self, verbose=False, debug=False, quiet=False, @@ -224,15 +224,18 @@ def readline(self): return sys.stdin.readline()[:-1] - def prompt(self, msg, pat, default="y"): + def prompt(self, msg, pat=None, default="y"): if not self.interactive: return default while 1: self.write(msg, " ") r = self.readline() - if re.match(pat, r): + if not pat or re.match(pat, r): return r else: self.write(_("unrecognized response\n")) + def getpass(self, prompt=None, default=None): + if not self.interactive: return default + return getpass.getpass(prompt or _('password: ')) def status(self, *msg): if not self.quiet: self.write(*msg) def warn(self, *msg):