summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2006-01-15 06:43:24 +0000
committerMatt Johnston <matt@ucc.asn.au>2006-01-15 06:43:24 +0000
commitfd0f873a367b133fd41af34dc168bd594ee2928c (patch)
tree95cd089b6b5b7e07e9d8fdaa03dbfb5aa6fffab4
parentd8e61e51ded9c7fb784d33f9939b9c40a967bc0f (diff)
Cancel a dbclient password prompt if the user presses ctrl-c.
Enter still has to be pressed since glibc blocks ctrl-c in getpass() --HG-- extra : convert_revision : 1c8128fba89431f2460dd5914f0614850d529b76
-rw-r--r--auth.h1
-rw-r--r--cli-auth.c15
-rw-r--r--cli-authinteract.c2
-rw-r--r--cli-authpasswd.c5
4 files changed, 18 insertions, 5 deletions
diff --git a/auth.h b/auth.h
index 7e83247..c407ad5 100644
--- a/auth.h
+++ b/auth.h
@@ -52,6 +52,7 @@ void cli_pubkeyfail();
void cli_auth_password();
int cli_auth_pubkey();
void cli_auth_interactive();
+char* getpass_or_cancel();
#define MAX_USERNAME_LEN 25 /* arbitrary for the moment */
diff --git a/cli-auth.c b/cli-auth.c
index 6a6d53a..d08de9a 100644
--- a/cli-auth.c
+++ b/cli-auth.c
@@ -278,3 +278,18 @@ void cli_auth_try() {
TRACE(("leave cli_auth_try"))
}
+
+/* A helper for getpass() that exits if the user cancels. The returned
+ * password is statically allocated by getpass() */
+char* getpass_or_cancel()
+{
+ char* password = NULL;
+
+ password = getpass("Password: ");
+
+ /* 0x03 is a ctrl-c character in the buffer. */
+ if (password == NULL || strchr(password, '\3') != NULL) {
+ dropbear_close("Interrupted.");
+ }
+ return password;
+}
diff --git a/cli-authinteract.c b/cli-authinteract.c
index ef65517..5a169cb 100644
--- a/cli-authinteract.c
+++ b/cli-authinteract.c
@@ -115,7 +115,7 @@ void recv_msg_userauth_info_request() {
echo = buf_getbool(ses.payload);
if (!echo) {
- unsigned char* p = getpass(prompt);
+ unsigned char* p = getpass_or_cancel(prompt);
response = m_strdup(p);
m_burn(p, strlen(p));
} else {
diff --git a/cli-authpasswd.c b/cli-authpasswd.c
index ec290e0..5dffac4 100644
--- a/cli-authpasswd.c
+++ b/cli-authpasswd.c
@@ -125,10 +125,7 @@ void cli_auth_password() {
password = gui_getpass("Password: ");
else
#endif
- password = getpass("Password: ");
-
- if (password == NULL)
- return 0;
+ password = getpass_or_cancel("Password: ");
buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST);