@@ -92,6 +92,18 @@ def readauthforuri(ui, uri, user):
prefix = auth.get('prefix')
if not prefix:
continue
+
+ prefixurl = util.url(prefix)
+ if prefixurl.user and prefixurl.user != user:
+ # If a username was set in the prefix, it must match the username in
+ # the URI.
+ continue
+
+ # The URI passed in has been stripped of credentials, so erase the user
+ # here to allow simpler matching.
+ prefixurl.user = None
+ prefix = bytes(prefixurl)
+
p = prefix.split('://', 1)
if len(p) > 1:
schemes, prefix = [p[0]], p[1]
@@ -104,6 +104,39 @@ test({'x.prefix': 'http://example.org/fo
'y.password': 'ypassword'},
urls=['http://y@example.org/foo/bar'])
+print('\n*** Test user matching with name in prefix\n')
+
+# prefix, username and URL have the same user
+test({'x.prefix': 'https://example.org/foo',
+ 'x.username': None,
+ 'x.password': 'xpassword',
+ 'y.prefix': 'http://y@example.org/foo',
+ 'y.username': 'y',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+# Prefix has a different user from username and URL
+test({'y.prefix': 'http://z@example.org/foo',
+ 'y.username': 'y',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+# Prefix has a different user from URL; no username
+test({'y.prefix': 'http://z@example.org/foo',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+# Prefix and URL have same user, but doesn't match username
+test({'y.prefix': 'http://y@example.org/foo',
+ 'y.username': 'z',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+# Prefix and URL have the same user; no username
+test({'y.prefix': 'http://y@example.org/foo',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+# Prefix user, but no URL user or username
+test({'y.prefix': 'http://y@example.org/foo',
+ 'y.password': 'ypassword'},
+ urls=['http://example.org/foo'])
+
def testauthinfo(fullurl, authurl):
print('URIs:', fullurl, authurl)
pm = urlreq.httppasswordmgrwithdefaultrealm()
@@ -190,6 +190,27 @@ CFG: {b'x.password': b'xpassword', b'x.p
URI: http://y@example.org/foo/bar
('y', 'xpassword')
+*** Test user matching with name in prefix
+
+CFG: {b'x.password': b'xpassword', b'x.prefix': b'https://example.org/foo', b'x.username': None, b'y.password': b'ypassword', b'y.prefix': b'http://y@example.org/foo', b'y.username': b'y'}
+URI: http://y@example.org/foo
+ ('y', 'ypassword')
+CFG: {b'y.password': b'ypassword', b'y.prefix': b'http://z@example.org/foo', b'y.username': b'y'}
+URI: http://y@example.org/foo
+ abort
+CFG: {b'y.password': b'ypassword', b'y.prefix': b'http://z@example.org/foo'}
+URI: http://y@example.org/foo
+ abort
+CFG: {b'y.password': b'ypassword', b'y.prefix': b'http://y@example.org/foo', b'y.username': b'z'}
+URI: http://y@example.org/foo
+ abort
+CFG: {b'y.password': b'ypassword', b'y.prefix': b'http://y@example.org/foo'}
+URI: http://y@example.org/foo
+ ('y', 'ypassword')
+CFG: {b'y.password': b'ypassword', b'y.prefix': b'http://y@example.org/foo'}
+URI: http://example.org/foo
+ abort
+
*** Test urllib2 and util.url
URIs: http://user@example.com:8080/foo http://example.com:8080/foo