From 599009c4bc9fd8e7d326747c27bf206a56345795 Mon Sep 17 00:00:00 2001 From: "daniil.frolov" <daniil.frolov@demlabs.net> Date: Thu, 13 Mar 2025 18:17:47 +0300 Subject: [PATCH] .. --- .../dap_stream_ch_chain_net_srv.c | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index cea6929cff..d7527d72b2 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -96,7 +96,7 @@ static void s_start_receipt_timeout_timer(dap_chain_net_srv_usage_t *a_usage); static bool s_stream_ch_packet_in(dap_stream_ch_t* ch , void* arg); static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg); -static bool s_check_client_is_banned(dap_chain_net_srv_usage_t *a_usage); +static dap_time_t s_check_client_is_banned(dap_chain_net_srv_usage_t *a_usage); static void s_ban_client(dap_chain_net_srv_usage_t *a_usage); static void s_unban_client(dap_chain_net_srv_usage_t *a_usage); @@ -218,7 +218,7 @@ static char *s_get_ban_group(dap_chain_net_srv_usage_t *a_usage) return l_ban_list_group; } -static bool s_check_client_is_banned(dap_chain_net_srv_usage_t *a_usage) +static dap_time_t s_check_client_is_banned(dap_chain_net_srv_usage_t *a_usage) { char *l_ban_group = s_get_ban_group(a_usage); size_t l_data_size = 0; @@ -226,22 +226,22 @@ static bool s_check_client_is_banned(dap_chain_net_srv_usage_t *a_usage) if(!l_ret) { DAP_DELETE(l_ban_group); - return false; + return 0; } if(*(dap_time_t*)l_ret < dap_time_now()){ DAP_DELETE(l_ban_group); - return true; + return *(dap_time_t*)l_ret; } s_unban_client(a_usage); DAP_DELETE(l_ban_group); - return false; + return 0; } static void s_ban_client(dap_chain_net_srv_usage_t *a_usage) { - dap_time_t l_end_of_ban_timestamp = dap_time_now() + a_usage->service->grace_period * 10; // ban client for 10x grace periods + dap_time_t l_end_of_ban_timestamp = dap_time_now() + (a_usage->service->grace_period * 10); // ban client for 10x grace periods char *l_ban_group = s_get_ban_group(a_usage); @@ -295,9 +295,11 @@ static bool s_receipt_timeout_handler(dap_chain_net_srv_usage_t *a_usage) if (a_usage->service_substate == DAP_CHAIN_NET_SRV_USAGE_SERVICE_SUBSTATE_WAITING_FIRST_RECEIPT_SIGN){ a_usage->last_err_code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN; + log_it(L_ERROR,"User did not respond for first receipt signing."); s_service_substate_go_to_error(a_usage); } else if (a_usage->service_substate == DAP_CHAIN_NET_SRV_USAGE_SERVICE_SUBSTATE_WAITING_NEXT_RECEIPT_SIGN){ a_usage->last_err_code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN; + log_it(L_ERROR,"User did not respond for next receipt signing."); s_service_substate_go_to_error(a_usage); } return false; @@ -535,8 +537,11 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_ // Check tx if (!l_tx){ // Start grace - if (s_check_client_is_banned(l_usage)) { // client banned - log_it(L_DEBUG, "Client %s is banned!", dap_chain_hash_fast_to_str_static(&l_usage->client_pkey_hash)); + dap_time_t l_end_of_ban = 0; + if ((l_end_of_ban = s_check_client_is_banned(l_usage))) { // client banned + char l_tmp_buf[DAP_TIME_STR_SIZE]; + dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_end_of_ban); + log_it(L_DEBUG, "Client %s is banned till %s!", dap_chain_hash_fast_to_str_static(&l_usage->client_pkey_hash), l_tmp_buf); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_BANNED_PKEY_HASH; if(a_ch) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); @@ -546,6 +551,7 @@ static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_ } s_service_state_go_to_grace(l_usage); } else { + s_unban_client(l_usage); l_usage->tx_cond = l_tx; s_service_substate_pay_service(l_usage); } @@ -666,6 +672,7 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) pthread_mutex_unlock(&l_srv->grace_mutex); if (!dap_ledger_tx_find_by_hash(a_grace_item->grace->usage->net->pub.ledger, &a_grace_item->grace->usage->tx_cond_hash)){ + log_it(L_ERROR, "Grace period is over. Can't find tx for paying."); a_grace_item->grace->usage->last_err_code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND; s_service_substate_go_to_error(a_grace_item->grace->usage); } else @@ -972,7 +979,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR:{ if ( l_ch_pkt->hdr.data_size == sizeof (dap_stream_ch_chain_net_srv_pkt_error_t) ){ dap_stream_ch_chain_net_srv_pkt_error_t * l_err = (dap_stream_ch_chain_net_srv_pkt_error_t *) l_ch_pkt->data; - log_it( L_NOTICE, "Remote responsed with error code 0x%08X", l_err->code ); + log_it( L_NOTICE, "Remote respond with error code 0x%08X", l_err->code ); // TODO code for service client mode }else{ log_it(L_ERROR, "Wrong error response size, %u when expected %zu", l_ch_pkt->hdr.data_size, @@ -1247,8 +1254,13 @@ static void s_service_state_go_to_error(dap_chain_net_srv_usage_t *a_usage) if (a_usage->last_err_code) { if(l_ch) dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &a_usage->last_err_code, sizeof (a_usage->last_err_code)); - if (a_usage->service && a_usage->service->callbacks.response_error) - a_usage->service->callbacks.response_error(a_usage->service, 0, NULL, &a_usage->last_err_code, sizeof(a_usage->last_err_code)); + if (a_usage->service && a_usage->service->callbacks.response_error){ + dap_stream_ch_chain_net_srv_pkt_error_t l_err = (dap_stream_ch_chain_net_srv_pkt_error_t){.code = a_usage->last_err_code, + .net_id = a_usage->net->pub.id, + .srv_uid = a_usage->service->uid, + .usage_id = a_usage->id}; + a_usage->service->callbacks.response_error(a_usage->service,a_usage->id, a_usage->client, &l_err, sizeof (l_err)); + } } if (a_usage && a_usage->service_state == DAP_CHAIN_NET_SRV_USAGE_SERVICE_STATE_GRACE) { // add client pkey hash to banlist @@ -1571,12 +1583,19 @@ static void s_service_substate_go_to_error(dap_chain_net_srv_usage_t *a_usage) if (a_usage->service_state == DAP_CHAIN_NET_SRV_USAGE_SERVICE_STATE_NORMAL){ // wait until end of service in this substate + log_it(L_WARNING,"Next receipt paying error. Wait until service end."); DAP_DEL_Z(a_usage->receipt_next); a_usage->service_substate=DAP_CHAIN_NET_SRV_USAGE_SERVICE_SUBSTATE_ERROR; dap_stream_ch_pkt_write_unsafe(a_usage->client->ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &a_usage->last_err_code, sizeof (a_usage->last_err_code)); - if (a_usage->service->callbacks.response_error) - a_usage->service->callbacks.response_error(a_usage->service,a_usage->id, a_usage->client, &a_usage->last_err_code,sizeof (a_usage->last_err_code)); + if (a_usage->service->callbacks.response_error){ + dap_stream_ch_chain_net_srv_pkt_error_t l_err = (dap_stream_ch_chain_net_srv_pkt_error_t){.code = a_usage->last_err_code, + .net_id = a_usage->net->pub.id, + .srv_uid = a_usage->service->uid, + .usage_id = a_usage->id}; + a_usage->service->callbacks.response_error(a_usage->service,a_usage->id, a_usage->client, &l_err, sizeof (l_err)); + } } else { + log_it(L_ERROR,"Stop service providing."); s_service_state_go_to_error(a_usage); } } \ No newline at end of file -- GitLab