1
0
mirror of https://github.com/haiwen/seafile-server.git synced 2025-09-01 15:36:37 +00:00

Get nickname use seahub API (#670)

* Get nickname use seahub API

* Add parse site_root

* Use regex to match SECRET_KEY

---------

Co-authored-by: 杨赫然 <heran.yang@seafile.com>
This commit is contained in:
feiniks
2024-07-30 17:58:18 +08:00
committed by GitHub
parent 7d26e0a8f4
commit 49c860b50d
11 changed files with 392 additions and 200 deletions

View File

@@ -5,6 +5,7 @@
#include <jansson.h>
#include <timer.h>
#include <jwt.h>
#include "seafile-session.h"
#include "http-tx-mgr.h"
@@ -289,29 +290,13 @@ send_request (void *ptr, size_t size, size_t nmemb, void *userp)
return copy_size;
}
int
http_post (Connection *conn, const char *url, const char *token,
const char *req_content, gint64 req_size,
int *rsp_status, char **rsp_content, gint64 *rsp_size,
gboolean timeout, int timeout_sec)
static int
http_post_common (CURL *curl, const char *url, const char *token,
const char *req_content, gint64 req_size,
int *rsp_status, char **rsp_content, gint64 *rsp_size,
gboolean timeout, int timeout_sec)
{
char *token_header;
struct curl_slist *headers = NULL;
int ret = 0;
CURL *curl;
curl = conn->curl;
g_return_val_if_fail (req_content != NULL, -1);
headers = curl_slist_append (headers, "User-Agent: Seafile/"SEAFILE_CLIENT_VERSION" ("USER_AGENT_OS")");
if (token) {
token_header = g_strdup_printf ("Seafile-Repo-Token: %s", token);
headers = curl_slist_append (headers, token_header);
g_free (token_header);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
@@ -378,9 +363,190 @@ http_post (Connection *conn, const char *url, const char *token,
out:
if (ret < 0) {
conn->release = TRUE;
g_free (rsp.content);
}
return ret;
}
int
http_post (Connection *conn, const char *url, const char *token,
const char *req_content, gint64 req_size,
int *rsp_status, char **rsp_content, gint64 *rsp_size,
gboolean timeout, int timeout_sec)
{
char *token_header;
struct curl_slist *headers = NULL;
int ret = 0;
CURL *curl;
curl = conn->curl;
headers = curl_slist_append (headers, "User-Agent: Seafile/"SEAFILE_CLIENT_VERSION" ("USER_AGENT_OS")");
if (token) {
token_header = g_strdup_printf ("Seafile-Repo-Token: %s", token);
headers = curl_slist_append (headers, token_header);
g_free (token_header);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
}
g_return_val_if_fail (req_content != NULL, -1);
ret = http_post_common (curl, url, token, req_content, req_size,
rsp_status, rsp_content, rsp_size, timeout, timeout_sec);
if (ret < 0) {
conn->release = TRUE;
}
curl_slist_free_all (headers);
return ret;
}
static char *
parse_nickname (const char *rsp_content, int rsp_size)
{
json_t *array = NULL, *object, *member;
json_error_t jerror;
size_t n;
int i;
char *nickname = NULL;
object = json_loadb (rsp_content, rsp_size, 0, &jerror);
if (!object) {
seaf_warning ("Parse response failed: %s.\n", jerror.text);
return NULL;
}
array = json_object_get (object, "user_list");
if (!array) {
goto out;
}
n = json_array_size (array);
for (i = 0; i < n; ++i) {
json_t *obj = json_array_get (array, i);
member = json_object_get (obj, "name");
if (!member) {
continue;
}
nickname = g_strdup (json_string_value(member));
break;
}
out:
json_decref (object);
return nickname;
}
static char *
gen_jwt_token ()
{
char *jwt_token = NULL;
gint64 now = (gint64)time(NULL);
jwt_t *jwt = NULL;
if (!seaf->seahub_pk) {
return NULL;
}
int ret = jwt_new (&jwt);
if (ret != 0 || jwt == NULL) {
seaf_warning ("Failed to create jwt\n");
goto out;
}
ret = jwt_add_grant_bool (jwt, "is_internal", TRUE);
if (ret != 0) {
seaf_warning ("Failed to add is_internal to jwt\n");
goto out;
}
ret = jwt_add_grant_int (jwt, "exp", now + 300);
if (ret != 0) {
seaf_warning ("Failed to add expire time to jwt\n");
goto out;
}
ret = jwt_set_alg (jwt, JWT_ALG_HS256, (unsigned char *)seaf->seahub_pk, strlen(seaf->seahub_pk));
if (ret != 0) {
seaf_warning ("Failed to set alg\n");
goto out;
}
jwt_token = jwt_encode_str (jwt);
out:
jwt_free (jwt);
return jwt_token;
}
char *
http_tx_manager_get_nickname (const char *modifier)
{
Connection *conn = NULL;
char *token_header;
struct curl_slist *headers = NULL;
int ret = 0;
CURL *curl;
json_t *content = NULL;
json_t *array = NULL;
int rsp_status;
char *req_content = NULL;
char *jwt_token = NULL;
char *rsp_content = NULL;
char *nickname = NULL;
gint64 rsp_size;
jwt_token = gen_jwt_token ();
if (!jwt_token) {
return NULL;
}
conn = connection_pool_get_connection (seaf->seahub_conn_pool);
if (!conn) {
g_free (jwt_token);
seaf_warning ("Failed to get connection: out of memory.\n");
return NULL;
}
content = json_object ();
array = json_array ();
json_array_append_new (array, json_string (modifier));
json_object_set_new (content, "user_id_list", array);
req_content = json_dumps (content, JSON_COMPACT);
if (!req_content) {
json_decref (content);
seaf_warning ("Failed to dump json request.\n");
goto out;
}
json_decref (content);
curl = conn->curl;
headers = curl_slist_append (headers, "User-Agent: Seafile/"SEAFILE_CLIENT_VERSION" ("USER_AGENT_OS")");
token_header = g_strdup_printf ("Authorization: Token %s", jwt_token);
headers = curl_slist_append (headers, token_header);
headers = curl_slist_append (headers, "Content-Type: application/json");
g_free (token_header);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
ret = http_post_common (curl, seaf->seahub_url, jwt_token, req_content, strlen(req_content),
&rsp_status, &rsp_content, &rsp_size, TRUE, 1);
if (ret < 0) {
conn->release = TRUE;
goto out;
}
if (rsp_status != HTTP_OK) {
seaf_warning ("Failed to get user list from seahub %d.\n",
rsp_status);
}
nickname = parse_nickname (rsp_content, rsp_size);
out:
g_free (jwt_token);
g_free (req_content);
g_free (rsp_content);
connection_pool_return_connection (seaf->seahub_conn_pool, conn);
return nickname;
}