mirror of
https://github.com/haiwen/seahub.git
synced 2025-07-16 00:06:11 +00:00
Merge pull request #1006 from haiwen/repo-folder-perm
[api] add repo user/group folder perm api
This commit is contained in:
commit
c042f4ba2c
@ -28,6 +28,8 @@ urlpatterns = patterns('',
|
|||||||
url(r'^repos/public/$', PubRepos.as_view(), name="api2-pub-repos"),
|
url(r'^repos/public/$', PubRepos.as_view(), name="api2-pub-repos"),
|
||||||
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/$', Repo.as_view(), name="api2-repo"),
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/$', Repo.as_view(), name="api2-repo"),
|
||||||
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/history/$', RepoHistory.as_view()),
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/history/$', RepoHistory.as_view()),
|
||||||
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/user-folder-perm/$', RepoUserFolderPerm.as_view(), name="api2-repo-user-folder-perm"),
|
||||||
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/group-folder-perm/$', RepoGroupFolderPerm.as_view(), name="api2-repo-group-folder-perm"),
|
||||||
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/history-limit/$', RepoHistoryLimit.as_view(), name="api2-repo-history-limit"),
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/history-limit/$', RepoHistoryLimit.as_view(), name="api2-repo-history-limit"),
|
||||||
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/download-info/$', DownloadRepo.as_view()),
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/download-info/$', DownloadRepo.as_view()),
|
||||||
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/owner/$', RepoOwner.as_view(), name="api2-repo-owner"),
|
url(r'^repos/(?P<repo_id>[-0-9a-f]{36})/owner/$', RepoOwner.as_view(), name="api2-repo-owner"),
|
||||||
|
@ -14,6 +14,7 @@ from django.core.paginator import EmptyPage, InvalidPage
|
|||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework import status, serializers
|
from rest_framework import status, serializers
|
||||||
|
import seaserv
|
||||||
from seaserv import seafile_api, get_commits, server_repo_size, \
|
from seaserv import seafile_api, get_commits, server_repo_size, \
|
||||||
get_personal_groups_by_user, is_group_user, get_group, seafserv_threaded_rpc
|
get_personal_groups_by_user, is_group_user, get_group, seafserv_threaded_rpc
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
@ -28,7 +29,7 @@ from seahub.group.views import is_group_staff
|
|||||||
from seahub.message.models import UserMessage, UserMsgAttachment
|
from seahub.message.models import UserMessage, UserMsgAttachment
|
||||||
from seahub.notifications.models import UserNotification
|
from seahub.notifications.models import UserNotification
|
||||||
from seahub.utils import api_convert_desc_link, get_file_type_and_ext, \
|
from seahub.utils import api_convert_desc_link, get_file_type_and_ext, \
|
||||||
gen_file_get_url
|
gen_file_get_url, is_org_context
|
||||||
from seahub.utils.paginator import Paginator
|
from seahub.utils.paginator import Paginator
|
||||||
from seahub.utils.file_types import IMAGE
|
from seahub.utils.file_types import IMAGE
|
||||||
from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS
|
from seahub.api2.models import Token, TokenV2, DESKTOP_PLATFORMS
|
||||||
@ -558,3 +559,123 @@ def to_python_boolean(string):
|
|||||||
|
|
||||||
def is_seafile_pro():
|
def is_seafile_pro():
|
||||||
return any(['seahub_extra' in app for app in settings.INSTALLED_APPS])
|
return any(['seahub_extra' in app for app in settings.INSTALLED_APPS])
|
||||||
|
|
||||||
|
def api_repo_setting_permission_check(func):
|
||||||
|
"""Decorator for initial repo setting permission check
|
||||||
|
"""
|
||||||
|
def _decorated(view, request, repo_id, *args, **kwargs):
|
||||||
|
repo = seafile_api.get_repo(repo_id)
|
||||||
|
if not repo:
|
||||||
|
error_msg = 'Library %s not found.' % repo_id
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
# check permission
|
||||||
|
if is_org_context(request):
|
||||||
|
repo_owner = seafile_api.get_org_repo_owner(repo_id)
|
||||||
|
else:
|
||||||
|
repo_owner = seafile_api.get_repo_owner(repo_id)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
if repo.is_virtual or username != repo_owner:
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
return func(view, request, repo_id, *args, **kwargs)
|
||||||
|
|
||||||
|
return _decorated
|
||||||
|
|
||||||
|
def api_repo_user_folder_perm_check(func):
|
||||||
|
"""Check repo setting permission and args used by user-folder-perm
|
||||||
|
"""
|
||||||
|
def _decorated(view, request, repo_id, *args, **kwargs):
|
||||||
|
repo = seafile_api.get_repo(repo_id)
|
||||||
|
if not repo:
|
||||||
|
error_msg = 'Library %s not found.' % repo_id
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
# check permission
|
||||||
|
if is_org_context(request):
|
||||||
|
repo_owner = seafile_api.get_org_repo_owner(repo_id)
|
||||||
|
else:
|
||||||
|
repo_owner = seafile_api.get_repo_owner(repo_id)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
if repo.is_virtual or username != repo_owner:
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
# check arguments
|
||||||
|
user = request.data.get('user', None)
|
||||||
|
path = request.data.get('path', None)
|
||||||
|
perm = request.data.get('perm', None)
|
||||||
|
|
||||||
|
try:
|
||||||
|
User.objects.get(email=user)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
error_msg = 'User %s not found.' % user
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
if path:
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
if seafile_api.get_dir_id_by_path(repo_id, path) is None:
|
||||||
|
error_msg = 'Folder %s not found.' % path
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
if request.method in ('POST', 'PUT') and perm not in ('r', 'rw'):
|
||||||
|
error_msg = 'perm invalid.'
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
return func(view, request, repo_id, *args, **kwargs)
|
||||||
|
|
||||||
|
return _decorated
|
||||||
|
|
||||||
|
def api_repo_group_folder_perm_check(func):
|
||||||
|
"""Check repo setting permission and args used by group-folder-perm
|
||||||
|
"""
|
||||||
|
def _decorated(view, request, repo_id, *args, **kwargs):
|
||||||
|
repo = seafile_api.get_repo(repo_id)
|
||||||
|
if not repo:
|
||||||
|
error_msg = 'Library %s not found.' % repo_id
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
# check permission
|
||||||
|
if is_org_context(request):
|
||||||
|
repo_owner = seafile_api.get_org_repo_owner(repo_id)
|
||||||
|
else:
|
||||||
|
repo_owner = seafile_api.get_repo_owner(repo_id)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
if repo.is_virtual or username != repo_owner:
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
# check arguments
|
||||||
|
group_id = request.data.get('group_id', None)
|
||||||
|
path = request.data.get('path', None)
|
||||||
|
perm = request.data.get('perm', None)
|
||||||
|
|
||||||
|
try:
|
||||||
|
group_id = int(group_id)
|
||||||
|
except ValueError:
|
||||||
|
error_msg = 'group_id invalid.'
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
if not seaserv.get_group(group_id):
|
||||||
|
error_msg = 'Group %s not found.' % group_id
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
if path:
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
if seafile_api.get_dir_id_by_path(repo_id, path) is None:
|
||||||
|
error_msg = 'Folder %s not found.' % path
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
if request.method in ('POST', 'PUT') and perm not in ('r', 'rw'):
|
||||||
|
error_msg = 'perm invalid.'
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
return func(view, request, repo_id, *args, **kwargs)
|
||||||
|
|
||||||
|
return _decorated
|
||||||
|
@ -39,7 +39,9 @@ from .utils import is_repo_writable, is_repo_accessible, \
|
|||||||
get_groups, get_group_and_contacts, prepare_events, \
|
get_groups, get_group_and_contacts, prepare_events, \
|
||||||
get_person_msgs, api_group_check, get_email, get_timestamp, \
|
get_person_msgs, api_group_check, get_email, get_timestamp, \
|
||||||
get_group_message_json, get_group_msgs, get_group_msgs_json, get_diff_details, \
|
get_group_message_json, get_group_msgs, get_group_msgs_json, get_diff_details, \
|
||||||
json_response, to_python_boolean, is_seafile_pro
|
json_response, to_python_boolean, is_seafile_pro, \
|
||||||
|
api_repo_user_folder_perm_check, api_repo_setting_permission_check, \
|
||||||
|
api_repo_group_folder_perm_check
|
||||||
|
|
||||||
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
from seahub.avatar.settings import AVATAR_DEFAULT_SIZE
|
||||||
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
|
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
|
||||||
@ -94,7 +96,7 @@ if HAS_OFFICE_CONVERTER:
|
|||||||
import seahub.settings as settings
|
import seahub.settings as settings
|
||||||
from seahub.settings import THUMBNAIL_EXTENSION, THUMBNAIL_ROOT, \
|
from seahub.settings import THUMBNAIL_EXTENSION, THUMBNAIL_ROOT, \
|
||||||
ENABLE_GLOBAL_ADDRESSBOOK, FILE_LOCK_EXPIRATION_DAYS, \
|
ENABLE_GLOBAL_ADDRESSBOOK, FILE_LOCK_EXPIRATION_DAYS, \
|
||||||
ENABLE_THUMBNAIL, ENABLE_SUB_LIBRARY
|
ENABLE_THUMBNAIL, ENABLE_SUB_LIBRARY, ENABLE_FOLDER_PERM
|
||||||
try:
|
try:
|
||||||
from seahub.settings import CLOUD_MODE
|
from seahub.settings import CLOUD_MODE
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@ -4374,3 +4376,252 @@ class RepoUploadSharedLink(APIView):
|
|||||||
link.delete()
|
link.delete()
|
||||||
result = {'success': True}
|
result = {'success': True}
|
||||||
return Response(result)
|
return Response(result)
|
||||||
|
|
||||||
|
def get_repo_user_folder_perm_result(repo_id, path, user):
|
||||||
|
result = {}
|
||||||
|
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
|
||||||
|
if permission:
|
||||||
|
result['repo_id'] = repo_id
|
||||||
|
result['user_email'] = user
|
||||||
|
result['user_name'] = email2nickname(user)
|
||||||
|
result['folder_path'] = path
|
||||||
|
result['folder_name'] = path if path == '/' else os.path.basename(path.rstrip('/'))
|
||||||
|
result['permission'] = permission
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
class RepoUserFolderPerm(APIView):
|
||||||
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
throttle_classes = (UserRateThrottle,)
|
||||||
|
|
||||||
|
@api_repo_setting_permission_check
|
||||||
|
def get(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not is_pro_version():
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
results = []
|
||||||
|
folder_perms = seafile_api.list_folder_user_perm_by_repo(repo_id)
|
||||||
|
for perm in folder_perms:
|
||||||
|
result = {}
|
||||||
|
result['repo_id'] = perm.repo_id
|
||||||
|
result['user_email'] = perm.user
|
||||||
|
result['user_name'] = email2nickname(perm.user)
|
||||||
|
result['folder_path'] = perm.path
|
||||||
|
result['folder_name'] = os.path.basename(perm.path.rstrip('/'))
|
||||||
|
result['permission'] = perm.permission
|
||||||
|
|
||||||
|
results.append(result)
|
||||||
|
|
||||||
|
return Response(results)
|
||||||
|
|
||||||
|
@api_repo_user_folder_perm_check
|
||||||
|
def post(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
user = request.data.get('user')
|
||||||
|
path = request.data.get('path')
|
||||||
|
perm = request.data.get('perm')
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
|
||||||
|
if permission:
|
||||||
|
error_msg = 'Permission already exists.'
|
||||||
|
return api_error(status.HTTP_409_CONFLICT, error_msg)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.add_folder_user_perm(repo_id, path, perm, user)
|
||||||
|
send_perm_audit_msg('add-repo-perm', username, user, repo_id, path, perm)
|
||||||
|
result = get_repo_user_folder_perm_result(repo_id, path, user)
|
||||||
|
return Response(result)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
@api_repo_user_folder_perm_check
|
||||||
|
def put(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
user = request.data.get('user')
|
||||||
|
path = request.data.get('path')
|
||||||
|
perm = request.data.get('perm')
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
|
||||||
|
if not permission:
|
||||||
|
error_msg = 'Folder permission not found.'
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.set_folder_user_perm(repo_id, path, perm, user)
|
||||||
|
send_perm_audit_msg('modify-repo-perm', username, user, repo_id, path, perm)
|
||||||
|
result = get_repo_user_folder_perm_result(repo_id, path, user)
|
||||||
|
return Response(result)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
@api_repo_user_folder_perm_check
|
||||||
|
def delete(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
user = request.data.get('user')
|
||||||
|
path = request.data.get('path')
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_user_perm(repo_id, path, user)
|
||||||
|
if not permission:
|
||||||
|
return Response('success')
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.rm_folder_user_perm(repo_id, path, user)
|
||||||
|
send_perm_audit_msg('delete-repo-perm', username,
|
||||||
|
user, repo_id, path, permission)
|
||||||
|
return Response('success')
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
def get_repo_group_folder_perm_result(repo_id, path, group_id):
|
||||||
|
result = {}
|
||||||
|
group = seaserv.get_group(group_id)
|
||||||
|
permission = seafile_api.get_folder_group_perm(repo_id, path, group_id)
|
||||||
|
if permission:
|
||||||
|
result['repo_id'] = repo_id
|
||||||
|
result['group_id'] = group_id
|
||||||
|
result['group_name'] = group.group_name
|
||||||
|
result['folder_path'] = path
|
||||||
|
result['folder_name'] = os.path.basename(path.rstrip('/'))
|
||||||
|
result['permission'] = permission
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
class RepoGroupFolderPerm(APIView):
|
||||||
|
authentication_classes = (TokenAuthentication, SessionAuthentication)
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
throttle_classes = (UserRateThrottle,)
|
||||||
|
|
||||||
|
@api_repo_setting_permission_check
|
||||||
|
def get(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not is_pro_version():
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
results = []
|
||||||
|
group_folder_perms = seafile_api.list_folder_group_perm_by_repo(repo_id)
|
||||||
|
for perm in group_folder_perms:
|
||||||
|
result = {}
|
||||||
|
group = seaserv.get_group(perm.group_id)
|
||||||
|
result['repo_id'] = perm.repo_id
|
||||||
|
result['group_id'] = perm.group_id
|
||||||
|
result['group_name'] = group.group_name
|
||||||
|
result['folder_path'] = perm.path
|
||||||
|
result['folder_name'] = os.path.basename(perm.path.rstrip('/'))
|
||||||
|
result['permission'] = perm.permission
|
||||||
|
|
||||||
|
results.append(result)
|
||||||
|
|
||||||
|
return Response(results)
|
||||||
|
|
||||||
|
@api_repo_group_folder_perm_check
|
||||||
|
def post(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
group_id = request.data.get('group_id')
|
||||||
|
path = request.data.get('path')
|
||||||
|
perm = request.data.get('perm')
|
||||||
|
group_id = int(group_id)
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_group_perm(repo_id, path, group_id)
|
||||||
|
if permission:
|
||||||
|
error_msg = 'Permission already exists.'
|
||||||
|
return api_error(status.HTTP_409_CONFLICT, error_msg)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.add_folder_group_perm(repo_id, path, perm, group_id)
|
||||||
|
send_perm_audit_msg('add-repo-perm', username, group_id, repo_id, path, perm)
|
||||||
|
result = get_repo_group_folder_perm_result(repo_id, path, group_id)
|
||||||
|
return Response(result)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
@api_repo_group_folder_perm_check
|
||||||
|
def put(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
group_id = request.data.get('group_id')
|
||||||
|
path = request.data.get('path')
|
||||||
|
perm = request.data.get('perm')
|
||||||
|
group_id = int(group_id)
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_group_perm(repo_id, path, group_id)
|
||||||
|
if not permission:
|
||||||
|
error_msg = 'Folder permission not found.'
|
||||||
|
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.set_folder_group_perm(repo_id, path, perm, group_id)
|
||||||
|
send_perm_audit_msg('modify-repo-perm', username, group_id, repo_id, path, perm)
|
||||||
|
result = get_repo_group_folder_perm_result(repo_id, path, group_id)
|
||||||
|
return Response(result)
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
@api_repo_group_folder_perm_check
|
||||||
|
def delete(self, request, repo_id, format=None):
|
||||||
|
|
||||||
|
if not (is_pro_version() and ENABLE_FOLDER_PERM):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
group_id = request.data.get('group_id')
|
||||||
|
path = request.data.get('path')
|
||||||
|
group_id = int(group_id)
|
||||||
|
path = path.rstrip('/') if path != '/' else path
|
||||||
|
|
||||||
|
permission = seafile_api.get_folder_group_perm(repo_id, path, group_id)
|
||||||
|
if not permission:
|
||||||
|
return Response('success')
|
||||||
|
|
||||||
|
username = request.user.username
|
||||||
|
try:
|
||||||
|
seafile_api.rm_folder_group_perm(repo_id, path, group_id)
|
||||||
|
send_perm_audit_msg('delete-repo-perm', username, group_id,
|
||||||
|
repo_id, path, permission)
|
||||||
|
return Response('success')
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
265
tests/api/test_repo_group_folder_perm.py
Normal file
265
tests/api/test_repo_group_folder_perm.py
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
"""seahub/api2/views.py::Repo api tests.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
from random import randint
|
||||||
|
from tests.common.utils import randstring
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from seaserv import seafile_api
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
try:
|
||||||
|
from seahub.settings import LOCAL_PRO_DEV_ENV
|
||||||
|
except ImportError:
|
||||||
|
LOCAL_PRO_DEV_ENV = False
|
||||||
|
|
||||||
|
class RepoGroupFolderPermTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.user_repo_id = self.repo.id
|
||||||
|
self.user_folder_path = self.folder
|
||||||
|
self.perm_r = 'r'
|
||||||
|
self.perm_rw = 'rw'
|
||||||
|
self.group_id = self.group.id
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.remove_repo()
|
||||||
|
self.remove_group()
|
||||||
|
|
||||||
|
def test_can_get_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_group_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.group_id)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['group_id'] == self.group_id
|
||||||
|
assert json_resp[0]['repo_id'] == self.user_repo_id
|
||||||
|
assert json_resp[0]['permission'] == self.perm_r
|
||||||
|
assert json_resp[0]['folder_path'] == self.user_folder_path
|
||||||
|
|
||||||
|
def test_can_not_get_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_modify_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_group_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.group_id)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (self.group_id,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['permission'] == self.perm_rw
|
||||||
|
|
||||||
|
def test_can_not_modify_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (self.group_id,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_not_modify_if_folder_perm_not_exist(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (self.group_id,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_add_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": self.group_id,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['group_id'] == self.group_id
|
||||||
|
assert json_resp[0]['repo_id'] == self.user_repo_id
|
||||||
|
assert json_resp[0]['permission'] == self.perm_rw
|
||||||
|
assert json_resp[0]['folder_path'] == self.user_folder_path
|
||||||
|
|
||||||
|
def test_can_not_add_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": self.group_id,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_not_add_if_folder_perm_already_exist(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_group_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.group_id)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": self.group_id,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(409, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_delete_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_group_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.group_id)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert len(json_resp) == 1
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s' % (self.group_id, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-group-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert len(json_resp) == 0
|
||||||
|
|
||||||
|
def test_can_not_delete_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s' % (self.group_id, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_path(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_path = randstring(6)
|
||||||
|
|
||||||
|
# test delete
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s' % (self.group_id, invalid_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (self.group_id, invalid_path, self.perm_rw)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": self.group_id,
|
||||||
|
"path": invalid_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_group(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_group_id = randint(0, 9)
|
||||||
|
while invalid_group_id == self.group_id:
|
||||||
|
invalid_group_id = randint(0, 9)
|
||||||
|
|
||||||
|
# test delete
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s' % (invalid_group_id, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (invalid_group_id, self.user_folder_path, self.perm_rw)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": invalid_group_id,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_perm(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_perm = randstring(1)
|
||||||
|
while invalid_perm == 'r':
|
||||||
|
invalid_perm = randstring(1)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'group_id=%s&path=%s&perm=%s' % (self.group_id, self.user_folder_path, invalid_perm)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(400, resp.status_code)
|
||||||
|
|
||||||
|
invalid_perm = randstring(2)
|
||||||
|
while invalid_perm == 'rw':
|
||||||
|
invalid_perm = randstring(2)
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-group-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"group_id": self.group_id,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": invalid_perm
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(400, resp.status_code)
|
261
tests/api/test_repo_user_folder_perm.py
Normal file
261
tests/api/test_repo_user_folder_perm.py
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
"""seahub/api2/views.py::Repo api tests.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
from tests.common.utils import randstring
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from seaserv import seafile_api
|
||||||
|
from seahub.test_utils import BaseTestCase
|
||||||
|
try:
|
||||||
|
from seahub.settings import LOCAL_PRO_DEV_ENV
|
||||||
|
except ImportError:
|
||||||
|
LOCAL_PRO_DEV_ENV = False
|
||||||
|
|
||||||
|
class RepoUserFolderPermTest(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.user_repo_id = self.repo.id
|
||||||
|
self.user_folder_path = self.folder
|
||||||
|
self.perm_r = 'r'
|
||||||
|
self.perm_rw = 'rw'
|
||||||
|
self.admin_email = self.admin.email
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
self.remove_repo()
|
||||||
|
|
||||||
|
def test_can_get_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_user_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.admin_email)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['user_email'] == self.admin_email
|
||||||
|
assert json_resp[0]['repo_id'] == self.user_repo_id
|
||||||
|
assert json_resp[0]['permission'] == self.perm_r
|
||||||
|
assert json_resp[0]['folder_path'] == self.user_folder_path
|
||||||
|
|
||||||
|
def test_can_not_get_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_modify_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_user_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.admin_email)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (self.admin_email,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['permission'] == self.perm_rw
|
||||||
|
|
||||||
|
def test_can_not_modify_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (self.admin_email,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_not_modify_if_folder_perm_not_exist(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (self.admin_email,
|
||||||
|
self.user_folder_path, self.perm_rw)
|
||||||
|
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_add_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": self.admin_email,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert json_resp[0]['user_email'] == self.admin_email
|
||||||
|
assert json_resp[0]['repo_id'] == self.user_repo_id
|
||||||
|
assert json_resp[0]['permission'] == self.perm_rw
|
||||||
|
assert json_resp[0]['folder_path'] == self.user_folder_path
|
||||||
|
|
||||||
|
def test_can_not_add_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": self.admin_email,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_not_add_if_folder_perm_already_exist(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_user_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.admin_email)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": self.admin_email,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_r
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(409, resp.status_code)
|
||||||
|
|
||||||
|
def test_can_delete_folder_perm(self):
|
||||||
|
|
||||||
|
if not LOCAL_PRO_DEV_ENV:
|
||||||
|
return
|
||||||
|
|
||||||
|
seafile_api.add_folder_user_perm(self.user_repo_id,
|
||||||
|
self.user_folder_path, self.perm_r, self.admin_email)
|
||||||
|
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert len(json_resp) == 1
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s' % (self.admin_email, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(200, resp.status_code)
|
||||||
|
|
||||||
|
resp = self.client.get(reverse("api2-repo-user-folder-perm", args=[self.user_repo_id]))
|
||||||
|
json_resp = json.loads(resp.content)
|
||||||
|
assert len(json_resp) == 0
|
||||||
|
|
||||||
|
def test_can_not_delete_if_not_repo_owner(self):
|
||||||
|
self.login_as(self.admin)
|
||||||
|
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s' % (self.admin_email, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(403, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_path(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_path = randstring(6)
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": self.admin_email,
|
||||||
|
"path": invalid_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (self.admin_email, invalid_path, self.perm_rw)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test delete
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s' % (self.admin_email, invalid_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_user(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_user = randstring(6) + '@' + randstring(6) + '.com'
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": invalid_user,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": self.perm_rw
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (invalid_user, self.user_folder_path, self.perm_rw)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
# test delete
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s' % (invalid_user, self.user_folder_path)
|
||||||
|
resp = self.client.delete(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(404, resp.status_code)
|
||||||
|
|
||||||
|
def test_invalid_perm(self):
|
||||||
|
self.login_as(self.user)
|
||||||
|
|
||||||
|
invalid_perm = randstring(1)
|
||||||
|
while invalid_perm == 'r':
|
||||||
|
invalid_perm = randstring(1)
|
||||||
|
|
||||||
|
# test add
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = {
|
||||||
|
"user": self.admin_email,
|
||||||
|
"path": self.user_folder_path,
|
||||||
|
"perm": invalid_perm
|
||||||
|
}
|
||||||
|
resp = self.client.post(url, data)
|
||||||
|
self.assertEqual(400, resp.status_code)
|
||||||
|
|
||||||
|
invalid_perm = randstring(2)
|
||||||
|
while invalid_perm == 'rw':
|
||||||
|
invalid_perm = randstring(2)
|
||||||
|
|
||||||
|
# test modify
|
||||||
|
url = reverse("api2-repo-user-folder-perm", args=[self.user_repo_id])
|
||||||
|
data = 'user=%s&path=%s&perm=%s' % (self.admin_email, self.user_folder_path, invalid_perm)
|
||||||
|
resp = self.client.put(url, data, 'application/x-www-form-urlencoded')
|
||||||
|
self.assertEqual(400, resp.status_code)
|
Loading…
Reference in New Issue
Block a user