fix up url checks and extend unit tests for this issue

This commit is contained in:
Mike McLean 2017-09-19 14:43:23 -04:00
parent 2ef60eada5
commit c457d07246
2 changed files with 26 additions and 9 deletions

View file

@ -262,14 +262,25 @@ class SCM(object):
netloc = userhost[1]
elif len(userhost) > 2:
raise koji.GenericError('Invalid username@hostname specified: %s' % netloc)
if not netloc:
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the netloc element.' % self.url)
# check for empty path before we apply normpath
if not path:
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the path element.' % self.url)
path = os.path.normpath(path)
# ensure that path and query do not end in /
if path.endswith('/'):
path = path[:-1]
if query.endswith('/'):
query = query[:-1]
# path and query should not end with /
path = path.rstrip('/')
query = query.rstrip('/')
# normpath might not strip // at start of path
if path.startswith('//'):
path = '/' + path.strip('/')
# path should start with /
if not path.startswith('/'): # pragma: no cover
# any such url should have already been caught by is_scm_url
raise koji.GenericError('Invalid SCM URL. Path should begin with /: %s) ')
# check for validity: params should be empty, query may be empty, everything else should be populated
if params:
@ -277,10 +288,6 @@ class SCM(object):
if not scheme: #pragma: no cover
# should not happen because of is_scm_url check earlier
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the scheme element.' % self.url)
if not netloc:
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the netloc element.' % self.url)
if not path:
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the path element.' % self.url)
if not fragment:
raise koji.GenericError('Unable to parse SCM URL: %s . Could not find the fragment element.' % self.url)

View file

@ -28,6 +28,9 @@ class TestSCM(unittest.TestCase):
"http://localhost/foo.html",
"foo-1.1-1.src.rpm",
"https://server/foo-1.1-1.src.rpm",
"git:foobar",
"https:foo/bar",
"https://",
]
for url in good:
self.assertTrue(SCM.is_scm_url(url))
@ -81,6 +84,13 @@ class TestSCM(unittest.TestCase):
"cvs://badserver/projects/42#ref",
"svn://badserver/projects/42#ref",
"git://maybeserver/badpath/project#1234",
"git://maybeserver//badpath/project#1234",
"git://maybeserver////badpath/project#1234",
"git://maybeserver/./badpath/project#1234",
"git://maybeserver//.//badpath/project#1234",
"git://maybeserver/goodpath/../badpath/project#1234",
"git://maybeserver/goodpath/..//badpath/project#1234",
"git://maybeserver/..//badpath/project#1234",
]
for url in good:
scm = SCM(url)