hide password in -stdin `walletpassphrase` command
This commit is contained in:
parent
e528caf7fb
commit
ab55776189
|
@ -19,6 +19,13 @@
|
||||||
|
|
||||||
#include <univalue.h>
|
#include <univalue.h>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
|
const std::function<std::string(const char*)> G_TRANSLATION_FUN = nullptr;
|
||||||
|
|
||||||
static const char DEFAULT_RPCCONNECT[] = "127.0.0.1";
|
static const char DEFAULT_RPCCONNECT[] = "127.0.0.1";
|
||||||
|
@ -32,6 +39,7 @@ std::string HelpMessageCli()
|
||||||
strUsage += HelpMessageOpt("-?", _("This help message"));
|
strUsage += HelpMessageOpt("-?", _("This help message"));
|
||||||
strUsage += HelpMessageOpt("-conf=<file>", strprintf(_("Specify configuration file (default: %s)"), BITCOIN_CONF_FILENAME));
|
strUsage += HelpMessageOpt("-conf=<file>", strprintf(_("Specify configuration file (default: %s)"), BITCOIN_CONF_FILENAME));
|
||||||
strUsage += HelpMessageOpt("-datadir=<dir>", _("Specify data directory"));
|
strUsage += HelpMessageOpt("-datadir=<dir>", _("Specify data directory"));
|
||||||
|
strUsage += HelpMessageOpt("-stdin", _("Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases). If first extra argument is `walletpassphrase` then the first line(password) will not be echoed."));
|
||||||
AppendParamsHelpMessages(strUsage);
|
AppendParamsHelpMessages(strUsage);
|
||||||
strUsage += HelpMessageOpt("-rpcconnect=<ip>", strprintf(_("Send commands to node running on <ip> (default: %s)"), DEFAULT_RPCCONNECT));
|
strUsage += HelpMessageOpt("-rpcconnect=<ip>", strprintf(_("Send commands to node running on <ip> (default: %s)"), DEFAULT_RPCCONNECT));
|
||||||
strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Connect to JSON-RPC on <port> (default: %u or testnet: %u)"), 8232, 18232));
|
strUsage += HelpMessageOpt("-rpcport=<port>", strprintf(_("Connect to JSON-RPC on <port> (default: %u or testnet: %u)"), 8232, 18232));
|
||||||
|
@ -39,7 +47,6 @@ std::string HelpMessageCli()
|
||||||
strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections"));
|
strUsage += HelpMessageOpt("-rpcuser=<user>", _("Username for JSON-RPC connections"));
|
||||||
strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections"));
|
strUsage += HelpMessageOpt("-rpcpassword=<pw>", _("Password for JSON-RPC connections"));
|
||||||
strUsage += HelpMessageOpt("-rpcclienttimeout=<n>", strprintf(_("Timeout in seconds during HTTP requests, or 0 for no timeout. (default: %d)"), DEFAULT_HTTP_CLIENT_TIMEOUT));
|
strUsage += HelpMessageOpt("-rpcclienttimeout=<n>", strprintf(_("Timeout in seconds during HTTP requests, or 0 for no timeout. (default: %d)"), DEFAULT_HTTP_CLIENT_TIMEOUT));
|
||||||
strUsage += HelpMessageOpt("-stdin", _("Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases)"));
|
|
||||||
|
|
||||||
return strUsage;
|
return strUsage;
|
||||||
}
|
}
|
||||||
|
@ -263,6 +270,32 @@ UniValue CallRPC(const std::string& strMethod, const UniValue& params)
|
||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetStdinEcho(bool enable = true)
|
||||||
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
DWORD mode;
|
||||||
|
GetConsoleMode(hStdin, &mode);
|
||||||
|
|
||||||
|
if (!enable)
|
||||||
|
mode &= ~ENABLE_ECHO_INPUT;
|
||||||
|
else
|
||||||
|
mode |= ENABLE_ECHO_INPUT;
|
||||||
|
|
||||||
|
SetConsoleMode(hStdin, mode);
|
||||||
|
|
||||||
|
#else
|
||||||
|
struct termios tty;
|
||||||
|
tcgetattr(STDIN_FILENO, &tty);
|
||||||
|
if (!enable)
|
||||||
|
tty.c_lflag &= ~ECHO;
|
||||||
|
else
|
||||||
|
tty.c_lflag |= ECHO;
|
||||||
|
|
||||||
|
(void) tcsetattr(STDIN_FILENO, TCSANOW, &tty);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int CommandLineRPC(int argc, char *argv[])
|
int CommandLineRPC(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
std::string strPrint;
|
std::string strPrint;
|
||||||
|
@ -275,10 +308,21 @@ int CommandLineRPC(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
std::vector<std::string> args = std::vector<std::string>(&argv[1], &argv[argc]);
|
std::vector<std::string> args = std::vector<std::string>(&argv[1], &argv[argc]);
|
||||||
if (GetBoolArg("-stdin", false)) {
|
if (GetBoolArg("-stdin", false)) {
|
||||||
|
bool hide = false;
|
||||||
|
if (strncmp(argv[1], "walletpassphrase", 16) == 0) {
|
||||||
|
SetStdinEcho(false);
|
||||||
|
hide = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Read one arg per line from stdin and append
|
// Read one arg per line from stdin and append
|
||||||
std::string line;
|
std::string line;
|
||||||
while (std::getline(std::cin,line))
|
while (std::getline(std::cin,line)) {
|
||||||
args.push_back(line);
|
args.push_back(line);
|
||||||
|
if (hide) {
|
||||||
|
SetStdinEcho(true);
|
||||||
|
hide = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (args.size() < 1)
|
if (args.size() < 1)
|
||||||
throw std::runtime_error("too few parameters (need at least command)");
|
throw std::runtime_error("too few parameters (need at least command)");
|
||||||
|
|
Loading…
Reference in New Issue