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