Mercurial > hg-stable
changeset 29379:fc777c855d66
largefiles: make cloning not ask two times about password (issue4883)
Before this commit url.opener overwritten stored password
for connection with given url/user even when
new password for given connection was not filled. This
commit makes opener overwrites saved authentication only
when it contains password.
author | liscju <piotr.listkiewicz@gmail.com> |
---|---|
date | Thu, 09 Jun 2016 12:41:57 +0200 |
parents | fea71f66ebff |
children | c1b526f55116 |
files | mercurial/url.py tests/test-largefiles-wireproto.t |
diffstat | 2 files changed, 60 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/url.py Thu Jun 09 11:41:36 2016 +0200 +++ b/mercurial/url.py Thu Jun 09 12:41:57 2016 +0200 @@ -493,8 +493,10 @@ passmgr = passwordmgr(ui, ui.httppasswordmgrdb) if authinfo is not None: - passmgr.add_password(*authinfo) - user, passwd = authinfo[2:4] + realm, uris, user, passwd = authinfo + saveduser, savedpass = passmgr.find_stored_password(uris[0]) + if user != saveduser or passwd: + passmgr.add_password(realm, uris, user, passwd) ui.debug('http auth: user %s, password %s\n' % (user, passwd and '*' * len(passwd) or 'not set'))
--- a/tests/test-largefiles-wireproto.t Thu Jun 09 11:41:36 2016 +0200 +++ b/tests/test-largefiles-wireproto.t Thu Jun 09 12:41:57 2016 +0200 @@ -380,4 +380,60 @@ $ killdaemons.py +largefiles should not ask for password again after succesfull authorization + + $ hg init credentialmain + $ cd credentialmain + $ echo "aaa" >> a + $ hg add --large a + $ hg commit -m "a" + Invoking status precommit hook + A a + +Before running server clear the user cache to force clone to download +a large file from the server rather than to get it from the cache + + $ rm "${USERCACHE}"/* + + $ cd .. + $ cat << EOT > userpass.py + > import base64 + > from mercurial.hgweb import common + > def perform_authentication(hgweb, req, op): + > auth = req.env.get('HTTP_AUTHORIZATION') + > if not auth: + > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who', + > [('WWW-Authenticate', 'Basic Realm="mercurial"')]) + > if base64.b64decode(auth.split()[1]).split(':', 1) != ['user', 'pass']: + > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no') + > def extsetup(): + > common.permhooks.insert(0, perform_authentication) + > EOT + $ hg serve --config extensions.x=userpass.py -R credentialmain \ + > -d -p $HGPORT --pid-file hg.pid -A access.log + $ cat hg.pid >> $DAEMON_PIDS + $ cat << EOF > get_pass.py + > import getpass + > def newgetpass(arg): + > return "pass" + > getpass.getpass = newgetpass + > EOF + $ hg clone --config ui.interactive=true --config extensions.getpass=get_pass.py \ + > http://user@localhost:$HGPORT credentialclone + requesting all changes + http authorization required for http://localhost:$HGPORT/ + realm: mercurial + user: user + password: adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating to branch default + getting changed largefiles + 1 largefiles updated, 0 removed + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + + $ rm hg.pid access.log + $ killdaemons.py + #endif