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

Collapse All | Expand All

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

Return to bug 69