diff options
author | Jethro Grassie <jtg@xtrabass.com> | 2018-02-01 15:32:30 -0500 |
---|---|---|
committer | Jethro Grassie <jtg@xtrabass.com> | 2018-02-10 18:29:49 -0500 |
commit | a4b50a6f511e60a57955dab7586aba08a5c54337 (patch) | |
tree | 93a0915795456aae2eab1984d07929e8c4c12cd3 | |
parent | Merge pull request #3198 (diff) | |
download | monero-a4b50a6f511e60a57955dab7586aba08a5c54337.tar.xz |
handle ^D and ^C while password prompting
-rw-r--r-- | src/common/password.cpp | 15 | ||||
-rw-r--r-- | src/common/password.h | 2 | ||||
-rw-r--r-- | src/common/util.h | 6 | ||||
-rw-r--r-- | src/simplewallet/simplewallet.cpp | 7 |
4 files changed, 24 insertions, 6 deletions
diff --git a/src/common/password.cpp b/src/common/password.cpp index ef026c979..9336a14fc 100644 --- a/src/common/password.cpp +++ b/src/common/password.cpp @@ -42,12 +42,10 @@ #include <unistd.h> #endif -#ifdef HAVE_READLINE - #include "readline_buffer.h" -#endif - #include "memwipe.h" +#define EOT 0x4 + namespace { #if defined(_WIN32) @@ -134,7 +132,7 @@ namespace while (aPass.size() < tools::password_container::max_password_size) { int ch = getch(); - if (EOF == ch) + if (EOF == ch || ch == EOT) { return false; } @@ -229,13 +227,20 @@ namespace tools m_password.clear(); } + std::atomic<bool> password_container::is_prompting(false); + boost::optional<password_container> password_container::prompt(const bool verify, const char *message) { + is_prompting = true; password_container pass1{}; password_container pass2{}; if (is_cin_tty() ? read_from_tty(verify, message, pass1.m_password, pass2.m_password) : read_from_file(pass1.m_password)) + { + is_prompting = false; return {std::move(pass1)}; + } + is_prompting = false; return boost::none; } diff --git a/src/common/password.h b/src/common/password.h index 7c29effe4..61937b93a 100644 --- a/src/common/password.h +++ b/src/common/password.h @@ -31,6 +31,7 @@ #pragma once #include <string> +#include <atomic> #include <boost/optional/optional.hpp> #include "wipeable_string.h" @@ -49,6 +50,7 @@ namespace tools //! \return A password from stdin TTY prompt or `std::cin` pipe. static boost::optional<password_container> prompt(bool verify, const char *mesage = "Password"); + static std::atomic<bool> is_prompting; password_container(const password_container&) = delete; password_container(password_container&& rhs) = default; diff --git a/src/common/util.h b/src/common/util.h index 5afb42c97..d3ba47a4f 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -153,8 +153,12 @@ namespace tools } return r; #else + static struct sigaction sa; + memset(&sa, 0, sizeof(struct sigaction)); + sa.sa_handler = posix_handler; + sa.sa_flags = 0; /* Only blocks SIGINT, SIGTERM and SIGPIPE */ - signal(SIGINT, posix_handler); + sigaction(SIGINT, &sa, NULL); signal(SIGTERM, posix_handler); signal(SIGPIPE, SIG_IGN); m_handler = t; diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index a6cef1bb9..ea9212ff1 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -638,6 +638,8 @@ bool simple_wallet::change_password(const std::vector<std::string> &args) // prompts for a new password, pass true to verify the password const auto pwd_container = default_password_prompter(true); + if(!pwd_container) + return true; try { @@ -6806,6 +6808,11 @@ int main(int argc, char* argv[]) else { tools::signal_handler::install([&w](int type) { + if (tools::password_container::is_prompting.load()) + { + // must be prompting for password so return and let the signal stop prompt + return; + } #ifdef WIN32 if (type == CTRL_C_EVENT) #else |