Skip to content
Snippets Groups Projects
Commit 6e1cc3f9 authored by Dmitriy A. Gerasimov's avatar Dmitriy A. Gerasimov
Browse files

[*] Fixed stream ctl params

[+] Some more error checks for dap_client
parent ec3582af
No related branches found
No related tags found
4 merge requests!251Master,!250Master,!220bugs-4547,!215features-4526
Pipeline #5567 passed with stage
in 13 seconds
...@@ -2,7 +2,7 @@ project(cellframe-sdk C) ...@@ -2,7 +2,7 @@ project(cellframe-sdk C)
cmake_minimum_required(VERSION 2.8) cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CELLFRAME_SDK_NATIVE_VERSION "2.5-23") set(CELLFRAME_SDK_NATIVE_VERSION "2.5-24")
add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
set(DAPSDK_MODULES "") set(DAPSDK_MODULES "")
......
...@@ -109,7 +109,11 @@ MEM_ALLOC_ERR: ...@@ -109,7 +109,11 @@ MEM_ALLOC_ERR:
void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t a_port) void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t a_port)
{ {
if(a_addr == NULL){ if(a_addr == NULL){
log_it(L_ERROR,"Address is NULL"); log_it(L_ERROR,"Address is NULL for dap_client_set_uplink");
return;
}
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_set_uplink");
return; return;
} }
DAP_CLIENT_PVT(a_client)->uplink_addr = strdup(a_addr); DAP_CLIENT_PVT(a_client)->uplink_addr = strdup(a_addr);
...@@ -123,6 +127,11 @@ void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t ...@@ -123,6 +127,11 @@ void dap_client_set_uplink(dap_client_t * a_client,const char* a_addr, uint16_t
*/ */
const char* dap_client_get_uplink_addr(dap_client_t * a_client) const char* dap_client_get_uplink_addr(dap_client_t * a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_uplink");
return NULL;
}
return DAP_CLIENT_PVT(a_client)->uplink_addr; return DAP_CLIENT_PVT(a_client)->uplink_addr;
} }
...@@ -133,9 +142,14 @@ const char* dap_client_get_uplink_addr(dap_client_t * a_client) ...@@ -133,9 +142,14 @@ const char* dap_client_get_uplink_addr(dap_client_t * a_client)
*/ */
void dap_client_set_active_channels (dap_client_t * a_client, const char * a_active_channels) void dap_client_set_active_channels (dap_client_t * a_client, const char * a_active_channels)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_set_active_channels");
return;
}
if ( DAP_CLIENT_PVT(a_client)->active_channels ) if ( DAP_CLIENT_PVT(a_client)->active_channels )
DAP_DELETE(DAP_CLIENT_PVT(a_client)->active_channels ); DAP_DELETE(DAP_CLIENT_PVT(a_client)->active_channels );
DAP_CLIENT_PVT(a_client)->active_channels = dap_strdup( a_active_channels); DAP_CLIENT_PVT(a_client)->active_channels = a_active_channels? dap_strdup( a_active_channels) : NULL;
} }
/** /**
...@@ -145,11 +159,21 @@ void dap_client_set_active_channels (dap_client_t * a_client, const char * a_act ...@@ -145,11 +159,21 @@ void dap_client_set_active_channels (dap_client_t * a_client, const char * a_act
*/ */
uint16_t dap_client_get_uplink_port(dap_client_t * a_client) uint16_t dap_client_get_uplink_port(dap_client_t * a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_uplink_port");
return 0;
}
return DAP_CLIENT_PVT(a_client)->uplink_port; return DAP_CLIENT_PVT(a_client)->uplink_port;
} }
void dap_client_set_auth_cert(dap_client_t * a_client, dap_cert_t *a_cert) void dap_client_set_auth_cert(dap_client_t * a_client, dap_cert_t *a_cert)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_set_auth_cert");
return;
}
DAP_CLIENT_PVT(a_client)->auth_cert = a_cert; DAP_CLIENT_PVT(a_client)->auth_cert = a_cert;
} }
...@@ -348,7 +372,11 @@ const char * dap_client_error_str(dap_client_error_t a_client_error) ...@@ -348,7 +372,11 @@ const char * dap_client_error_str(dap_client_error_t a_client_error)
*/ */
const char * dap_client_get_error_str(dap_client_t * a_client) const char * dap_client_get_error_str(dap_client_t * a_client)
{ {
return dap_client_error_str( DAP_CLIENT_PVT(a_client)->last_error ); if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_error_str");
return NULL;
}
return dap_client_error_str( DAP_CLIENT_PVT(a_client)->last_error );
} }
/** /**
* @brief dap_client_get_stage * @brief dap_client_get_stage
...@@ -357,6 +385,10 @@ const char * dap_client_get_error_str(dap_client_t * a_client) ...@@ -357,6 +385,10 @@ const char * dap_client_get_error_str(dap_client_t * a_client)
*/ */
dap_client_stage_t dap_client_get_stage(dap_client_t * a_client) dap_client_stage_t dap_client_get_stage(dap_client_t * a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_stage");
return -1;
}
return DAP_CLIENT_PVT(a_client)->stage; return DAP_CLIENT_PVT(a_client)->stage;
} }
...@@ -366,6 +398,10 @@ dap_client_stage_t dap_client_get_stage(dap_client_t * a_client) ...@@ -366,6 +398,10 @@ dap_client_stage_t dap_client_get_stage(dap_client_t * a_client)
* @return * @return
*/ */
const char * dap_client_get_stage_status_str(dap_client_t *a_client){ const char * dap_client_get_stage_status_str(dap_client_t *a_client){
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_stage_status_str");
return NULL;
}
return dap_client_stage_status_str(DAP_CLIENT_PVT(a_client)->stage_status); return dap_client_stage_status_str(DAP_CLIENT_PVT(a_client)->stage_status);
} }
...@@ -392,6 +428,10 @@ const char * dap_client_stage_status_str(dap_client_stage_status_t a_stage_statu ...@@ -392,6 +428,10 @@ const char * dap_client_stage_status_str(dap_client_stage_status_t a_stage_statu
*/ */
const char * dap_client_get_stage_str(dap_client_t *a_client) const char * dap_client_get_stage_str(dap_client_t *a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_stage_str");
return NULL;
}
return dap_client_stage_str(DAP_CLIENT_PVT(a_client)->stage); return dap_client_stage_str(DAP_CLIENT_PVT(a_client)->stage);
} }
...@@ -439,6 +479,11 @@ dap_enc_key_t * dap_client_get_key_stream(dap_client_t * a_client){ ...@@ -439,6 +479,11 @@ dap_enc_key_t * dap_client_get_key_stream(dap_client_t * a_client){
*/ */
dap_stream_t * dap_client_get_stream(dap_client_t * a_client) dap_stream_t * dap_client_get_stream(dap_client_t * a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_stream");
return NULL;
}
dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
return (l_client_internal) ? l_client_internal->stream : NULL; return (l_client_internal) ? l_client_internal->stream : NULL;
} }
...@@ -450,6 +495,10 @@ dap_stream_t * dap_client_get_stream(dap_client_t * a_client) ...@@ -450,6 +495,10 @@ dap_stream_t * dap_client_get_stream(dap_client_t * a_client)
*/ */
dap_stream_worker_t * dap_client_get_stream_worker(dap_client_t * a_client) dap_stream_worker_t * dap_client_get_stream_worker(dap_client_t * a_client)
{ {
if(a_client == NULL){
log_it(L_ERROR,"Client is NULL for dap_client_get_stream_worker");
return NULL;
}
dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
return (l_client_internal) ? l_client_internal->stream_worker : NULL; return (l_client_internal) ? l_client_internal->stream_worker : NULL;
...@@ -460,7 +509,7 @@ dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch ...@@ -460,7 +509,7 @@ dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch
dap_stream_ch_t * l_ch = NULL; dap_stream_ch_t * l_ch = NULL;
dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL; dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL;
if(l_client_internal && l_client_internal->stream && l_client_internal->stream_es) if(l_client_internal && l_client_internal->stream && l_client_internal->stream_es)
for(int i = 0; i < l_client_internal->stream->channel_count; i++) { for(size_t i = 0; i < l_client_internal->stream->channel_count; i++) {
if(l_client_internal->stream->channel[i]->proc->id == a_ch_id) { if(l_client_internal->stream->channel[i]->proc->id == a_ch_id) {
l_ch = l_client_internal->stream->channel[i]; l_ch = l_client_internal->stream->channel[i];
break; break;
......
...@@ -421,7 +421,7 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) ...@@ -421,7 +421,7 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt)
l_sign_size = dap_sign_get_size(l_sign); l_sign_size = dap_sign_get_size(l_sign);
} }
uint8_t l_data[l_key_size + l_sign_size]; uint8_t l_data[l_key_size + l_sign_size];
memcpy(l_data, a_client_pvt->session_key_open->pub_key_data, l_key_size); memcpy(l_data,a_client_pvt->session_key_open->pub_key_data, l_key_size);
if (l_sign) { if (l_sign) {
memcpy(l_data + l_key_size, l_sign, l_sign_size); memcpy(l_data + l_key_size, l_sign, l_sign_size);
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
* @brief The dap_client_stage enum. Top level of client's state machine * @brief The dap_client_stage enum. Top level of client's state machine
**/ **/
typedef enum dap_client_stage { typedef enum dap_client_stage {
STAGE_UNDEFINED=-1,
STAGE_BEGIN=0, STAGE_BEGIN=0,
STAGE_ENC_INIT=1, STAGE_ENC_INIT=1,
STAGE_STREAM_CTL=2, STAGE_STREAM_CTL=2,
......
...@@ -106,7 +106,8 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg) ...@@ -106,7 +106,8 @@ void enc_http_proc(struct dap_http_simple *cl_st, void * arg)
sscanf(cl_st->http_client->in_query_string, "enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd", sscanf(cl_st->http_client->in_query_string, "enc_type=%d,pkey_exchange_type=%d,pkey_exchange_size=%zd",
&l_enc_type,&l_pkey_exchange_type,&l_pkey_exchange_size); &l_enc_type,&l_pkey_exchange_type,&l_pkey_exchange_size);
log_it(L_DEBUG, "Stream encryption: %s\t public key exchange: %s",dap_enc_get_type_name(l_enc_type),
dap_enc_get_type_name(l_pkey_exchange_type));
uint8_t alice_msg[cl_st->request_size]; uint8_t alice_msg[cl_st->request_size];
size_t l_decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64); size_t l_decode_len = dap_enc_base64_decode(cl_st->request, cl_st->request_size, alice_msg, DAP_ENC_DATA_TYPE_B64);
dap_chain_hash_fast_t l_sign_hash = {}; dap_chain_hash_fast_t l_sign_hash = {};
......
...@@ -121,26 +121,35 @@ void s_proc(struct dap_http_simple *a_http_simple, void * a_arg) ...@@ -121,26 +121,35 @@ void s_proc(struct dap_http_simple *a_http_simple, void * a_arg)
char l_channels_str[sizeof(ss->active_channels)]; char l_channels_str[sizeof(ss->active_channels)];
dap_enc_key_type_t l_enc_type = s_socket_forward_key.type; dap_enc_key_type_t l_enc_type = s_socket_forward_key.type;
int l_enc_headers = 0; int l_enc_headers = 0;
bool l_is_legacy=false; bool l_is_legacy=true;
int l_url_sscanf_res = sscanf(l_dg->url_path, "stream_ctl,channels=%16s,enc_type=%d,enc_headers=%d", l_channels_str, &l_enc_type, &l_enc_headers); char * l_tok_tmp = NULL;
if(l_url_sscanf_res > 0){ char * l_tok = strtok_r(l_dg->url_path, ",",&l_tok_tmp) ;
if(l_url_sscanf_res < 3){ do {
log_it(L_INFO, "legacy encryption mode used (OAES)"); char * l_subtok_tmp = NULL;
l_enc_type = DAP_ENC_KEY_TYPE_OAES; char * l_subtok_name = strtok_r(l_tok, "=",&l_subtok_tmp);
l_is_legacy = true; char * l_subtok_value = strtok_r(NULL, "=",&l_subtok_tmp);
if (l_subtok_value){
log_it(L_DEBUG, "tok = %s value =%s",l_subtok_name,l_subtok_value);
if ( strcmp(l_subtok_name,"channels")==0 ){
strncpy(l_channels_str,l_subtok_value,sizeof (l_channels_str)-1);
log_it(L_DEBUG,"Param: channels=%s",l_channels_str);
}else if(strcmp(l_subtok_name,"enc_type")==0){
l_enc_type = atoi(l_subtok_value);
log_it(L_DEBUG,"Param: enc_type=%s",dap_enc_get_type_name(l_enc_type));
l_is_legacy = false;
}else if(strcmp(l_subtok_name,"enc_headers")==0){
l_enc_headers = atoi(l_subtok_value);
log_it(L_DEBUG,"Param: enc_headers=%d",l_enc_headers);
}
} }
l_tok = strtok_r(NULL, ",",&l_tok_tmp) ;
} while(l_tok);
l_new_session = true;
if(l_is_legacy){
log_it(L_INFO, "legacy encryption mode used (OAES)");
l_enc_type = DAP_ENC_KEY_TYPE_OAES;
l_new_session = true; l_new_session = true;
} }
else if(strcmp(l_dg->url_path, "socket_forward" ) == 0) {
l_channels_str[0] = '\0';
l_new_session = true;
}
else{
log_it(L_ERROR,"ctl command unknown: %s",l_dg->url_path);
enc_http_delegate_delete(l_dg);
*return_code = Http_Status_MethodNotAllowed;
return;
}
if(l_new_session){ if(l_new_session){
ss = dap_stream_session_pure_new(); ss = dap_stream_session_pure_new();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment