From 3fd9ecb4818f241625e78f93095cb402277b32e2 Mon Sep 17 00:00:00 2001 From: cuihaikuo Date: Thu, 17 May 2018 11:52:21 +0800 Subject: [PATCH] Add rpc for getting shared users. --- common/rpc-service.c | 26 +++++++++++++++++ include/seafile-rpc.h | 8 +++++ python/seafile/rpcclient.py | 8 +++++ python/seaserv/api.py | 6 ++++ server/seaf-server.c | 8 +++++ server/share-mgr.c | 58 +++++++++++++++++++++++++++++++++++++ server/share-mgr.h | 9 ++++++ 7 files changed, 123 insertions(+) diff --git a/common/rpc-service.c b/common/rpc-service.c index ddf7fbe..b9e8017 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -5243,4 +5243,30 @@ seafile_get_org_group_repos_by_user (const char *user, int org_id, GError **erro return seaf_get_group_repos_by_user (mgr, user, org_id, error); } + +GList * +seafile_get_shared_users_by_repo (const char *repo_id, GError **error) +{ + if (!repo_id) { + g_set_error (error, 0, SEAF_ERR_BAD_ARGS, "Arguments error"); + return NULL; + } + + return seaf_share_manager_get_shared_users_by_repo (seaf->share_mgr, + repo_id); +} + +GList * +seafile_org_get_shared_users_by_repo (int org_id, + const char *repo_id, + GError **error) +{ + if (!repo_id || org_id < 0) { + g_set_error (error, 0, SEAF_ERR_BAD_ARGS, "Arguments error"); + return NULL; + } + + return seaf_share_manager_org_get_shared_users_by_repo (seaf->share_mgr, + org_id, repo_id); +} #endif /* SEAFILE_SERVER */ diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index ccb46ee..820c684 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -1091,4 +1091,12 @@ seafile_get_group_repos_by_user (const char *user, GError **error); GList * seafile_get_org_group_repos_by_user (const char *user, int org_id, GError **error); + +GList * +seafile_get_shared_users_by_repo (const char *repo_id, GError **error); + +GList * +seafile_org_get_shared_users_by_repo (int org_id, + const char *repo_id, + GError **error); #endif diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index 75bb665..6e1423e 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -1025,3 +1025,11 @@ class SeafServerThreadedRpcClient(ccnet.RpcClientBase): @searpc_func("int", ["string", "string", "int"]) def set_server_config_boolean (group, key, value): pass + + @searpc_func("objlist", ["string"]) + def get_shared_users_by_repo (repo_id): + pass + + @searpc_func("objlist", ["int", "string"]) + def org_get_shared_users_by_repo (org_id, repo_id): + pass diff --git a/python/seaserv/api.py b/python/seaserv/api.py index e9bfc08..c73c274 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -737,6 +737,12 @@ class SeafileAPI(object): def del_org_group_repo(self, repo_id, org_id, group_id): seafserv_threaded_rpc.del_org_group_repo(repo_id, org_id, group_id) + def get_shared_users_by_repo(self, repo_id): + return seafserv_threaded_rpc.get_shared_users_by_repo (repo_id) + + def org_get_shared_users_by_repo(self, org_id, repo_id): + return seafserv_threaded_rpc.org_get_shared_users_by_repo(org_id, repo_id) + seafile_api = SeafileAPI() class CcnetAPI(object): diff --git a/server/seaf-server.c b/server/seaf-server.c index 24b11d9..fb00131 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -420,6 +420,14 @@ static void start_rpc_service (CcnetClient *client, int cloud_mode) seafile_get_shared_repo_by_path, "get_shared_repo_by_path", searpc_signature_object__string_string_string_int()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_get_shared_users_by_repo, + "get_shared_users_by_repo", + searpc_signature_objlist__string()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_org_get_shared_users_by_repo, + "org_get_shared_users_by_repo", + searpc_signature_objlist__int_string()); /* share repo to group */ searpc_server_register_function ("seafserv-threaded-rpcserver", diff --git a/server/share-mgr.c b/server/share-mgr.c index c7da58b..7402251 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -758,3 +758,61 @@ seaf_share_manager_unshare_group_subdir (SeafShareManager* mgr, return 0; } + +gboolean +get_shared_users_cb (SeafDBRow *row, void *data) +{ + GList **users = data; + const char *repo_id = seaf_db_row_get_column_text (row, 0); + const char *user = seaf_db_row_get_column_text (row, 1); + const char *perm = seaf_db_row_get_column_text (row, 2); + SeafileSharedUser *uobj = g_object_new (SEAFILE_TYPE_SHARED_USER, + "repo_id", repo_id, + "user", user, + "perm", perm, + NULL); + *users = g_list_append (*users, uobj); + + return TRUE; +} + +GList * +seaf_share_manager_org_get_shared_users_by_repo (SeafShareManager* mgr, + int org_id, + const char *repo_id) +{ + GList *users = NULL; + char *sql = "SELECT repo_id, to_email, permission FROM OrgSharedRepo WHERE org_id=? AND " + "repo_id=?"; + + int ret = seaf_db_statement_foreach_row (mgr->seaf->db, sql, + get_shared_users_cb, &users, + 2, "int", org_id, "string", repo_id); + if (ret < 0) { + seaf_warning("Failed to get users by repo_id[%s], org_id[%d]\n", + repo_id, org_id); + return NULL; + } + + return users; +} + + +GList * +seaf_share_manager_get_shared_users_by_repo(SeafShareManager* mgr, + const char *repo_id) +{ + GList *users = NULL; + char *sql = "SELECT repo_id, to_email, permission FROM SharedRepo WHERE " + "repo_id=?"; + + int ret = seaf_db_statement_foreach_row (mgr->seaf->db, sql, + get_shared_users_cb, &users, + 1, "string", repo_id); + if (ret < 0) { + seaf_warning("Failed to get users by repo_id[%s]\n", repo_id); + return NULL; + } + + return users; +} diff --git a/server/share-mgr.h b/server/share-mgr.h index b022f17..9b340b8 100644 --- a/server/share-mgr.h +++ b/server/share-mgr.h @@ -102,5 +102,14 @@ seaf_share_manager_unshare_group_subdir (SeafShareManager* mgr, const char *owner, int group_id); + +GList * +seaf_share_manager_org_get_shared_users_by_repo (SeafShareManager* mgr, + int org_id, + const char *repo_id); + +GList * +seaf_share_manager_get_shared_users_by_repo (SeafShareManager* mgr, + const char *repo_id); #endif /* SHARE_MGR_H */