URL quote username/password in gerrit
When constructing a git url for a project, urlquote the username and password component, taking particular care to escape '/' which is not quoted by default in urllib.parse.quote (it is the only 'safe' character by default, but it's not safe here). Change-Id: Ia7515acc63e7258e327948bfa621cccd60491baa
This commit is contained in:
parent
6380557111
commit
b768ece2c0
|
@ -109,6 +109,23 @@ class TestGerrit(BaseTestCase):
|
||||||
GerritConnection._checkRefFormat(ref),
|
GerritConnection._checkRefFormat(ref),
|
||||||
ref + ' shall be ' + ('accepted' if accepted else 'rejected'))
|
ref + ' shall be ' + ('accepted' if accepted else 'rejected'))
|
||||||
|
|
||||||
|
def test_getGitURL(self):
|
||||||
|
gerrit_config = {
|
||||||
|
'user': 'gerrit',
|
||||||
|
'server': 'localhost',
|
||||||
|
'password': '1/badpassword',
|
||||||
|
}
|
||||||
|
# The 1/ in the password ensures we test the url encoding
|
||||||
|
# path; this is the format of password we get from
|
||||||
|
# googlesource.com.
|
||||||
|
driver = GerritDriver()
|
||||||
|
gerrit = GerritConnection(driver, 'review_gerrit', gerrit_config)
|
||||||
|
project = gerrit.source.getProject('org/project')
|
||||||
|
url = gerrit.source.getGitUrl(project)
|
||||||
|
self.assertEqual(
|
||||||
|
'https://gerrit:1%2Fbadpassword@localhost/org/project',
|
||||||
|
url)
|
||||||
|
|
||||||
|
|
||||||
class TestGerritWeb(ZuulTestCase):
|
class TestGerritWeb(ZuulTestCase):
|
||||||
config_file = 'zuul-gerrit-web.conf'
|
config_file = 'zuul-gerrit-web.conf'
|
||||||
|
|
|
@ -1296,7 +1296,12 @@ class GerritConnection(BaseConnection):
|
||||||
def getGitUrl(self, project: Project) -> str:
|
def getGitUrl(self, project: Project) -> str:
|
||||||
if self.session:
|
if self.session:
|
||||||
baseurl = list(urllib.parse.urlparse(self.baseurl))
|
baseurl = list(urllib.parse.urlparse(self.baseurl))
|
||||||
baseurl[1] = '%s:%s@%s' % (self.user, self.password, baseurl[1])
|
# Make sure we escape '/' symbols, otherwise git's url
|
||||||
|
# parser will think the username is a hostname.
|
||||||
|
baseurl[1] = '%s:%s@%s' % (
|
||||||
|
urllib.parse.quote(self.user, safe=''),
|
||||||
|
urllib.parse.quote(self.password, safe=''),
|
||||||
|
baseurl[1])
|
||||||
baseurl = urllib.parse.urlunparse(baseurl)
|
baseurl = urllib.parse.urlunparse(baseurl)
|
||||||
url = ('%s/%s' % (baseurl, project.name))
|
url = ('%s/%s' % (baseurl, project.name))
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue