Diff

Differences From Artifact [a335df6663]:

To Artifact [2f1d78ddec]:


59
60
61
62
63
64
65
66

67





68

69
70

71
72





73
74
75









76
77
78
79
80
81
82








83
84
85
86
87
88
89
59
60
61
62
63
64
65

66
67
68
69
70
71
72

73


74
75
76
77
78
79
80
81



82
83
84
85
86
87
88
89
90
91






92
93
94
95
96
97
98
99
100
101
102
103
104
105
106







-
+

+
+
+
+
+
-
+
-
-
+


+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+
+
+







	sfree(saves[pri].params);
}

#define SAVEABLE(pri) do { \
    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.
 */
static int cmdline_get_line(const char *prompt, char *str,
int cmdline_get_passwd_input(prompts_t *p, unsigned char *in, int inlen) {
                            int maxlen, int is_pw)
{

    static int tried_once = 0;

    /*
     * 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.
     */
    assert(is_pw && cmdline_password);

    if (tried_once) {
    if (!cmdline_password || in || p->n_prompts != 1 || p->prompts[0]->echo) {
	return -1;
    }

    /*
     * 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;

}

/*
 * Here we have a flags word which describes the capabilities of
 * the particular tool on whose behalf we're running. We will
 * refuse certain command-line options if a particular tool
 * inherently can't do anything sensible. For example, the file
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
285
286
287
288
289
290
291


292
293
294
295
296
297
298







-
-







	SAVEABLE(1);		       /* lower priority than -ssh,-telnet */
	cfg->port = atoi(value);
    }
    if (!strcmp(p, "-pw")) {
	RETURN(2);
	UNAVAILABLE_IN(TOOLTYPE_NONNETWORK);
	cmdline_password = value;
	ssh_get_line = cmdline_get_line;
	ssh_getline_pw_only = TRUE;
    }

    if (!strcmp(p, "-A")) {
	RETURN(1);
	UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK);
	SAVEABLE(0);
	cfg->agentfwd = 1;