diff --git a/common/rpc-service.c b/common/rpc-service.c index 36398fa..cf41c15 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -61,6 +61,7 @@ convert_repo (SeafRepo *r) g_object_set (repo, "repo_id", r->id, "repo_name", r->name, "repo_desc", r->desc, "last_modified", r->last_modify, + "status", r->status, NULL); #ifdef SEAFILE_SERVER @@ -5328,7 +5329,7 @@ seafile_convert_repo_path (const char *repo_id, GError **error) { if (!is_uuid_valid(repo_id) || !path || !user) { - g_set_error (error, 0, SEAF_ERR_BAD_ARGS, "Arguments error"); + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Arguments error"); return NULL; } @@ -5338,4 +5339,28 @@ seafile_convert_repo_path (const char *repo_id, return ret; } + +int +seafile_set_repo_status(const char *repo_id, int status, GError **error) +{ + if (!is_uuid_valid(repo_id) || + status < 0 || status >= N_REPO_STATUS) { + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Arguments error"); + return -1; + } + + return seaf_repo_manager_set_repo_status(seaf->repo_mgr, repo_id, status); +} + +int +seafile_get_repo_status(const char *repo_id, GError **error) +{ + if (!is_uuid_valid(repo_id)) { + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_BAD_ARGS, "Arguments error"); + return -1; + } + + return seaf_repo_manager_get_repo_status(seaf->repo_mgr, repo_id); +} + #endif /* SEAFILE_SERVER */ diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index 923e81d..6fe02f5 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -1113,4 +1113,11 @@ seafile_convert_repo_path (const char *repo_id, const char *user, int is_org, GError **error); + +int +seafile_set_repo_status(const char *repo_id, int status, GError **error); + +int +seafile_get_repo_status(const char *repo_id, GError **error); + #endif diff --git a/lib/repo.vala b/lib/repo.vala index 75a77d0..482b384 100644 --- a/lib/repo.vala +++ b/lib/repo.vala @@ -40,6 +40,7 @@ public class Repo : Object { public string last_modifier { get; set; } public string head_cmmt_id { get; set; } public string root { get; set; } + public int status { get; set; } // To be compatible with obsoleted SharedRepo object public string repo_id { get; set; } diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index aae1694..5349db4 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -1046,3 +1046,12 @@ class SeafServerThreadedRpcClient(ccnet.RpcClientBase): @searpc_func("string", ["string", "string", "string", "int"]) def convert_repo_path(repo_id, path, user, is_org): pass + + # repo status + @searpc_func("int", ["string", "int"]) + def set_repo_status(repo_id, status): + pass + + @searpc_func("int", ["string"]) + def get_repo_status(repo_id): + pass diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 423368a..ef7e50d 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -14,6 +14,9 @@ All paths in parameters can be in absolute path format (like '/test') or relative path format (like 'test'). The API can handle both formats. """ +REPO_STATUS_NORMAL = 0 +REPO_STATUS_READ_ONLY = 1 + class SeafileAPI(object): def __init__(self): @@ -169,6 +172,12 @@ class SeafileAPI(object): def get_org_id_by_repo_id (self, repo_id): return seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id) + def set_repo_status (self, repo_id, status): + return seafserv_threaded_rpc.set_repo_status(repo_id, status) + + def get_repo_status (self, repo_id): + return seafserv_threaded_rpc.get_repo_status(repo_id) + # File property and dir listing def is_valid_filename(self, repo_id, filename): diff --git a/server/http-server.c b/server/http-server.c index ce3286d..438fc2c 100644 --- a/server/http-server.c +++ b/server/http-server.c @@ -373,6 +373,12 @@ check_permission (HttpServer *htp_server, const char *repo_id, const char *usern return EVHTP_RES_OK; } + if (strcmp(op, "upload") == 0) { + int status = seaf_repo_manager_get_repo_status(seaf->repo_mgr, repo_id); + if (status != REPO_STATUS_NORMAL) + return EVHTP_RES_FORBIDDEN; + } + char *perm = seaf_repo_manager_check_permission (seaf->repo_mgr, repo_id, username, NULL); if (perm) { diff --git a/server/repo-mgr.c b/server/repo-mgr.c index c3236d5..abdd708 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -599,9 +599,15 @@ del_repo: remove_virtual_repo_ondisk (mgr, (char *)ptr->data); string_list_free (vrepos); + seaf_db_statement_query (mgr->seaf->db, "DELETE FROM RepoInfo " + "WHERE repo_id IN (SELECT repo_id FROM VirtualRepo " + "WHERE origin_repo=?)", + 1, "string", repo_id); + seaf_db_statement_query (mgr->seaf->db, "DELETE FROM VirtualRepo " "WHERE repo_id=? OR origin_repo=?", 2, "string", repo_id, "string", repo_id); + if (!head_commit) add_deleted_repo_record(mgr, repo_id); @@ -641,6 +647,7 @@ create_repo_fill_size (SeafDBRow *row, void *data) const char *commit_id = seaf_db_row_get_column_text (row, 2); const char *vrepo_id = seaf_db_row_get_column_text (row, 3); gint64 file_count = seaf_db_row_get_column_int64 (row, 7); + int status = seaf_db_row_get_column_int(row, 8); *repo = seaf_repo_new (repo_id, NULL, NULL); if (!*repo) @@ -655,6 +662,7 @@ create_repo_fill_size (SeafDBRow *row, void *data) (*repo)->file_count = file_count; head = seaf_branch_new ("master", repo_id, commit_id); (*repo)->head = head; + (*repo)->status = status; if (vrepo_id) { const char *origin_repo_id = seaf_db_row_get_column_text (row, 4); @@ -684,19 +692,21 @@ get_repo_from_db (SeafRepoManager *mgr, const char *id, gboolean *db_err) if (seaf_db_type(mgr->seaf->db) != SEAF_DB_TYPE_PGSQL) sql = "SELECT r.repo_id, s.size, b.commit_id, " - "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count FROM " + "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count, i.status FROM " "Repo r LEFT JOIN Branch b ON r.repo_id = b.repo_id " "LEFT JOIN RepoSize s ON r.repo_id = s.repo_id " "LEFT JOIN VirtualRepo v ON r.repo_id = v.repo_id " "LEFT JOIN RepoFileCount fc ON r.repo_id = fc.repo_id " + "LEFT JOIN RepoInfo i on r.repo_id = i.repo_id " "WHERE r.repo_id = ? AND b.name = 'master'"; else sql = "SELECT r.repo_id, s.\"size\", b.commit_id, " - "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count FROM " + "v.repo_id, v.origin_repo, v.path, v.base_commit, fc.file_count, i.status FROM " "Repo r LEFT JOIN Branch b ON r.repo_id = b.repo_id " "LEFT JOIN RepoSize s ON r.repo_id = s.repo_id " "LEFT JOIN VirtualRepo v ON r.repo_id = v.repo_id " "LEFT JOIN RepoFileCount fc ON r.repo_id = fc.repo_id " + "LEFT JOIN RepoInfo i on r.repo_id = i.repo_id " "WHERE r.repo_id = ? AND b.name = 'master'"; int ret = seaf_db_statement_foreach_row (mgr->seaf->db, sql, @@ -820,12 +830,32 @@ int set_repo_commit_to_db (const char *repo_id, const char *repo_name, gint64 update_time, int version, gboolean is_encrypted, const char *last_modifier) { - int db_type = seaf_db_type (seaf->db); char *sql; gboolean exists = FALSE, db_err = FALSE; - if (db_type == SEAF_DB_TYPE_SQLITE || db_type == SEAF_DB_TYPE_MYSQL) { - sql = "REPLACE INTO RepoInfo (repo_id, name, update_time, version, is_encrypted, last_modifier) " + sql = "SELECT 1 FROM RepoInfo WHERE repo_id=?"; + exists = seaf_db_statement_exists (seaf->db, sql, &db_err, 1, "string", repo_id); + if (db_err) + return -1; + + if (update_time == 0) + update_time = (gint64)time(NULL); + + if (exists) { + sql = "UPDATE RepoInfo SET name=?, update_time=?, version=?, is_encrypted=?, " + "last_modifier=? WHERE repo_id=?"; + if (seaf_db_statement_query (seaf->db, sql, 6, + "string", repo_name, + "int64", update_time, + "int", version, + "int", (is_encrypted ? 1:0), + "string", last_modifier, + "string", repo_id) < 0) { + seaf_warning ("Failed to update repo info for repo %s.\n", repo_id); + return -1; + } + } else { + sql = "INSERT INTO RepoInfo (repo_id, name, update_time, version, is_encrypted, last_modifier) " "VALUES (?, ?, ?, ?, ?, ?)"; if (seaf_db_statement_query (seaf->db, sql, 6, "string", repo_id, @@ -833,42 +863,9 @@ set_repo_commit_to_db (const char *repo_id, const char *repo_name, gint64 update "int64", update_time, "int", version, "int", (is_encrypted ? 1:0), - "string", last_modifier) < 0) { + "string", last_modifier) < 0) { seaf_warning ("Failed to add repo info for repo %s.\n", repo_id); return -1; - } - } else { - sql = "SELECT 1 FROM RepoInfo WHERE repo_id=?"; - exists = seaf_db_statement_exists (seaf->db, sql, &db_err, 1, "string", repo_id); - if (db_err) - return -1; - - if (exists) { - sql = "UPDATE RepoInfo SET name=?, update_time=?, version=?, is_encrypted=?, " - "last_modifier=? WHERE repo_id=?"; - if (seaf_db_statement_query (seaf->db, sql, 6, - "string", repo_name, - "int64", update_time, - "int", version, - "int", (is_encrypted ? 1:0), - "string", last_modifier, - "string", repo_id) < 0) { - seaf_warning ("Failed to update repo info for repo %s.\n", repo_id); - return -1; - } - } else { - sql = "INSERT INTO RepoInfo (repo_id, name, update_time, version, is_encrypted, last_modifier) " - "VALUES (?, ?, ?, ?, ?, ?)"; - if (seaf_db_statement_query (seaf->db, sql, 6, - "string", repo_id, - "string", repo_name, - "int64", update_time, - "int", version, - "int", (is_encrypted ? 1:0), - "string", last_modifier) < 0) { - seaf_warning ("Failed to add repo info for repo %s.\n", repo_id); - return -1; - } } } @@ -1054,7 +1051,7 @@ create_tables_mysql (SeafRepoManager *mgr) sql = "CREATE TABLE IF NOT EXISTS RepoInfo (id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, " "repo_id CHAR(36), " "name VARCHAR(255) NOT NULL, update_time BIGINT, version INTEGER, " - "is_encrypted INTEGER, last_modifier VARCHAR(255), UNIQUE INDEX(repo_id)) ENGINE=INNODB"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, UNIQUE INDEX(repo_id)) ENGINE=INNODB"; if (seaf_db_query (db, sql) < 0) return -1; @@ -1208,7 +1205,7 @@ create_tables_sqlite (SeafRepoManager *mgr) sql = "CREATE TABLE IF NOT EXISTS RepoInfo (repo_id CHAR(36) PRIMARY KEY, " "name VARCHAR(255) NOT NULL, update_time INTEGER, version INTEGER, " - "is_encrypted INTEGER, last_modifier VARCHAR(255))"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0)"; if (seaf_db_query (db, sql) < 0) return -1; @@ -1362,7 +1359,7 @@ create_tables_pgsql (SeafRepoManager *mgr) sql = "CREATE TABLE IF NOT EXISTS RepoInfo (repo_id CHAR(36) PRIMARY KEY, " "name VARCHAR(255) NOT NULL, update_time BIGINT, version INTEGER, " - "is_encrypted INTEGER, last_modifier VARCHAR(255))"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0)"; if (seaf_db_query (db, sql) < 0) return -1; @@ -2211,6 +2208,7 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) int version = seaf_db_row_get_column_int (row, 5); gboolean is_encrypted = seaf_db_row_get_column_int (row, 6) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 7); + int status = seaf_db_row_get_column_int (row, 8); repo = seaf_repo_new (repo_id, NULL, NULL); if (!repo) @@ -2230,6 +2228,7 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) repo->version = version; repo->encrypted = is_encrypted; repo->last_modifier = g_strdup (last_modifier); + repo->status = status; } out: @@ -2254,7 +2253,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, if (start == -1 && limit == -1) { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT o.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -2263,7 +2262,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, "ORDER BY i.update_time DESC, o.repo_id"; else sql = "SELECT o.repo_id, s.\"size\", b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -2278,7 +2277,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, } else { if (db_type != SEAF_DB_TYPE_PGSQL) sql = "SELECT o.repo_id, s.size, b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -2288,7 +2287,7 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, "LIMIT ? OFFSET ?"; else sql = "SELECT o.repo_id, s.\"size\", b.commit_id, i.name, i.update_time, " - "i.version, i.is_encrypted, i.last_modifier FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status FROM " "RepoOwner o LEFT JOIN RepoSize s ON o.repo_id = s.repo_id " "LEFT JOIN Branch b ON o.repo_id = b.repo_id " "LEFT JOIN RepoInfo i ON o.repo_id = i.repo_id " @@ -3027,6 +3026,8 @@ get_group_repos_cb (SeafDBRow *row, void *data) int version = seaf_db_row_get_column_int (row, 11); gboolean is_encrypted = seaf_db_row_get_column_int (row, 12) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 13); + int status = seaf_db_row_get_column_int (row, 14); + char *user_name_l = g_ascii_strdown (user_name, -1); srepo = g_object_new (SEAFILE_TYPE_REPO, @@ -3039,6 +3040,7 @@ get_group_repos_cb (SeafDBRow *row, void *data) "permission", permission, "is_virtual", (vrepo_id != NULL), "size", size, + "status", status, NULL); g_free (user_name_l); @@ -3046,7 +3048,7 @@ get_group_repos_cb (SeafDBRow *row, void *data) if (vrepo_id) { const char *origin_repo_id = seaf_db_row_get_column_text (row, 7); const char *origin_path = seaf_db_row_get_column_text (row, 8); - const char *origin_repo_name = seaf_db_row_get_column_text (row, 14); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 15); g_object_set (srepo, "store_id", origin_repo_id, "origin_repo_id", origin_repo_id, "origin_repo_name", origin_repo_name, @@ -3138,7 +3140,7 @@ seaf_repo_manager_get_repos_by_group (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -3176,7 +3178,7 @@ seaf_repo_manager_get_group_repos_by_owner (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -3326,6 +3328,7 @@ collect_public_repos (SeafDBRow *row, void *data) int version = seaf_db_row_get_column_int (row, 10); gboolean is_encrypted = seaf_db_row_get_column_int (row, 11) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 12); + int status = seaf_db_row_get_column_int (row, 13); char *owner_l = g_ascii_strdown (owner, -1); @@ -3338,6 +3341,7 @@ collect_public_repos (SeafDBRow *row, void *data) "user", owner_l, "is_virtual", (vrepo_id != NULL), "size", size, + "status", status, NULL); g_free (owner_l); @@ -3377,7 +3381,7 @@ seaf_repo_manager_list_inner_pub_repos (SeafRepoManager *mgr) sql = "SELECT InnerPubRepo.repo_id, VirtualRepo.repo_id, " "owner_id, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -3419,7 +3423,7 @@ seaf_repo_manager_list_inner_pub_repos_by_owner (SeafRepoManager *mgr, sql = "SELECT InnerPubRepo.repo_id, VirtualRepo.repo_id, " "owner_id, permission, commit_id, s.size, " "VirtualRepo.origin_repo, VirtualRepo.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -4154,7 +4158,7 @@ seaf_get_group_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT RepoGroup.repo_id, v.repo_id, " "group_id, user_name, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -4168,7 +4172,7 @@ seaf_get_group_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT OrgGroupRepo.repo_id, v.repo_id, " "group_id, owner, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM OrgGroupRepo LEFT JOIN VirtualRepo v ON " "OrgGroupRepo.repo_id = v.repo_id " @@ -4233,7 +4237,7 @@ seaf_get_group_repos_by_user (SeafRepoManager *mgr, g_string_printf (sql, "SELECT g.repo_id, v.repo_id, " "group_id, %s, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo)" "FROM %s g LEFT JOIN VirtualRepo v ON " "g.repo_id = v.repo_id " @@ -4480,3 +4484,29 @@ out: return ret; } +int +seaf_repo_manager_set_repo_status(SeafRepoManager *mgr, + const char *repo_id, RepoStatus status) +{ + int ret = 0; + + if (seaf_db_statement_query (mgr->seaf->db, + "UPDATE RepoInfo SET status=? " + "WHERE repo_id=? OR repo_id IN " + "(SELECT repo_id FROM VirtualRepo WHERE origin_repo=?)", + 3, "int", status, + "string", repo_id, "string", repo_id) < 0) + ret = -1; + + return ret; +} + +int +seaf_repo_manager_get_repo_status(SeafRepoManager *mgr, + const char *repo_id) +{ + char *sql = "SELECT status FROM RepoInfo WHERE repo_id=?"; + + return seaf_db_statement_get_int (mgr->seaf->db, sql, + 1, "string", repo_id); +} diff --git a/server/repo-mgr.h b/server/repo-mgr.h index b8c2d37..8f73d93 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -7,6 +7,12 @@ #include "commit-mgr.h" #include "branch-mgr.h" +typedef enum RepoStatus { + REPO_STATUS_NORMAL, + REPO_STATUS_READ_ONLY, + N_REPO_STATUS, +} RepoStatus; + struct _SeafRepoManager; typedef struct _SeafRepo SeafRepo; @@ -33,6 +39,8 @@ struct _SeafRepo { gint64 size; gint64 file_count; + int status; + SeafBranch *head; gchar root_id[41]; @@ -894,4 +902,11 @@ seaf_repo_manager_convert_repo_path (SeafRepoManager *mgr, const char *user, gboolean is_org, GError **error); +int +seaf_repo_manager_set_repo_status(SeafRepoManager *mgr, + const char *repo_id, RepoStatus status); + +int +seaf_repo_manager_get_repo_status(SeafRepoManager *mgr, + const char *repo_id); #endif diff --git a/server/seaf-server.c b/server/seaf-server.c index 62a5069..b9df5e7 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -687,6 +687,16 @@ static void start_rpc_service (CcnetClient *client, int cloud_mode) "check_permission", searpc_signature_string__string_string()); + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_set_repo_status, + "set_repo_status", + searpc_signature_int__string_int()); + + searpc_server_register_function ("seafserv-threaded-rpcserver", + seafile_get_repo_status, + "get_repo_status", + searpc_signature_int__string()); + /* folder permission */ searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_check_permission_by_path, diff --git a/server/share-mgr.c b/server/share-mgr.c index 83c40d0..cba3a92 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -188,7 +188,8 @@ collect_repos (SeafDBRow *row, void *data) int version = seaf_db_row_get_column_int (row, 10); gboolean is_encrypted = seaf_db_row_get_column_int (row, 11) ? TRUE : FALSE; const char *last_modifier = seaf_db_row_get_column_text (row, 12); - const char *origin_repo_name = seaf_db_row_get_column_text (row, 13); + int status = seaf_db_row_get_column_int (row, 13); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 14); char *email_l = g_ascii_strdown (email, -1); @@ -201,6 +202,7 @@ collect_repos (SeafDBRow *row, void *data) "permission", permission, "is_virtual", (vrepo_id != NULL), "size", size, + "status", status, NULL); g_free (email_l); @@ -300,7 +302,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "to_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -314,7 +316,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -346,7 +348,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "to_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -361,7 +363,7 @@ seaf_share_manager_list_share_repos (SeafShareManager *mgr, const char *email, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -802,7 +804,7 @@ seaf_get_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -815,7 +817,7 @@ seaf_get_shared_repo_by_path (SeafRepoManager *mgr, sql = "SELECT sh.repo_id, v.repo_id, " "from_email, permission, commit_id, s.size, " "v.origin_repo, v.path, i.name, " - "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.update_time, i.version, i.is_encrypted, i.last_modifier, i.status, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "OrgSharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " diff --git a/server/upload-file.c b/server/upload-file.c index f851425..489ecaf 100755 --- a/server/upload-file.c +++ b/server/upload-file.c @@ -2519,12 +2519,20 @@ check_access_token (const char *token, { SeafileWebAccess *webaccess; const char *op; + const char *_repo_id; webaccess = (SeafileWebAccess *) seaf_web_at_manager_query_access_token (seaf->web_at_mgr, token); if (!webaccess) return -1; + _repo_id = seafile_web_access_get_repo_id (webaccess); + int status = seaf_repo_manager_get_repo_status(seaf->repo_mgr, _repo_id); + if (status != REPO_STATUS_NORMAL) { + g_object_unref (webaccess); + return -1; + } + /* token with op = "upload" can only be used for "upload-*" operations; * token with op = "update" can only be used for "update-*" operations. */ @@ -2540,7 +2548,7 @@ check_access_token (const char *token, return -1; } - *repo_id = g_strdup (seafile_web_access_get_repo_id (webaccess)); + *repo_id = g_strdup (_repo_id); *user = g_strdup (seafile_web_access_get_username (webaccess)); g_object_unref (webaccess); diff --git a/server/virtual-repo.c b/server/virtual-repo.c index 463e0ef..2b03300 100644 --- a/server/virtual-repo.c +++ b/server/virtual-repo.c @@ -136,6 +136,15 @@ do_create_virtual_repo (SeafRepoManager *mgr, goto out; } + if (set_repo_commit_to_db (repo_id, repo_name, 0, + repo->version, repo->encrypted, user) < 0) { + seaf_warning("Failed to add repo info.\n"); + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, + "Failed to add repo info"); + ret = -1; + goto out; + } + out: if (repo) seaf_repo_unref (repo); @@ -186,6 +195,14 @@ create_virtual_repo_common (SeafRepoManager *mgr, "Origin library not exists"); return NULL; } + if (origin_repo->status != REPO_STATUS_NORMAL) { + seaf_warning("Status of repo %.8s is %d, can't create VirtualRepo\n", + origin_repo_id, origin_repo->status); + g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, + "Unnormal repo status"); + seaf_repo_unref (origin_repo); + return NULL; + } if (origin_repo->encrypted) { if (origin_repo->enc_version < 2) {