From 150e5fd8daa3f4faee64fb685af3d2914a65d63b Mon Sep 17 00:00:00 2001 From: zhengxie Date: Mon, 27 Apr 2015 14:59:49 +0800 Subject: [PATCH] Fix system library bug, fix mv/cp dir(s)/file(s) bug --- seahub/api2/views.py | 22 +- seahub/share/views.py | 2 +- .../templates/sysadmin/sys_list_system.html | 2 +- seahub/views/__init__.py | 24 +- seahub/views/ajax.py | 307 +++++++++--------- seahub/views/file.py | 2 +- seahub/views/repo.py | 8 +- 7 files changed, 189 insertions(+), 178 deletions(-) diff --git a/seahub/api2/views.py b/seahub/api2/views.py index fd8e0b8954..f79fbdf4ce 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -1062,7 +1062,7 @@ class UploadLinkView(APIView): def get(self, request, repo_id, format=None): parent_dir = request.GET.get('p', '/') - if check_folder_permission(repo_id, parent_dir, request.user.username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if check_quota(repo_id) < 0: @@ -1080,7 +1080,7 @@ class UpdateLinkView(APIView): def get(self, request, repo_id, format=None): parent_dir = request.GET.get('p', '/') - if check_folder_permission(repo_id, parent_dir, request.user.username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if check_quota(repo_id) < 0: @@ -1098,7 +1098,7 @@ class UploadBlksLinkView(APIView): def get(self, request, repo_id, format=None): parent_dir = request.GET.get('p', '/') - if check_folder_permission(repo_id, parent_dir, request.user.username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if check_quota(repo_id) < 0: @@ -1116,7 +1116,7 @@ class UpdateBlksLinkView(APIView): def get(self, request, repo_id, format=None): parent_dir = request.GET.get('p', '/') - if check_folder_permission(repo_id, parent_dir, request.user.username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if check_quota(repo_id) < 0: @@ -1381,7 +1381,7 @@ class OpCopyView(APIView): return api_error(status.HTTP_400_BAD_REQUEST, 'Missing argument.') - if check_folder_permission(repo_id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') parent_dir = request.POST.get('p', '/') @@ -1517,7 +1517,7 @@ class FileView(APIView): path = request.GET.get('p', '') username = request.user.username parent_dir = os.path.dirname(path) - if check_folder_permission(repo_id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if not path or path[0] != '/': @@ -1669,7 +1669,7 @@ class FileView(APIView): return api_error(status.HTTP_400_BAD_REQUEST, 'Path is missing.') parent_dir = os.path.dirname(path) - if check_folder_permission(repo_id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') parent_dir_utf8 = os.path.dirname(path).encode('utf-8') @@ -1747,7 +1747,7 @@ class FileRevert(APIView): parent_dir = os.path.dirname(path) username = request.uset.username - if check_folder_permission(repo_id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') path = unquote(path.encode('utf-8')) @@ -1919,7 +1919,7 @@ class DirView(APIView): 'You do not have permission to create folder.') parent_dir = os.path.dirname(path) - if check_folder_permission(repo_id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo_id, parent_dir) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') parent_dir_utf8 = parent_dir.encode('utf-8') @@ -1944,7 +1944,7 @@ class DirView(APIView): quote(new_dir_name_utf8) return resp elif operation.lower() == 'rename': - if check_folder_permission(repo.id, path, username) != 'rw': + if check_folder_permission(request, repo.id, path) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if not is_repo_writable(repo.id, username): @@ -1994,7 +1994,7 @@ class DirView(APIView): if not path: return api_error(status.HTTP_400_BAD_REQUEST, 'Path is missing.') - if check_folder_permission(repo_id, path, username) != 'rw': + if check_folder_permission(request, repo_id, path) != 'rw': return api_error(status.HTTP_403_FORBIDDEN, 'Forbid to access this folder.') if path == '/': # Can not delete root path. diff --git a/seahub/share/views.py b/seahub/share/views.py index 7f0fbeeba0..4e612516e3 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -1260,7 +1260,7 @@ def get_shared_upload_link(request): messages.error(request, _(u'Library does not exist')) return HttpResponse(status=400, content_type=content_type) - user_perm = check_folder_permission(repo.id, path, request.user.username) + user_perm = check_folder_permission(request, repo.id, path) if user_perm == 'rw': l = UploadLinkShare.objects.filter(repo_id=repo_id).filter( diff --git a/seahub/templates/sysadmin/sys_list_system.html b/seahub/templates/sysadmin/sys_list_system.html index a58d15b3fb..84358aab1b 100644 --- a/seahub/templates/sysadmin/sys_list_system.html +++ b/seahub/templates/sysadmin/sys_list_system.html @@ -26,7 +26,7 @@ {% for repo in repos %} - {{ repo.props.name }} + {{ repo.props.name }} {{ repo.id }} {{ repo.props.desc }} diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index 679d5483f4..a172388e5d 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -99,13 +99,18 @@ def get_system_default_repo_id(): logger.error(e) return None -def check_folder_permission(repo_id, path, username): - repo_owner = seafile_api.get_repo_owner(repo_id) - if username == repo_owner: - return 'rw' +def check_folder_permission(request, repo_id, path): + """Check repo/folder access permission of a user, always return 'rw' + when repo is system repo and user is admin. - if path != '/' and path.endswith('/'): - path = path.rstrip('/') + Arguments: + - `request`: + - `repo_id`: + - `path`: + """ + username = request.user.username + if get_system_default_repo_id() == repo_id and request.user.is_staff: + return 'rw' return seafile_api.check_permission_by_path(repo_id, path, username) @@ -185,6 +190,9 @@ def get_repo_dirents_with_perm(request, repo, commit, path, offset=-1, limit=-1) to be pulled out to multiple functions. """ + if get_system_default_repo_id() == repo.id: + return get_repo_dirents(request, repo, commit, path, offset, limit) + dir_list = [] file_list = [] dirent_more = False @@ -1464,7 +1472,7 @@ def repo_revert_file(request, repo_id): return render_error(request, _(u"Invalid arguments")) # perm check - if check_folder_permission(repo.id, path, request.user.username) != 'rw': + if check_folder_permission(request, repo.id, path) != 'rw': next = request.META.get('HTTP_REFERER', None) if not next: next = settings.SITE_ROOT @@ -1515,7 +1523,7 @@ def repo_revert_dir(request, repo_id): return render_error(request, _(u"Invalid arguments")) # perm check - if check_folder_permission(repo.id, path, request.user.username) != 'rw': + if check_folder_permission(request, repo.id, path) != 'rw': next = request.META.get('HTTP_REFERER', None) if not next: next = settings.SITE_ROOT diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index 3ed7881f1c..46e4c490ba 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -530,7 +530,7 @@ def new_dirent_common(func): # permission checking username = request.user.username - if check_folder_permission(repo.id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo.id, parent_dir) != 'rw': result['error'] = _('Permission denied') return HttpResponse(json.dumps(result), status=403, content_type=content_type) @@ -628,14 +628,14 @@ def rename_dirent(request, repo_id): full_path = os.path.join(parent_dir, oldname) if seafile_api.get_dir_id_by_path(repo.id, full_path) is not None: # when dirent is a dir, check current dir perm - if check_folder_permission(repo.id, full_path, username) != 'rw': + if check_folder_permission(request, repo.id, full_path) != 'rw': err_msg = _('Permission denied') return HttpResponse(json.dumps({'error': err_msg}), status=403, content_type=content_type) if seafile_api.get_file_id_by_path(repo.id, full_path) is not None: # when dirent is a file, check parent dir perm - if check_folder_permission(repo.id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo.id, parent_dir) != 'rw': err_msg = _('Permission denied') return HttpResponse(json.dumps({'error': err_msg}), status=403, content_type=content_type) @@ -684,14 +684,14 @@ def delete_dirent(request, repo_id): if seafile_api.get_dir_id_by_path(repo.id, full_path) is not None: # when dirent is a dir, check current dir perm - if check_folder_permission(repo.id, full_path, username) != 'rw': + if check_folder_permission(request, repo.id, full_path) != 'rw': err_msg = _('Permission denied') return HttpResponse(json.dumps({'error': err_msg}), status=403, content_type=content_type) if seafile_api.get_file_id_by_path(repo.id, full_path) is not None: # when dirent is a file, check parent dir perm - if check_folder_permission(repo.id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo.id, parent_dir) != 'rw': err_msg = _('Permission denied') return HttpResponse(json.dumps({'error': err_msg}), status=403, content_type=content_type) @@ -730,7 +730,7 @@ def delete_dirents(request, repo_id): # permission checking username = request.user.username - if check_folder_permission(repo.id, parent_dir, username) != 'rw': + if check_folder_permission(request, repo.id, parent_dir) != 'rw': err_msg = _(u'Permission denied.') return HttpResponse(json.dumps({'error': err_msg}), status=403, content_type=content_type) @@ -748,70 +748,81 @@ def delete_dirents(request, repo_id): return HttpResponse(json.dumps({'deleted': deleted, 'undeleted': undeleted}), content_type=content_type) -def copy_move_common(func): +def copy_move_common(): """Decorator for common logic in copying/moving dir/file. """ - def _decorated(request, repo_id, *args, **kwargs): - if request.method != 'POST': - raise Http404 + def _method_wrapper(view_method): + def _arguments_wrapper(request, repo_id, *args, **kwargs): + if request.method != 'POST': + raise Http404 - result = {} - content_type = 'application/json; charset=utf-8' + result = {} + content_type = 'application/json; charset=utf-8' - repo = get_repo(repo_id) - if not repo: - result['error'] = _(u'Library does not exist.') - return HttpResponse(json.dumps(result), status=400, - content_type=content_type) + repo = get_repo(repo_id) + if not repo: + result['error'] = _(u'Library does not exist.') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - # arguments validation - path = request.GET.get('path') - obj_name = request.GET.get('obj_name') - dst_repo_id = request.POST.get('dst_repo') - dst_path = request.POST.get('dst_path') + # arguments validation + path = request.GET.get('path') + obj_name = request.GET.get('obj_name') + dst_repo_id = request.POST.get('dst_repo') + dst_path = request.POST.get('dst_path') + if not (path and obj_name and dst_repo_id and dst_path): + result['error'] = _('Argument missing') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - if not (path and obj_name and dst_repo_id and dst_path): - result['error'] = _('Argument missing') - return HttpResponse(json.dumps(result), status=400, - content_type=content_type) + # check file path + if len(dst_path + obj_name) > settings.MAX_PATH: + result['error'] = _('Destination path is too long.') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - # permission checking - username = request.user.username - if check_folder_permission(repo.id, path, username) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) + # return error when dst is the same as src + if repo_id == dst_repo_id and path == dst_path: + result['error'] = _('Invalid destination path') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - # check file path - if len(dst_path+obj_name) > settings.MAX_PATH: - result['error'] = _('Destination path is too long.') - return HttpResponse(json.dumps(result), status=400, - content_type=content_type) + # check whether user has write permission to dest repo + if check_folder_permission(request, dst_repo_id, dst_path) != 'rw': + result['error'] = _('Permission denied') + return HttpResponse(json.dumps(result), status=403, + content_type=content_type) - # check whether user has write permission to dest repo - if check_repo_access_permission(dst_repo_id, request.user) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) + # Leave src folder/file permission checking to corresponding + # views, only need to check folder permission when perform 'move' + # operation, 1), if move file, check parent dir perm, 2), if move + # folder, check that folder perm. - # do nothing when dst is the same as src - if repo_id == dst_repo_id and path == dst_path: - result['error'] = _('Invalid destination path') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) - return func(repo_id, path, dst_repo_id, dst_path, obj_name, username) - return _decorated + return view_method(request, repo_id, path, dst_repo_id, dst_path, + obj_name) + + return _arguments_wrapper + + return _method_wrapper @login_required_ajax -@copy_move_common -def mv_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): +@copy_move_common() +def mv_file(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name): result = {} content_type = 'application/json; charset=utf-8' + username = request.user.username + + # check parent dir perm + if check_folder_permission(request, src_repo_id, src_path) != 'rw': + result['error'] = _('Permission denied') + return HttpResponse(json.dumps(result), status=403, + content_type=content_type) new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) - try: res = seafile_api.move_file(src_repo_id, src_path, obj_name, - dst_repo_id, dst_path, new_obj_name, username, need_progress=1) + dst_repo_id, dst_path, new_obj_name, + username, need_progress=1) except SearpcError, e: res = None @@ -830,16 +841,17 @@ def mv_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) @login_required_ajax -@copy_move_common -def cp_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): +@copy_move_common() +def cp_file(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name): result = {} content_type = 'application/json; charset=utf-8' + username = request.user.username new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) - try: res = seafile_api.copy_file(src_repo_id, src_path, obj_name, - dst_repo_id, dst_path, new_obj_name, username, need_progress=1) + dst_repo_id, dst_path, new_obj_name, + username, need_progress=1) except SearpcError, e: res = None @@ -858,32 +870,30 @@ def cp_file(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) @login_required_ajax -@copy_move_common -def mv_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): +@copy_move_common() +def mv_dir(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name): result = {} content_type = 'application/json; charset=utf-8' + username = request.user.username src_dir = os.path.join(src_path, obj_name) - - # permission checking - dst_repo_owner = seafile_api.get_repo_owner(dst_repo_id) - if check_folder_permission(src_repo_id, src_dir, username) != 'rw' or \ - check_folder_permission(dst_repo_id, dst_path, dst_repo_owner) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) - if dst_path.startswith(src_dir + '/'): error_msg = _(u'Can not move directory %(src)s to its subdirectory %(des)s') \ % {'src': escape(src_dir), 'des': escape(dst_path)} result['error'] = error_msg return HttpResponse(json.dumps(result), status=400, content_type=content_type) - new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) + # check dir perm + if check_folder_permission(request, src_repo_id, src_dir) != 'rw': + result['error'] = _('Permission denied') + return HttpResponse(json.dumps(result), status=403, + content_type=content_type) + new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) try: res = seafile_api.move_file(src_repo_id, src_path, obj_name, - dst_repo_id, dst_path, new_obj_name, username, need_progress=1) + dst_repo_id, dst_path, new_obj_name, + username, need_progress=1) except SearpcError, e: res = None @@ -902,18 +912,11 @@ def mv_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) @login_required_ajax -@copy_move_common -def cp_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): +@copy_move_common() +def cp_dir(request, src_repo_id, src_path, dst_repo_id, dst_path, obj_name): result = {} content_type = 'application/json; charset=utf-8' - - # permission checking - dst_repo_owner = seafile_api.get_repo_owner(dst_repo_id) - if check_folder_permission(src_repo_id, src_path, username) != 'rw' or \ - check_folder_permission(dst_repo_id, dst_path, dst_repo_owner) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) + username = request.user.username src_dir = os.path.join(src_path, obj_name) if dst_path.startswith(src_dir): @@ -926,7 +929,8 @@ def cp_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): try: res = seafile_api.copy_file(src_repo_id, src_path, obj_name, - dst_repo_id, dst_path, new_obj_name, username, need_progress=1) + dst_repo_id, dst_path, new_obj_name, + username, need_progress=1) except SearpcError, e: res = None @@ -945,72 +949,84 @@ def cp_dir(src_repo_id, src_path, dst_repo_id, dst_path, obj_name, username): return HttpResponse(json.dumps(result), content_type=content_type) -def dirents_copy_move_common(func): +def dirents_copy_move_common(): """ - Decorator for common logic in copying/moving dirs/files. + Decorator for common logic in copying/moving dirs/files in batch. """ - def _decorated(request, repo_id, *args, **kwargs): + def _method_wrapper(view_method): + def _arguments_wrapper(request, repo_id, *args, **kwargs): + if request.method != 'POST': + raise Http404 - if request.method != 'POST': - raise Http404 + result = {} + content_type = 'application/json; charset=utf-8' - result = {} - content_type = 'application/json; charset=utf-8' - - repo = get_repo(repo_id) - if not repo: - result['error'] = _(u'Library does not exist.') - return HttpResponse(json.dumps(result), status=400, - content_type=content_type) - - # arguments validation - parent_dir = request.GET.get('parent_dir') - obj_file_names = request.POST.getlist('file_names') - obj_dir_names = request.POST.getlist('dir_names') - dst_repo_id = request.POST.get('dst_repo') - dst_path = request.POST.get('dst_path') - - if not (parent_dir and dst_repo_id and dst_path) and not (obj_file_names or obj_dir_names): - result['error'] = _('Argument missing') - return HttpResponse(json.dumps(result), status=400, - content_type=content_type) - - # permission checking - username = request.user.username - if check_folder_permission(repo.id, parent_dir, username) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) - - # check file path - for obj_name in obj_file_names + obj_dir_names: - if len(dst_path+obj_name) > settings.MAX_PATH: - result['error'] = _('Destination path is too long for %s.') % escape(obj_name) + repo = get_repo(repo_id) + if not repo: + result['error'] = _(u'Library does not exist.') return HttpResponse(json.dumps(result), status=400, - content_type=content_type) + content_type=content_type) - # check whether user has write permission to dest repo - if check_repo_access_permission(dst_repo_id, request.user) != 'rw': - result['error'] = _('Permission denied') - return HttpResponse(json.dumps(result), status=403, - content_type=content_type) + # arguments validation + parent_dir = request.GET.get('parent_dir') + obj_file_names = request.POST.getlist('file_names') + obj_dir_names = request.POST.getlist('dir_names') + dst_repo_id = request.POST.get('dst_repo') + dst_path = request.POST.get('dst_path') + if not (parent_dir and dst_repo_id and dst_path) and \ + not (obj_file_names or obj_dir_names): + result['error'] = _('Argument missing') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - # when dst is the same as src - if repo_id == dst_repo_id and parent_dir == dst_path: - result['error'] = _('Invalid destination path') - return HttpResponse(json.dumps(result), status=400, content_type=content_type) + # check file path + for obj_name in obj_file_names + obj_dir_names: + if len(dst_path+obj_name) > settings.MAX_PATH: + result['error'] = _('Destination path is too long for %s.') % escape(obj_name) + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) - return func(repo_id, parent_dir, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username) - return _decorated + # when dst is the same as src + if repo_id == dst_repo_id and parent_dir == dst_path: + result['error'] = _('Invalid destination path') + return HttpResponse(json.dumps(result), status=400, + content_type=content_type) + + # check whether user has write permission to dest repo + if check_folder_permission(request, dst_repo_id, dst_path) != 'rw': + result['error'] = _('Permission denied') + return HttpResponse(json.dumps(result), status=403, + content_type=content_type) + + # Leave src folder/file permission checking to corresponding + # views, only need to check folder permission when perform 'move' + # operation, 1), if move file, check parent dir perm, 2), if move + # folder, check that folder perm. + + return view_method(request, repo_id, parent_dir, dst_repo_id, + dst_path, obj_file_names, obj_dir_names) + + return _arguments_wrapper + + return _method_wrapper @login_required_ajax -@dirents_copy_move_common -def mv_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username): +@dirents_copy_move_common() +def mv_dirents(request, src_repo_id, src_path, dst_repo_id, dst_path, + obj_file_names, obj_dir_names): result = {} content_type = 'application/json; charset=utf-8' + username = request.user.username failed = [] + allowed_files = [] allowed_dirs = [] - dst_repo_owner = seafile_api.get_repo_owner(dst_repo_id) + + # check parent dir perm for files + if check_folder_permission(request, src_repo_id, src_path) != 'rw': + allowed_files = [] + failed += obj_file_names + else: + allowed_files = obj_file_names for obj_name in obj_dir_names: src_dir = os.path.join(src_path, obj_name) @@ -1020,17 +1036,15 @@ def mv_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj result['error'] = error_msg return HttpResponse(json.dumps(result), status=400, content_type=content_type) - # permission checking - if check_folder_permission(src_repo_id, obj_name, username) != 'rw' or \ - check_folder_permission(dst_repo_id, dst_path, dst_repo_owner) != 'rw': + # check every folder perm + if check_folder_permission(request, src_repo_id, src_dir) != 'rw': failed.append(obj_name) else: allowed_dirs.append(obj_name) success = [] url = None - - for obj_name in obj_file_names + allowed_dirs: + for obj_name in allowed_files + allowed_dirs: new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) try: res = seafile_api.move_file(src_repo_id, src_path, obj_name, @@ -1050,15 +1064,11 @@ def mv_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj return HttpResponse(json.dumps(result), content_type=content_type) @login_required_ajax -@dirents_copy_move_common +@dirents_copy_move_common() def cp_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj_dir_names, username): result = {} content_type = 'application/json; charset=utf-8' - failed = [] - allowed_dirs = [] - dst_repo_owner = seafile_api.get_repo_owner(dst_repo_id) - for obj_name in obj_dir_names: src_dir = os.path.join(src_path, obj_name) if dst_path.startswith(src_dir): @@ -1067,17 +1077,10 @@ def cp_dirents(src_repo_id, src_path, dst_repo_id, dst_path, obj_file_names, obj result['error'] = error_msg return HttpResponse(json.dumps(result), status=400, content_type=content_type) - # permission checking - if check_folder_permission(src_repo_id, obj_name, username) != 'rw' or \ - check_folder_permission(dst_repo_id, dst_path, dst_repo_owner) != 'rw': - failed.append(obj_name) - else: - allowed_dirs.append(obj_name) - + failed = [] success = [] url = None - - for obj_name in obj_file_names + allowed_dirs: + for obj_name in obj_file_names: new_obj_name = check_filename_with_rename(dst_repo_id, dst_path, obj_name) try: res = seafile_api.copy_file(src_repo_id, src_path, obj_name, @@ -1793,7 +1796,7 @@ def get_file_op_url(request, repo_id): username = request.user.username # permission checking - if check_folder_permission(repo.id, path, username) != 'rw': + if check_folder_permission(request, repo.id, path) != 'rw': err_msg = _(u'Permission denied') return HttpResponse(json.dumps({"error": err_msg}), status=403, content_type=content_type) diff --git a/seahub/views/file.py b/seahub/views/file.py index 7c905f4c87..8460467a1f 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -993,7 +993,7 @@ def file_edit(request, repo_id): filename = urllib2.quote(u_filename.encode('utf-8')) parent_dir = os.path.dirname(path) - if check_folder_permission(repo.id, parent_dir, request.user.username) != 'rw': + if check_folder_permission(request, repo.id, parent_dir) != 'rw': return render_permission_error(request, _(u'Unable to edit file')) head_id = repo.head_cmmt_id diff --git a/seahub/views/repo.py b/seahub/views/repo.py index 4e09c2652f..e9d0769911 100644 --- a/seahub/views/repo.py +++ b/seahub/views/repo.py @@ -24,7 +24,8 @@ from seahub.share.models import FileShare, UploadLinkShare, \ check_share_link_access, set_share_link_access from seahub.share.forms import SharedLinkPasswordForm from seahub.views import gen_path_link, get_repo_dirents, \ - check_repo_access_permission, get_repo_dirents_with_perm + check_repo_access_permission, get_repo_dirents_with_perm, \ + get_system_default_repo_id from seahub.utils import gen_file_upload_url, is_org_context, \ get_fileserver_root, gen_dir_share_link, gen_shared_upload_link, \ @@ -221,10 +222,9 @@ def render_repo(request, repo): else: show_repo_settings = False + file_list, dir_list, dirent_more = get_repo_dirents_with_perm( + request, repo, head_commit, path, offset=0, limit=100) more_start = None - file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo, - head_commit, path, - offset=0, limit=100) if dirent_more: more_start = 100 zipped = get_nav_path(path, repo.name)