From ba17b3c2a7d73ff2574e6389daad28b2ffca105c Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Sat, 30 Nov 2019 04:57:43 +0700
Subject: [PATCH] [*] Fixes with CDB

---
 dap_chain_net_srv_vpn.c                 | 39 +++++++++++++++++++++----
 dap_chain_net_srv_vpn_cdb.c             | 39 +++++++++++++++++++++++--
 dap_chain_net_srv_vpn_cdb_server_list.c |  2 +-
 3 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/dap_chain_net_srv_vpn.c b/dap_chain_net_srv_vpn.c
index a0218c3..1ce31d8 100755
--- a/dap_chain_net_srv_vpn.c
+++ b/dap_chain_net_srv_vpn.c
@@ -62,6 +62,7 @@
 #include "dap_stream_ch_pkt.h"
 
 #include "dap_chain_net.h"
+#include "dap_chain_net_srv.h"
 #include "dap_chain_net_srv_vpn.h"
 #include "dap_chain_net_vpn_client.h"
 #include "dap_chain_ledger.h"
@@ -107,11 +108,20 @@ static vpn_local_network_t *s_raw_server;
 
 static const char *s_addr;
 
+// Service callbacks
+static int s_callback_request_after(dap_chain_net_srv_t * a_srv, dap_chain_net_srv_client_t * a_srv_client
+                                    , const void * a_custom_data, size_t a_custom_data_size );
+
+
+
+// Tunnel threads
 static void *srv_ch_sf_thread(void * arg);
 static void *srv_ch_sf_thread_raw(void *arg);
 static void s_tun_create(void);
 static void s_tun_destroy(void);
 
+
+// Stream callbacks
 static void s_new(dap_stream_ch_t* ch, void* arg);
 static void srv_ch_sf_delete(dap_stream_ch_t* ch, void* arg);
 static void srv_ch_sf_packet_in(dap_stream_ch_t* ch, void* arg);
@@ -122,6 +132,7 @@ static void srv_ch_sf_packet_out(dap_stream_ch_t* ch, void* arg);
 
 static char *s_srv_vpn_addr, *s_srv_vpn_mask;
 
+
 /**
  * @brief dap_stream_ch_vpn_init Init actions for VPN stream channel
  * @param vpn_addr Zero if only client mode. Address if the node shares its local VPN
@@ -130,8 +141,8 @@ static char *s_srv_vpn_addr, *s_srv_vpn_mask;
  */
 int dap_chain_net_srv_vpn_init(dap_config_t * g_config)
 {
-    const char *c_addr = dap_config_get_item_str(g_config, "vpn", "network_address");
-    const char *c_mask = dap_config_get_item_str(g_config, "vpn", "network_mask");
+    const char *c_addr = dap_config_get_item_str(g_config, "srv_vpn", "network_address");
+    const char *c_mask = dap_config_get_item_str(g_config, "srv_vpn", "network_mask");
     if(c_addr && c_mask) {
         s_srv_vpn_addr = strdup(c_addr);
         s_srv_vpn_mask = strdup(c_mask);
@@ -145,6 +156,9 @@ int dap_chain_net_srv_vpn_init(dap_config_t * g_config)
         pthread_create(&srv_sf_socks_pid, NULL, srv_ch_sf_thread, NULL);
         dap_stream_ch_proc_add(DAP_STREAM_CH_ID_NET_SRV_VPN, s_new, srv_ch_sf_delete, srv_ch_sf_packet_in,
                 srv_ch_sf_packet_out);
+
+        dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID };
+        dap_chain_net_srv_add( l_uid, s_callback_request_after);
         return 0;
     }
     return -1;
@@ -163,6 +177,22 @@ void dap_chain_net_srv_vpn_deinit(void)
         free(s_raw_server);
 }
 
+/**
+ * @brief s_callback_request_after
+ * @param a_srv
+ * @param a_srv_client
+ * @param a_custom_data
+ * @param a_custom_data_size
+ * @return
+ */
+static int s_callback_request_after(dap_chain_net_srv_t * a_srv, dap_chain_net_srv_client_t * a_srv_client
+                                    , const void * a_custom_data, size_t a_custom_data_size )
+{
+
+}
+
+
+
 /**
  * @brief s_tun_create
  */
@@ -284,8 +314,7 @@ void s_new(dap_stream_ch_t* a_stream_ch, void* a_arg)
         uint64_t l_value = dap_chain_net_srv_client_auth(l_ledger, a_stream_ch->stream->session->service_key, &l_cond);
 
         // add service
-        if(l_cond && l_value > 0)
-                {
+        if(l_cond && l_value > 0) {
             dap_chain_net_srv_t l_srv;
             memset(&l_srv, 0, sizeof(dap_chain_net_srv_t));
             l_srv.callback_trafic = s_callback_trafic;
@@ -293,8 +322,6 @@ void s_new(dap_stream_ch_t* a_stream_ch, void* a_arg)
             l_srv.srv_common.proposal_params.vpn.limit_bytes = 2000;
             if(l_cond)
                 memcpy(&l_srv.srv_common, l_cond, sizeof(dap_chain_net_srv_abstract_t));
-            dap_chain_net_srv_gen_uid((uint8_t*) &l_srv.uid, sizeof(l_srv.uid));
-            dap_chain_net_srv_add(&l_srv);
             memcpy(&sf->net_srv, &l_srv, sizeof(dap_chain_net_srv_t)); // Unique ID for service.
         }
 
diff --git a/dap_chain_net_srv_vpn_cdb.c b/dap_chain_net_srv_vpn_cdb.c
index 9e1e4dc..6af45b1 100644
--- a/dap_chain_net_srv_vpn_cdb.c
+++ b/dap_chain_net_srv_vpn_cdb.c
@@ -26,6 +26,7 @@
 #include "dap_common.h"
 #include "dap_config.h"
 #include "dap_enc_http.h"
+#include "dap_enc_base64.h"
 #include "dap_http.h"
 
 #include "db_core.h"
@@ -46,8 +47,11 @@
 #include "dap_chain_datum_tx_receipt.h"
 #include "dap_chain_datum_tx_sig.h"
 #include "dap_chain_global_db.h"
+
+#include "dap_chain_mempool.h"
 #include "dap_pkey.h"
 
+#include "dap_chain_net_srv_vpn.h"
 #include "dap_chain_net_srv_vpn_cdb.h"
 #include "dap_chain_net_srv_vpn_cdb_server_list.h"
 
@@ -243,10 +247,15 @@ static void s_auth_callback(enc_http_delegate_t* a_delegate, void * a_arg)
     db_auth_info_t *l_auth_info = (db_auth_info_t *) a_arg;
     log_it( L_DEBUG, "Authorized, now need to create conditioned transaction if not present");
 
+    size_t l_pkey_b64_length = strlen(l_auth_info->pkey);
+    byte_t * l_pkey_raw = DAP_NEW_Z_SIZE(byte_t,l_pkey_b64_length );
+    size_t l_pkey_raw_size = dap_enc_base64_decode(l_auth_info->pkey,l_pkey_b64_length,l_pkey_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE );
+    char * l_pkey_gdb_group = dap_strdup_printf("%s.pkey", DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX );
+    dap_chain_global_db_gr_set( l_auth_info->user , l_pkey_raw, l_pkey_raw_size,l_pkey_gdb_group);
+
+    dap_enc_key_t *l_client_key = dap_enc_key_deserealize(l_pkey_raw, l_pkey_raw_size);
+
     for ( tx_cond_template_t * l_tpl = s_tx_cond_templates; l_tpl; l_tpl=l_tpl->next) {
-        enc_http_reply_f(a_delegate,"\t<tx_cond_tpl>\n");
-        enc_http_reply_f(a_delegate,"\t\t<net>%s</net>\n",l_tpl->net_name);
-        enc_http_reply_f(a_delegate,"\t\t<token>%s</token>\n",l_tpl->token_ticker);
 
         size_t l_gdb_group_size=0;
 
@@ -278,12 +287,34 @@ static void s_auth_callback(enc_http_delegate_t* a_delegate, void * a_arg)
         }
         // Try to create condition
         if (! l_tx_cond_hash ) {
+            // test
+            dap_chain_wallet_t *l_wallet_from = l_tpl->wallet;
+            dap_enc_key_t *l_key_from = dap_chain_wallet_get_key(l_wallet_from, 0);
+
+            // where to take coins for service
+            dap_chain_addr_t *l_addr_from = dap_chain_wallet_get_addr(l_wallet_from, l_tpl->net->pub.id );
+            dap_chain_net_srv_price_unit_uid_t l_price_unit = { .enm = SERV_UNIT_SEC };
+            dap_chain_net_srv_uid_t l_srv_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID };
+            l_tx_cond_hash= dap_chain_mempool_tx_create_cond( l_tpl->net, l_key_from,l_client_key, l_addr_from,l_tpl->token_ticker,
+                                                       (uint64_t) l_tpl->value_datoshi , 0,l_price_unit,l_srv_uid, 0,NULL, 0);
+            char * l_addr_from_str =dap_chain_addr_to_str( l_addr_from );
+            DAP_DELETE( l_addr_from);
+            if ( l_tx_cond_hash == NULL ){
+                log_it( L_ERROR, "Can't create condiftion for user");
+            }else
+                log_it( L_NOTICE, "User \"%s\": created conditioned transaction from %s(%s) on "
+                                , l_auth_info->user, l_tpl->wallet_name, l_addr_from_str
+                                       );
+            DAP_DELETE( l_addr_from_str );
 
         }
 
         // If we loaded or created hash
         if( l_tx_cond_hash ){
             char * l_tx_cond_hash_str = dap_chain_hash_fast_to_str_new(l_tx_cond_hash);
+            enc_http_reply_f(a_delegate,"\t<tx_cond_tpl>\n");
+            enc_http_reply_f(a_delegate,"\t\t<net>%s</net>\n",l_tpl->net_name);
+            enc_http_reply_f(a_delegate,"\t\t<token>%s</token>\n",l_tpl->token_ticker);
             enc_http_reply_f(a_delegate,"\t\t<tx_cond>%s</tx_cond>\n",l_tx_cond_hash_str);
             DAP_DELETE(l_tx_cond_hash);
             DAP_DELETE(l_tx_cond_hash_str);
@@ -291,4 +322,6 @@ static void s_auth_callback(enc_http_delegate_t* a_delegate, void * a_arg)
         enc_http_reply_f(a_delegate,"\t</tx_cond_tpl>\n");
     }
 
+    if (l_client_key)
+        DAP_DELETE( l_client_key);
 }
diff --git a/dap_chain_net_srv_vpn_cdb_server_list.c b/dap_chain_net_srv_vpn_cdb_server_list.c
index 87b5cc5..24bd81b 100644
--- a/dap_chain_net_srv_vpn_cdb_server_list.c
+++ b/dap_chain_net_srv_vpn_cdb_server_list.c
@@ -99,7 +99,7 @@ static void s_http_simple_proc(dap_http_simple_t *a_http_simple, void *a_arg)
             size_t l_orders_count = 0;
             dap_chain_net_srv_price_unit_uid_t l_unit_uid = {{0}};
             dap_chain_net_srv_uid_t l_srv_uid = { .uint64 =DAP_CHAIN_NET_SRV_VPN_ID };
-            dap_chain_net_srv_order_find_all_by( l_net, SERV_DIR_SELL,  l_srv_uid, SERV_CLASS_PERMANENT ,l_unit_uid ,
+            dap_chain_net_srv_order_find_all_by( l_net, SERV_DIR_SELL,  l_srv_uid, l_unit_uid ,
                                                  NULL,0,0, &l_orders, &l_orders_count );
             log_it(L_DEBUG, "Found %zd orders in \"%s\" network", l_orders_count, l_net->pub.name );
 
-- 
GitLab