diff options
| author | fengweihao <[email protected]> | 2023-12-20 17:57:20 +0800 |
|---|---|---|
| committer | fengweihao <[email protected]> | 2023-12-20 17:57:20 +0800 |
| commit | 937b0f0ff92ae5569d4613e4797759b58bbbb76e (patch) | |
| tree | 4b7c66f17682433854d040eb7d840479c140314a /program/src | |
| parent | 36614dd842b102dbd8e809c640c719cb60002b02 (diff) | |
feature:适配MAAT4动态库名变更
Diffstat (limited to 'program/src')
| -rw-r--r-- | program/src/cert_session.cpp | 162 |
1 files changed, 91 insertions, 71 deletions
diff --git a/program/src/cert_session.cpp b/program/src/cert_session.cpp index cfd7645..a17df29 100644 --- a/program/src/cert_session.cpp +++ b/program/src/cert_session.cpp @@ -954,8 +954,7 @@ static int redis_async_connect(struct event_base *base, struct redisAsyncContext return 0; } -static int -evhttp_socket_send_error(struct evhttp_request *req, int error) +static int evhttp_socket_send_error(struct evhttp_request *req, int error) { FS_operate(g_FP_instance.handle, g_FP_instance.line_ids[KEYPAIR_ACTION_ERR], 0, FS_OP_ADD, 1); evhttp_send_error(req, error, 0); @@ -964,8 +963,7 @@ evhttp_socket_send_error(struct evhttp_request *req, int error) /* Callback used for the /dump URI, and for every non-GET request: * dumps all information to stdout and gives back a trivial 200 ok */ -static int -evhttp_socket_send(struct evhttp_request *req, char *sendbuf) +static int evhttp_socket_send(struct evhttp_request *req, char *sendbuf) { struct evbuffer *evb = NULL; @@ -989,8 +987,7 @@ done: return 0; } -static void -redis_reget_callback(redisAsyncContext __attribute__((__unused__))*cl_ctx, +static void redis_reget_callback(redisAsyncContext __attribute__((__unused__))*cl_ctx, void *r, void *privdata) { redisReply *reply = (redisReply*)r; @@ -1522,51 +1519,67 @@ void _urldecode(char url[]) free(res); } -static int http_decode_uri(struct evhttp_request *evh_req, struct http_request *request) +int http_get_headers(struct evhttp_request *evh_req, struct evkeyvalq *headers) { - int rv = 0; - struct evkeyvalq params; + int xret = -1; const char *uri = evhttp_request_get_uri(evh_req); - rv = evhttp_parse_query(uri, ¶ms); - if (rv != 0) + if(!uri) { - return -1; + return xret; } - const char *health_check = evhttp_find_header(¶ms, "health_check"); - if (health_check) + return evhttp_parse_query(uri, headers); +} + +int http_get_heal_check(struct evhttp_request *evh_req) +{ + int xret = -1; + struct evkeyvalq headers; + xret = http_get_headers(evh_req, &headers); + if(xret != 0) + { + return xret; + } + + xret = (evhttp_find_header(&headers, "health_check") != NULL) ? 1 : 0; + evhttp_clear_headers(&headers); + return xret; +} + +int http_get_request_uri(struct evhttp_request *evh_req, struct http_request *request) +{ + int xret=-1; + struct evkeyvalq headers; + + xret = http_get_headers(evh_req, &headers); + if(xret != 0) { - evhttp_clear_headers(¶ms); - return -2; + return xret; } - const char *keyring_id = evhttp_find_header(¶ms, "keyring_id"); + const char *keyring_id = evhttp_find_header(&headers, "keyring_id"); if (keyring_id) { request->keyring_id = atoi(keyring_id); } - const char *is_valid = evhttp_find_header(¶ms, "is_valid"); + const char *is_valid = evhttp_find_header(&headers, "is_valid"); if (is_valid) { request->is_valid = atoi(is_valid); } - const char *sni = evhttp_find_header(¶ms, "sni"); + const char *sni = evhttp_find_header(&headers, "sni"); if (sni) { request->sni = strdup(sni); } - evhttp_clear_headers(¶ms); - - mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "[Thread %d]Received request for uri, kering_id:%d, sni:%s, valid:%d", - request->thread_id, request->keyring_id, request->sni, request->is_valid); - + evhttp_clear_headers(&headers); + mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "[Thread %d]Received request for uri, kering_id:%d, sni:%s, valid:%d", request->thread_id, request->keyring_id, request->sni, request->is_valid); return 0; } -static void -evhttp_socket_close_cb(struct evhttp_connection *evcon, - void __attribute__((__unused__))*arg) +static void evhttp_socket_close_cb(struct evhttp_connection *evcon, void __attribute__((__unused__))*arg) { - if (NULL == evcon){ + if (NULL == evcon) + { goto finish; } @@ -1574,8 +1587,7 @@ finish: return; } -static int -x509_get_rkey(X509 *origin, int keyring_id, char *rkey, int is_valid) +static int x509_get_rkey(X509 *origin, int keyring_id, char *rkey, int is_valid) { unsigned int len = 0, i = 0; char hex[EVP_MAX_MD_SIZE] = {0}; @@ -1598,8 +1610,7 @@ finish: return 0; } -static int -redis_sync_command(struct http_request *request, struct redisContext __attribute__((__unused__))*c) +static int redis_sync_command(struct http_request *request, struct redisContext __attribute__((__unused__))*c) { int xret = -1; redisReply *reply; @@ -1651,36 +1662,46 @@ static int get_x509_msg(struct http_request *request, char *input, ssize_t input return 0; } -static int get_keypair_cache(x509_forge_thread *info, struct http_request *request, int mode) +int get_keyring_from_local( struct http_request *request) +{ + int ret =0; + ret = redis_clnt_pdu_send(request); + if (ret < 0) + { + mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Local sign certificate failed"); + } + return ret; +} + +int get_keyring_form_redis(x509_forge_thread *info, struct http_request *request, int mode) { - int xret = 0; + int ret=0; - if (info->sync == NULL) + switch (mode) { - xret = redis_clnt_pdu_send(request); - if (xret < 0) - { - mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Local sign certificate failed"); - } - }else{ - if(mode) - { - xret = redisAsyncCommand(info->cl_ctx, redis_get_callback, request, "GET %s", request->rkey); - if (xret < 0) + case 0: + ret = redis_sync_command(request, info->sync); + if (ret < 0) { mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to get information from redis server"); } - } - else - { - xret = redis_sync_command(request, info->sync); - if (xret < 0) + break; + case 1: + ret = redisAsyncCommand(info->cl_ctx, redis_get_callback, request, "GET %s", request->rkey); + if (ret < 0) { mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to get information from redis server"); } - } - } - return xret; + break; + default: + break; + } + return ret; +} + +static int get_keypair_cache(x509_forge_thread *info, struct http_request *request, int mode) +{ + return info->sync == NULL ? get_keyring_from_local(request) : get_keyring_form_redis(info, request, mode); } void http_get_cb(struct evhttp_request *evh_req, void *arg) @@ -1689,41 +1710,39 @@ void http_get_cb(struct evhttp_request *evh_req, void *arg) struct http_request *request = NULL; struct evbuffer * evbuf_body = NULL; char *input = NULL; ssize_t inputlen=0; - x509_forge_thread *info = (x509_forge_thread *)arg; + x509_forge_thread *info = (x509_forge_thread *)arg; - if (evhttp_request_get_command(evh_req) != EVHTTP_REQ_POST) { + if (evhttp_request_get_command(evh_req) != EVHTTP_REQ_POST) + { mesa_runtime_log(RLOG_LV_DEBUG, MODULE_NAME, "FAILED (post type)"); goto error; } + evhttp_connection_set_closecb(evhttp_request_get_connection(evh_req), evhttp_socket_close_cb, NULL); + + xret = http_get_heal_check(evh_req); + if(xret != 0) + { + evhttp_send_reply(evh_req, 200, "OK", NULL); + return; + } + request = (struct http_request *) kmalloc (sizeof(struct http_request), MPF_CLR, -1); request->keyring_id = 0; request->thread_id = info->id; request->evh_req = evh_req; clock_gettime(CLOCK_MONOTONIC,&request->create_time); - xret = http_decode_uri(evh_req, request); - if (xret != 0) + xret = http_get_request_uri(evh_req, request); + if(xret != 0) { - if (xret == -2) - { - request_destroy(request); - evhttp_send_reply(evh_req, 200, "OK", NULL); - goto finish; - } - else - { - goto error; - } + goto error; } - evhttp_connection_set_closecb(evhttp_request_get_connection(evh_req), evhttp_socket_close_cb, NULL); evbuf_body = evhttp_request_get_input_buffer(evh_req); - if (!evbuf_body || 0==(inputlen = evbuffer_get_length(evbuf_body)) - ||!(input = (char *)evbuffer_pullup(evbuf_body,inputlen))) + if (!evbuf_body || 0==(inputlen = evbuffer_get_length(evbuf_body)) || !(input = (char *)evbuffer_pullup(evbuf_body,inputlen))) { mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Failed to get certificate information."); goto error; } - xret = get_x509_msg(request, input, inputlen); if (xret != 0) { @@ -1737,6 +1756,7 @@ void http_get_cb(struct evhttp_request *evh_req, void *arg) goto finish; } error: + request_destroy(request); evhttp_socket_send_error(evh_req, HTTP_BADREQUEST); finish: return; |
