diff --git a/net/server/json_rpc/rpc_core/include/dap_json_rpc_request.h b/net/server/json_rpc/rpc_core/include/dap_json_rpc_request.h index cceded3ed5d763d64b9bf352fcb2ed654dd7127a..c583c41478b8a015d829f5e384be143e8404ef47 100644 --- a/net/server/json_rpc/rpc_core/include/dap_json_rpc_request.h +++ b/net/server/json_rpc/rpc_core/include/dap_json_rpc_request.h @@ -44,12 +44,10 @@ typedef struct dap_json_rpc_http_request struct { uint32_t data_size; uint32_t signs_size; - } DAP_ALIGN_PACKED header; - dap_json_rpc_request_t * request; - byte_t tsd_n_signs[]; -}dap_json_rpc_http_request_t; + } header; + byte_t request_n_signs[]; +} DAP_ALIGN_PACKED dap_json_rpc_http_request_t; -int dap_json_rpc_request_init(const char *a_url_service); /** * Create a new dap_json_rpc_request_t instance. * diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c index b7b4f95586ffa544cdcf8b5b3d67289f7d8635a4..a17bec4878dba2e5c20cf3252dbc025d50b73273 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request.c @@ -4,8 +4,6 @@ #define LOG_TAG "dap_json_rpc_request" -static char *s_url_service = NULL; - struct exec_cmd_request { dap_client_pvt_t * client_pvt; #ifdef DAP_OS_WINDOWS @@ -26,14 +24,6 @@ enum ExecCmdRetCode { EXEC_CMD_ERR_UNKNOWN }; -int dap_json_rpc_request_init(const char *a_url_service) -{ - if (s_url_service) - return 1; - s_url_service = dap_strdup(a_url_service); - return 0; -} - static struct exec_cmd_request* s_exec_cmd_request_init(dap_client_pvt_t * a_client_pvt) { struct exec_cmd_request *l_exec_cmd_request = DAP_NEW_Z(struct exec_cmd_request); @@ -296,39 +286,24 @@ char *dap_json_rpc_request_to_json_string(const dap_json_rpc_request_t *a_reques char *dap_json_rpc_http_request_serialize(dap_json_rpc_http_request_t *a_request, size_t *a_total_size) { *a_total_size = a_request->header.data_size + a_request->header.signs_size + sizeof(a_request->header); - - char *a_output = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(char, *a_total_size, NULL), - *ptr = dap_mempcpy(a_output, &a_request->header, sizeof(a_request->header)); - - char *l_str = dap_json_rpc_request_to_json_string(a_request->request); - if (!l_str) - return DAP_DELETE(a_output), NULL; - - ptr = dap_mempcpy(ptr, l_str, a_request->header.data_size); - DAP_DELETE(l_str); - memcpy(ptr, a_request->tsd_n_signs, a_request->header.signs_size); - return a_output; + return (char*)DAP_DUP_SIZE(a_request, *a_total_size); } dap_json_rpc_http_request_t *dap_json_rpc_http_request_deserialize(const void *data, size_t data_size) { - if (data_size < sizeof(dap_json_rpc_http_request_t)) + __typeof__( (dap_json_rpc_http_request_t){0}.header ) l_hdr; + if (data_size < sizeof(l_hdr)) return log_it(L_ERROR, "Data size is less than minimum: %zu < %zu", data_size, sizeof(dap_json_rpc_http_request_t)), NULL; - __typeof__( (dap_json_rpc_http_request_t){0}.header ) l_hdr; memcpy(&l_hdr, data, sizeof(l_hdr)); - if ( data_size < sizeof(dap_json_rpc_http_request_t) + l_hdr.data_size + l_hdr.signs_size ) + if ( data_size < sizeof(l_hdr) + l_hdr.data_size + l_hdr.signs_size ) return log_it(L_ERROR, "Data size is less than needed: %zu < %zu", data_size, sizeof(dap_json_rpc_http_request_t) + l_hdr.data_size + l_hdr.signs_size), NULL; - dap_json_rpc_http_request_t *l_ret - = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_json_rpc_http_request_t, sizeof(dap_json_rpc_http_request_t) + l_hdr.signs_size, NULL); - l_ret->header = l_hdr; - l_ret->request = dap_json_rpc_request_from_json((char*)data + sizeof(l_ret->header)); - if (l_hdr.signs_size) - memcpy(l_ret->tsd_n_signs, (byte_t*)data + sizeof(l_hdr) + l_hdr.data_size, l_hdr.signs_size); + dap_json_rpc_http_request_t *l_ret = (dap_json_rpc_http_request_t*)DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(byte_t, data_size + 1, NULL); + dap_mempcpy(l_ret, data, data_size); return l_ret; } @@ -337,7 +312,6 @@ void dap_json_rpc_http_request_free(dap_json_rpc_http_request_t *a_http_request) if (!a_http_request) return; - dap_json_rpc_request_free(a_http_request->request); DAP_DELETE(a_http_request); } @@ -348,19 +322,18 @@ dap_json_rpc_http_request_t *dap_json_rpc_request_sign_by_cert(dap_json_rpc_requ return log_it(L_ERROR, "Can't convert JSON-request to string!"), NULL; int l_len = strlen(l_str); dap_sign_t *l_sign = dap_cert_sign(a_cert, l_str, l_len, 0); - DAP_DELETE(l_str); if (!l_sign) return log_it(L_ERROR, "JSON request signing failed"), NULL; size_t l_sign_size = dap_sign_get_size(l_sign); dap_json_rpc_http_request_t *l_ret - = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_json_rpc_http_request_t, sizeof(dap_json_rpc_http_request_t) + l_sign_size, NULL, l_sign); + = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_json_rpc_http_request_t, sizeof(dap_json_rpc_http_request_t) + l_len + 1 + l_sign_size, NULL, l_sign); *l_ret = (dap_json_rpc_http_request_t) { .header.data_size = l_len + 1, .header.signs_size = l_sign_size, - .request = a_request }; - memcpy(l_ret->tsd_n_signs, l_sign, l_sign_size); + byte_t* l_cur = (byte_t*)dap_strncpy((char*)l_ret->request_n_signs, l_str, l_len); + dap_mempcpy(l_cur + 1, l_sign, l_sign_size); return DAP_DELETE(l_sign), l_ret; } diff --git a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request_handler.c b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request_handler.c index 1bf488d5e0f4b7c1de2d04ec50a4266aa4aad7a3..a36e4f41af42fc451e323fec8d9e7c8b3a43dd3b 100644 --- a/net/server/json_rpc/rpc_core/src/dap_json_rpc_request_handler.c +++ b/net/server/json_rpc/rpc_core/src/dap_json_rpc_request_handler.c @@ -53,22 +53,26 @@ char * dap_json_rpc_request_handler(const char * a_request, size_t a_request_si log_it(L_ERROR, "Can't read request"); return NULL; } - char * l_data_str = dap_json_rpc_request_to_json_string(l_http_request->request); + + char * l_data_str = DAP_NEW_Z_COUNT(char, l_http_request->header.data_size); + dap_mempcpy(l_data_str, l_http_request->request_n_signs, l_http_request->header.data_size); + dap_hash_fast_t l_sign_pkey_hash; bool l_sign_correct = false; - dap_sign_t * l_sign = (dap_sign_t*)(l_http_request->tsd_n_signs); + dap_sign_t * l_sign = (dap_sign_t*)DAP_DUP_SIZE(l_http_request->request_n_signs + l_http_request->header.data_size, l_http_request->header.signs_size); dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash); l_sign_correct = dap_check_node_pkey_in_map(&l_sign_pkey_hash); if (l_sign_correct) - l_sign_correct = !dap_sign_verify_all(l_sign, l_http_request->header.signs_size, l_data_str, sizeof(l_data_str)); + l_sign_correct = !dap_sign_verify_all(l_sign, l_http_request->header.signs_size, l_data_str, strlen(l_data_str)); if (!l_sign_correct) { - dap_json_rpc_response_t* l_no_rights_res = dap_json_rpc_response_create("You have no rights", TYPE_RESPONSE_STRING, l_http_request->request->id); + dap_json_rpc_response_t* l_no_rights_res = dap_json_rpc_response_create("You have no rights", TYPE_RESPONSE_STRING, 0); // def id char * l_no_rights_res_str = dap_json_rpc_response_to_string(l_no_rights_res); dap_json_rpc_http_request_free(l_http_request); + DAP_DEL_MULTY(l_sign); return l_no_rights_res_str; } char* l_response = dap_cli_cmd_exec(l_data_str); dap_json_rpc_http_request_free(l_http_request); - DAP_DEL_MULTY(l_data_str); + DAP_DEL_MULTY(l_data_str, l_sign); return l_response; } diff --git a/net/server/json_rpc/src/dap_json_rpc.c b/net/server/json_rpc/src/dap_json_rpc.c index 303ac918a052c8fcfe5c430bbea7e8488b4da316..b42d2bb9ed781b10733001028915105224975069 100644 --- a/net/server/json_rpc/src/dap_json_rpc.c +++ b/net/server/json_rpc/src/dap_json_rpc.c @@ -74,7 +74,6 @@ int dap_json_rpc_init(dap_server_t* a_http_server, dap_config_t *a_config) } dap_json_rpc_map_init(a_config); - dap_json_rpc_request_init("/exec_cmd"); dap_http_simple_proc_add(l_http, "/exec_cmd", 24000, dap_json_rpc_http_proc); return 0; } @@ -142,10 +141,16 @@ void dap_json_rpc_http_proc(dap_http_simple_t *a_http_simple, void *a_arg) char * l_res_str = dap_json_rpc_request_handler(l_dg->request, l_dg->request_size); if (l_res_str) { enc_http_reply(l_dg, l_res_str, strlen(l_res_str)); + DAP_DELETE(l_res_str); } else { - enc_http_reply(l_dg, "Wrong request", strlen("Wrong request")); + json_object* l_json_obj_res = json_object_new_array(); + json_object_array_add(l_json_obj_res, json_object_new_string("Wrong request")); + const char * l_json_str_res = json_object_to_json_string(l_json_obj_res); + enc_http_reply(l_dg, l_json_str_res, strlen(l_json_str_res)); + json_object_put(l_json_obj_res); + DAP_DELETE(l_json_str_res); + log_it(L_ERROR,"Wrong request"); } - DAP_DEL_Z(l_res_str); *return_code = Http_Status_OK; enc_http_reply_encode(a_http_simple,l_dg); enc_http_delegate_delete(l_dg);