|
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 |