diff --git a/common/rpc-service.c b/common/rpc-service.c index 3e94a0a..0767ec9 100644 --- a/common/rpc-service.c +++ b/common/rpc-service.c @@ -1399,6 +1399,7 @@ seafile_web_get_access_token (const char *repo_id, const char *obj_id, const char *op, const char *username, + const char *friendly_name, int use_onetime, GError **error) { @@ -1411,7 +1412,8 @@ seafile_web_get_access_token (const char *repo_id, token = seaf_web_at_manager_get_access_token (seaf->web_at_mgr, repo_id, obj_id, op, - username, use_onetime, error); + username, friendly_name, + use_onetime, error); return token; } diff --git a/include/seafile-rpc.h b/include/seafile-rpc.h index b639292..b418252 100644 --- a/include/seafile-rpc.h +++ b/include/seafile-rpc.h @@ -494,6 +494,7 @@ seafile_web_get_access_token (const char *repo_id, const char *obj_id, const char *op, const char *username, + const char *friendly_name, int use_onetime, GError **error); diff --git a/lib/webaccess.vala b/lib/webaccess.vala index ecdba49..5641b64 100644 --- a/lib/webaccess.vala +++ b/lib/webaccess.vala @@ -5,6 +5,7 @@ public class WebAccess : Object { public string obj_id { set; get; } public string op { set; get; } public string username { set; get; } + public string friendly_name { set; get; } } } diff --git a/python/seafile/rpcclient.py b/python/seafile/rpcclient.py index 4786713..ff57b52 100644 --- a/python/seafile/rpcclient.py +++ b/python/seafile/rpcclient.py @@ -753,8 +753,8 @@ class SeafServerThreadedRpcClient(NamedPipeClient): pass # token for web access to repo - @searpc_func("string", ["string", "string", "string", "string", "int"]) - def seafile_web_get_access_token(repo_id, obj_id, op, username, use_onetime=1): + @searpc_func("string", ["string", "string", "string", "string", "string", "int"]) + def seafile_web_get_access_token(repo_id, obj_id, op, username, friendly_name, use_onetime=1): pass web_get_access_token = seafile_web_get_access_token diff --git a/python/seaserv/api.py b/python/seaserv/api.py index 5c07bf0..b105f44 100644 --- a/python/seaserv/api.py +++ b/python/seaserv/api.py @@ -23,7 +23,7 @@ class SeafileAPI(object): # fileserver token - def get_fileserver_access_token(self, repo_id, obj_id, op, username, use_onetime=True): + def get_fileserver_access_token(self, repo_id, obj_id, op, username, friendly_name, use_onetime=True): """Generate token for access file/dir in fileserver op: the operation, can be 'view', 'download', 'download-dir', 'downloadblks', @@ -33,7 +33,7 @@ class SeafileAPI(object): Return: the access token in string """ onetime = 1 if bool(use_onetime) else 0 - return seafserv_threaded_rpc.web_get_access_token(repo_id, obj_id, op, username, + return seafserv_threaded_rpc.web_get_access_token(repo_id, obj_id, op, username, friendly_name, onetime) def query_fileserver_access_token(self, token): diff --git a/server/repo-mgr.h b/server/repo-mgr.h index 358e7d3..0921f1b 100644 --- a/server/repo-mgr.h +++ b/server/repo-mgr.h @@ -360,6 +360,7 @@ seaf_repo_manager_commit_file_blocks (SeafRepoManager *mgr, const char *file_name, const char *blockids_json, const char *user, + const char *friendly_name, gint64 file_size, int replace_existed, char **new_id, diff --git a/server/repo-op.c b/server/repo-op.c index 0061bde..071cbe4 100644 --- a/server/repo-op.c +++ b/server/repo-op.c @@ -1506,6 +1506,7 @@ seaf_repo_manager_commit_file_blocks (SeafRepoManager *mgr, const char *file_name, const char *blockids_json, const char *user, + const char *friendly_name, gint64 file_size, int replace_existed, char **new_id, @@ -1566,9 +1567,12 @@ seaf_repo_manager_commit_file_blocks (SeafRepoManager *mgr, } rawdata_to_hex(sha1, hex, 20); + const char *username = user; + if (friendly_name) + username = friendly_name; new_dent = seaf_dirent_new (dir_version_from_repo_version(repo->version), hex, STD_FILE_MODE, file_name, - (gint64)time(NULL), user, file_size); + (gint64)time(NULL), username, file_size); root_id = do_post_file_replace (repo, head_commit->root_id, canon_path, replace_existed, new_dent); @@ -1584,7 +1588,7 @@ seaf_repo_manager_commit_file_blocks (SeafRepoManager *mgr, *new_id = g_strdup(hex); snprintf(buf, SEAF_PATH_MAX, "Added \"%s\"", file_name); if (gen_new_commit (repo_id, head_commit, root_id, - user, NULL, buf, NULL, TRUE, error) < 0) + user, friendly_name, buf, NULL, TRUE, error) < 0) ret = -1; out: diff --git a/server/seaf-server.c b/server/seaf-server.c index 20b00b0..67e21ce 100644 --- a/server/seaf-server.c +++ b/server/seaf-server.c @@ -571,7 +571,7 @@ static void start_rpc_service (const char *seafile_dir, searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_web_get_access_token, "seafile_web_get_access_token", - searpc_signature_string__string_string_string_string_int()); + searpc_signature_string__string_string_string_string_string_int()); searpc_server_register_function ("seafserv-threaded-rpcserver", seafile_web_query_access_token, "seafile_web_query_access_token", diff --git a/server/upload-file.c b/server/upload-file.c index 930612a..fde8322 100755 --- a/server/upload-file.c +++ b/server/upload-file.c @@ -59,6 +59,7 @@ typedef struct RecvFSM { char *repo_id; char *user; + char *friendly_name; char *boundary; /* boundary of multipart form-data. */ char *input_name; /* input name of the current form field. */ char *parent_dir; @@ -382,7 +383,7 @@ create_relative_path (RecvFSM *fsm, char *parent_dir, char *relative_path) parent_dir, relative_path, fsm->user, - NULL, + fsm->friendly_name, &error); if (rc < 0) { if (error) { @@ -575,7 +576,7 @@ upload_api_cb(evhtp_request_t *req, void *arg) filenames_json, tmp_files_json, fsm->user, - NULL, + fsm->friendly_name, replace, &ret_json, fsm->need_idx_progress ? &task_id : NULL, @@ -768,6 +769,7 @@ upload_blks_api_cb(evhtp_request_t *req, void *arg) file_name, blockids_json, fsm->user, + fsm->friendly_name, file_size, replace, &new_file_id, @@ -1191,7 +1193,7 @@ upload_ajax_cb(evhtp_request_t *req, void *arg) filenames_json, tmp_files_json, fsm->user, - NULL, + fsm->friendly_name, 0, &ret_json, fsm->need_idx_progress ? &task_id : NULL, @@ -1350,7 +1352,7 @@ update_api_cb(evhtp_request_t *req, void *arg) parent_dir, filename, fsm->user, - NULL, + fsm->friendly_name, head_id, &new_file_id, &error); @@ -1463,6 +1465,7 @@ update_blks_api_cb(evhtp_request_t *req, void *arg) filename, blockids_json, fsm->user, + fsm->friendly_name, file_size, 1, &new_file_id, @@ -1719,7 +1722,7 @@ update_ajax_cb(evhtp_request_t *req, void *arg) parent_dir, filename, fsm->user, - NULL, + fsm->friendly_name, head_id, &new_file_id, &error); @@ -2321,6 +2324,7 @@ check_access_token (const char *token, char **repo_id, char **parent_dir, char **user, + char **friendly_name, char **token_type, char **err_msg) { @@ -2364,6 +2368,7 @@ check_access_token (const char *token, *repo_id = g_strdup (_repo_id); *user = g_strdup (seafile_web_access_get_username (webaccess)); + *friendly_name = g_strdup (seafile_web_access_get_friendly_name (webaccess)); _obj_id = seafile_web_access_get_obj_id (webaccess); parent_dir_json = json_loadb (_obj_id, strlen (_obj_id), 0, NULL); @@ -2460,7 +2465,7 @@ static evhtp_res upload_headers_cb (evhtp_request_t *req, evhtp_headers_t *hdr, void *arg) { char **parts = NULL; - char *token, *repo_id = NULL, *user = NULL; + char *token, *repo_id = NULL, *user = NULL, *friendly_name = NULL; char *parent_dir = NULL; char *boundary = NULL; gint64 content_len; @@ -2490,7 +2495,7 @@ upload_headers_cb (evhtp_request_t *req, evhtp_headers_t *hdr, void *arg) } char *url_op = parts[0]; - if (check_access_token (token, url_op, &repo_id, &parent_dir, &user, &token_type, &err_msg) < 0) { + if (check_access_token (token, url_op, &repo_id, &parent_dir, &user, &friendly_name, &token_type, &err_msg) < 0) { error_code = EVHTP_RES_FORBIDDEN; goto err; } @@ -2530,6 +2535,7 @@ upload_headers_cb (evhtp_request_t *req, evhtp_headers_t *hdr, void *arg) fsm->repo_id = repo_id; fsm->parent_dir = parent_dir; fsm->user = user; + fsm->friendly_name = friendly_name; fsm->token_type = token_type; fsm->rstart = rstart; fsm->rend = rend; @@ -2575,6 +2581,7 @@ err: g_free (repo_id); g_free (user); + g_free (friendly_name); g_free (boundary); g_free (token_type); g_free (progress_id); diff --git a/server/web-accesstoken-mgr.c b/server/web-accesstoken-mgr.c index d6504bd..562b68b 100644 --- a/server/web-accesstoken-mgr.c +++ b/server/web-accesstoken-mgr.c @@ -34,6 +34,7 @@ typedef struct { char *obj_id; char *op; char *username; + char *friendly_name; long expire_time; gboolean use_onetime; } AccessInfo; @@ -48,6 +49,7 @@ free_access_info (AccessInfo *info) g_free (info->obj_id); g_free (info->op); g_free (info->username); + g_free (info->friendly_name); g_free (info); } @@ -128,6 +130,7 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, const char *obj_id, const char *op, const char *username, + const char *friendly_name, int use_onetime, GError **error) { @@ -167,6 +170,7 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, info->obj_id = g_strdup (obj_id); info->op = g_strdup (op); info->username = g_strdup (username); + info->friendly_name = g_strdup (friendly_name); info->expire_time = expire; if (use_onetime) { info->use_onetime = TRUE; @@ -188,6 +192,7 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, "obj_id", info->obj_id, "op", info->op, "username", info->username, + "friendly_name", info->friendly_name, NULL); if (zip_download_mgr_start_zip_task (seaf->zip_download_mgr, @@ -231,6 +236,7 @@ seaf_web_at_manager_query_access_token (SeafWebAccessTokenManager *mgr, "obj_id", info->obj_id, "op", info->op, "username", info->username, + "friendly_name", info->friendly_name, NULL); if (info->use_onetime) { diff --git a/server/web-accesstoken-mgr.h b/server/web-accesstoken-mgr.h index b2d310f..bbb15b4 100644 --- a/server/web-accesstoken-mgr.h +++ b/server/web-accesstoken-mgr.h @@ -28,6 +28,7 @@ seaf_web_at_manager_get_access_token (SeafWebAccessTokenManager *mgr, const char *obj_id, const char *op, const char *username, + const char *friendly_name, int use_onetime, GError **error); diff --git a/tests/test_file_operation/test_merge_virtual_repo.py b/tests/test_file_operation/test_merge_virtual_repo.py index 4ab79a1..3889203 100644 --- a/tests/test_file_operation/test_merge_virtual_repo.py +++ b/tests/test_file_operation/test_merge_virtual_repo.py @@ -113,7 +113,7 @@ def test_merge_virtual_repo(repo): create_test_dir(repo,'test') #test upload file to vritual repo root dir. - token = api.get_fileserver_access_token(v_repo_id, obj_id, 'upload', USER2, False) + token = api.get_fileserver_access_token(v_repo_id, obj_id, 'upload', USER2, USERNAME2, False) upload_url_base = 'http://127.0.0.1:8082/upload-api/' + token m = MultipartEncoder( fields={ @@ -165,7 +165,7 @@ def test_merge_virtual_repo(repo): #test update file to virtual repo. write_file(file_path, file_content) - token = api.get_fileserver_access_token(v_repo_id, obj_id, 'update', USER2, False) + token = api.get_fileserver_access_token(v_repo_id, obj_id, 'update', USER2, USERNAME2, False) update_url_base = 'http://127.0.0.1:8082/update-api/' + token m = MultipartEncoder( fields={ diff --git a/tests/test_file_operation/test_upload_and_update.py b/tests/test_file_operation/test_upload_and_update.py index 3b81554..3976c72 100644 --- a/tests/test_file_operation/test_upload_and_update.py +++ b/tests/test_file_operation/test_upload_and_update.py @@ -114,7 +114,7 @@ def test_ajax(repo): obj_id = '{"parent_dir":"/"}' #test upload file to test dir. - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-aj/'+ token m = MultipartEncoder( fields={ @@ -126,7 +126,7 @@ def test_ajax(repo): assert response.status_code == 403 #test upload file to root dir. - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-aj/'+ token m = MultipartEncoder( fields={ @@ -258,7 +258,7 @@ def test_ajax(repo): #test update file. write_file(file_path, file_content) - token = api.get_fileserver_access_token(repo.id, obj_id, 'update', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'update', USER, USERNAME, False) update_url_base = 'http://127.0.0.1:8082/update-aj/' + token m = MultipartEncoder( fields={ @@ -283,7 +283,7 @@ def test_api(repo): obj_id = '{"parent_dir":"/"}' create_test_dir(repo,'test') #test upload file to test dir instead of root dir. - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-api/' + token m = MultipartEncoder( fields={ @@ -296,7 +296,7 @@ def test_api(repo): #test upload file to root dir. params = {'ret-json':'1'} - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-api/' + token m = MultipartEncoder( fields={ @@ -497,7 +497,7 @@ def test_api(repo): #test update file. write_file(file_path, file_content) - token = api.get_fileserver_access_token(repo.id, obj_id, 'update', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'update', USER, USERNAME, False) update_url_base = 'http://127.0.0.1:8082/update-api/' + token m = MultipartEncoder( fields={ diff --git a/tests/test_file_operation/test_upload_large_files.py b/tests/test_file_operation/test_upload_large_files.py index 49816f1..c365722 100644 --- a/tests/test_file_operation/test_upload_large_files.py +++ b/tests/test_file_operation/test_upload_large_files.py @@ -119,7 +119,7 @@ def test_large_files_ajax(repo): # upload large file by upload-aj file_id1 = sha1sum(file_path) - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-aj/'+ token m = MultipartEncoder( fields={ @@ -133,7 +133,7 @@ def test_large_files_ajax(repo): # download file and check sha1 obj_id = api.get_file_id_by_path(repo.id, '/' + file_name) assert obj_id != None - token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, False) + token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, USERNAME, False) download_url = 'http://127.0.0.1:8082/files/' + token + '/' + file_name response = requests.get(download_url) assert response.status_code == 200 @@ -163,7 +163,7 @@ def test_large_files_ajax(repo): # download file and check sha1 obj_id = api.get_file_id_by_path(repo.id, '/' + resumable_file_name) assert obj_id != None - token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, False) + token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, USERNAME, False) download_url = 'http://127.0.0.1:8082/files/' + token + '/' + resumable_file_name response = requests.get(download_url) assert response.status_code == 200 @@ -184,7 +184,7 @@ def test_large_files_api(repo): #test upload file to root dir. file_id1 = sha1sum(file_path) params = {'ret-json':'1'} - token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, False) + token = api.get_fileserver_access_token(repo.id, obj_id, 'upload', USER, USERNAME, False) upload_url_base = 'http://127.0.0.1:8082/upload-api/' + token m = MultipartEncoder( fields={ @@ -198,7 +198,7 @@ def test_large_files_api(repo): # download file and check sha1 obj_id = api.get_file_id_by_path(repo.id, '/' + file_name) assert obj_id != None - token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, False) + token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, USERNAME, False) download_url = 'http://127.0.0.1:8082/files/' + token + '/' + file_name response = requests.get(download_url) assert response.status_code == 200 @@ -228,7 +228,7 @@ def test_large_files_api(repo): obj_id = api.get_file_id_by_path(repo.id, '/' + resumable_file_name) assert obj_id != None - token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, False) + token = api.get_fileserver_access_token (repo.id, obj_id, 'download', USER, USERNAME, False) download_url = 'http://127.0.0.1:8082/files/' + token + '/' + resumable_file_name response = requests.get(download_url) assert response.status_code == 200 diff --git a/tests/test_file_operation/test_zip_download.py b/tests/test_file_operation/test_zip_download.py index b8062be..93e7d67 100644 --- a/tests/test_file_operation/test_zip_download.py +++ b/tests/test_file_operation/test_zip_download.py @@ -42,7 +42,7 @@ def test_zip_download(): obj_id = {'obj_id': dir_id, 'dir_name': dir_name, 'is_windows': 0} obj_id_json_str = json.dumps(obj_id) token = api.get_fileserver_access_token(t_repo_id, obj_id_json_str, - 'download-dir', USER) + 'download-dir', USER, USERNAME) time.sleep(1) download_url = base_url + 'zip/' + token @@ -80,7 +80,7 @@ def test_zip_download(): obj_id = {'obj_id': dir_id, 'dir_name': empty_dir_name, 'is_windows': 0} obj_id_json_str = json.dumps(obj_id) token = api.get_fileserver_access_token(t_repo_id, obj_id_json_str, - 'download-dir', USER) + 'download-dir', USER, USERNAME) time.sleep(1) download_url = base_url + 'zip/' + token response = requests.get(download_url) @@ -105,7 +105,7 @@ def test_zip_download(): obj_id = {'parent_dir': '/', 'file_list': [file1_name, file2_name], 'is_windows' : 0} obj_id_json_str = json.dumps(obj_id) token = api.get_fileserver_access_token(t_repo_id, obj_id_json_str, - 'download-multi', USER) + 'download-multi', USER, USERNAME) time.sleep(1) download_url = base_url + 'zip/' + token