[PATCH] allow http authentication information to be specified in the configuration (2)
Sune Foldager
cryo at cyanite.org
Mon Apr 6 12:37:19 CDT 2009
Another stab at the feature. This time the code is in the password
manager, which is better. I also moved the debug output so it will also
work for authn obtained like this. I didn't run existing tests to ensure
this (the moved debug) breaks anything.
--
Sune.
# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1239039116 -7200
# Node ID 74108bfd8a8462579542ceeddabcb2e197b99243
# Parent b5db7dcc14972cfb01897f703654225a0ab098f9
allow http authentication information to be specified in the configuration
diff --git a/mercurial/url.py b/mercurial/url.py
--- a/mercurial/url.py
+++ b/mercurial/url.py
@@ -105,24 +105,47 @@
self, realm, authuri)
user, passwd = authinfo
if user and passwd:
+ self._writedebug(user, passwd)
return (user, passwd)
- if not self.ui.interactive:
- raise util.Abort(_('http authorization required'))
+ user, passwd = self._readauthtoken(authuri)
+ if not user or not passwd:
+ if not self.ui.interactive:
+ raise util.Abort(_('http authorization required'))
- self.ui.write(_("http authorization required\n"))
- self.ui.status(_("realm: %s\n") % realm)
- if user:
- self.ui.status(_("user: %s\n") % user)
- else:
- user = self.ui.prompt(_("user:"), default=None)
+ self.ui.write(_("http authorization required\n"))
+ self.ui.status(_("realm: %s\n") % realm)
+ if user:
+ self.ui.status(_("user: %s\n") % user)
+ else:
+ user = self.ui.prompt(_("user:"), default=None)
- if not passwd:
- passwd = self.ui.getpass()
+ if not passwd:
+ passwd = self.ui.getpass()
self.add_password(realm, authuri, user, passwd)
+ self._writedebug(user, passwd)
return (user, passwd)
+ def _writedebug(self, user, passwd):
+ self.ui.debug(_('http auth: user %s, password %s\n') %
+ (user, passwd and '*' * len(passwd) or 'not set'))
+
+ def _readauthtoken(self, uri):
+ uri = uri[uri.index('://')+3:]
+ bestlen = 0
+ bestauth = None
+ for prefix, auth in self.ui.configitems('auth'):
+ if (prefix == '*' or uri.startswith(prefix)) and
len(prefix) > bestlen:
+ bestlen = len(prefix)
+ bestauth = auth
+ if bestauth:
+ userpw = bestauth.split(':')
+ if len(userpw) == 1:
+ return userpw[0], None
+ return userpw
+ return None, None
+
class proxyhandler(urllib2.ProxyHandler):
def __init__(self, ui):
proxyurl = ui.config("http_proxy", "host") or
os.getenv('http_proxy')
@@ -285,9 +308,6 @@
passmgr = passwordmgr(ui)
if authinfo is not None:
passmgr.add_password(*authinfo)
- user, passwd = authinfo[2:4]
- ui.debug(_('http auth: user %s, password %s\n') %
- (user, passwd and '*' * len(passwd) or 'not set'))
handlers.extend((urllib2.HTTPBasicAuthHandler(passmgr),
httpdigestauthhandler(passmgr)))
More information about the Mercurial-devel
mailing list