From 486f495f639a6e88225b2d81a4f1e0ad06922ada Mon Sep 17 00:00:00 2001
From: "daniil.frolov" <daniil.frolov@demlabs.net>
Date: Thu, 17 Aug 2023 12:44:39 +0700
Subject: [PATCH] ..

---
 .../dap_stream_ch_chain_net_srv.c             | 19 ++++++++++++++-----
 modules/service/vpn/dap_chain_net_srv_vpn.c   | 13 +++++++++----
 2 files changed, 23 insertions(+), 9 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 ff41271a4f..9ffcd4bc11 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
@@ -182,10 +182,11 @@ void s_stream_ch_delete(dap_stream_ch_t* a_ch , void* a_arg)
     (void) a_arg;
     log_it(L_DEBUG, "Stream ch chain net srv delete");
 
-    dap_chain_net_srv_stream_session_t * l_srv_session = (dap_chain_net_srv_stream_session_t *) a_ch->stream->session->_inheritor;
-    dap_chain_net_srv_t * l_srv = dap_chain_net_srv_get(l_srv_session->usage_active->service->uid);
+    dap_chain_net_srv_stream_session_t * l_srv_session = a_ch && a_ch->stream && a_ch->stream->session ? (dap_chain_net_srv_stream_session_t *) a_ch->stream->session->_inheritor : NULL;
+    dap_chain_net_srv_t * l_srv = l_srv_session ? dap_chain_net_srv_get(l_srv_session->usage_active->service->uid) : NULL;
 
-    l_srv->callbacks.save_remain_service(l_srv, l_srv_session->usage_active->id, l_srv_session->usage_active->client);
+    if (l_srv)
+        l_srv->callbacks.save_remain_service(l_srv, l_srv_session->usage_active->id, l_srv_session->usage_active->client);
 
     dap_chain_net_srv_call_closed_all(a_ch);
     if (a_ch->stream->session && a_ch->stream->session->_inheritor)
@@ -496,6 +497,7 @@ static void s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
             return;
         }
 
+        memcpy(&a_grace->usage->client_pkey_hash, &l_tx_out_cond->subtype.srv_pay.pkey_hash, sizeof(dap_chain_hash_fast_t));
         dap_stream_ch_chain_net_srv_remain_service_store_t* l_remain_service = NULL;
         l_remain_service = a_grace->usage->service->callbacks.get_remain_service(a_grace->usage->service, a_grace->usage->id, a_grace->usage->client);
         if (l_remain_service && !a_grace->usage->is_active &&
@@ -523,6 +525,8 @@ static void s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
             log_it(L_INFO, "User has %d %s remain service. Start service without paying.", l_remain_service->remain_units, l_unit_type_str);
             DAP_DELETE(l_unit_type_str);
 
+
+
             size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t );
             dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t,
                                                                                   l_success_size);
@@ -544,7 +548,9 @@ static void s_grace_period_start(dap_chain_net_srv_grace_t *a_grace)
                             a_grace->usage->service->uid, l_remain_service->remain_units_type, l_remain_service->remain_units, uint256_0, NULL, NULL);
 
                 if (a_grace->usage->service->callbacks.response_success)
-                    a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id,  a_grace->usage->client, NULL, 0);
+                    a_grace->usage->service->callbacks.response_success(a_grace->usage->service, a_grace->usage->id,
+                                                                        a_grace->usage->client, a_grace->usage->receipt,
+                                                                        sizeof(dap_chain_datum_tx_receipt_t) + a_grace->usage->receipt->size + a_grace->usage->receipt->exts_size);
                 DAP_DELETE(l_success);
             }
             DAP_DELETE(a_grace->request);
@@ -682,6 +688,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item)
             RET_WITH_DEL_A_GRACE;
         }
 
+        memcpy(&l_grace->usage->client_pkey_hash, &l_tx_out_cond->subtype.srv_pay.pkey_hash, sizeof(dap_chain_hash_fast_t));
         // get remain units from DB
         dap_stream_ch_chain_net_srv_remain_service_store_t* l_remain_service = NULL;
         l_remain_service = l_grace->usage->service->callbacks.get_remain_service(l_grace->usage->service, l_grace->usage->id, l_grace->usage->client);
@@ -731,7 +738,9 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item)
                             l_grace->usage->service->uid, l_remain_service->remain_units_type, l_remain_service->remain_units, uint256_0, NULL, NULL);
 
                 if (l_grace->usage->service->callbacks.response_success)
-                    l_grace->usage->service->callbacks.response_success(l_grace->usage->service, l_grace->usage->id,  l_grace->usage->client, NULL, 0);
+                    l_grace->usage->service->callbacks.response_success(l_grace->usage->service, l_grace->usage->id,
+                                                                        l_grace->usage->client, l_grace->usage->receipt,
+                                                                        sizeof(dap_chain_datum_tx_receipt_t) + l_grace->usage->receipt->size + l_grace->usage->receipt->exts_size);
                 DAP_DELETE(l_success);
             }
             DAP_DELETE(l_grace->request);
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index ec1623f5ca..90cb795682 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -950,15 +950,12 @@ static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_u
     dap_chain_net_srv_usage_t * l_usage_active = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session,a_usage_id);
     dap_chain_net_srv_ch_vpn_t * l_srv_ch_vpn =(dap_chain_net_srv_ch_vpn_t*) a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID] ?
             a_srv_client->ch->stream->channel[DAP_CHAIN_NET_SRV_VPN_ID]->internal : NULL;
-
     if ( !l_usage_active){
         log_it( L_ERROR, "No active service usage, can't success");
         return -1;
     }
 
-    usage_client_t * l_usage_client = NULL;
-
-    l_usage_client = DAP_NEW_Z(usage_client_t);
+    usage_client_t * l_usage_client = DAP_NEW_Z(usage_client_t);
     if (!l_usage_client) {
         log_it(L_CRITICAL, "Memory allocation error");
         return -1;
@@ -993,6 +990,7 @@ static int s_callback_response_success(dap_chain_net_srv_t * a_srv, uint32_t a_u
 
     // set start limits
     if(!l_usage_active->is_free){
+        l_srv_session->limits_units_type.uint32 = l_usage_active->receipt->receipt_info.units_type.uint32;
         switch( l_usage_active->receipt->receipt_info.units_type.enm){
             case SERV_UNIT_DAY:{
                 l_srv_session->last_update_ts = time(NULL);
@@ -1107,6 +1105,7 @@ static dap_stream_ch_chain_net_srv_remain_service_store_t* s_callback_get_remain
 static int s_callback_save_remain_service(dap_chain_net_srv_t * a_srv,  uint32_t a_usage_id,
                                           dap_chain_net_srv_client_remote_t * a_srv_client)
 {
+
     UNUSED(a_srv);
     dap_chain_net_srv_stream_session_t * l_srv_session = a_srv_client && a_srv_client->ch && a_srv_client->ch->stream && a_srv_client->ch->stream->session ?
                                             (dap_chain_net_srv_stream_session_t *) a_srv_client->ch->stream->session->_inheritor : NULL;
@@ -1121,6 +1120,9 @@ static int s_callback_save_remain_service(dap_chain_net_srv_t * a_srv,  uint32_t
         return -101;
     }
 
+    if (l_usage->is_free)
+        return -110;
+
     dap_chain_net_t *l_net = l_usage->net;
 
     // get remain units from DB
@@ -1143,6 +1145,9 @@ static int s_callback_save_remain_service(dap_chain_net_srv_t * a_srv,  uint32_t
             break;
     }
 
+    if (l_srv_session->usage_active->receipt_next)
+        l_remain_service.remain_units += l_srv_session->usage_active->receipt_next->receipt_info.units;
+
     if(dap_global_db_set_sync(l_remain_limits_gdb_group, l_user_key, &l_remain_service, sizeof(l_remain_service), false))
     {
         DAP_DELETE(l_remain_limits_gdb_group);
-- 
GitLab