Skip to content

Commit

Permalink
Add enc_version and salt to RepoInfo.
Browse files Browse the repository at this point in the history
  • Loading branch information
ly1217 committed Oct 31, 2019
1 parent 6a428da commit fd6fe4d
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 50 deletions.
1 change: 1 addition & 0 deletions common/commit-mgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
2 changes: 2 additions & 0 deletions scripts/sql/mysql/seafile.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion scripts/sql/sqlite/seafile.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
108 changes: 82 additions & 26 deletions server/repo-mgr.c

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion server/repo-mgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
39 changes: 31 additions & 8 deletions server/share-mgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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 "
Expand All @@ -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 "
Expand Down Expand Up @@ -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 "
Expand All @@ -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 "
Expand Down Expand Up @@ -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 "
Expand All @@ -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 "
Expand Down
3 changes: 2 additions & 1 deletion server/virtual-repo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
56 changes: 43 additions & 13 deletions tests/test_get_repo_list/test_get_repo_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'):
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)

0 comments on commit fd6fe4d

Please sign in to comment.