def setUp(self): self.repo_id = self.repo.id self.group_id = self.group.id self.user_name = self.user.username self.admin_name = self.admin.username self.url = reverse('api-v2.1-shared-repos') # make sure this user has not sharing any repos for x in seafile_api.get_share_out_repo_list(self.user_name, -1, -1): seafile_api.remove_share(x.repo_id, self.user_name, x.user) assert len(seafile_api.get_share_out_repo_list(self.user_name, -1, -1)) == 0 for x in seafile_api.get_group_repos_by_owner(self.user_name): seafile_api.unset_group_repo(x.repo_id, x.group_id, self.user_name) assert len(seafile_api.get_group_repos_by_user(self.user_name)) == 0
def user_share_list(request, id_or_email): """List sharing repos with ``to_email``. """ try: uid = int(id_or_email) try: user = User.objects.get(id=uid) except User.DoesNotExist: user = None if not user: return render_to_response("user_404.html",{}, context_instance=RequestContext(request)) to_email = user.email except ValueError: to_email = id_or_email share_list = [] username = request.user.username share_in = seafile_api.get_share_in_repo_list(username, -1, -1) share_out = seafile_api.get_share_out_repo_list(username, -1, -1) for e in (share_in+share_out): if e.share_type == 'personal' and e.user == to_email: share_list.append(e) c = Contact.objects.get_contact_by_user(username, to_email) add_to_contacts = True if c is None else False return render_to_response('repo/user_share_list.html', { 'to_email': to_email, 'share_list': share_list, 'add_to_contacts': add_to_contacts, }, context_instance=RequestContext(request))
def get(self, request, format=None): """ List all shared out folders. Permission checking: 1. all authenticated user can perform this action. """ shared_repos = [] username = request.user.username try: if is_org_context(request): org_id = request.user.org.org_id shared_repos += seafile_api.get_org_share_out_repo_list(org_id, username, -1, -1) shared_repos += seaserv.seafserv_threaded_rpc.get_org_group_repos_by_owner(org_id, username) else: shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) shared_repos += seafile_api.get_group_repos_by_owner(username) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) returned_result = [] shared_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name)) for repo in shared_repos: if not repo.is_virtual: continue result = {} result['repo_id'] = repo.origin_repo_id result['repo_name'] = repo.origin_repo_name result['path'] = repo.origin_path result['folder_name'] = repo.name result['share_type'] = repo.share_type result['share_permission'] = repo.permission if repo.share_type == 'personal': result['user_name'] = email2nickname(repo.user) result['user_email'] = repo.user result['contact_email'] = Profile.objects.get_contact_email_by_user(repo.user) if repo.share_type == 'group': group = ccnet_api.get_group(repo.group_id) if not group: if is_org_context(request): seafile_api.org_unshare_subdir_for_group(org_id, repo.repo_id, repo.origin_path, username, repo.group_id) else: seafile_api.unshare_subdir_for_group( repo.repo_id, repo.origin_path, username, repo.group_id) continue result['group_id'] = repo.group_id result['group_name'] = group.group_name returned_result.append(result) return Response(returned_result)
def test_share_repo_to_user(repo, permission): assert api.check_permission(repo.id, USER) == 'rw' assert api.check_permission(repo.id, USER2) is None assert api.repo_has_been_shared(repo.id) == False api.share_repo(repo.id, USER, USER2, permission) assert api.check_permission(repo.id, USER2) == permission assert api.repo_has_been_shared(repo.id) repos = api.get_share_in_repo_list(USER2, 0, 1) assert_repo_with_permission(repo, repos, permission) repos = api.get_share_out_repo_list(USER, 0, 1) assert_repo_with_permission(repo, repos, permission) users = api.list_repo_shared_to(USER, repo.id) assert len(users) == 1 assert users[0].repo_id == repo.id assert users[0].user == USER2 assert users[0].perm == permission api.remove_share(repo.id, USER, USER2) assert api.check_permission(repo.id, USER2) is None
def list_share_out_repos(request): shared_repos = [] username = request.user.username # repos shared from this user shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) # repos shared to groups group_repos = get_group_repos_by_owner(request) for repo in group_repos: group = ccnet_threaded_rpc.get_group(int(repo.group_id)) if not group: repo.props.user = '' continue repo.props.user = group.props.group_name repo.props.user_info = repo.group_id shared_repos += group_repos # pub repos pub_repos = get_inner_pub_repo_list(request) for repo in pub_repos: repo.props.user = _(u'all members') repo.props.user_info = 'all' shared_repos += pub_repos return shared_repos
def user_share_list(request, id_or_email): """List sharing repos with ``to_email``. """ try: uid = int(id_or_email) try: user = User.objects.get(id=uid) except User.DoesNotExist: user = None if not user: return render_to_response("user_404.html", {}, context_instance=RequestContext(request)) to_email = user.email except ValueError: to_email = id_or_email share_list = [] username = request.user.username share_in = seafile_api.get_share_in_repo_list(username, -1, -1) share_out = seafile_api.get_share_out_repo_list(username, -1, -1) for e in (share_in + share_out): if e.share_type == 'personal' and e.user == to_email: share_list.append(e) c = Contact.objects.get_contact_by_user(username, to_email) add_to_contacts = True if c is None else False return render_to_response('repo/user_share_list.html', { 'to_email': to_email, 'share_list': share_list, 'add_to_contacts': add_to_contacts, }, context_instance=RequestContext(request))
def test_get_with_invalid_repo_permission(self): user_shared_repos = \ seafile_api.get_share_out_repo_list(self.admin_name, -1, -1) for repo in user_shared_repos: seafile_api.remove_share(repo.repo_id, self.admin_name, repo.user) group_shared_repos = seafile_api.get_group_repos_by_owner( self.admin_name) for repo in group_shared_repos: seafile_api.unset_group_repo(repo.repo_id, repo.group_id, self.admin_name) public_shared_repos = seafile_api.list_inner_pub_repos_by_owner( self.admin_name) for repo in public_shared_repos: seafile_api.remove_inner_pub_repo(repo.repo_id) self.share_repo_to_user() self.share_repo_to_group() self.share_repo_to_public() # login with admin, then get user's share repo info self.login_as(self.admin) resp = self.client.get(self.url) self.assertEqual(200, resp.status_code) json_resp = json.loads(resp.content) assert len(json_resp) == 0
def list_priv_shared_folders(request): """List private shared folders. Arguments: - `request`: """ username = request.user.username shared_repos = [] # personal repos shared from this user shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) # repos shared to groups group_repos = get_group_repos_by_owner(username) for repo in group_repos: group = ccnet_threaded_rpc.get_group(int(repo.group_id)) if not group: repo.props.user = '' continue repo.props.user = group.props.group_name repo.props.user_info = repo.group_id shared_repos += group_repos if not CLOUD_MODE: # public repos shared by this user pub_repos = list_inner_pub_repos_by_owner(username) for repo in pub_repos: repo.props.user = _(u'all members') repo.props.user_info = 'all' shared_repos += pub_repos shared_folders = [] for repo in shared_repos: if not repo.is_virtual: # skip non-virtual repos continue if repo.props.permission == 'rw': repo.share_permission = _(u'Read-Write') elif repo.props.permission == 'r': repo.share_permission = _(u'Read-Only') else: repo.share_permission = '' if repo.props.share_type == 'personal': repo.props.user_info = repo.props.user shared_folders.append(repo) shared_folders.sort(lambda x, y: cmp(x.repo_id, y.repo_id)) return render_to_response('share/list_priv_shared_folders.html', { 'shared_folders': shared_folders, }, context_instance=RequestContext(request))
def get_share_out_repo_list(request): """List repos that @user share to other users. Returns: A list of repos. """ username = request.user.username if is_org_context(request): org_id = request.user.org.org_id return seafile_api.get_org_share_out_repo_list(org_id, username, -1, -1) else: return seafile_api.get_share_out_repo_list(username, -1, -1)
def get(self, request, format=None): """ List all shared out repos. Permission checking: 1. all authenticated user can perform this action. """ shared_repos = [] username = request.user.username try: if is_org_context(request): org_id = request.user.org.org_id shared_repos += seafile_api.get_org_share_out_repo_list(org_id, username, -1, -1) shared_repos += seaserv.seafserv_threaded_rpc.get_org_group_repos_by_owner(org_id, username) shared_repos += seaserv.seafserv_threaded_rpc.list_org_inner_pub_repos_by_owner(org_id, username) else: shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) shared_repos += seafile_api.get_group_repos_by_owner(username) if not request.cloud_mode: shared_repos += seaserv.list_inner_pub_repos_by_owner(username) except Exception as e: logger.error(e) error_msg = "Internal Server Error" return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) returned_result = [] shared_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name)) for repo in shared_repos: if repo.is_virtual: continue result = {} result["repo_id"] = repo.repo_id result["repo_name"] = repo.repo_name result["share_type"] = repo.share_type result["share_permission"] = repo.permission if repo.share_type == "personal": result["user_name"] = email2nickname(repo.user) result["user_email"] = repo.user if repo.share_type == "group": group = ccnet_api.get_group(repo.group_id) result["group_id"] = repo.group_id result["group_name"] = group.group_name returned_result.append(result) return Response(returned_result)
def list_shared_repos(request): """ List personal shared repos. """ username = request.user.username out_repos = [] # personal repos shared from this user out_repos += seafile_api.get_share_out_repo_list(username, -1, -1) # repos shared to groups group_repos = get_group_repos_by_owner(username) for repo in group_repos: group = ccnet_threaded_rpc.get_group(int(repo.group_id)) if not group: repo.props.user = '' continue repo.props.user = group.props.group_name repo.props.user_info = repo.group_id out_repos += group_repos if not CLOUD_MODE: # public repos shared by this user pub_repos = list_inner_pub_repos_by_owner(username) for repo in pub_repos: repo.props.user = _(u'all members') repo.props.user_info = 'all' out_repos += pub_repos for repo in out_repos: if repo.props.permission == 'rw': repo.share_permission = _(u'Read-Write') elif repo.props.permission == 'r': repo.share_permission = _(u'Read-Only') else: repo.share_permission = '' if repo.props.share_type == 'personal': repo.props.user_info = repo.props.user out_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id)) return render_to_response('share/repos.html', { "out_repos": out_repos, }, context_instance=RequestContext(request))
def show_share_info(user, show_groupmembers=False): shared_repos = seafile_api.get_share_out_repo_list(user, -1, -1) shared_repos += seafile_api.get_group_repos_by_owner(user) shown_repos = set() if show_groupmembers: groups = {} for repo in shared_repos: if repo.repo_id in shown_repos: continue shown_repos.add(repo.repo_id) if repo.is_virtual: print("Folder %s of Repo %s, shared to:" % (repo.origin_path, repo.origin_repo_id)) else: print("Repo %s (%s), shared to:" % (repo.repo_id, repo.name)) sgroups = seafile_api.list_repo_shared_group(user, repo.repo_id) print("groups:") for sgroup in sgroups: print("%s (%d), %s" % (ccnet_api.get_group( sgroup.group_id).group_name, sgroup.group_id, sgroup.perm)) if show_groupmembers: groups[sgroup.group_id] = sgroup susers = seafile_api.list_repo_shared_to(user, repo.repo_id) print("users:") for suser in susers: print("%s, %s" % (suser.user, suser.perm)) print("\n") if show_groupmembers: print("\ngroup memberships:") for group in groups.values(): print("group %s (%d):" % (ccnet_api.get_group( group.group_id).group_name, group.group_id)) gusers = ccnet_api.get_group_members(group.group_id) for guser in gusers: print("%s" % (guser.user_name)) print("")
def get(self, request, format=None): """ List all shared out repos. Permission checking: 1. all authenticated user can perform this action. """ shared_repos = [] username = request.user.username try: if is_org_context(request): org_id = request.user.org.org_id shared_repos += seafile_api.get_org_share_out_repo_list( org_id, username, -1, -1) shared_repos += seafile_api.get_org_group_repos_by_owner( org_id, username) shared_repos += seafile_api.list_org_inner_pub_repos_by_owner( org_id, username) else: shared_repos += seafile_api.get_share_out_repo_list( username, -1, -1) shared_repos += seafile_api.get_group_repos_by_owner(username) if not request.cloud_mode: shared_repos += seafile_api.list_inner_pub_repos_by_owner( username) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) returned_result = [] shared_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name)) usernames = [] gids = [] for repo in shared_repos: if repo.is_virtual: continue result = {} result['repo_id'] = repo.repo_id result['repo_name'] = repo.repo_name result['encrypted'] = repo.encrypted result['share_type'] = repo.share_type result['share_permission'] = repo.permission result['modifier_email'] = repo.last_modifier result['modifier_name'] = email2nickname(repo.last_modifier) result['modifier_contact_email'] = email2contact_email( repo.last_modifier) if repo.share_type == 'personal': result['user_name'] = email2nickname(repo.user) result['user_email'] = repo.user result[ 'contact_email'] = Profile.objects.get_contact_email_by_user( repo.user) usernames.append((repo.repo_id, repo.user)) if repo.share_type == 'group': group = ccnet_api.get_group(repo.group_id) result['group_id'] = repo.group_id result['group_name'] = group.group_name if group else '' gids.append(repo.group_id) returned_result.append(result) user_admins = ExtraSharePermission.objects.batch_is_admin(usernames) group_admins = ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission( gids) for result in returned_result: if result['share_type'] == 'group': result['is_admin'] = (result['repo_id'], result['group_id']) in group_admins elif result['share_type'] == 'personal': result['is_admin'] = (result['repo_id'], result['user_email']) in user_admins return Response(returned_result)
def get(self, request, format=None): """ List all shared out repos. Permission checking: 1. all authenticated user can perform this action. """ shared_repos = [] username = request.user.username try: if is_org_context(request): org_id = request.user.org.org_id shared_repos += seafile_api.get_org_share_out_repo_list(org_id, username, -1, -1) shared_repos += seafile_api.get_org_group_repos_by_owner(org_id, username) shared_repos += seafile_api.list_org_inner_pub_repos_by_owner(org_id, username) else: shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) shared_repos += seafile_api.get_group_repos_by_owner(username) if not request.cloud_mode: shared_repos += seafile_api.list_inner_pub_repos_by_owner(username) except Exception as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) returned_result = [] shared_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name)) usernames = [] gids = [] for repo in shared_repos: if repo.is_virtual: continue result = {} result['repo_id'] = repo.repo_id result['repo_name'] = repo.repo_name result['encrypted'] = repo.encrypted result['share_type'] = repo.share_type result['share_permission'] = repo.permission result['modifier_email'] = repo.last_modifier result['modifier_name'] = email2nickname(repo.last_modifier) result['modifier_contact_email'] = email2contact_email(repo.last_modifier) if repo.share_type == 'personal': result['user_name'] = email2nickname(repo.user) result['user_email'] = repo.user result['contact_email'] = Profile.objects.get_contact_email_by_user(repo.user) usernames.append((repo.repo_id, repo.user)) if repo.share_type == 'group': group = ccnet_api.get_group(repo.group_id) result['group_id'] = repo.group_id result['group_name'] = group.group_name if group else '' gids.append(repo.group_id) returned_result.append(result) user_admins = ExtraSharePermission.objects.batch_is_admin(usernames) group_admins = ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission(gids) for result in returned_result: if result['share_type'] == 'group': result['is_admin'] = (result['repo_id'], result['group_id']) in group_admins elif result['share_type'] == 'personal': result['is_admin'] = (result['repo_id'], result['user_email']) in user_admins return Response(returned_result)