mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-04 16:31:13 +00:00
add can publish repo permission (#3402)
add can_publish_repo user role permission
This commit is contained in:
@@ -2,7 +2,7 @@ import React, { Component, Fragment } from 'react';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Button } from 'reactstrap';
|
import { Button } from 'reactstrap';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { gettext, loginUrl } from '../../utils/constants';
|
import { gettext, loginUrl, canPublishRepo } from '../../utils/constants';
|
||||||
import toaster from '../../components/toast';
|
import toaster from '../../components/toast';
|
||||||
import ModalPortal from '../../components/modal-portal';
|
import ModalPortal from '../../components/modal-portal';
|
||||||
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
import CommonToolbar from '../../components/toolbar/common-toolbar';
|
||||||
@@ -128,9 +128,11 @@ class Wikis extends Component {
|
|||||||
<div className="cur-view-toolbar">
|
<div className="cur-view-toolbar">
|
||||||
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu" onClick={this.props.onShowSidePanel}></span>
|
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu" onClick={this.props.onShowSidePanel}></span>
|
||||||
<div className="operation">
|
<div className="operation">
|
||||||
|
{canPublishRepo &&
|
||||||
<Button className="btn btn-secondary operation-item" onClick={this.onSelectToggle}>
|
<Button className="btn btn-secondary operation-item" onClick={this.onSelectToggle}>
|
||||||
{gettext('Publish a Library')}
|
{gettext('Publish a Library')}
|
||||||
</Button>
|
</Button>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<CommonToolbar onSearchedClick={this.props.onSearchedClick} />
|
<CommonToolbar onSearchedClick={this.props.onSearchedClick} />
|
||||||
|
@@ -39,6 +39,7 @@ export const shareLinkExpireDaysMin = window.app.pageOptions.shareLinkExpireDays
|
|||||||
export const shareLinkExpireDaysMax = window.app.pageOptions.shareLinkExpireDaysMax;
|
export const shareLinkExpireDaysMax = window.app.pageOptions.shareLinkExpireDaysMax;
|
||||||
export const maxFileName = window.app.pageOptions.maxFileName;
|
export const maxFileName = window.app.pageOptions.maxFileName;
|
||||||
export const enableWiki = window.app.pageOptions.enableWiki;
|
export const enableWiki = window.app.pageOptions.enableWiki;
|
||||||
|
export const canPublishRepo = window.app.pageOptions.canPublishRepo;
|
||||||
export const enableEncryptedLibrary = window.app.pageOptions.enableEncryptedLibrary;
|
export const enableEncryptedLibrary = window.app.pageOptions.enableEncryptedLibrary;
|
||||||
export const enableRepoHistorySetting = window.app.pageOptions.enableRepoHistorySetting;
|
export const enableRepoHistorySetting = window.app.pageOptions.enableRepoHistorySetting;
|
||||||
export const isSystemStaff = window.app.pageOptions.isSystemStaff;
|
export const isSystemStaff = window.app.pageOptions.isSystemStaff;
|
||||||
|
@@ -96,6 +96,10 @@ class WikisView(APIView):
|
|||||||
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
# check perm
|
# check perm
|
||||||
|
if not request.user.permissions.can_publish_repo():
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
is_owner = is_repo_owner(request, repo_id, username)
|
is_owner = is_repo_owner(request, repo_id, username)
|
||||||
|
|
||||||
if not is_owner:
|
if not is_owner:
|
||||||
|
@@ -222,6 +222,12 @@ class UserPermissions(object):
|
|||||||
|
|
||||||
return self._get_perm_by_roles('can_use_wiki')
|
return self._get_perm_by_roles('can_use_wiki')
|
||||||
|
|
||||||
|
def can_publish_repo(self):
|
||||||
|
if not self.can_use_wiki():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return self._get_perm_by_roles('can_publish_repo')
|
||||||
|
|
||||||
class AdminPermissions(object):
|
class AdminPermissions(object):
|
||||||
def __init__(self, user):
|
def __init__(self, user):
|
||||||
self.user = user
|
self.user = user
|
||||||
|
@@ -41,6 +41,7 @@ DEFAULT_ENABLED_ROLE_PERMISSIONS = {
|
|||||||
'storage_ids': [],
|
'storage_ids': [],
|
||||||
'role_quota': '',
|
'role_quota': '',
|
||||||
'can_use_wiki': True,
|
'can_use_wiki': True,
|
||||||
|
'can_publish_repo': True,
|
||||||
},
|
},
|
||||||
GUEST_USER: {
|
GUEST_USER: {
|
||||||
'can_add_repo': False,
|
'can_add_repo': False,
|
||||||
@@ -60,6 +61,7 @@ DEFAULT_ENABLED_ROLE_PERMISSIONS = {
|
|||||||
'storage_ids': [],
|
'storage_ids': [],
|
||||||
'role_quota': '',
|
'role_quota': '',
|
||||||
'can_use_wiki': False,
|
'can_use_wiki': False,
|
||||||
|
'can_publish_repo': False,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -77,6 +77,7 @@
|
|||||||
shareLinkExpireDaysMax: "{{ share_link_expire_days_max }}",
|
shareLinkExpireDaysMax: "{{ share_link_expire_days_max }}",
|
||||||
maxFileName: "{{ max_file_name }}",
|
maxFileName: "{{ max_file_name }}",
|
||||||
enableWiki: {% if user.permissions.can_use_wiki %} true {% else %} false {% endif %},
|
enableWiki: {% if user.permissions.can_use_wiki %} true {% else %} false {% endif %},
|
||||||
|
canPublishRepo: {% if user.permissions.can_publish_repo %} true {% else %} false {% endif %},
|
||||||
enableEncryptedLibrary: {% if enable_encrypted_library %} true {% else %} false {% endif %},
|
enableEncryptedLibrary: {% if enable_encrypted_library %} true {% else %} false {% endif %},
|
||||||
enableRepoHistorySetting: {% if enable_repo_history_setting %} true {% else %} false {% endif %},
|
enableRepoHistorySetting: {% if enable_repo_history_setting %} true {% else %} false {% endif %},
|
||||||
isSystemStaff: {% if request.user.is_staff %} true {% else %} false {% endif %},
|
isSystemStaff: {% if request.user.is_staff %} true {% else %} false {% endif %},
|
||||||
|
@@ -1,14 +1,26 @@
|
|||||||
import json
|
import json
|
||||||
|
import copy
|
||||||
|
from mock import patch
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.test import override_settings
|
||||||
|
|
||||||
import seaserv
|
import seaserv
|
||||||
from seaserv import seafile_api, ccnet_api
|
from seaserv import seafile_api, ccnet_api
|
||||||
|
|
||||||
from seahub.share.utils import share_dir_to_user
|
from seahub.share.utils import share_dir_to_user
|
||||||
from seahub.wiki.models import Wiki
|
from seahub.wiki.models import Wiki
|
||||||
|
from seahub.role_permissions.settings import ENABLED_ROLE_PERMISSIONS
|
||||||
from seahub.test_utils import BaseTestCase
|
from seahub.test_utils import BaseTestCase
|
||||||
|
|
||||||
|
TEST_CAN_USE_WIKI_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
|
||||||
|
TEST_CAN_USE_WIKI_FALSE['default']['can_use_wiki'] = False
|
||||||
|
|
||||||
|
TEST_CAN_PUBLISH_REPO_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
|
||||||
|
TEST_CAN_PUBLISH_REPO_FALSE['default']['can_publish_repo'] = False
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(ENABLE_WIKI=True)
|
||||||
class WikisViewTest(BaseTestCase):
|
class WikisViewTest(BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.url = reverse('api-v2.1-wikis')
|
self.url = reverse('api-v2.1-wikis')
|
||||||
@@ -68,6 +80,27 @@ class WikisViewTest(BaseTestCase):
|
|||||||
w = Wiki.objects.all()[0]
|
w = Wiki.objects.all()[0]
|
||||||
assert w.created_at is not None
|
assert w.created_at is not None
|
||||||
|
|
||||||
|
def test_403_when_add_wiki_with_can_publish_repo_false(self):
|
||||||
|
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_CAN_PUBLISH_REPO_FALSE):
|
||||||
|
resp = self.client.post(self.url, {
|
||||||
|
'repo_id': self.repo.id,
|
||||||
|
})
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
@override_settings(ENABLE_WIKI=False)
|
||||||
|
def test_403_when_add_wiki_with_enable_wiki_false(self):
|
||||||
|
resp = self.client.post(self.url, {
|
||||||
|
'repo_id': self.repo.id,
|
||||||
|
})
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_403_when_add_wiki_with_can_use_wiki_false(self):
|
||||||
|
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_CAN_USE_WIKI_FALSE):
|
||||||
|
resp = self.client.post(self.url, {
|
||||||
|
'repo_id': self.repo.id,
|
||||||
|
})
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
|
||||||
class WikiViewTest(BaseTestCase):
|
class WikiViewTest(BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@@ -1,52 +1,20 @@
|
|||||||
|
import copy
|
||||||
from seahub.test_utils import BaseTestCase
|
from seahub.test_utils import BaseTestCase
|
||||||
from seahub.base.accounts import User, RegistrationForm
|
from seahub.base.accounts import User, RegistrationForm
|
||||||
|
|
||||||
from seahub.options.models import UserOptions
|
from seahub.options.models import UserOptions
|
||||||
|
from seahub.role_permissions.settings import ENABLED_ROLE_PERMISSIONS
|
||||||
from post_office.models import Email
|
from post_office.models import Email
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.test import override_settings
|
||||||
from mock import patch
|
from mock import patch
|
||||||
|
|
||||||
|
|
||||||
TEST_ADD_PUBLIC_ENABLED_ROLE_PERMISSIONS = {
|
TEST_CAN_ADD_PUBLICK_REPO_TRUE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
|
||||||
'default': {
|
TEST_CAN_ADD_PUBLICK_REPO_TRUE['default']['can_add_public_repo'] = True
|
||||||
'can_add_repo': True,
|
|
||||||
'can_add_group': True,
|
TEST_PUBLISH_REPO_CAN_USE_WIKI_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
|
||||||
'can_view_org': True,
|
TEST_PUBLISH_REPO_CAN_USE_WIKI_FALSE['default']['can_use_wiki'] = False
|
||||||
'can_add_public_repo': True,
|
|
||||||
'can_use_global_address_book': True,
|
|
||||||
'can_generate_share_link': True,
|
|
||||||
'can_generate_upload_link': True,
|
|
||||||
'can_send_share_link_mail': True,
|
|
||||||
'can_invite_guest': False,
|
|
||||||
'can_drag_drop_folder_to_sync': True,
|
|
||||||
'can_connect_with_android_clients': True,
|
|
||||||
'can_connect_with_ios_clients': True,
|
|
||||||
'can_connect_with_desktop_clients': True,
|
|
||||||
'can_export_files_via_mobile_client': True,
|
|
||||||
'storage_ids': [],
|
|
||||||
'role_quota': '',
|
|
||||||
'can_use_wiki': True,
|
|
||||||
},
|
|
||||||
'guest': {
|
|
||||||
'can_add_repo': False,
|
|
||||||
'can_add_group': False,
|
|
||||||
'can_view_org': False,
|
|
||||||
'can_add_public_repo': False,
|
|
||||||
'can_use_global_address_book': False,
|
|
||||||
'can_generate_share_link': False,
|
|
||||||
'can_generate_upload_link': False,
|
|
||||||
'can_send_share_link_mail': False,
|
|
||||||
'can_invite_guest': False,
|
|
||||||
'can_drag_drop_folder_to_sync': False,
|
|
||||||
'can_connect_with_android_clients': False,
|
|
||||||
'can_connect_with_ios_clients': False,
|
|
||||||
'can_connect_with_desktop_clients': False,
|
|
||||||
'can_export_files_via_mobile_client': False,
|
|
||||||
'storage_ids': [],
|
|
||||||
'role_quota': '',
|
|
||||||
'can_use_wiki': False,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
CLOUD_MODE_TRUE = True
|
CLOUD_MODE_TRUE = True
|
||||||
MULTI_TENANCY_TRUE = True
|
MULTI_TENANCY_TRUE = True
|
||||||
@@ -80,6 +48,7 @@ class UserTest(BaseTestCase):
|
|||||||
|
|
||||||
assert len(UserOptions.objects.filter(email=test_email)) == 0
|
assert len(UserOptions.objects.filter(email=test_email)) == 0
|
||||||
|
|
||||||
|
@override_settings(ENABLE_WIKI=True)
|
||||||
class UserPermissionsTest(BaseTestCase):
|
class UserPermissionsTest(BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
from constance import config
|
from constance import config
|
||||||
@@ -97,7 +66,6 @@ class UserPermissionsTest(BaseTestCase):
|
|||||||
assert self.user.permissions.can_connect_with_ios_clients() is True
|
assert self.user.permissions.can_connect_with_ios_clients() is True
|
||||||
assert self.user.permissions.can_connect_with_desktop_clients() is True
|
assert self.user.permissions.can_connect_with_desktop_clients() is True
|
||||||
assert self.user.permissions.can_invite_guest() is False
|
assert self.user.permissions.can_invite_guest() is False
|
||||||
|
|
||||||
assert self.user.permissions.can_export_files_via_mobile_client() is True
|
assert self.user.permissions.can_export_files_via_mobile_client() is True
|
||||||
|
|
||||||
def test_admin_permissions_can_add_public_repo(self):
|
def test_admin_permissions_can_add_public_repo(self):
|
||||||
@@ -116,14 +84,14 @@ class UserPermissionsTest(BaseTestCase):
|
|||||||
# both have
|
# both have
|
||||||
self.config.ENABLE_USER_CREATE_ORG_REPO = 1
|
self.config.ENABLE_USER_CREATE_ORG_REPO = 1
|
||||||
assert bool(self.config.ENABLE_USER_CREATE_ORG_REPO) is True
|
assert bool(self.config.ENABLE_USER_CREATE_ORG_REPO) is True
|
||||||
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_ADD_PUBLIC_ENABLED_ROLE_PERMISSIONS):
|
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_CAN_ADD_PUBLICK_REPO_TRUE):
|
||||||
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is True
|
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is True
|
||||||
assert self.user.permissions.can_add_public_repo() is True
|
assert self.user.permissions.can_add_public_repo() is True
|
||||||
|
|
||||||
# only have can_add_public_repo
|
# only have can_add_public_repo
|
||||||
self.config.ENABLE_USER_CREATE_ORG_REPO = 0
|
self.config.ENABLE_USER_CREATE_ORG_REPO = 0
|
||||||
assert bool(self.config.ENABLE_USER_CREATE_ORG_REPO) is False
|
assert bool(self.config.ENABLE_USER_CREATE_ORG_REPO) is False
|
||||||
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_ADD_PUBLIC_ENABLED_ROLE_PERMISSIONS):
|
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_CAN_ADD_PUBLICK_REPO_TRUE):
|
||||||
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is True
|
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is True
|
||||||
assert self.user.permissions.can_add_public_repo() is False
|
assert self.user.permissions.can_add_public_repo() is False
|
||||||
|
|
||||||
@@ -139,6 +107,23 @@ class UserPermissionsTest(BaseTestCase):
|
|||||||
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is False
|
assert self.user.permissions._get_perm_by_roles('can_add_public_repo') is False
|
||||||
assert self.user.permissions.can_add_public_repo() is False
|
assert self.user.permissions.can_add_public_repo() is False
|
||||||
|
|
||||||
|
def test_can_publish_repo_permission(self):
|
||||||
|
# enableWIKI = True, and can_use_wiki = True
|
||||||
|
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is True
|
||||||
|
assert self.user.permissions.can_publish_repo() is True
|
||||||
|
|
||||||
|
@override_settings(ENABLE_WIKI=False)
|
||||||
|
def test_can_publish_repo_permission_with_enable_wiki_False(self):
|
||||||
|
# enableWIKI = False, and can_use_wiki = True
|
||||||
|
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is True
|
||||||
|
assert self.user.permissions.can_publish_repo() is False
|
||||||
|
|
||||||
|
def test_can_publish_repo_permission_with_can_use_wiki_False(self):
|
||||||
|
# enableWIKI = True, and can_use_wiki = False
|
||||||
|
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_PUBLISH_REPO_CAN_USE_WIKI_FALSE):
|
||||||
|
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is True
|
||||||
|
assert self.user.permissions.can_publish_repo() is False
|
||||||
|
|
||||||
|
|
||||||
class RegistrationFormTest(BaseTestCase):
|
class RegistrationFormTest(BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@@ -11,4 +11,4 @@ class UtilsTest(BaseTestCase):
|
|||||||
assert DEFAULT_USER in get_available_roles()
|
assert DEFAULT_USER in get_available_roles()
|
||||||
|
|
||||||
def test_get_enabled_role_permissions_by_role(self):
|
def test_get_enabled_role_permissions_by_role(self):
|
||||||
assert len(get_enabled_role_permissions_by_role(DEFAULT_USER).keys()) == 17
|
assert len(get_enabled_role_permissions_by_role(DEFAULT_USER).keys()) == 18
|
||||||
|
Reference in New Issue
Block a user