changeset 5223:0b7b52bfaf5d stable

api: make update_repo check permissions to check owner like create_repo does Close loophole for reassigning repository owners. Test by Thomas De Schampheleire.
author Mads Kiilerich <madski@unity3d.com>
date Tue, 07 Jul 2015 02:25:59 +0200
parents 6620542597d3
children 2906653151bf
files kallithea/controllers/api/api.py kallithea/tests/api/api_base.py
diffstat 2 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/controllers/api/api.py	Tue Jul 07 02:25:59 2015 +0200
+++ b/kallithea/controllers/api/api.py	Tue Jul 07 02:25:59 2015 +0200
@@ -1561,6 +1561,12 @@
                 ):
                 raise JSONRPCError('no permission to create (or move) repositories')
 
+            if not isinstance(owner, Optional):
+                #forbid setting owner for non-admins
+                raise JSONRPCError(
+                    'Only Kallithea admin can specify `owner` param'
+                )
+
         updates = {
             # update function requires this.
             'repo_name': repo.repo_name
--- a/kallithea/tests/api/api_base.py	Tue Jul 07 02:25:59 2015 +0200
+++ b/kallithea/tests/api/api_base.py	Tue Jul 07 02:25:59 2015 +0200
@@ -1221,6 +1221,22 @@
             fixture.destroy_repo(repo_name)
             fixture.destroy_repo(new_repo_name)
 
+    def test_api_update_repo_regular_user_change_owner(self):
+        repo_name = 'admin_owned'
+        fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
+        RepoModel().grant_user_permission(repo=repo_name,
+                                          user=self.TEST_USER_LOGIN,
+                                          perm='repository.admin')
+        updates = {'owner': TEST_USER_ADMIN_LOGIN}
+        id_, params = _build_data(self.apikey_regular, 'update_repo',
+                                  repoid=repo_name, **updates)
+        response = api_call(self, params)
+        try:
+            expected = 'Only Kallithea admin can specify `owner` param'
+            self._compare_error(id_, expected, given=response.body)
+        finally:
+            fixture.destroy_repo(repo_name)
+
     def test_api_delete_repo(self):
         repo_name = 'api_delete_me'
         fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)