diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cdb.c b/modules/service/vpn/dap_chain_net_srv_vpn_cdb.c index 648b707b267e9aa3957dd463eab892da7cc36551..6ab2d43a962fe79c19c19afd8c6dc6f43a574257 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cdb.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cdb.c @@ -119,6 +119,12 @@ int dap_chain_net_srv_vpn_cdb_init(dap_http_t * a_http) "\tShow serial keys\n" "vpn_cdb serial update -serial <serial keys> -acive_days <active days that left for serial>\n" "\tEdit serial key\n" + "vpn_cdb serial info -serial <serial keys>\n" + "\tInformation about serial key\n" + "vpn_cdb serial delete -serial <serial keys>\n" + "\tDelete serial key\n" + "vpn_cdb serial deactivate -serial <serial keys>\n" + "\tDeactivate serial key\n" ); // Load all chain networks diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c b/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c index 587121d1ab83328fc9c6c1fd73491333bb675ea5..931f437f7fb8dff998464a58ffe83f909dd7780e 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cdb_auth.c @@ -101,6 +101,7 @@ static char *s_hook_serial_login = NULL; static char *s_hook_serial_activate = NULL; static char *s_hook_serial_update = NULL; static char *s_hook_serial_delete = NULL; +static char *s_hook_serial_deactivate = NULL; static int s_input_validation(const char * str); static void s_http_enc_proc(enc_http_delegate_t *a_delegate, void * a_arg); @@ -184,7 +185,8 @@ int dap_chain_net_srv_vpn_cdb_auth_init (const char * a_domain, const char * a_m s_hook_serial_login = register_hook("hook_serial_login"); s_hook_serial_activate = register_hook("hook_serial_activate"); s_hook_serial_update = register_hook("hook_serial_update"); - s_hook_serial_delete = register_hook("s_hook_serial_delete"); + s_hook_serial_delete = register_hook("hook_serial_delete"); + s_hook_serial_deactivate = register_hook("hook_serial_deactivate"); //run_hook(s_hook_serial_update, "serial=%s active_days=%lld", l_serial.header.serial, l_active_days); } @@ -318,7 +320,9 @@ int dap_chain_net_srv_vpn_cdb_auth_activate_serial(const char * a_serial_raw, co l_serial_key->header.ext_size = l_pkey_raw_size; l_serial_key = DAP_REALLOC(l_serial_key, dap_serial_key_len(l_serial_key)); l_serial_key->header.activated = time(NULL); - l_serial_key->header.os = l_key_type; + if(l_serial_key->header.expired) + l_serial_key->header.expired = l_serial_key->header.activated + l_serial_key->header.expired; + l_serial_key->header.pkey_type = l_key_type; memcpy(l_serial_key->ext, l_pkey_raw, l_pkey_raw_size); // save updated serial if(dap_chain_global_db_gr_set(dap_strdup(l_serial_key->header.serial), l_serial_key, @@ -361,20 +365,23 @@ int dap_chain_net_srv_vpn_cdb_auth_check_serial(const char * a_serial, const cha if((l_serial_key->header.activated + l_serial_key->header.expired) < time(NULL)) l_ret = -4; } - // check pkey - dap_enc_key_t *l_client_key = NULL; - size_t l_pkey_length = dap_strlen(a_pkey_b64); - byte_t *l_pkey_raw = DAP_NEW_Z_SIZE(byte_t, l_pkey_length); - memset(l_pkey_raw, 0, l_pkey_length); - size_t l_pkey_raw_size = dap_enc_base64_decode(a_pkey_b64, l_pkey_length, l_pkey_raw, DAP_ENC_DATA_TYPE_B64_URLSAFE); - // pkey from sign - size_t l_pkey_sign_size = l_serial_key->header.ext_size; - uint8_t *l_pkey_sign = l_serial_key->ext; - // compare pkeys - if(l_pkey_sign_size != l_pkey_raw_size || memcmp(l_pkey_sign, l_pkey_raw, l_pkey_sign_size)) { - l_ret = -2; + else { + // check pkey + dap_enc_key_t *l_client_key = NULL; + size_t l_pkey_length = dap_strlen(a_pkey_b64); + byte_t *l_pkey_raw = DAP_NEW_Z_SIZE(byte_t, l_pkey_length); + memset(l_pkey_raw, 0, l_pkey_length); + size_t l_pkey_raw_size = dap_enc_base64_decode(a_pkey_b64, l_pkey_length, l_pkey_raw, + DAP_ENC_DATA_TYPE_B64_URLSAFE); + // pkey from sign + size_t l_pkey_sign_size = l_serial_key->header.ext_size; + uint8_t *l_pkey_sign = l_serial_key->ext; + // compare pkeys + if(l_pkey_sign_size != l_pkey_raw_size || memcmp(l_pkey_sign, l_pkey_raw, l_pkey_sign_size)) { + l_ret = -2; + } + DAP_DELETE(l_pkey_raw); } - DAP_DELETE(l_pkey_raw); return l_ret; } @@ -596,7 +603,7 @@ int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_serial(const char *a_serial_str, int DAP_DELETE(l_serial_key); // save gdb dap_chain_global_db_flush(); - run_hook(s_hook_serial_update, "serial=%s active_days=%lld", l_serial_key->header.serial, l_serial_key->header.activated ? "activated" : "inative", l_active_days); + run_hook(s_hook_serial_update, "serial=%s active_days=%lld", l_serial_key->header.serial, l_serial_key->header.activated ? "activated" : "inactive", l_active_days); return 0; } else{ @@ -613,11 +620,140 @@ int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_serial(const char *a_serial_str, int else // Command 'serial info' if(!dap_strcmp(a_serial_str, "info")) { + int l_ret = 0; + const char * l_serial_number_str = NULL; + dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, "-serial", &l_serial_number_str); + if(!l_serial_number_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "option '-serial XXXX-XXXX-XXXX-XXXX' is not defined"); + l_ret = -1; + } + else { + const char *l_group; + dap_serial_key_t *l_serial_key = dap_chain_net_srv_vpn_cdb_auth_get_serial_param(l_serial_number_str, &l_group); + if(l_serial_key) { + char l_out_str[121]; + char *l_str_message; + // form full string with serial info + if(l_serial_key->header.activated) { + if(dap_time_to_str_rfc822(l_out_str, 120, l_serial_key->header.activated) > 0) {// instead of strftime + // form expired time string + char *l_expired_txt = NULL; + if(l_serial_key->header.expired) { + time_t l_expired_sec = l_serial_key->header.expired - time(NULL); + if(l_expired_sec < 0) + l_expired_txt = dap_strdup("0 days"); + else + l_expired_txt = dap_strdup_printf("%lld days", l_expired_sec/(24*3600)); + } + else + l_expired_txt = dap_strdup("no time limit"); + l_str_message = dap_strdup_printf("serial %s actitated %s\nexpired: %s", l_serial_key->header.serial, l_out_str, l_expired_txt); + DAP_DELETE(l_expired_txt); + } + else { + l_str_message = dap_strdup_printf("serial %s actitated ???", l_serial_key->header.serial); + l_ret = -3; + } + } + // not activated serial + else { + // form expired time string + char *l_expired_txt = NULL; + if(l_serial_key->header.expired) { + l_expired_txt = dap_strdup_printf("%lld days", l_serial_key->header.expired/(24*3600)); + } + else + l_expired_txt = dap_strdup("no time limit"); + l_str_message = dap_strdup_printf("serial %s not actitated\nexpired: %s", l_serial_key->header.serial, l_expired_txt); + DAP_DELETE(l_expired_txt); + } + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_message); + + DAP_DELETE(l_str_message); + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' not found", l_serial_number_str); + l_ret = -2; + } + + DAP_DELETE(l_serial_key); + } + return l_ret; } + else // Command 'serial delete' if(!dap_strcmp(a_serial_str, "delete")) { + int l_ret = 0; + const char * l_serial_number_str = NULL; + dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, "-serial", &l_serial_number_str); + if(!l_serial_number_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "option '-serial XXXX-XXXX-XXXX-XXXX' is not defined"); + l_ret = -1; + } + else { + const char *l_group; + dap_serial_key_t *l_serial_key = dap_chain_net_srv_vpn_cdb_auth_get_serial_param(l_serial_number_str, &l_group); + if(l_serial_key) { + if(dap_chain_global_db_gr_del(l_serial_key->header.serial, l_group)){ + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' deleted", l_serial_key->header.serial); + run_hook(s_hook_serial_delete, "serial=%s", l_serial_key->header.serial); + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' not deleted", l_serial_key->header.serial); + l_ret = -4; + } + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' not found", l_serial_number_str); + l_ret = -2; + } + DAP_DELETE(l_serial_key); + } + return l_ret; + } + else + // Command 'serial deactivate' + if(!dap_strcmp(a_serial_str, "deactivate")) { + int l_ret = 0; + const char * l_serial_number_str = NULL; + dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, "-serial", &l_serial_number_str); + if(!l_serial_number_str) { + dap_chain_node_cli_set_reply_text(a_str_reply, "option '-serial XXXX-XXXX-XXXX-XXXX' is not defined"); + l_ret = -1; + } + else { + const char *l_group; + dap_serial_key_t *l_serial_key = dap_chain_net_srv_vpn_cdb_auth_get_serial_param(l_serial_number_str, &l_group); + if(l_serial_key) { + if(!l_serial_key->header.activated){ + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' already deactivated", l_serial_number_str); + } + else{ + if(l_serial_key->header.expired) + l_serial_key->header.expired = l_serial_key->header.expired - l_serial_key->header.activated; + l_serial_key->header.activated = 0; + + // pkey in l_serial_key->ext remains + // save updated serial + if(dap_chain_global_db_gr_set(dap_strdup(l_serial_key->header.serial), l_serial_key, dap_serial_key_len(l_serial_key), s_group_serials)) { + dap_chain_global_db_gr_del(l_serial_key->header.serial, s_group_serials_activated); + run_hook(s_hook_serial_deactivate, "serial=%s", l_serial_key->header.serial); + l_ret = 0; // OK + } + else + l_ret = -5; + } + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, "serial '%s' not found", l_serial_number_str); + l_ret = -2; + } + + DAP_DELETE(l_serial_key); + } + return l_ret; } else { dap_chain_node_cli_set_reply_text(a_str_reply, "unknown subcommand %s, use 'generate', 'list' or 'update'", a_serial_str); diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h index 8682421039c334431ef333fc981e9b2e10e9e31a..07556ea38d24ddbbca21a90d6ce4b78b7b9f1c16 100644 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h +++ b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h @@ -32,10 +32,10 @@ typedef struct dap_serial_key { char serial[20]; time_t activated; // if set, then serial is activated time_t expired; // if zero then time no expired - int32_t os;// operating system. if zero then any operating system + int32_t pkey_type;// dap_enc_key_type_t pkey type size_t ext_size; }DAP_ALIGN_PACKED header; - uint8_t ext[]; + uint8_t ext[];// pkey here }DAP_ALIGN_PACKED dap_serial_key_t; size_t dap_serial_key_len(dap_serial_key_t *a_serial_key);