mirror of
https://github.com/haiwen/seafile-server.git
synced 2025-09-25 14:42:52 +00:00
Fix memory usage issues when checking share permission.
This commit is contained in:
@@ -37,23 +37,16 @@ check_repo_share_perm_cb (SeafDBRow *row, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
check_repo_share_permission (SeafRepoManager *mgr,
|
check_group_permission_by_user (SeafRepoManager *mgr,
|
||||||
const char *repo_id,
|
const char *repo_id,
|
||||||
const char *user_name)
|
const char *user_name)
|
||||||
{
|
{
|
||||||
|
char *permission = NULL;
|
||||||
SearpcClient *rpc_client;
|
SearpcClient *rpc_client;
|
||||||
GList *groups, *p1;
|
GList *groups = NULL, *p1;
|
||||||
CcnetGroup *group;
|
CcnetGroup *group;
|
||||||
int group_id;
|
int group_id;
|
||||||
char *permission;
|
GString *sql;
|
||||||
GString *sql = NULL;
|
|
||||||
|
|
||||||
permission = seaf_share_manager_check_permission (seaf->share_mgr,
|
|
||||||
repo_id,
|
|
||||||
user_name);
|
|
||||||
if (permission != NULL)
|
|
||||||
return permission;
|
|
||||||
g_free (permission);
|
|
||||||
|
|
||||||
rpc_client = ccnet_create_pooled_rpc_client (seaf->client_pool,
|
rpc_client = ccnet_create_pooled_rpc_client (seaf->client_pool,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -63,10 +56,9 @@ check_repo_share_permission (SeafRepoManager *mgr,
|
|||||||
|
|
||||||
/* Get the groups this user belongs to. */
|
/* Get the groups this user belongs to. */
|
||||||
groups = ccnet_get_groups_by_user (rpc_client, user_name);
|
groups = ccnet_get_groups_by_user (rpc_client, user_name);
|
||||||
if (!groups)
|
if (!groups) {
|
||||||
goto group_out;
|
goto out;
|
||||||
|
}
|
||||||
ccnet_rpc_client_free (rpc_client);
|
|
||||||
|
|
||||||
sql = g_string_new ("");
|
sql = g_string_new ("");
|
||||||
g_string_printf (sql, "SELECT permission FROM RepoGroup WHERE repo_id = ? AND group_id IN (");
|
g_string_printf (sql, "SELECT permission FROM RepoGroup WHERE repo_id = ? AND group_id IN (");
|
||||||
@@ -84,15 +76,32 @@ check_repo_share_permission (SeafRepoManager *mgr,
|
|||||||
check_repo_share_perm_cb, &permission,
|
check_repo_share_perm_cb, &permission,
|
||||||
1, "string", repo_id) < 0) {
|
1, "string", repo_id) < 0) {
|
||||||
seaf_warning ("DB error when get repo share permission for repo %s.\n", repo_id);
|
seaf_warning ("DB error when get repo share permission for repo %s.\n", repo_id);
|
||||||
goto group_out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
group_out:
|
|
||||||
g_string_free (sql, TRUE);
|
g_string_free (sql, TRUE);
|
||||||
|
|
||||||
|
out:
|
||||||
|
ccnet_rpc_client_free (rpc_client);
|
||||||
for (p1 = groups; p1 != NULL; p1 = p1->next)
|
for (p1 = groups; p1 != NULL; p1 = p1->next)
|
||||||
g_object_unref ((GObject *)p1->data);
|
g_object_unref ((GObject *)p1->data);
|
||||||
g_list_free (groups);
|
g_list_free (groups);
|
||||||
|
return permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
check_repo_share_permission (SeafRepoManager *mgr,
|
||||||
|
const char *repo_id,
|
||||||
|
const char *user_name)
|
||||||
|
{
|
||||||
|
char *permission;
|
||||||
|
|
||||||
|
permission = seaf_share_manager_check_permission (seaf->share_mgr,
|
||||||
|
repo_id,
|
||||||
|
user_name);
|
||||||
|
if (permission != NULL)
|
||||||
|
return permission;
|
||||||
|
|
||||||
|
permission = check_group_permission_by_user (mgr, repo_id, user_name);
|
||||||
if (permission != NULL)
|
if (permission != NULL)
|
||||||
return permission;
|
return permission;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user