changeset 7293:9ff917d87291

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 ...
author Mads Kiilerich <mads@kiilerich.com>
date Mon, 07 May 2018 11:38:13 +0200
parents 8e51bf654165
children a569b523f86a
files kallithea/lib/utils.py kallithea/model/validators.py
diffstat 2 files changed, 39 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- 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)