Exemplo n.º 1
0
def share_dir_to_user(repo, path, owner, share_from, share_to, permission, org_id=None):
    # Share  repo or subdir to user with permission(r, rw, admin).
    extra_share_permission = ''
    if permission == PERMISSION_ADMIN:
        extra_share_permission = permission
        permission = PERMISSION_READ_WRITE

    if is_valid_org_id(org_id):
        if path == '/':
            seaserv.seafserv_threaded_rpc.org_add_share(org_id, repo.repo_id, 
                                                        owner, share_to, 
                                                        permission)
        else:
            seafile_api.org_share_subdir_to_user(org_id, repo.repo_id, 
                                                               path, owner, 
                                                               share_to, permission)
    else:
        if path == '/':
            seafile_api.share_repo(repo.repo_id, owner, share_to, permission)
        else:
            seafile_api.share_subdir_to_user(repo.repo_id, path, 
                                                           owner, share_to, 
                                                           permission)
    if path == '/' and extra_share_permission == PERMISSION_ADMIN:
        ExtraSharePermission.objects.create_share_permission(repo.repo_id, share_to, extra_share_permission)
Exemplo n.º 2
0
def share_dir_to_user(repo, path, owner, share_from, share_to, permission, org_id=None):
    # Share  repo or subdir to user with permission(r, rw, admin).
    extra_share_permission = ''
    if permission == PERMISSION_ADMIN:
        extra_share_permission = permission
        permission = PERMISSION_READ_WRITE

    if org_id:
        if path == '/':
            seaserv.seafserv_threaded_rpc.org_add_share(org_id, repo.repo_id, 
                                                        owner, share_to, 
                                                        permission)
        else:
            seafile_api.org_share_subdir_to_user(org_id, repo.repo_id, 
                                                               path, owner, 
                                                               share_to, permission)
    else:
        if path == '/':
            seafile_api.share_repo(repo.repo_id, owner, share_to, permission)
        else:
            seafile_api.share_subdir_to_user(repo.repo_id, path, 
                                                           owner, share_to, 
                                                           permission)
    if path == '/' and extra_share_permission == PERMISSION_ADMIN:
        ExtraSharePermission.objects.create_share_permission(repo.repo_id, share_to, extra_share_permission)
Exemplo n.º 3
0
    def share_folder_to_user_and_group(self):

        # share folder to user
        seafile_api.share_subdir_to_user(self.repo_id, self.folder_path,
                                         self.user_name, self.admin_name, 'rw')

        # share folder to group
        seafile_api.share_subdir_to_group(self.repo_id, self.folder_path,
                                          self.user_name, self.group_id, 'rw')
Exemplo n.º 4
0
    def share_folder_to_user_and_group(self):

        # share folder to user
        seafile_api.share_subdir_to_user(self.repo_id,
                self.folder_path, self.user_name, self.admin_name, 'rw')

        # share folder to group
        seafile_api.share_subdir_to_group(self.repo_id,
                self.folder_path, self.user_name, self.group_id, 'rw')
Exemplo n.º 5
0
def test_share_dir_to_user(repo, permission):
    v_repo_id_1 = api.share_subdir_to_user(repo.id, '/dir1', USER, USER2,
                                           permission)
    v_repo_id_2 = api.share_subdir_to_user(repo.id, '/dir2', USER, USER2,
                                           permission)
    assert api.check_permission(v_repo_id_1, USER2) == permission
    assert api.check_permission(v_repo_id_2, USER2) == permission

    vir_repo_2 = api.get_shared_repo_by_path(repo.id, '/dir2', USER2)
    assert vir_repo_2.permission == permission

    assert api.del_file(repo.id, '/', 'dir1', USER) == 0
    assert api.unshare_subdir_for_user(repo.id, '/dir2', USER, USER2) == 0

    assert api.get_shared_repo_by_path(repo.id, '/dir1', USER2) is None
    assert api.get_shared_repo_by_path(repo.id, '/dir2', USER2) is None
def test_subdir_permission_in_virtual_repo(repo, group, permission):
    api.post_dir(repo.id, '/dir1', 'subdir1', USER)
    api.post_dir(repo.id, '/dir2', 'subdir2', USER)

    v_repo_id_1 = api.share_subdir_to_user(repo.id, '/dir1', USER, USER2,
                                           permission)
    v_subdir_repo_id_1 = api.create_virtual_repo(v_repo_id_1,
                                                 '/subdir1',
                                                 'subdir1',
                                                 'test_desc',
                                                 USER,
                                                 passwd='')
    assert api.check_permission(v_subdir_repo_id_1, USER2) == permission

    assert ccnet_api.group_add_member(group.id, USER, USER2) == 0
    v_repo_id_2 = api.share_subdir_to_group(repo.id, '/dir2', USER, group.id,
                                            permission)
    v_subdir_repo_id_2 = api.create_virtual_repo(v_repo_id_2,
                                                 '/subdir2',
                                                 'subdir2',
                                                 'test_desc',
                                                 USER,
                                                 passwd='')
    assert api.check_permission(v_subdir_repo_id_2, USER2) == permission

    assert api.unshare_subdir_for_user(repo.id, '/dir1', USER, USER2) == 0
    assert api.unshare_subdir_for_group(repo.id, '/dir2', USER, group.id) == 0
def test_update_share_subdir_perm_for_user(repo, permission_to_share, permission_to_update):
    v_repo_id =  api.share_subdir_to_user(repo.id, '/dir1', USER, USER2, permission_to_share)
    assert api.check_permission(v_repo_id, USER2) == permission_to_share

    api.update_share_subdir_perm_for_user(repo.id, '/dir1', USER, USER2, permission_to_update)
    assert api.check_permission(v_repo_id, USER2) == permission_to_update

    api.unshare_subdir_for_user(repo.id, '/dir1', USER, USER2) == 0
def test_share_dir_to_user(repo, permission):
    v_repo_id_1 = api.share_subdir_to_user(repo.id, '/dir1', USER, USER2,
                                           permission)
    v_repo_id_2 = api.share_subdir_to_user(repo.id, '/dir2', USER, USER2,
                                           permission)
    assert api.check_permission(v_repo_id_1, USER2) == permission
    assert api.check_permission(v_repo_id_2, USER2) == permission

    vir_repo_2 = api.get_shared_repo_by_path(repo.id, '/dir2', USER2)
    assert vir_repo_2.permission == permission

    users = api.get_shared_users_for_subdir(repo.id, '/dir1', USER)
    assert len(users) == 1 and users[0].user == USER2

    assert api.del_file(repo.id, '/', 'dir1', USER) == 0
    assert api.unshare_subdir_for_user(repo.id, '/dir2', USER, USER2) == 0

    time.sleep(1)

    assert api.get_shared_repo_by_path(repo.id, '/dir1', USER2) is None
    assert api.get_shared_repo_by_path(repo.id, '/dir2', USER2) is None
Exemplo n.º 9
0
    def put(self, request, repo_id, format=None):
        username = request.user.username
        repo = seafile_api.get_repo(repo_id)
        if not repo:
            return api_error(status.HTTP_404_NOT_FOUND,
                             'Library %s not found.' % repo_id)

        path = request.GET.get('p', '/')
        if seafile_api.get_dir_id_by_path(repo.id, path) is None:
            return api_error(status.HTTP_404_NOT_FOUND,
                             'Folder %s not found.' % path)

        share_type = request.data.get('share_type')
        if share_type != 'user' and share_type != 'group':
            return api_error(status.HTTP_400_BAD_REQUEST,
                             'share_type invalid.')

        if share_type == 'user':
            if username != self.get_repo_owner(request, repo_id) and \
               ExtraSharePermission.objects.get_user_permission(repo_id, username) != PERMISSION_ADMIN:
                return api_error(status.HTTP_403_FORBIDDEN,
                                 'Permission denied.')
        else:
            if username != self.get_repo_owner(request, repo_id):
                return api_error(status.HTTP_403_FORBIDDEN,
                                 'Permission denied.')

        permission = request.data.get('permission', PERMISSION_READ)
        if permission not in [
                PERMISSION_READ, PERMISSION_READ_WRITE, PERMISSION_ADMIN
        ]:
            return api_error(status.HTTP_400_BAD_REQUEST,
                             'permission invalid.')

        result = {}
        result['failed'] = []
        result['success'] = []

        if share_type == 'user':
            share_to_users = request.data.getlist('username')
            for to_user in share_to_users:
                if not is_valid_username(to_user):
                    result['failed'].append({
                        'email':
                        to_user,
                        'error_msg':
                        _(u'username invalid.')
                    })
                    continue

                try:
                    User.objects.get(email=to_user)
                except User.DoesNotExist:
                    result['failed'].append({
                        'email':
                        to_user,
                        'error_msg':
                        _(u'User %s not found.') % to_user
                    })
                    continue

                if self.has_shared_to_user(request, repo_id, path, to_user):
                    result['failed'].append({
                        'email':
                        to_user,
                        'error_msg':
                        _(u'This item has been shared to %s.') % to_user
                    })
                    continue

                try:
                    extra_share_permission = ''
                    if permission == PERMISSION_ADMIN:
                        extra_share_permission = permission
                        permission = PERMISSION_READ_WRITE

                    if is_org_context(request):
                        username = seafile_api.get_org_repo_owner(repo_id)
                        org_id = request.user.org.org_id

                        if not is_org_user(to_user, int(org_id)):
                            org_name = request.user.org.org_name
                            error_msg = 'User %s is not member of organization %s.' \
                                    % (to_user, org_name)

                            result['failed'].append({
                                'email': to_user,
                                'error_msg': error_msg
                            })
                            continue

                        if path == '/':
                            seaserv.seafserv_threaded_rpc.org_add_share(
                                org_id, repo_id, username, to_user, permission)
                        else:
                            sub_repo_id = seafile_api.org_share_subdir_to_user(
                                org_id, repo_id, path, username, to_user,
                                permission)
                    else:

                        if is_org_user(to_user):
                            error_msg = 'User %s is a member of organization.' % to_user
                            result['failed'].append({
                                'email': to_user,
                                'error_msg': error_msg
                            })
                            continue

                        username = seafile_api.get_repo_owner(repo_id)
                        if path == '/':
                            seafile_api.share_repo(repo_id, username, to_user,
                                                   permission)
                        else:
                            sub_repo_id = seafile_api.share_subdir_to_user(
                                repo_id, path, username, to_user, permission)

                    if path == '/' and extra_share_permission == PERMISSION_ADMIN:
                        ExtraSharePermission.objects.create_share_permission(
                            repo_id, to_user, extra_share_permission)
                    # send a signal when sharing repo successful
                    if path == '/':
                        share_repo_to_user_successful.send(sender=None,
                                                           from_user=username,
                                                           to_user=to_user,
                                                           repo=repo)
                    else:
                        sub_repo = seafile_api.get_repo(sub_repo_id)
                        share_repo_to_user_successful.send(sender=None,
                                                           from_user=username,
                                                           to_user=to_user,
                                                           repo=sub_repo)

                    result['success'].append({
                        "share_type":
                        "user",
                        "user_info": {
                            "name": to_user,
                            "nickname": email2nickname(to_user),
                        },
                        "permission":
                        permission,
                        "is_admin":
                        extra_share_permission == PERMISSION_ADMIN
                    })

                    send_perm_audit_msg('add-repo-perm', username, to_user,
                                        repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result['failed'].append({
                        'email':
                        to_user,
                        'error_msg':
                        'Internal Server Error'
                    })
                    continue

        if share_type == 'group':
            group_ids = request.data.getlist('group_id')
            for gid in group_ids:
                try:
                    gid = int(gid)
                except ValueError:
                    result['failed'].append(
                        {'error_msg': _(u'group_id %s invalid.') % gid})
                    continue

                group = ccnet_api.get_group(gid)
                if not group:
                    result['failed'].append(
                        {'error_msg': _(u'Group %s not found') % gid})
                    continue

                if not config.ENABLE_SHARE_TO_ALL_GROUPS and \
                        not ccnet_api.is_group_user(gid, username):
                    result['failed'].append({
                        'group_name':
                        group.group_name,
                        'error_msg':
                        _(u'Permission denied.')
                    })
                    continue

                if self.has_shared_to_group(request, repo_id, path, gid):
                    result['failed'].append({
                        'group_name':
                        group.group_name,
                        'error_msg':
                        _(u'This item has been shared to %s.') %
                        group.group_name
                    })
                    continue

                try:
                    if is_org_context(request):
                        org_id = request.user.org.org_id
                        if path == '/':
                            seafile_api.add_org_group_repo(
                                repo_id, org_id, gid, username, permission)
                        else:
                            sub_repo_id = seafile_api.org_share_subdir_to_group(
                                org_id, repo_id, path, username, gid,
                                permission)
                    else:
                        if path == '/':
                            seafile_api.set_group_repo(repo_id, gid, username,
                                                       permission)
                        else:
                            sub_repo_id = seafile_api.share_subdir_to_group(
                                repo_id, path, username, gid, permission)

                    if path == '/':
                        share_repo_to_group_successful.send(sender=None,
                                                            from_user=username,
                                                            group_id=gid,
                                                            repo=repo)
                    else:
                        sub_repo = seafile_api.get_repo(sub_repo_id)
                        share_repo_to_group_successful.send(sender=None,
                                                            from_user=username,
                                                            group_id=gid,
                                                            repo=sub_repo)

                    result['success'].append({
                        "share_type": "group",
                        "group_info": {
                            "id": gid,
                            "name": group.group_name,
                        },
                        "permission": permission
                    })

                    send_perm_audit_msg('add-repo-perm', username, gid,
                                        repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result['failed'].append({
                        'group_name':
                        group.group_name,
                        'error_msg':
                        'Internal Server Error'
                    })
                    continue

        return HttpResponse(json.dumps(result),
                            status=200,
                            content_type=json_content_type)
Exemplo n.º 10
0
    def put(self, request, repo_id, format=None):
        username = request.user.username
        repo = seafile_api.get_repo(repo_id)
        if not repo:
            return api_error(status.HTTP_404_NOT_FOUND, 'Library %s not found.' % repo_id)

        path = request.GET.get('p', '/')
        if seafile_api.get_dir_id_by_path(repo.id, path) is None:
            return api_error(status.HTTP_404_NOT_FOUND, 'Folder %s not found.' % path)

        if username != self.get_repo_owner(request, repo_id):
            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')

        share_type = request.data.get('share_type')
        if share_type != 'user' and share_type != 'group':
            return api_error(status.HTTP_400_BAD_REQUEST, 'share_type invalid.')

        permission = request.data.get('permission', 'r')
        if permission not in ['r', 'rw']:
            return api_error(status.HTTP_400_BAD_REQUEST, 'permission invalid.')

        result = {}
        result['failed'] = []
        result['success'] = []

        if share_type == 'user':
            share_to_users = request.data.getlist('username')
            for to_user in share_to_users:
                if not is_valid_username(to_user):
                    result['failed'].append({
                        'email': to_user,
                        'error_msg': 'username invalid.'
                        })
                    continue

                try:
                    User.objects.get(email=to_user)
                except User.DoesNotExist:
                    result['failed'].append({
                        'email': to_user,
                        'error_msg': 'User %s not found.' % to_user
                        })
                    continue

                try:
                    if is_org_context(request):
                        org_id = request.user.org.org_id
                        if path == '/':
                            seaserv.seafserv_threaded_rpc.org_add_share(
                                    org_id, repo_id, username, to_user,
                                    permission)
                        else:
                            sub_repo_id = seafile_api.org_share_subdir_to_user(org_id,
                                    repo_id, path, username, to_user, permission)
                    else:
                        if path == '/':
                            seafile_api.share_repo(
                                    repo_id, username, to_user, permission)
                        else:
                            sub_repo_id = seafile_api.share_subdir_to_user(
                                    repo_id, path, username, to_user, permission)

                    # send a signal when sharing repo successful
                    if path == '/':
                        share_repo_to_user_successful.send(sender=None,
                                from_user=username, to_user=to_user, repo=repo)
                    else:
                        sub_repo = seafile_api.get_repo(sub_repo_id)
                        share_repo_to_user_successful.send(sender=None,
                                from_user=username, to_user=to_user, repo=sub_repo)

                    result['success'].append({
                        "share_type": "user",
                        "user_info": {
                            "name": to_user,
                            "nickname": email2nickname(to_user),
                        },
                        "permission": permission
                    })

                    send_perm_audit_msg('add-repo-perm', username, to_user,
                                        repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result['failed'].append({
                        'email': to_user,
                        'error_msg': 'Internal Server Error'
                        })
                    continue

        if share_type == 'group':
            group_ids = request.data.getlist('group_id')
            for gid in group_ids:
                try:
                    gid = int(gid)
                except ValueError:
                    return api_error(status.HTTP_400_BAD_REQUEST, 'group_id %s invalid.' % gid)
                group = seaserv.get_group(gid)
                if not group:
                    return api_error(status.HTTP_404_NOT_FOUND, 'Group %s not found' % gid)

                try:
                    if is_org_context(request):
                        org_id = request.user.org.org_id
                        if path == '/':
                            seafile_api.add_org_group_repo(
                                    repo_id, org_id, gid, username, permission)
                        else:
                            sub_repo_id = seafile_api.org_share_subdir_to_group(org_id,
                                    repo_id, path, username, gid, permission)
                    else:
                        if path == '/':
                            seafile_api.set_group_repo(
                                    repo_id, gid, username, permission)
                        else:
                            sub_repo_id = seafile_api.share_subdir_to_group(
                                    repo_id, path, username, gid, permission)

                    if path == '/':
                        share_repo_to_group_successful.send(sender=None,
                                from_user=username, group_id=gid, repo=repo)
                    else:
                        sub_repo = seafile_api.get_repo(sub_repo_id)
                        share_repo_to_group_successful.send(sender=None,
                                from_user=username, group_id=gid, repo=sub_repo)

                    result['success'].append({
                        "share_type": "group",
                        "group_info": {
                            "id": gid,
                            "name": group.group_name,
                        },
                        "permission": permission
                    })

                    send_perm_audit_msg('add-repo-perm', username, gid,
                                        repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result['failed'].append({
                        'group_name': group.group_name,
                        'error_msg': 'Internal Server Error'
                        })
                    continue

        return HttpResponse(json.dumps(result),
            status=200, content_type=json_content_type)
Exemplo n.º 11
0
def test_merge_virtual_repo(repo):
    api.post_dir(repo.id, '/dir1', 'subdir1', USER)
    api.post_dir(repo.id, '/dir2', 'subdir2', USER)
    v_repo_id = api.share_subdir_to_user(repo.id, '/dir1', USER, USER2, 'rw')

    create_test_file()
    params = {'ret-json': '1'}
    obj_id = '{"parent_dir":"/"}'
    create_test_dir(repo, 'test')

    #test upload file to vritual repo root dir.
    token = api.get_fileserver_access_token(v_repo_id, obj_id, 'upload', USER2,
                                            False)
    upload_url_base = 'http://127.0.0.1:8082/upload-api/' + token
    m = MultipartEncoder(
        fields={
            'parent_dir': '/',
            'file': (file_name, open(file_path, 'rb'),
                     'application/octet-stream')
        })
    response = requests.post(upload_url_base,
                             params=params,
                             data=m,
                             headers={'Content-Type': m.content_type})
    assert_upload_response(response, False, False)

    time.sleep(1.5)
    repo_size = api.get_repo_size(v_repo_id)
    assert repo_size == 0

    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == 0

    #test resumable upload file to virtual repo root dir
    parent_dir = '/'
    headers = {
        'Content-Range':
        'bytes 0-{}/{}'.format(str(len(chunked_part1_content) - 1),
                               str(total_size)),
        'Content-Disposition':
        'attachment; filename=\"{}\"'.format(resumable_file_name)
    }
    response = request_resumable_upload(chunked_part1_path, headers,
                                        upload_url_base, parent_dir, False)
    assert_resumable_upload_response(response, v_repo_id, resumable_file_name,
                                     False)

    time.sleep(1.5)
    v_repo_size = api.get_repo_size(v_repo_id)
    assert v_repo_size == 0
    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == 0

    headers = {
        'Content-Range':
        'bytes {}-{}/{}'.format(str(len(chunked_part1_content)),
                                str(total_size - 1), str(total_size)),
        'Content-Disposition':
        'attachment; filename=\"{}\"'.format(resumable_file_name)
    }
    response = request_resumable_upload(chunked_part2_path, headers,
                                        upload_url_base, parent_dir, False)
    assert_resumable_upload_response(response, v_repo_id, resumable_file_name,
                                     True)

    time.sleep(2.5)
    v_repo_size = api.get_repo_size(v_repo_id)
    assert v_repo_size == total_size
    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == total_size

    #test update file to virtual repo.
    write_file(file_path, file_content)
    token = api.get_fileserver_access_token(v_repo_id, obj_id, 'update', USER2,
                                            False)
    update_url_base = 'http://127.0.0.1:8082/update-api/' + token
    m = MultipartEncoder(
        fields={
            'target_file': '/' + file_name,
            'file': (file_name, open(file_path, 'rb'),
                     'application/octet-stream')
        })
    response = requests.post(update_url_base,
                             data=m,
                             headers={'Content-Type': m.content_type})
    assert_update_response(response, False)

    time.sleep(1.5)
    v_repo_size = api.get_repo_size(v_repo_id)
    assert v_repo_size == total_size + file_size
    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == total_size + file_size

    api.del_file(v_repo_id, '/', file_name, USER2)

    time.sleep(1.5)
    v_repo_size = api.get_repo_size(v_repo_id)
    assert v_repo_size == total_size
    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == total_size

    api.del_file(v_repo_id, '/', resumable_file_name, USER2)

    time.sleep(1.5)
    v_repo_size = api.get_repo_size(v_repo_id)
    assert v_repo_size == 0
    time.sleep(1.5)
    repo_size = api.get_repo_size(repo.id)
    assert repo_size == 0

    api.del_file(repo.id, '/dir1', 'subdir1', USER)
    api.del_file(repo.id, '/dir2', 'subdir1', USER)
    assert api.unshare_subdir_for_user(repo.id, '/dir1', USER, USER2) == 0
    del_local_files()
Exemplo n.º 12
0
    def post(self, request, repo_id, path, share_type):
        """ Admin share a library to user/group.

        Permission checking:
        1. admin user.
        """

        # argument check
        permission = request.data.get('permission', None)
        if not permission or permission not in ('r', 'rw'):
            error_msg = 'permission invalid.'
            return api_error(status.HTTP_400_BAD_REQUEST, error_msg)

        result = {}
        result['failed'] = []
        result['success'] = []
        share_to = request.data.getlist('share_to')

        # current `request.user.username` is admin user,
        # so need to identify the repo owner specifically.
        repo_owner = seafile_api.get_repo_owner(repo_id)

        if share_type == 'user':
            for email in share_to:
                if repo_owner == email:
                    result['failed'].append({
                        'user_email':
                        email,
                        'error_msg':
                        _(u'User %s is already library owner.') % email
                    })

                    continue

                if not is_valid_username(email):
                    result['failed'].append({
                        'user_email':
                        email,
                        'error_msg':
                        _('Email %s invalid.') % email
                    })

                    continue

                try:
                    User.objects.get(email=email)
                except User.DoesNotExist:
                    result['failed'].append({
                        'user_email':
                        email,
                        'error_msg':
                        'User %s not found.' % email
                    })

                    continue

                try:
                    if path == '/':
                        seafile_api.share_repo(repo_id, repo_owner, email,
                                               permission)
                    else:
                        seafile_api.share_subdir_to_user(
                            repo_id, path, repo_owner, email, permission)

                except Exception as e:
                    logger.error(e)
                    result['failed'].append({
                        'user_email':
                        email,
                        'error_msg':
                        'Internal Server Error'
                    })

                    continue

                new_perm = seafile_api.check_permission_by_path(
                    repo_id, path, email)
                result['success'].append({
                    "repo_id": repo_id,
                    "path": path,
                    "share_type": share_type,
                    "user_email": email,
                    "user_name": email2nickname(email),
                    "permission": new_perm
                })

        if share_type == 'group':
            for group_id in share_to:
                try:
                    group_id = int(group_id)
                except ValueError as e:
                    logger.error(e)
                    result['failed'].append({
                        'group_id':
                        group_id,
                        'error_msg':
                        'group_id %s invalid.' % group_id
                    })

                    continue

                group = ccnet_api.get_group(group_id)
                if not group:
                    result['failed'].append({
                        'group_id':
                        group_id,
                        'error_msg':
                        'Group %s not found' % group_id
                    })

                    continue

                try:
                    if path == '/':
                        seafile_api.set_group_repo(repo_id, group_id,
                                                   repo_owner, permission)
                    else:
                        seafile_api.share_subdir_to_group(
                            repo_id, path, repo_owner, group_id, permission)
                except Exception as e:
                    logger.error(e)
                    result['failed'].append({
                        "group_id":
                        group_id,
                        'error_msg':
                        'Internal Server Error'
                    })

                    continue

                result['success'].append({
                    "repo_id": repo_id,
                    "path": path,
                    "share_type": share_type,
                    "group_id": group_id,
                    "group_name": group.group_name,
                    "permission": permission
                })

        return Response(result)
Exemplo n.º 13
0
    def put(self, request, repo_id, format=None):
        username = request.user.username
        repo = seafile_api.get_repo(repo_id)
        if not repo:
            return api_error(status.HTTP_404_NOT_FOUND, "Library %s not found." % repo_id)

        path = request.GET.get("p", "/")
        if seafile_api.get_dir_id_by_path(repo.id, path) is None:
            return api_error(status.HTTP_404_NOT_FOUND, "Folder %s not found." % path)

        if username != self.get_repo_owner(request, repo_id):
            return api_error(status.HTTP_403_FORBIDDEN, "Permission denied.")

        share_type = request.data.get("share_type")
        if share_type != "user" and share_type != "group":
            return api_error(status.HTTP_400_BAD_REQUEST, "share_type invalid.")

        permission = request.data.get("permission", "r")
        if permission not in ["r", "rw"]:
            return api_error(status.HTTP_400_BAD_REQUEST, "permission invalid.")

        result = {}
        result["failed"] = []
        result["success"] = []

        if share_type == "user":
            share_to_users = request.data.getlist("username")
            for to_user in share_to_users:
                if not is_valid_username(to_user):
                    result["failed"].append({"email": to_user, "error_msg": "username invalid."})
                    continue

                try:
                    User.objects.get(email=to_user)
                except User.DoesNotExist:
                    result["failed"].append({"email": to_user, "error_msg": "User %s not found." % to_user})
                    continue

                try:
                    if is_org_context(request):
                        org_id = request.user.org.org_id
                        if path == "/":
                            seaserv.seafserv_threaded_rpc.org_add_share(org_id, repo_id, username, to_user, permission)
                        else:
                            seafile_api.org_share_subdir_to_user(org_id, repo_id, path, username, to_user, permission)
                    else:
                        if path == "/":
                            seafile_api.share_repo(repo_id, username, to_user, permission)
                        else:
                            seafile_api.share_subdir_to_user(repo_id, path, username, to_user, permission)

                    # send a signal when sharing repo successful
                    share_repo_to_user_successful.send(sender=None, from_user=username, to_user=to_user, repo=repo)
                    result["success"].append(
                        {
                            "share_type": "user",
                            "user_info": {"name": to_user, "nickname": email2nickname(to_user)},
                            "permission": permission,
                        }
                    )

                    send_perm_audit_msg("add-repo-perm", username, to_user, repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result["failed"].append({"email": to_user, "error_msg": "Internal Server Error"})
                    continue

        if share_type == "group":
            group_ids = request.data.getlist("group_id")
            for gid in group_ids:
                try:
                    gid = int(gid)
                except ValueError:
                    return api_error(status.HTTP_400_BAD_REQUEST, "group_id %s invalid." % gid)
                group = seaserv.get_group(gid)
                if not group:
                    return api_error(status.HTTP_404_NOT_FOUND, "Group %s not found" % gid)

                try:
                    if is_org_context(request):
                        org_id = request.user.org.org_id
                        if path == "/":
                            seafile_api.add_org_group_repo(repo_id, org_id, gid, username, permission)
                        else:
                            seafile_api.org_share_subdir_to_group(org_id, repo_id, path, username, gid, permission)
                    else:
                        if path == "/":
                            seafile_api.set_group_repo(repo_id, gid, username, permission)
                        else:
                            seafile_api.share_subdir_to_group(repo_id, path, username, gid, permission)

                    share_repo_to_group_successful.send(sender=None, from_user=username, group_id=gid, repo=repo)

                    result["success"].append(
                        {
                            "share_type": "group",
                            "group_info": {"id": gid, "name": group.group_name},
                            "permission": permission,
                        }
                    )

                    send_perm_audit_msg("add-repo-perm", username, gid, repo_id, path, permission)
                except SearpcError as e:
                    logger.error(e)
                    result["failed"].append({"group_name": group.group_name, "error_msg": "Internal Server Error"})
                    continue

        return HttpResponse(json.dumps(result), status=200, content_type=json_content_type)