diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 95917a8314a40a1c0757cbde63ba043782a5b3ba..b6300743314daad2ff03f8437be9c5e747326596 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -126,7 +126,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "wallet new -w <wallet_name> [-sign <sign_type>] [-restore <hex_value>] [-net <net_name>] [-force] [-password <password>] [-restore <hash>]\n" "wallet info {-addr <addr> | -w <wallet_name>} -net <net_name>\n" "wallet activate -w <wallet_name> -password <password> [-ttl <password_ttl_in_minutes>]\n" - "wallet deactivate -w <wallet_name> -password <password>\n"); + "wallet deactivate -w <wallet_name> -password <password>\n" + "wallet convert -w <wallet_name> -password <password>\n"); // Token commands diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index bcc6e38b71906f36d019177016aa4c855fc2795a..219a07b85ce7aab76d5aab715ba9bcacc1c2e3ef 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -67,6 +67,7 @@ #include "dap_file_utils.h" #include "dap_enc_base58.h" #include "dap_chain_wallet.h" +#include "dap_chain_wallet_internal.h" #include "dap_chain_node.h" #include "dap_global_db.h" #include "dap_global_db_driver.h" @@ -1831,7 +1832,7 @@ int com_help(int a_argc, char **a_argv, char **a_str_reply) int com_tx_wallet(int a_argc, char **a_argv, char **a_str_reply) { const char *c_wallets_path = dap_chain_wallet_get_path(g_config); -enum { CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO, CMD_WALLET_ACTIVATE, CMD_WALLET_DEACTIVATE }; +enum { CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO, CMD_WALLET_ACTIVATE, CMD_WALLET_DEACTIVATE, CMD_WALLET_CONVERT }; int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; char l_buf[1024]; @@ -1847,6 +1848,8 @@ char l_buf[1024]; cmd_num = CMD_WALLET_ACTIVATE; else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "deactivate", NULL)) cmd_num = CMD_WALLET_DEACTIVATE; + else if(dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, min(a_argc, l_arg_index + 1), "convert", NULL)) + cmd_num = CMD_WALLET_CONVERT; l_arg_index++; @@ -2030,7 +2033,7 @@ char l_buf[1024]; dap_chain_addr_t *l_addr = l_net? dap_chain_wallet_get_addr(l_wallet, l_net->pub.id) : NULL; char *l_addr_str = dap_chain_addr_to_str(l_addr); - dap_string_append_printf(l_l_string_ret, "Wallet: %s%s\n", l_wallet->name, + dap_string_append_printf(l_l_string_ret, "Wallet: %.*s%s\n", (int) l_file_name_len - 8, l_file_name, (l_wallet->flags & DAP_WALLET$M_FL_ACTIVE) ? " (Active)" : ""); if (l_addr_str) @@ -2042,6 +2045,8 @@ char l_buf[1024]; dap_chain_wallet_close(l_wallet); } else dap_string_append_printf(l_l_string_ret, "Wallet: %.*s (non-Active)\n", (int) l_file_name_len - 8, l_file_name); + } else if ((l_file_name_len > 7) && (!strcmp(l_file_name + l_file_name_len - 7, ".backup"))) { + dap_string_append_printf(l_l_string_ret, "Wallet: %.*s (Backup)\n", (int) l_file_name_len - 7, l_file_name); } } closedir(l_dir); @@ -2134,6 +2139,53 @@ char l_buf[1024]; } } break; + + // convert wallet + case CMD_WALLET_CONVERT: { + dap_chain_wallet_t *l_wallet = NULL; + dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-password", &l_pass_str); + + if(!l_wallet_name) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet name option <-w> not defined"); + return -EINVAL; + } + + if(!l_pass_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet password option <-password> not defined"); + return -EINVAL; + } + + l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path); + if (!l_wallet) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "wrong password"); + return -1; + } else if (l_wallet->flags & DAP_WALLET$M_FL_ACTIVE) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet can't be converted twice"); + return -1; + } + // create wallet backup + dap_chain_wallet_internal_t* l_file_name = DAP_CHAIN_WALLET_INTERNAL(l_wallet); + time_t rawtime; // add timestamp to filename + char l_timestamp[16]; + time(&rawtime); + strftime(l_timestamp,16,"%G%m%d%H%M%S", localtime (&rawtime)); + snprintf(l_file_name->file_name, sizeof(l_file_name->file_name) - 1, "%s/%s_%s%s", c_wallets_path, l_wallet_name, l_timestamp,".backup"); + if ( dap_chain_wallet_save(l_wallet, NULL) ) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't create backup wallet file because of internal error"); + return -1; + } + // change to old filename + snprintf(l_file_name->file_name, sizeof(l_file_name->file_name) - 1, "%s/%s%s", c_wallets_path, l_wallet_name, ".dwallet"); + if ( dap_chain_wallet_save(l_wallet, l_pass_str) ) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet is not converted because of internal error"); + return -1; + } + + log_it(L_INFO, "Wallet %s has been converted", l_wallet_name); + dap_string_append_printf(l_l_string_ret, "Wallet: %s successfully converted\n", l_wallet_name); + dap_chain_wallet_close(l_wallet); + } + break; } *a_str_reply = dap_string_free(l_l_string_ret, false); diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index db0b7c4c42d31458945660aca581f3e29b958ff5..1c02e0be223b8dbb2f77526aa8032f26dd13cc27 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -609,7 +609,7 @@ if ( a_pass ) .signature = DAP_CHAIN_WALLETS_FILE_SIGNATURE, .version = a_pass ? DAP_WALLET$K_VER_2 : DAP_WALLET$K_VER_1, .type = a_pass ? DAP_WALLET$K_TYPE_GOST89 : DAP_WALLET$K_TYPE_PLAIN, - .wallet_len = strnlen(l_cp, DAP_WALLET$SZ_NAME) + 1 + .wallet_len = strnlen(l_cp, DAP_WALLET$SZ_NAME) }; iovec_t l_iov[] = {