From 533755377fb6befa28aab5148b83fada1af6cf10 Mon Sep 17 00:00:00 2001 From: cuihaikuo Date: Sat, 6 Jan 2018 15:28:11 +0800 Subject: [PATCH] Fix that shared folder can't be set permission. --- common/rpc-service.c | 36 +++++++----------------------------- server/repo-mgr.c | 18 ++++++++++++++++++ server/repo-mgr.h | 8 ++++++++ server/share-mgr.c | 25 +++++++++++++++++++++++++ server/share-mgr.h | 5 +++++ 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/common/rpc-service.c b/common/rpc-service.c index fc7e97d..a9dc62e 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -2518,29 +2518,19 @@ seafile_update_share_subdir_perm_for_user (const char *repo_id, } char *real_path; - char *vrepo_id; int ret = 0; real_path = format_dir_path (path); - vrepo_id = seaf_repo_manager_get_virtual_repo_id (seaf->repo_mgr, repo_id, - real_path, owner); - if (!vrepo_id) { - g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, - "Failed to get shared sub repo"); - ret = -1; - goto out; - } - ret = seaf_share_manager_set_permission (seaf->share_mgr, vrepo_id, - owner, share_user, - permission); + ret = seaf_share_manager_set_subdir_perm_by_path (seaf->share_mgr, + repo_id, owner, share_user, + permission, real_path); + if (ret < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Failed to update share subdir permission for user"); } - g_free (vrepo_id); -out: g_free (real_path); return ret; } @@ -2795,29 +2785,17 @@ seafile_update_share_subdir_perm_for_group (const char *repo_id, } char *real_path; - char *vrepo_id; int ret = 0; real_path = format_dir_path (path); - vrepo_id = seaf_repo_manager_get_virtual_repo_id (seaf->repo_mgr, repo_id, - real_path, owner); - if (!vrepo_id) { - g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, - "Failed to get shared sub repo"); - ret = -1; - goto out; - } - - ret = seaf_repo_manager_set_group_repo_perm (seaf->repo_mgr, vrepo_id, - share_group, permission, - error); + ret = seaf_repo_manager_set_subdir_group_perm_by_path (seaf->repo_mgr, + repo_id, owner, share_group, + permission, real_path); if (ret < 0) { g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Failed to update share subdir permission for group"); } - g_free (vrepo_id); -out: g_free (real_path); return ret; } diff --git a/server/repo-mgr.c b/server/repo-mgr.c index 812a5ab..84d30ed 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -2932,6 +2932,24 @@ seaf_repo_manager_set_group_repo_perm (SeafRepoManager *mgr, "int", group_id); } +int +seaf_repo_manager_set_subdir_group_perm_by_path (SeafRepoManager *mgr, + const char *repo_id, + const char *username, + int group_id, + const char *permission, + const char *path) +{ + return seaf_db_statement_query (mgr->seaf->db, + "UPDATE RepoGroup SET permission=? WHERE repo_id IN " + "(SELECT repo_id FROM VirtualRepo WHERE origin_repo=? AND path=?) " + "AND group_id=? AND user_name=?", + 5, "string", permission, + "string", repo_id, + "string", path, + "int", group_id, + "string", username); +} static gboolean get_group_repoids_cb (SeafDBRow *row, void *data) { diff --git a/server/repo-mgr.h b/server/repo-mgr.h index 6aae961..67171a1 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -841,4 +841,12 @@ seaf_get_group_repos_by_user (SeafRepoManager *mgr, const char *user, int org_id, GError **error); + +int +seaf_repo_manager_set_subdir_group_perm_by_path (SeafRepoManager *mgr, + const char *repo_id, + const char *username, + int group_id, + const char *permission, + const char *path); #endif diff --git a/server/share-mgr.c b/server/share-mgr.c index c761089..c7da58b 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -114,6 +114,31 @@ out: return ret; } +int +seaf_share_manager_set_subdir_perm_by_path (SeafShareManager *mgr, const char *repo_id, + const char *from_email, const char *to_email, + const char *permission, const char *path) +{ + char *sql; + int ret; + + char *from_email_l = g_ascii_strdown (from_email, -1); + char *to_email_l = g_ascii_strdown (to_email, -1); + sql = "UPDATE SharedRepo SET permission=? WHERE repo_id IN " + "(SELECT repo_id FROM VirtualRepo WHERE origin_repo=? AND path=?) " + "AND from_email=? AND to_email=?"; + + ret = seaf_db_statement_query (mgr->seaf->db, sql, + 5, "string", permission, + "string", repo_id, + "string", path, + "string", from_email_l, + "string", to_email_l); + g_free (from_email_l); + g_free (to_email_l); + return ret; +} + int seaf_share_manager_set_permission (SeafShareManager *mgr, const char *repo_id, const char *from_email, const char *to_email, diff --git a/server/share-mgr.h b/server/share-mgr.h index b92e2ef..b022f17 100644 --- a/server/share-mgr.h +++ b/server/share-mgr.h @@ -27,6 +27,11 @@ seaf_share_manager_add_share (SeafShareManager *mgr, const char *repo_id, const char *from_email, const char *to_email, const char *permission); +int +seaf_share_manager_set_subdir_perm_by_path (SeafShareManager *mgr, const char *repo_id, + const char *from_email, const char *to_email, + const char *permission, const char *path); + int seaf_share_manager_set_permission (SeafShareManager *mgr, const char *repo_id, const char *from_email, const char *to_email,