X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/116f2044b2ed89f13b29a45f04aac7a7f01e446a..55fb297890fbd83482db2d2516a9392befb3eb21:/cmdline.c diff --git a/cmdline.c b/cmdline.c index fdd95849..112463c3 100644 --- a/cmdline.c +++ b/cmdline.c @@ -63,23 +63,40 @@ void cmdline_cleanup(void) if (need_save) { cmdline_save_param(p, value, pri); return ret; } \ } while (0) -char *cmdline_password = NULL; +static char *cmdline_password = NULL; + +/* + * Similar interface to get_userpass_input(), except that here a -1 + * return means that we aren't capable of processing the prompt and + * someone else should do it. + */ +int cmdline_get_passwd_input(prompts_t *p, unsigned char *in, int inlen) { -static int cmdline_get_line(const char *prompt, char *str, - int maxlen, int is_pw) -{ static int tried_once = 0; - assert(is_pw && cmdline_password); + /* + * We only handle prompts which don't echo (which we assume to be + * passwords), and (currently) we only cope with a password prompt + * that comes in a prompt-set on its own. + */ + if (!cmdline_password || in || p->n_prompts != 1 || p->prompts[0]->echo) { + return -1; + } - if (tried_once) { + /* + * If we've tried once, return utter failure (no more passwords left + * to try). + */ + if (tried_once) return 0; - } else { - strncpy(str, cmdline_password, maxlen); - str[maxlen - 1] = '\0'; - tried_once = 1; - return 1; - } + + strncpy(p->prompts[0]->result, cmdline_password, + p->prompts[0]->result_len); + p->prompts[0]->result[p->prompts[0]->result_len-1] = '\0'; + memset(cmdline_password, 0, strlen(cmdline_password)); + tried_once = 1; + return 1; + } /* @@ -272,8 +289,6 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) RETURN(2); UNAVAILABLE_IN(TOOLTYPE_NONNETWORK); cmdline_password = value; - ssh_get_line = cmdline_get_line; - ssh_getline_pw_only = TRUE; } if (!strcmp(p, "-A")) {