changeset 2835:faffec4abbda beta

Implemented permissions for writing to repo groups. Now only write access to group allows to create a repostiory within that group
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 13 Sep 2012 19:36:56 +0200
parents 925c77b9d3f1
children 819eb7f8a555
files rhodecode/controllers/admin/repos.py rhodecode/controllers/admin/settings.py rhodecode/controllers/forks.py rhodecode/controllers/settings.py rhodecode/model/db.py rhodecode/model/forms.py rhodecode/model/validators.py
diffstat 7 files changed, 36 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/controllers/admin/repos.py	Thu Sep 13 19:36:56 2012 +0200
@@ -66,7 +66,7 @@
         super(ReposController, self).__before__()
 
     def __load_defaults(self):
-        c.repo_groups = RepoGroup.groups_choices()
+        c.repo_groups = RepoGroup.groups_choices(check_perms=True)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
 
         repo_model = RepoModel()
--- a/rhodecode/controllers/admin/settings.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/controllers/admin/settings.py	Thu Sep 13 19:36:56 2012 +0200
@@ -451,7 +451,7 @@
     def create_repository(self):
         """GET /_admin/create_repository: Form to create a new item"""
 
-        c.repo_groups = RepoGroup.groups_choices()
+        c.repo_groups = RepoGroup.groups_choices(check_perms=True)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
         choices, c.landing_revs = ScmModel().get_repo_landing_revs()
 
--- a/rhodecode/controllers/forks.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/controllers/forks.py	Thu Sep 13 19:36:56 2012 +0200
@@ -53,7 +53,7 @@
         super(ForksController, self).__before__()
 
     def __load_defaults(self):
-        c.repo_groups = RepoGroup.groups_choices()
+        c.repo_groups = RepoGroup.groups_choices(check_perms=True)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
         choices, c.landing_revs = ScmModel().get_repo_landing_revs()
         c.landing_revs_choices = choices
--- a/rhodecode/controllers/settings.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/controllers/settings.py	Thu Sep 13 19:36:56 2012 +0200
@@ -56,7 +56,7 @@
         super(SettingsController, self).__before__()
 
     def __load_defaults(self):
-        c.repo_groups = RepoGroup.groups_choices()
+        c.repo_groups = RepoGroup.groups_choices(check_perms=True)
         c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups)
 
         repo_model = RepoModel()
--- a/rhodecode/model/db.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/model/db.py	Thu Sep 13 19:36:56 2012 +0200
@@ -1027,14 +1027,20 @@
                                   self.group_name)
 
     @classmethod
-    def groups_choices(cls):
+    def groups_choices(cls, check_perms=False):
         from webhelpers.html import literal as _literal
+        from rhodecode.model.scm import ScmModel
+        groups = cls.query().all()
+        if check_perms:
+            #filter group user have access to, it's done
+            #magically inside ScmModel based on current user
+            groups = ScmModel().get_repos_groups(groups)
         repo_groups = [('', '')]
         sep = ' &raquo; '
         _name = lambda k: _literal(sep.join(k))
 
         repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
-                              for x in cls.query().all()])
+                              for x in groups])
 
         repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
         return repo_groups
--- a/rhodecode/model/forms.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/model/forms.py	Thu Sep 13 19:36:56 2012 +0200
@@ -177,7 +177,8 @@
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
         clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
-        repo_group = v.OneOf(repo_groups, hideList=True)
+        repo_group = All(v.CanWriteGroup(),
+                         v.OneOf(repo_groups, hideList=True))
         repo_type = v.OneOf(supported_backends)
         description = v.UnicodeString(strip=True, min=1, not_empty=False)
         private = v.StringBoolean(if_missing=False)
@@ -203,7 +204,8 @@
         filter_extra_fields = False
         repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
                         v.SlugifyName())
-        repo_group = v.OneOf(repo_groups, hideList=True)
+        repo_group = All(v.CanWriteGroup(),
+                         v.OneOf(repo_groups, hideList=True))
         repo_type = All(v.ValidForkType(old_data), v.OneOf(supported_backends))
         description = v.UnicodeString(strip=True, min=1, not_empty=True)
         private = v.StringBoolean(if_missing=False)
--- a/rhodecode/model/validators.py	Wed Sep 12 22:20:56 2012 +0200
+++ b/rhodecode/model/validators.py	Thu Sep 13 19:36:56 2012 +0200
@@ -19,6 +19,7 @@
     ChangesetStatus
 from rhodecode.lib.exceptions import LdapImportError
 from rhodecode.config.routing import ADMIN_PREFIX
+from rhodecode.lib.auth import HasReposGroupPermissionAny
 
 # silence warnings and pylint
 UnicodeString, OneOf, Int, Number, Regex, Email, Bool, StringBoolean, Set, \
@@ -466,6 +467,25 @@
     return _validator
 
 
+def CanWriteGroup():
+    class _validator(formencode.validators.FancyValidator):
+        messages = {
+            'permission_denied': _(u"You don't have permissions "
+                                   "to create repository in this group")
+        }
+
+        def validate_python(self, value, state):
+            gr = RepoGroup.get(value)
+            if not HasReposGroupPermissionAny(
+                'group.write', 'group.admin'
+            )(gr.group_name, 'get group of repo form'):
+                msg = M(self, 'permission_denied', state)
+                raise formencode.Invalid(msg, value, state,
+                    error_dict=dict(repo_type=msg)
+                )
+    return _validator
+
+
 def ValidPerms(type_='repo'):
     if type_ == 'group':
         EMPTY_PERM = 'group.none'