handle ^D and ^C while password prompting

This commit is contained in:
Jethro Grassie
2018-02-01 15:32:30 -05:00
parent ed67e5c001
commit a4b50a6f51
4 changed files with 24 additions and 6 deletions

View File

@@ -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;
}