diff --git a/net/common/rpc-service.c b/net/common/rpc-service.c index 92f6473..83cffea 100644 --- a/net/common/rpc-service.c +++ b/net/common/rpc-service.c @@ -275,7 +275,7 @@ ccnet_start_rpc(CcnetSession *session) searpc_server_register_function ("ccnet-threaded-rpcserver", ccnet_rpc_is_group_user, "is_group_user", - searpc_signature_int__int_string()); + searpc_signature_int__int_string_int()); searpc_server_register_function ("ccnet-threaded-rpcserver", ccnet_rpc_set_group_creator, "set_group_creator", @@ -1248,7 +1248,7 @@ ccnet_rpc_remove_group_user (const char *user, GError **error) } int -ccnet_rpc_is_group_user (int group_id, const char *user, GError **error) +ccnet_rpc_is_group_user (int group_id, const char *user, int in_structure, GError **error) { CcnetGroupManager *group_mgr = ((CcnetServerSession *)session)->group_mgr; if (!user || group_id < 0) { @@ -1256,7 +1256,7 @@ ccnet_rpc_is_group_user (int group_id, const char *user, GError **error) return 0; } - return ccnet_group_manager_is_group_user (group_mgr, group_id, user); + return ccnet_group_manager_is_group_user (group_mgr, group_id, user, in_structure ? TRUE : FALSE); } int diff --git a/net/common/rpc-service.h b/net/common/rpc-service.h index 9c2ba24..c2a1e7c 100644 --- a/net/common/rpc-service.h +++ b/net/common/rpc-service.h @@ -241,7 +241,7 @@ int ccnet_rpc_remove_group_user (const char *user, GError **error); int -ccnet_rpc_is_group_user (int group_id, const char *user, GError **error); +ccnet_rpc_is_group_user (int group_id, const char *user, int in_structure, GError **error); int ccnet_rpc_set_group_creator (int group_id, const char *user_name, diff --git a/net/server/group-mgr.c b/net/server/group-mgr.c index e2f4692..e44edcf 100644 --- a/net/server/group-mgr.c +++ b/net/server/group-mgr.c @@ -958,13 +958,35 @@ ccnet_group_manager_remove_group_user (CcnetGroupManager *mgr, int ccnet_group_manager_is_group_user (CcnetGroupManager *mgr, int group_id, - const char *user) + const char *user, + gboolean in_structure) { CcnetDB *db = mgr->priv->db; - return ccnet_db_statement_exists (db, "SELECT group_id FROM GroupUser " - "WHERE group_id=? AND user_name=?", - 2, "int", group_id, "string", user); + gboolean exists = ccnet_db_statement_exists (db, "SELECT group_id FROM GroupUser " + "WHERE group_id=? AND user_name=?", + 2, "int", group_id, "string", user); + if (!in_structure || exists) + return exists ? 1 : 0; + + GList *ptr; + GList *groups = ccnet_group_manager_get_groups_by_user (mgr, user, TRUE, NULL); + if (!groups) + return 0; + + CcnetGroup *group; + int id; + for (ptr = groups; ptr; ptr = ptr->next) { + group = ptr->data; + g_object_get (group, "id", &id, NULL); + if (group_id == id) { + exists = TRUE; + break; + } + } + g_list_free_full (groups, g_object_unref); + + return exists ? 1 : 0; } static gboolean diff --git a/net/server/group-mgr.h b/net/server/group-mgr.h index 45c7997..10af98d 100644 --- a/net/server/group-mgr.h +++ b/net/server/group-mgr.h @@ -100,7 +100,8 @@ ccnet_group_manager_remove_group_user (CcnetGroupManager *mgr, int ccnet_group_manager_is_group_user (CcnetGroupManager *mgr, int group_id, - const char *user); + const char *user, + gboolean in_structure); GList* ccnet_group_manager_get_all_groups (CcnetGroupManager *mgr, diff --git a/python/ccnet/rpc.py b/python/ccnet/rpc.py index 8a7a33f..29f0885 100644 --- a/python/ccnet/rpc.py +++ b/python/ccnet/rpc.py @@ -331,8 +331,8 @@ class CcnetThreadedRpcClient(RpcClientBase): def remove_group_user(self, username): pass - @searpc_func("int", ["int", "string"]) - def is_group_user(self, group_id, user): + @searpc_func("int", ["int", "string", "int"]) + def is_group_user(self, group_id, user, in_structure): pass @searpc_func("int", ["int", "string"])