diff --git a/dap_chain_net_srv.c b/dap_chain_net_srv.c index 1a690e3f2fabeda8148af854a95289fec83304fc..83e3ae1e19bc00776bcb65e6fbf097e5d70e1a2b 100755 --- a/dap_chain_net_srv.c +++ b/dap_chain_net_srv.c @@ -50,6 +50,7 @@ #include "dap_chain_net.h" #include "dap_chain_net_srv.h" #include "dap_chain_net_srv_order.h" +#include "dap_chain_net_srv_stream_session.h" #include "dap_chain_node_cli_cmd.h" @@ -398,7 +399,9 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) * @return */ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_chain_net_srv_callback_data_t a_callback_request, - dap_chain_net_srv_callback_data_t a_callback_response_success,dap_chain_net_srv_callback_data_t a_callback_response_error) + dap_chain_net_srv_callback_data_t a_callback_response_success, + dap_chain_net_srv_callback_data_t a_callback_response_error, + dap_chain_net_srv_callback_data_t a_callback_receipt_next_success) { service_list_t *l_sdata = NULL; dap_chain_net_srv_t * l_srv = NULL; @@ -409,8 +412,9 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha l_srv = DAP_NEW_Z(dap_chain_net_srv_t); l_srv->uid.uint64 = a_uid.uint64; l_srv->callback_requested = a_callback_request; - l_srv->callback_response_success = a_callback_response_success; + l_srv->callback_receipt_first_success = a_callback_response_success; l_srv->callback_response_error = a_callback_response_error; + l_srv->callback_receipt_next_success = a_callback_receipt_next_success; l_sdata = DAP_NEW_Z(service_list_t); memcpy(&l_sdata->uid, &l_uid, sizeof(l_uid)); l_sdata->srv = DAP_NEW(dap_chain_net_srv_t); @@ -522,3 +526,30 @@ const dap_chain_net_srv_uid_t * dap_chain_net_srv_list(void) return l_srv_uids; } +/** + * @brief dap_chain_net_srv_issue_receipt + * @param a_srv + * @param a_usage + * @param a_price + * @return + */ +dap_chain_datum_tx_receipt_t * dap_chain_net_srv_issue_receipt(dap_chain_net_srv_t *a_srv, + dap_chain_net_srv_usage_t * a_usage, + dap_chain_net_srv_price_t * a_price + ) +{ + dap_chain_datum_tx_receipt_t * l_receipt = dap_chain_datum_tx_receipt_create( + a_srv->uid, a_price->units_uid, a_price->units, a_price->value_datoshi); + size_t l_receipt_size = sizeof(dap_chain_receipt_t)+1; // nested receipt plus 8 bits for type + + // Sign with our wallet + l_receipt_size = dap_chain_datum_tx_receipt_sign_add(l_receipt,l_receipt_size , dap_chain_wallet_get_key( a_usage->wallet,0) ); + + a_usage->receipt = l_receipt; + a_usage->receipt_size = l_receipt_size; + a_usage->wallet = a_price->wallet; + + return l_receipt; +} + + diff --git a/dap_chain_net_srv.h b/dap_chain_net_srv.h index b11c48fe2384a781e6975adaf28f55c13ccc6122..5c4f8cd0374c111e7d9a9ca64fd9a446f6019880 100755 --- a/dap_chain_net_srv.h +++ b/dap_chain_net_srv.h @@ -27,6 +27,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_config.h" #include "dap_chain_net_srv_common.h" #include "dap_chain_net_srv_client.h" +#include "dap_chain_net_srv_stream_session.h" typedef struct dap_chain_net_srv dap_chain_net_srv_t; @@ -40,8 +41,9 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_price_t *pricelist; dap_chain_callback_trafic_t callback_trafic; dap_chain_net_srv_callback_data_t callback_requested; - dap_chain_net_srv_callback_data_t callback_response_success; + dap_chain_net_srv_callback_data_t callback_receipt_first_success; dap_chain_net_srv_callback_data_t callback_response_error; + dap_chain_net_srv_callback_data_t callback_receipt_next_success; void * _inhertor; } dap_chain_net_srv_t; typedef void (*dap_chain_net_srv_callback_new_t)(dap_chain_net_srv_t *, dap_config_t *); @@ -51,10 +53,16 @@ int dap_chain_net_srv_init(dap_config_t * a_cfg); void dap_chain_net_srv_deinit(void); dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_chain_net_srv_callback_data_t a_callback_requested, dap_chain_net_srv_callback_data_t a_callback_response_success, - dap_chain_net_srv_callback_data_t a_callback_response_error); + dap_chain_net_srv_callback_data_t a_callback_response_error, + dap_chain_net_srv_callback_data_t a_callback_receipt_next_success + ); void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv); void dap_chain_net_srv_del_all(void); dap_chain_net_srv_t * dap_chain_net_srv_get(dap_chain_net_srv_uid_t a_uid); size_t dap_chain_net_srv_count(void); const dap_chain_net_srv_uid_t * dap_chain_net_srv_list(void); +dap_chain_datum_tx_receipt_t * dap_chain_net_srv_issue_receipt(dap_chain_net_srv_t *a_srv, + dap_chain_net_srv_usage_t * a_usage, + dap_chain_net_srv_price_t * a_price + ); diff --git a/dap_chain_net_srv_common.c b/dap_chain_net_srv_common.c index 57bcc568d233ab09f655021eea64fed1cb78a94c..04ace6677fccc24266945e0888f963385f3d8634 100755 --- a/dap_chain_net_srv_common.c +++ b/dap_chain_net_srv_common.c @@ -47,83 +47,3 @@ #include "dap_chain_net_srv_key.h" #include "dap_chain_net_srv_common.h" -/** - * copy a_value_dst to a_uid_src - */ -void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst) -{ - memset(a_uid_src->raw, 0, sizeof(a_uid_src->raw)); - memcpy(a_uid_src->raw, &a_value_dst, min(sizeof(a_uid_src->raw), sizeof(uint128_t))); -} - -/** - * Generate unique id for service - */ -bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size) -{ - if(!a_srv) - return false; - randombytes(a_srv, a_srv_size); - return true; -} - -/** - * Initialize dap_chain_net_srv_abstract_t structure - */ -void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id, - uint64_t a_price, uint8_t a_price_units, const char *a_decription) -{ - memset(a_cond, 0, sizeof(dap_chain_net_srv_abstract_t)); - // generate unique proposal_id - //dap_chain_net_srv_gen_uid((uint8_t*) &a_cond->proposal_id, sizeof(a_cond->proposal_id)); - // fill structure - a_cond->class = a_class; - dap_chain_net_srv_uid_set(&a_cond->type_id, a_type_id); - a_cond->price = a_price; - a_cond->price_units = a_price_units; - if(a_decription) - strncpy(a_cond->decription, a_decription, sizeof(a_cond->decription) - 1); -} - -/** - * - */ -uint64_t dap_chain_net_srv_client_auth(dap_ledger_t *a_ledger, - const char *a_service_key, const dap_chain_net_srv_abstract_t **a_cond_out) -{ - char *l_addr_base58; - char *l_sign_hash_str; - if(dap_chain_net_srv_key_parse(a_service_key, &l_addr_base58, &l_sign_hash_str)) { - return 0; - } - if(!dap_chain_net_srv_key_check(l_addr_base58, l_sign_hash_str)) { - // invalid signature - return 0; - } - - dap_chain_addr_t *l_addr = (l_addr_base58) ? dap_chain_addr_from_str(l_addr_base58) : NULL; - dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; - dap_sign_type_t l_sig_type; - if(l_addr) - memcpy(&l_sig_type, &l_addr->sig_type, sizeof(dap_sign_type_t)); - - // Search all value in transactions with l_addr in 'out_cond' item - uint64_t l_value = dap_chain_ledger_tx_cache_get_out_cond_value(a_ledger, l_addr, &l_tx_out_cond); - DAP_DELETE(l_addr); - // not found transaction with l_addr in 'out_cond' item - if(!l_value) - return 0; - - size_t l_pkey_size = 0; - size_t l_cond_size = 0; - uint8_t *l_cond = dap_chain_datum_tx_out_cond_item_get_params(l_tx_out_cond, &l_cond_size); - //uint8_t *l_pkey = dap_chain_datum_tx_out_cond_item_get_pkey(l_tx_out_cond, &l_pkey_size); - - if(l_cond_size != sizeof(dap_chain_net_srv_abstract_t)) { - return 0; - } - if(a_cond_out) - *a_cond_out = (const dap_chain_net_srv_abstract_t*) l_cond; - return l_value; -} - diff --git a/dap_chain_net_srv_common.h b/dap_chain_net_srv_common.h index 08f29345efcc607298a5b1b0033c4ef28302f7cf..55a949360762a4644393adb1115f484c5dd6dd8d 100755 --- a/dap_chain_net_srv_common.h +++ b/dap_chain_net_srv_common.h @@ -153,16 +153,3 @@ DAP_STATIC_INLINE const char * dap_chain_net_srv_price_unit_uid_to_str( dap_chai default: return "UNKNOWN"; } } - -// Initialize dap_chain_net_srv_abstract_t structure -void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id, - uint64_t a_price, uint8_t a_price_units, const char *a_decription); - -// copy a_value_dst to a_uid_src -void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst); - -// generate new dap_chain_net_srv_uid_t -bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size); - -uint64_t dap_chain_net_srv_client_auth(dap_ledger_t *a_ledger, - const char *a_service_key, const dap_chain_net_srv_abstract_t **a_cond_out); diff --git a/dap_chain_net_srv_stream_session.c b/dap_chain_net_srv_stream_session.c index 60d4e57add52bc53070231f01276471d7e755ba2..4cae5231445c8595746f3698602bc7a1a6f4d1d4 100644 --- a/dap_chain_net_srv_stream_session.c +++ b/dap_chain_net_srv_stream_session.c @@ -24,6 +24,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_common.h" #include "rand/dap_rand.h" +#include "dap_chain_net_srv.h" #include "dap_chain_net_srv_stream_session.h" #define LOG_TAG "dap_stream_ch_chain_net_srv_session" diff --git a/dap_chain_net_srv_stream_session.h b/dap_chain_net_srv_stream_session.h index 610c20b0110532da6ccdc9e755cda1cb8282f0d2..94f44f4c7e6a68c76b9fb1ac3aa4799755ef4fce 100644 --- a/dap_chain_net_srv_stream_session.h +++ b/dap_chain_net_srv_stream_session.h @@ -31,10 +31,12 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_sign.h" #include "dap_chain_datum_tx.h" #include "dap_chain_datum_tx_receipt.h" -#include "dap_chain_net_srv.h" +//#include "dap_chain_net_srv.h" #include "dap_chain_net_srv_order.h" #include "dap_chain_net_srv_client.h" #include "dap_chain_wallet.h" + +typedef struct dap_chain_net_srv dap_chain_net_srv_t; typedef struct dap_chain_net_srv_usage{ uint32_t id; // Usage id pthread_rwlock_t rwlock; @@ -42,8 +44,12 @@ typedef struct dap_chain_net_srv_usage{ dap_chain_net_t * net; // Chain network where everything happens dap_chain_wallet_t * wallet; dap_chain_net_srv_t * service; // Service that used + dap_chain_datum_tx_receipt_t* receipt; + dap_chain_datum_tx_receipt_t* receipt_next; // Receipt on the next units amount + dap_chain_net_srv_price_t * price; // Price for issue next receipt size_t receipt_size; + size_t receipt_next_size; dap_chain_net_srv_client_t * clients; dap_chain_datum_tx_t * tx_cond; dap_chain_hash_fast_t tx_cond_hash; @@ -56,8 +62,11 @@ typedef struct dap_chain_net_srv_stream_session { dap_stream_session_t * parent; dap_chain_net_srv_usage_t * usages; dap_chain_net_srv_usage_t * usage_active; - uint64_t bytes_sent; - uint64_t bytes_received; + + uint128_t limits_bytes; // Bytes left + time_t limits_ts; // Timestamp until its activte + dap_chain_net_srv_price_unit_uid_t limits_units_type; + time_t ts_activated; dap_sign_t* user_sign; // User's signature for auth if reconnect } dap_chain_net_srv_stream_session_t;