[PATCH] allow http authentication information to be specified in the configuration

Peter Arrenbrecht peter.arrenbrecht at gmail.com
Wed Apr 22 13:52:15 UTC 2009


On Wed, Apr 22, 2009 at 2:13 PM, timeless <timeless at gmail.com> wrote:
> Please write "a URI". Please don't end sentences with prepositions
> (with), instead try using "with which to...".

Why? Case in point:

>> +    The username-password pair to authenticiate with, in the same format
>> +    used in URIs. ...

It seems to me that this is no hard and fast rule [1,2], and the
current version is actually shorter and - to my non-native ears - more
elegant.

But please do correct "authenticiate" to "authenticate".
-parren

[1]http://grammar.quickanddirtytips.com/ending-prepositions.aspx
[2]http://grammartips.homestead.com/prepositions1.html


> On 4/22/09, Sune Foldager <cryo at cyanite.org> wrote:
>> Changed to a config style inspired by [merge-tools], as discussed with tonfa
>> and djc on IRC.
>>
>>
>> # HG changeset patch
>> # User Sune Foldager <cryo at cyanite.org>
>> # Date 1240398504 -7200
>> # Node ID 6f75c801af5647f3667d358d002f3f1ff35eb2c1
>> # Parent  28a72f620cdef2883d1332a5edcc14b05224fd7b
>> allow http authentication information to be specified in the configuration
>>
>> diff --git a/doc/hgrc.5.txt b/doc/hgrc.5.txt
>> --- a/doc/hgrc.5.txt
>> +++ b/doc/hgrc.5.txt
>> @@ -100,6 +100,41 @@
>>  Mercurial "hgrc" file, the purpose of each section, its possible
>>  keys, and their possible values.
>>
>> +[[auth]]
>> +auth:
>> +  Authentication credentials for HTTP authentication.
>> +  Each line has the following format:
>> +
>> +    <name>.<argument> = <value>
>> +
>> +  where <name> is used to group arguments into authentication entries.
>> +  Example:
>> +
>> +    foo.prefix = hg.intevation.org/mercurial
>> +    foo.credentials = foo:bar
>> +    foo.schemas = http https
>> +
>> +  Supported arguments:
>> +
>> +  prefix;;
>> +    Either '*' or an URI prefix without the schema part. The authentication
>> +    entry with the longest matching prefix is used (where '*' matches
>> +    everything and counts as a match of length 1).
>> +    If this argument is not given, the authentication entry is skipped.
>> +  credentials;;
>> +    The username-password pair to authenticiate with, in the same format
>> +    used in URIs. Password is optional and if left out, the user will be
>> +    prompted for it.
>> +    If this argument is not given, the authentication entry is skipped.
>> +  schemas;;
>> +    The space-separated list of URI-schemas to use this authentication
>> +    entry with. Supported schemas are http and https. They will match
>> +    static-http and static-https respectively, as well.
>> +    Default: https.
>> +
>> +  If no suitable authentication entry is found, the user is prompted for
>> +  credentials as usual if required by the remote.
>> +
>>  [[decode]]
>>  decode/encode::
>>    Filters for transforming files on checkout/checkin. This would
>> diff --git a/mercurial/url.py b/mercurial/url.py
>> --- a/mercurial/url.py
>> +++ b/mercurial/url.py
>> @@ -105,24 +105,61 @@
>>              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 _readauthconfig(self):
>> +        config = dict()
>> +        for key, val in self.ui.configitems('auth'):
>> +            group, setting = key.split('.', 1)
>> +            if group in config:
>> +                d = config[group]
>> +            else:
>> +                config[group] = d = dict()
>> +            d[setting] = val
>> +        return config
>> +
>> +    def _readauthtoken(self, uri):
>> +        config = self._readauthconfig()
>> +        schema, hostpath = uri.split('://', 1)
>> +        bestlen = 0
>> +        bestauth = None
>> +
>> +        for auth in config.itervalues():
>> +            prefix = auth.get('prefix')
>> +            if not prefix: continue
>> +            schemas = (auth.get('schemas') or 'https').split()
>> +            if (prefix == '*' or hostpath.startswith(prefix)) and
>> len(prefix) > bestlen and schema in schemas:
>> +                bestlen = len(prefix)
>> +                bestauth = auth.get('credentials')
>> +
>> +        if bestauth:
>> +            return netlocsplit(bestauth + '@dummy')[2:4]
>> +        return None, None
>> +
>>  class proxyhandler(urllib2.ProxyHandler):
>>      def __init__(self, ui):
>>          proxyurl = ui.config("http_proxy", "host") or
>> os.getenv('http_proxy')
>> @@ -285,9 +322,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)))
>>
>>
>>
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
>>
>
> --
> Sent from my mobile device
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>




More information about the Mercurial-devel mailing list