# HG changeset patch # User Mads Kiilerich # Date 1525685893 -7200 # Node ID 9ff917d87291c09e98862ec9506b635a2c3951d0 # Parent 8e51bf6541655c2d642c789d2bf826f61040f3eb utils: move clone URI validator function to more generic utils.is_valid_repo_uri No changes to the functionality, even though the API and implementation could use some clean-up ... diff -r 8e51bf654165 -r 9ff917d87291 kallithea/lib/utils.py --- a/kallithea/lib/utils.py Mon May 07 11:37:55 2018 +0200 +++ b/kallithea/lib/utils.py Mon May 07 11:38:13 2018 +0200 @@ -33,6 +33,7 @@ import beaker from tg import request, response +from tg.i18n import ugettext as _ from webhelpers.text import collapse, remove_formatting, strip_tags from beaker.cache import _cache_decorate @@ -40,6 +41,7 @@ from kallithea.lib.vcs.utils.helpers import get_scm from kallithea.lib.vcs.exceptions import VCSError +from kallithea.lib.exceptions import HgsubversionImportError from kallithea.model import meta from kallithea.model.db import Repository, User, Ui, \ UserLog, RepoGroup, Setting, UserGroup @@ -251,6 +253,40 @@ dirs[:] = recurse_dirs +def is_valid_repo_uri(repo_type, url, ui): + """Check if the url seems like a valid remote repo location - raise an Exception if any problems""" + if repo_type == 'hg': + from kallithea.lib.vcs.backends.hg.repository import MercurialRepository + if url.startswith('http') or url.startswith('ssh'): + # initially check if it's at least the proper URL + # or does it pass basic auth + MercurialRepository._check_url(url, ui) + elif url.startswith('svn+http'): + try: + from hgsubversion.svnrepo import svnremoterepo + except ImportError: + raise HgsubversionImportError(_('Unable to activate hgsubversion support. ' + 'The "hgsubversion" library is missing')) + svnremoterepo(ui, url).svn.uuid + elif url.startswith('git+http'): + raise NotImplementedError() + else: + raise Exception('URI %s not allowed' % (url,)) + + elif repo_type == 'git': + from kallithea.lib.vcs.backends.git.repository import GitRepository + if url.startswith('http') or url.startswith('git'): + # initially check if it's at least the proper URL + # or does it pass basic auth + GitRepository._check_url(url) + elif url.startswith('svn+http'): + raise NotImplementedError() + elif url.startswith('hg+http'): + raise NotImplementedError() + else: + raise Exception('URI %s not allowed' % (url)) + + def is_valid_repo(repo_name, base_path, scm=None): """ Returns True if given path is a valid repository False otherwise. diff -r 8e51bf654165 -r 9ff917d87291 kallithea/model/validators.py --- a/kallithea/model/validators.py Mon May 07 11:37:55 2018 +0200 +++ b/kallithea/model/validators.py Mon May 07 11:38:13 2018 +0200 @@ -31,10 +31,10 @@ ) from kallithea.lib.compat import OrderedSet from kallithea.lib import ipaddr -from kallithea.lib.utils import repo_name_slug +from kallithea.lib.utils import repo_name_slug, is_valid_repo_uri from kallithea.lib.utils2 import str2bool, aslist from kallithea.model.db import RepoGroup, Repository, UserGroup, User -from kallithea.lib.exceptions import LdapImportError, HgsubversionImportError +from kallithea.lib.exceptions import LdapImportError from kallithea.config.routing import ADMIN_PREFIX from kallithea.lib.auth import HasRepoGroupPermissionLevel, HasPermissionAny @@ -414,38 +414,6 @@ def ValidCloneUri(): from kallithea.lib.utils import make_ui - def url_handler(repo_type, url, ui): - if repo_type == 'hg': - from kallithea.lib.vcs.backends.hg.repository import MercurialRepository - if url.startswith('http') or url.startswith('ssh'): - # initially check if it's at least the proper URL - # or does it pass basic auth - MercurialRepository._check_url(url, ui) - elif url.startswith('svn+http'): - try: - from hgsubversion.svnrepo import svnremoterepo - except ImportError: - raise HgsubversionImportError(_('Unable to activate hgsubversion support. ' - 'The "hgsubversion" library is missing')) - svnremoterepo(ui, url).svn.uuid - elif url.startswith('git+http'): - raise NotImplementedError() - else: - raise Exception('clone from URI %s not allowed' % (url,)) - - elif repo_type == 'git': - from kallithea.lib.vcs.backends.git.repository import GitRepository - if url.startswith('http') or url.startswith('git'): - # initially check if it's at least the proper URL - # or does it pass basic auth - GitRepository._check_url(url) - elif url.startswith('svn+http'): - raise NotImplementedError() - elif url.startswith('hg+http'): - raise NotImplementedError() - else: - raise Exception('clone from URI %s not allowed' % (url)) - class _validator(formencode.validators.FancyValidator): messages = { 'clone_uri': _('Invalid repository URL'), @@ -459,7 +427,7 @@ if url and url != value.get('clone_uri_hidden'): try: - url_handler(repo_type, url, make_ui('db', clear_session=False)) + is_valid_repo_uri(repo_type, url, make_ui('db', clear_session=False)) except Exception: log.exception('URL validation failed') msg = self.message('clone_uri', state)