diff --git a/common/commit-mgr.c b/common/commit-mgr.c index bf28a5b9..b83b509f 100644 --- a/common/commit-mgr.c +++ b/common/commit-mgr.c @@ -168,6 +168,7 @@ seaf_commit_free (SeafCommit *commit) g_free (commit->client_version); g_free (commit->magic); g_free (commit->random_key); + g_free (commit->salt); g_free (commit); } diff --git a/scripts/sql/mysql/seafile.sql b/scripts/sql/mysql/seafile.sql index ca4b5184..5f783c99 100644 --- a/scripts/sql/mysql/seafile.sql +++ b/scripts/sql/mysql/seafile.sql @@ -178,6 +178,8 @@ CREATE TABLE IF NOT EXISTS RepoInfo (id BIGINT NOT NULL PRIMARY KEY AUTO_INCREME is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, + enc_version INTEGER, + salt CHAR(64), UNIQUE INDEX(repo_id) ) ENGINE=INNODB; diff --git a/scripts/sql/sqlite/seafile.sql b/scripts/sql/sqlite/seafile.sql index de9e40d6..532ee10d 100644 --- a/scripts/sql/sqlite/seafile.sql +++ b/scripts/sql/sqlite/seafile.sql @@ -42,7 +42,7 @@ CREATE TABLE IF NOT EXISTS FolderGroupPerm (repo_id CHAR(36) NOT NULL, path TEXT CREATE INDEX IF NOT EXISTS folder_group_perm_idx ON FolderGroupPerm(repo_id); CREATE TABLE IF NOT EXISTS FolderPermTimestamp (repo_id CHAR(36) PRIMARY KEY, timestamp INTEGER); CREATE TABLE IF NOT EXISTS WebUploadTempFiles (repo_id CHAR(40) NOT NULL, file_path TEXT NOT NULL, tmp_file_path TEXT NOT NULL); -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), status INTEGER DEFAULT 0); +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), status INTEGER DEFAULT 0, enc_version INTEGER, salt CHAR(64)); CREATE TABLE IF NOT EXISTS RepoStorageId (repo_id CHAR(40) NOT NULL, storage_id VARCHAR(255) NOT NULL); CREATE TABLE IF NOT EXISTS UserQuota (user VARCHAR(255) PRIMARY KEY, quota BIGINT); CREATE TABLE IF NOT EXISTS UserShareQuota (user VARCHAR(255) PRIMARY KEY, quota BIGINT); diff --git a/server/repo-mgr.c b/server/repo-mgr.c index a6a5c204..87aa80b3 100644 --- a/server/repo-mgr.c +++ b/server/repo-mgr.c @@ -837,7 +837,8 @@ seaf_repo_manager_branch_repo_unmap (SeafRepoManager *manager, SeafBranch *branc 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 version, gboolean is_encrypted, const char *last_modifier, + int enc_version, const char *salt) { char *sql; gboolean exists = FALSE, db_err = FALSE; @@ -852,27 +853,32 @@ set_repo_commit_to_db (const char *repo_id, const char *repo_name, gint64 update 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, + "last_modifier=?, enc_version=?, salt=? WHERE repo_id=?"; + if (seaf_db_statement_query (seaf->db, sql, 8, "string", repo_name, "int64", update_time, "int", version, "int", (is_encrypted ? 1:0), "string", last_modifier, + "int", enc_version, + "string", salt, "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, + sql = "INSERT INTO RepoInfo (repo_id, name, update_time, version, " + "is_encrypted, last_modifier, enc_version, salt) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + if (seaf_db_statement_query (seaf->db, sql, 8, "string", repo_id, "string", repo_name, "int64", update_time, "int", version, "int", (is_encrypted ? 1:0), - "string", last_modifier) < 0) { + "string", last_modifier, + "int", enc_version, + "string", salt) < 0) { seaf_warning ("Failed to add repo info for repo %s.\n", repo_id); return -1; } @@ -929,7 +935,12 @@ load_mini_repo (SeafRepoManager *manager, SeafRepo *repo) repo->last_modify = commit->ctime; repo->version = commit->version; repo->last_modifier = g_strdup (commit->creator_name); - + if (repo->encrypted) { + repo->enc_version = commit->enc_version; + if (repo->enc_version == 3) { + memcpy (repo->salt, commit->salt, 64); + } + } seaf_commit_unref (commit); } @@ -1060,7 +1071,8 @@ 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), status INTEGER DEFAULT 0, UNIQUE INDEX(repo_id)) ENGINE=INNODB"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, " + "enc_version INTEGER, salt CHAR(64), UNIQUE INDEX(repo_id)) ENGINE=INNODB"; if (seaf_db_query (db, sql) < 0) return -1; @@ -1214,7 +1226,8 @@ 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), status INTEGER DEFAULT 0)"; + "is_encrypted INTEGER, last_modifier VARCHAR(255), status INTEGER DEFAULT 0, " + "enc_version INTEGER, salt CHAR(64))"; if (seaf_db_query (db, sql) < 0) return -1; @@ -2218,6 +2231,8 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) 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); + int enc_version = seaf_db_row_get_column_int (row, 9); + const char *salt = seaf_db_row_get_column_text (row, 10); repo = seaf_repo_new (repo_id, NULL, NULL); if (!repo) @@ -2238,6 +2253,12 @@ collect_repos_fill_size_commit (SeafDBRow *row, void *data) repo->encrypted = is_encrypted; repo->last_modifier = g_strdup (last_modifier); repo->status = status; + if (is_encrypted) { + repo->enc_version = enc_version; + if (enc_version == 3) { + memcpy (repo->salt, salt, 64); + } + } } out: @@ -2262,7 +2283,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, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.enc_version, i.salt 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 " @@ -2271,7 +2292,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, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.enc_version, i.salt 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 " @@ -2286,7 +2307,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, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.enc_version, i.salt 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 " @@ -2296,7 +2317,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, i.status FROM " + "i.version, i.is_encrypted, i.last_modifier, i.status, i.enc_version, i.salt 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 " @@ -2323,7 +2344,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, if (!repo->is_corrupted) set_repo_commit_to_db (repo->id, repo->name, repo->last_modify, repo->version, (repo->encrypted ? 1 : 0), - repo->last_modifier); + repo->last_modifier, repo->enc_version, + repo->salt); } } else { if (repo->is_corrupted) { @@ -2335,7 +2357,8 @@ seaf_repo_manager_get_repos_by_owner (SeafRepoManager *mgr, if (!repo->is_corrupted) set_repo_commit_to_db (repo->id, repo->name, repo->last_modify, repo->version, (repo->encrypted ? 1 : 0), - repo->last_modifier); + repo->last_modifier, repo->enc_version, + repo->salt); } if (repo->is_corrupted) { seaf_repo_unref (repo); @@ -3040,6 +3063,8 @@ get_group_repos_cb (SeafDBRow *row, void *data) 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); + int enc_version = seaf_db_row_get_column_int (row, 15); + const char *salt = seaf_db_row_get_column_text (row, 16); char *user_name_l = g_ascii_strdown (user_name, -1); @@ -3061,7 +3086,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, 15); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 17); g_object_set (srepo, "store_id", origin_repo_id, "origin_repo_id", origin_repo_id, "origin_repo_name", origin_repo_name, @@ -3077,6 +3102,13 @@ get_group_repos_cb (SeafDBRow *row, void *data) "version", version, "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); + + if (is_encrypted) { + g_object_set (srepo, "enc_version", enc_version, NULL); + if (enc_version == 3) { + g_object_set (srepo, "salt", salt, NULL); + } + } } *p_list = g_list_prepend (*p_list, srepo); } @@ -3124,9 +3156,16 @@ seaf_fill_repo_obj_from_commit (GList **repos) "last_modifier", commit->creator_name, NULL); + if (commit->encrypted) { + g_object_set (repo, "enc_version", commit->enc_version, NULL); + if (commit->enc_version == 3) { + g_object_set (repo, "salt", commit->salt, NULL); + } + } /* Set to database */ set_repo_commit_to_db (repo_id, commit->repo_name, commit->ctime, commit->version, - commit->encrypted, commit->creator_name); + commit->encrypted, commit->creator_name, commit->enc_version, + commit->salt); seaf_commit_unref (commit); } g_free (repo_id); @@ -3153,7 +3192,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -3191,7 +3231,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -3342,6 +3383,8 @@ collect_public_repos (SeafDBRow *row, void *data) 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); + int enc_version = seaf_db_row_get_column_int (row, 14); + const char *salt = seaf_db_row_get_column_text (row, 15); char *owner_l = g_ascii_strdown (owner, -1); @@ -3377,6 +3420,13 @@ collect_public_repos (SeafDBRow *row, void *data) "version", version, "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); + + if (is_encrypted) { + g_object_set (srepo, "enc_version", enc_version, NULL); + if (enc_version == 3) { + g_object_set (srepo, "salt", salt, NULL); + } + } } *ret = g_list_prepend (*ret, srepo); @@ -3394,7 +3444,8 @@ 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.status " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -3436,7 +3487,8 @@ 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.status " + "i.update_time, i.version, i.is_encrypted, i.last_modifier," + "i.status, i.enc_version, i.salt " "FROM InnerPubRepo LEFT JOIN VirtualRepo ON " "InnerPubRepo.repo_id=VirtualRepo.repo_id " "LEFT JOIN RepoInfo i ON InnerPubRepo.repo_id = i.repo_id " @@ -4208,7 +4260,8 @@ seaf_repo_manager_update_repo_info (SeafRepoManager *mgr, } set_repo_commit_to_db (repo_id, head->repo_name, head->ctime, head->version, - (head->encrypted ? 1 : 0), head->creator_name); + (head->encrypted ? 1 : 0), head->creator_name, head->enc_version, + head->salt); seaf_commit_unref (head); } @@ -4251,7 +4304,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM RepoGroup LEFT JOIN VirtualRepo v ON " "RepoGroup.repo_id = v.repo_id " @@ -4265,7 +4319,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo) " "FROM OrgGroupRepo LEFT JOIN VirtualRepo v ON " "OrgGroupRepo.repo_id = v.repo_id " @@ -4330,7 +4385,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name FROM RepoInfo WHERE repo_id=v.origin_repo)" "FROM %s g LEFT JOIN VirtualRepo v ON " "g.repo_id = v.repo_id " diff --git a/server/repo-mgr.h b/server/repo-mgr.h index ccc06b08..d777b7eb 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -861,7 +861,8 @@ seaf_repo_manager_update_repo_info (SeafRepoManager *mgr, 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 version, gboolean is_encrypted, const char *last_modifier, + int enc_version, const char *salt); char * seaf_get_trash_repo_owner (const char *repo_id); diff --git a/server/share-mgr.c b/server/share-mgr.c index 8f72b419..8dda2f14 100644 --- a/server/share-mgr.c +++ b/server/share-mgr.c @@ -190,7 +190,9 @@ collect_repos (SeafDBRow *row, void *data) 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); - const char *origin_repo_name = seaf_db_row_get_column_text (row, 14); + int enc_version = seaf_db_row_get_column_int (row, 14); + const char *salt = seaf_db_row_get_column_text (row, 15); + const char *origin_repo_name = seaf_db_row_get_column_text (row, 16); char *email_l = g_ascii_strdown (email, -1); @@ -226,6 +228,13 @@ collect_repos (SeafDBRow *row, void *data) "version", version, "encrypted", is_encrypted, "last_modifier", last_modifier, NULL); + + if (is_encrypted) { + g_object_set (repo, "enc_version", enc_version, NULL); + if (enc_version == 3) { + g_object_set (repo, "salt", salt, NULL); + } + } } *p_repos = g_list_prepend (*p_repos, repo); } @@ -273,9 +282,17 @@ seaf_fill_repo_commit_if_not_in_db (GList **repos) "last_modifier", commit->creator_name, NULL); + if (commit->encrypted) { + g_object_set (repo, "enc_version", commit->enc_version, NULL); + if (commit->enc_version == 3) { + g_object_set (repo, "salt", commit->salt, NULL); + } + } + /* Set to database */ set_repo_commit_to_db (repo_id, commit->repo_name, commit->ctime, commit->version, - commit->encrypted, commit->creator_name); + commit->encrypted, commit->creator_name, commit->enc_version, + commit->salt); seaf_commit_unref (commit); } @@ -303,7 +320,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -317,7 +335,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -349,7 +368,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -364,7 +384,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -805,7 +826,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(SELECT name from RepoInfo WHERE repo_id=v.origin_repo) FROM " "SharedRepo sh LEFT JOIN VirtualRepo v ON " "sh.repo_id=v.repo_id " @@ -818,7 +840,8 @@ 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.status, " + "i.update_time, i.version, i.is_encrypted, i.last_modifier, " + "i.status, i.enc_version, i.salt, " "(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/virtual-repo.c b/server/virtual-repo.c index 745dbf09..5cf0b723 100644 --- a/server/virtual-repo.c +++ b/server/virtual-repo.c @@ -139,7 +139,8 @@ do_create_virtual_repo (SeafRepoManager *mgr, } if (set_repo_commit_to_db (repo_id, repo_name, commit->ctime, - repo->version, repo->encrypted, user) < 0) { + repo->version, repo->encrypted, user, + repo->enc_version, repo->salt) < 0) { seaf_warning("Failed to add repo info.\n"); g_set_error (error, SEAFILE_DOMAIN, SEAF_ERR_GENERAL, "Failed to add repo info"); diff --git a/tests/conf/ccnet.conf b/tests/conf/ccnet.conf index 491c37d9..a28c92d7 100644 --- a/tests/conf/ccnet.conf +++ b/tests/conf/ccnet.conf @@ -10,13 +10,13 @@ PORT = 10002 [Client] PORT = 9999 -[Database] -CREATE_TABLES = true - #[Database] -#ENGINE = mysql -#HOST = 127.0.0.1 -#USER = seafile -#PASSWD = root -#DB = ccnet-db -#CREATE_TABLES=true +#CREATE_TABLES = true + +[Database] +ENGINE = mysql +HOST = 127.0.0.1 +USER = seafile +PASSWD = 123 +DB = ccnet-db +CREATE_TABLES=true diff --git a/tests/test_get_repo_list/test_get_repo_list.py b/tests/test_get_repo_list/test_get_repo_list.py index f624e336..81b3b43b 100644 --- a/tests/test_get_repo_list/test_get_repo_list.py +++ b/tests/test_get_repo_list/test_get_repo_list.py @@ -8,7 +8,7 @@ 'last_modifier', 'head_cmmt_id', 'repo_id', 'repo_name', 'last_modified', 'encrypted', 'is_virtual', 'origin_repo_id', 'origin_repo_name', 'origin_path', 'store_id' ,'share_type', - 'permission', 'user', 'group_id'] + 'permission', 'user', 'group_id', 'enc_version', 'salt'] def assert_by_attr_name (repo, repo_to_test, attr): if (attr == 'id'): @@ -44,7 +44,16 @@ def assert_by_attr_name (repo, repo_to_test, attr): elif (attr == 'permission'): assert getattr(repo_to_test, attr) == 'rw' elif (attr == 'group_id'): - assert getattr(repo_to_test,attr) != 0 + assert getattr(repo_to_test, attr) != 0 + elif (attr == 'enc_version'): + assert getattr(repo_to_test, attr) == repo.enc_version + elif (attr == 'salt'): + enc_version = getattr(repo_to_test, 'enc_version') + if (enc_version >= 3): + assert getattr(repo_to_test, attr) + else: + assert getattr(repo_to_test, attr) == None + assert getattr(repo_to_test, attr) == repo.salt def assert_public_repos_attr(repo, repo_to_test): for attr in attr_to_assert: @@ -81,33 +90,54 @@ def assert_group_repos_attr(repo, repo_to_test): assert_by_attr_name(repo, repo_to_test, attr) -def test_get_group_repos(repo, group): - repo = api.get_repo(repo.id) - api.group_share_repo(repo.id, group.id, USER, 'rw') +repo_name = 'test_get_repo_list' +password = 'test_get_repo_list' +@pytest.mark.parametrize('is_encrypted, enc_version' ,[(False, 0), (True, 2), (True, 3)]) +def test_get_group_repos(group, is_encrypted, enc_version): + if is_encrypted: + repo_id = api.create_repo(repo_name, '', USER, password, enc_version) + else: + repo_id = api.create_repo(repo_name, '', USER) + api.post_dir(repo_id, '/', 'dir1', USER) + + repo = api.get_repo(repo_id) + api.group_share_repo(repo_id, group.id, USER, 'rw') repos = api.get_repos_by_group(group.id) assert_group_repos_attr(repo, repos[0]) repos = api.get_group_repos_by_owner(USER) assert_group_repos_attr(repo, repos[0]) - v_repo_id = api.share_subdir_to_group(repo.id, '/dir1', USER, group.id, 'rw') + if is_encrypted: + v_repo_id = api.share_subdir_to_group(repo_id, '/dir1', USER, group.id, 'rw', password) + else: + v_repo_id = api.share_subdir_to_group(repo_id, '/dir1', USER, group.id, 'rw') + v_repo = api.get_repo(v_repo_id) - v_repo_to_test = api.get_group_shared_repo_by_path(repo.id, '/dir1', group.id) + v_repo_to_test = api.get_group_shared_repo_by_path(repo_id, '/dir1', group.id) assert_group_repos_attr(v_repo, v_repo_to_test) - api.unshare_subdir_for_group(repo.id, '/dir1', USER, group.id) + api.unshare_subdir_for_group(repo_id, '/dir1', USER, group.id) repos = api.get_group_repos_by_user(USER) assert_group_repos_attr(repo, repos[0]) - assert api.group_unshare_repo(repo.id, group.id, USER) == 0 + assert api.group_unshare_repo(repo_id, group.id, USER) == 0 + api.remove_repo(repo_id) + +@pytest.mark.parametrize('is_encrypted, enc_version' ,[(False, 0), (True, 2), (True, 3)]) +def test_get_inner_pub_repos(is_encrypted, enc_version): + if is_encrypted: + repo_id = api.create_repo(repo_name, '', USER, password, enc_version) + else: + repo_id = api.create_repo(repo_name, '', USER) -def test_get_inner_pub_repos(repo): - repo = api.get_repo(repo.id) - api.add_inner_pub_repo(repo.id, 'rw') + repo = api.get_repo(repo_id) + api.add_inner_pub_repo(repo_id, 'rw') repos = api.get_inner_pub_repo_list() assert_public_repos_attr(repo, repos[0]) repos = api.list_inner_pub_repos_by_owner(USER) assert_public_repos_attr(repo, repos[0]) - assert api.remove_inner_pub_repo(repo.id) == 0 + assert api.remove_inner_pub_repo(repo_id) == 0 + api.remove_repo(repo_id)