View | Details | Raw Unified | Return to bug 69 | Differences between
and this patch

Collapse All | Expand All

(-)a/readpass.c (-38 / +69 lines)
Lines 117-175 Link Here
117
char *
117
char *
118
read_passphrase(const char *prompt, int flags)
118
read_passphrase(const char *prompt, int flags)
119
{
119
{
120
	static const int askpass_never = 0, askpass_always = 1, askpass_auto = 2;
121
	static const char *prefix_never = "never:", *prefix_always = "always:",
122
		*prefix_auto = "auto:";
123
120
	char cr = '\r', *askpass = NULL, *ret, buf[1024];
124
	char cr = '\r', *askpass = NULL, *ret, buf[1024];
121
	int rppflags, use_askpass = 0, ttyfd;
125
	int rppflags, use_askpass, force_askpass, ttyfd;
126
127
	/* decode $SSH_ASKPASS */
128
	askpass = getenv(SSH_ASKPASS_ENV);
129
130
	if(askpass == NULL) {
131
		force_askpass = askpass_auto;
132
		askpass = "";
133
	} else if(strncmp(askpass, prefix_never, strlen(prefix_never)) == 0) {
134
		force_askpass = askpass_never;
135
		askpass += strlen(prefix_never);
136
	} else if(strncmp(askpass, prefix_always, strlen(prefix_always)) == 0) {
137
		force_askpass = askpass_always;
138
		askpass += strlen(prefix_always);
139
	} else if(strncmp(askpass, prefix_auto, strlen(prefix_auto)) == 0) {
140
		force_askpass = askpass_auto;
141
		askpass += strlen(prefix_auto);
142
	} else
143
		force_askpass = askpass_auto;
144
145
	if(askpass[0] == '\0')
146
		askpass = _PATH_SSH_ASKPASS_DEFAULT;
122
147
123
	rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF;
148
	if (force_askpass == askpass_always)
124
	if (flags & RP_USE_ASKPASS)
125
		use_askpass = 1;
149
		use_askpass = 1;
126
	else if (flags & RP_ALLOW_STDIN) {
150
	else {
127
		if (!isatty(STDIN_FILENO)) {
151
		/* This block has two purposes:
128
			debug("read_passphrase: stdin is not a tty");
152
			1.) automatic detection of askpass usesage.  The result will be stored
153
			    in use_askpass and may be overridden by force_askpass == never
154
			2.) determine options and print debug warnings for use with the
155
			    tty/stdin pasphrase reader.
156
		*/
157
		use_askpass = 0;
158
159
		rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF;
160
		if (flags & RP_USE_ASKPASS)
129
			use_askpass = 1;
161
			use_askpass = 1;
130
		}
162
		else if (flags & RP_ALLOW_STDIN) {
131
	} else {
163
			if (!isatty(STDIN_FILENO)) {
132
		rppflags |= RPP_REQUIRE_TTY;
164
				debug("read_passphrase: stdin is not a tty");
133
		ttyfd = open(_PATH_TTY, O_RDWR);
165
				use_askpass = 1;
134
		if (ttyfd >= 0) {
166
			}
135
			/*
136
			 * If we're on a tty, ensure that show the prompt at
137
			 * the beginning of the line. This will hopefully
138
			 * clobber any password characters the user has
139
			 * optimistically typed before echo is disabled.
140
			 */
141
			(void)write(ttyfd, &cr, 1);
142
			close(ttyfd);
143
		} else {
167
		} else {
144
			debug("read_passphrase: can't open %s: %s", _PATH_TTY,
168
			rppflags |= RPP_REQUIRE_TTY;
145
			    strerror(errno));
169
			ttyfd = open(_PATH_TTY, O_RDWR);
146
			use_askpass = 1;
170
			if (ttyfd >= 0)
171
				close(ttyfd);
172
			else {
173
				debug("read_passphrase: can't open %s: %s", _PATH_TTY,
174
					strerror(errno));
175
				use_askpass = 1;
176
			}
147
		}
177
		}
178
179
		if(getenv("DISPLAY") == NULL)
180
			use_askpass = 0;
181
182
		if(force_askpass == askpass_never)
183
			use_askpass = 0;
148
	}
184
	}
149
185
150
	if ((flags & RP_USE_ASKPASS) && getenv("DISPLAY") == NULL)
186
	if (!use_askpass && (flags & RP_USE_ASKPASS))
151
		return (flags & RP_ALLOW_EOF) ? NULL : xstrdup("");
187
		return (flags & RP_ALLOW_EOF) ? NULL : xstrdup("");
152
188
153
	if (use_askpass && getenv("DISPLAY")) {
189
	if (use_askpass) {
154
		if (getenv(SSH_ASKPASS_ENV))
155
			askpass = getenv(SSH_ASKPASS_ENV);
156
		else
157
			askpass = _PATH_SSH_ASKPASS_DEFAULT;
158
		if ((ret = ssh_askpass(askpass, prompt)) == NULL)
190
		if ((ret = ssh_askpass(askpass, prompt)) == NULL)
159
			if (!(flags & RP_ALLOW_EOF))
191
			if (!(flags & RP_ALLOW_EOF))
160
				return xstrdup("");
192
				return xstrdup("");
161
		return ret;
193
		return ret;
194
	} else {
195
		if (readpassphrase(prompt, buf, sizeof buf, rppflags) == NULL) {
196
			if (flags & RP_ALLOW_EOF)
197
				return NULL;
198
			return xstrdup("");
199
		}
200
		ret = xstrdup(buf);
201
		memset(buf, 'x', sizeof buf);
202
		return ret;
162
	}
203
	}
163
164
	if (readpassphrase(prompt, buf, sizeof buf, rppflags) == NULL) {
165
		if (flags & RP_ALLOW_EOF)
166
			return NULL;
167
		return xstrdup("");
168
	}
169
170
	ret = xstrdup(buf);
171
	explicit_bzero(buf, sizeof(buf));
172
	return ret;
173
}
204
}
174
205
175
int
206
int

Return to bug 69