diff --git a/common/fs-mgr.c b/common/fs-mgr.c index fa84693..7f81ec0 100644 --- a/common/fs-mgr.c +++ b/common/fs-mgr.c @@ -2769,7 +2769,6 @@ seaf_fs_manager_get_dirent_by_path (SeafFSManager *mgr, root_id, parent_dir, error); if (!dir) { - seaf_warning ("dir %s doesn't exist in repo %.8s.\n", parent_dir, repo_id); goto out; } diff --git a/common/group-mgr.c b/common/group-mgr.c index 64b05de..580363d 100644 --- a/common/group-mgr.c +++ b/common/group-mgr.c @@ -1443,6 +1443,33 @@ ccnet_group_manager_get_groups_members (CcnetGroupManager *mgr, const char *grou return ret; } +GList* +ccnet_group_manager_search_group_members (CcnetGroupManager *mgr, + int group_id, + const char *pattern) +{ + CcnetDB *db = mgr->priv->db; + GList *ret = NULL; + char *sql; + int rc; + + char *db_patt = g_strdup_printf ("%%%s%%", pattern); + + sql = "SELECT DISTINCT user_name FROM GroupUser " + "WHERE group_id = ? AND user_name LIKE ? ORDER BY user_name"; + rc = seaf_db_statement_foreach_row (db, sql, + get_groups_members_cb, &ret, + 2, "int", group_id, "string", db_patt); + + g_free (db_patt); + if (rc < 0) { + g_list_free_full (ret, g_object_unref); + return NULL; + } + + return g_list_reverse (ret); +} + int ccnet_group_manager_update_group_user (CcnetGroupManager *mgr, const char *old_email, diff --git a/common/group-mgr.h b/common/group-mgr.h index 006fe47..0f30426 100644 --- a/common/group-mgr.h +++ b/common/group-mgr.h @@ -130,6 +130,11 @@ ccnet_group_manager_search_groups (CcnetGroupManager *mgr, const char *keyword, int start, int limit); +GList* +ccnet_group_manager_search_group_members (CcnetGroupManager *mgr, + int group_id, + const char *pattern); + GList * ccnet_group_manager_get_top_groups (CcnetGroupManager *mgr, gboolean including_org, GError **error); diff --git a/common/rpc-service.c b/common/rpc-service.c index b776b5c..e8281b4 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -4696,6 +4696,17 @@ ccnet_rpc_search_groups (const char *group_patt, return groups; } +GList * +ccnet_rpc_search_group_members (int group_id, const char *pattern, GError **error) +{ + CcnetGroupManager *group_mgr = seaf->group_mgr; + GList *ret = NULL; + + ret = ccnet_group_manager_search_group_members (group_mgr, group_id, pattern); + + return ret; +} + GList* ccnet_rpc_get_top_groups (int including_org, GError **error) { diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index 06ce5e7..e6037f7 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -1280,6 +1280,9 @@ ccnet_rpc_search_groups (const char *group_patt, GList * ccnet_rpc_get_groups_members (const char *group_ids, GError **error); +GList * +ccnet_rpc_search_group_members (int group_id, const char *pattern, GError **error); + int ccnet_rpc_create_org (const char *org_name, const char *url_prefix, const char *creator, GError **error); diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index 47e80bc..ce48f96 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -978,6 +978,10 @@ class SeafServerThreadedRpcClient(NamedPipeClient): def search_groups(self, group_patt, start, limit): pass + @searpc_func("objlist", ["int", "string"]) + def search_group_members(self, group_id, pattern): + pass + @searpc_func("objlist", ["string"]) def get_groups_members(self, group_ids): pass diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 3875c70..8c07712 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -935,6 +935,9 @@ class CcnetAPI(object): Search for groups whose name contains @group_patt. """ return ccnet_threaded_rpc.search_groups(group_patt, start, limit) + + def search_group_members(self, group_id, pattern): + return ccnet_threaded_rpc.search_group_members(group_id, pattern) def get_top_groups(self, including_org=False): return ccnet_threaded_rpc.get_top_groups(1 if including_org else 0) diff --git a/scripts/setup-seafile-mysql.py b/scripts/setup-seafile-mysql.py index 08ec906..5ceeb0e 100644 --- a/scripts/setup-seafile-mysql.py +++ b/scripts/setup-seafile-mysql.py @@ -1209,7 +1209,6 @@ class SeafDavConfigurator(AbstractConfigurator): [WEBDAV] enabled = false port = 8080 -fastcgi = false share_name = / ''' diff --git a/scripts/setup-seafile.sh b/scripts/setup-seafile.sh index bd987f7..763e989 100755 --- a/scripts/setup-seafile.sh +++ b/scripts/setup-seafile.sh @@ -349,8 +349,6 @@ function gen_seafdav_conf () { [WEBDAV] enabled = false port = 8080 -fastcgi = false -host = 0.0.0.0 share_name = / EOF ); then diff --git a/server/seaf-server.c b/server/seaf-server.c index 3595325..8b816b0 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -930,6 +930,10 @@ static void start_rpc_service (const char *seafile_dir, ccnet_rpc_search_groups, "search_groups", searpc_signature_objlist__string_int_int()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + ccnet_rpc_search_group_members, + "search_group_members", + searpc_signature_objlist__int_string()); searpc_server_register_function ("seafserv-threaded-rpcserver", ccnet_rpc_get_top_groups, "get_top_groups", diff --git a/tests/test_group/test_groups.py b/tests/test_group/test_groups.py index 4c7f899..dfbc276 100644 --- a/tests/test_group/test_groups.py +++ b/tests/test_group/test_groups.py @@ -3,6 +3,7 @@ from seaserv import seafile_api as api from seaserv import ccnet_api from tests.config import USER, USER2 +from tests.utils import randstring def test_multi_tier_groups(repo): id1 = ccnet_api.create_group('group1', USER, parent_group_id=-1) @@ -21,6 +22,12 @@ def test_multi_tier_groups(repo): assert group3.parent_group_id == id1 assert group4.parent_group_id == id3 + members = ccnet_api.search_group_members (id1, 'randgroup{}'.format(randstring(6))) + assert len(members) == 0 + members = ccnet_api.search_group_members (id1, USER) + assert len(members) == 1 + assert members[0].user_name == USER + ances_order = [id5, id4, id3, id2, id1] user2_groups_with_ancestors = ccnet_api.get_groups (USER2, return_ancestors = True) assert len(user2_groups_with_ancestors) == 5