|
Lines 99-126
Link Here
|
| 99 |
char * |
99 |
char * |
| 100 |
read_passphrase(const char *prompt, int flags) |
100 |
read_passphrase(const char *prompt, int flags) |
| 101 |
{ |
101 |
{ |
| 102 |
char *askpass = NULL, *ret, buf[1024]; |
102 |
char *askpass = NULL, *ret, buf[1024], *env_askpass; |
| 103 |
int rppflags, use_askpass = 0, ttyfd; |
103 |
enum { |
| 104 |
|
104 |
NEVER, |
|
|
105 |
IFAVAILABLE, |
| 106 |
ALWAYS |
| 107 |
}; |
| 108 |
int rppflags, use_askpass = NEVER, ttyfd; |
| 109 |
|
| 105 |
rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF; |
110 |
rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF; |
| 106 |
if (flags & RP_USE_ASKPASS) |
111 |
|
| 107 |
use_askpass = 1; |
112 |
env_askpass = getenv("SSH_USE_ASKPASS"); |
| 108 |
else if (flags & RP_ALLOW_STDIN) { |
113 |
|
| 109 |
if (!isatty(STDIN_FILENO)) |
114 |
if (env_askpass && !strcasecmp(env_askpass, "always")) |
| 110 |
use_askpass = 1; |
115 |
use_askpass = ALWAYS; |
| 111 |
} else { |
116 |
else if (env_askpass && !strcasecmp(env_askpass, "never")) |
| 112 |
rppflags |= RPP_REQUIRE_TTY; |
117 |
use_askpass = NEVER; |
| 113 |
ttyfd = open(_PATH_TTY, O_RDWR); |
118 |
else if (env_askpass && !strcasecmp(env_askpass, "prefer") && |
| 114 |
if (ttyfd >= 0) |
119 |
!(flags & RP_ECHO)) |
| 115 |
close(ttyfd); |
120 |
use_askpass = IFAVAILABLE; |
| 116 |
else |
121 |
if (!env_askpass) { |
| 117 |
use_askpass = 1; |
122 |
if (flags & RP_USE_ASKPASS) |
|
|
123 |
use_askpass = IFAVAILABLE; |
| 124 |
else if (flags & RP_ALLOW_STDIN) { |
| 125 |
if (!isatty(STDIN_FILENO)) |
| 126 |
use_askpass = IFAVAILABLE; |
| 127 |
} else { |
| 128 |
rppflags |= RPP_REQUIRE_TTY; |
| 129 |
ttyfd = open(_PATH_TTY, O_RDWR); |
| 130 |
if (ttyfd >= 0) |
| 131 |
close(ttyfd); |
| 132 |
else |
| 133 |
use_askpass = IFAVAILABLE; |
| 134 |
} |
| 118 |
} |
135 |
} |
| 119 |
|
136 |
|
| 120 |
if ((flags & RP_USE_ASKPASS) && getenv("DISPLAY") == NULL) |
137 |
if ((flags & RP_USE_ASKPASS) && (use_askpass == NEVER || |
|
|
138 |
(use_askpass == IFAVAILABLE |
| 139 |
&& getenv("DISPLAY") == NULL))) |
| 121 |
return (flags & RP_ALLOW_EOF) ? NULL : xstrdup(""); |
140 |
return (flags & RP_ALLOW_EOF) ? NULL : xstrdup(""); |
| 122 |
|
141 |
|
| 123 |
if (use_askpass && getenv("DISPLAY")) { |
142 |
if (use_askpass == ALWAYS || (use_askpass == IFAVAILABLE |
|
|
143 |
&& getenv("DISPLAY"))) { |
| 124 |
if (getenv(SSH_ASKPASS_ENV)) |
144 |
if (getenv(SSH_ASKPASS_ENV)) |
| 125 |
askpass = getenv(SSH_ASKPASS_ENV); |
145 |
askpass = getenv(SSH_ASKPASS_ENV); |
| 126 |
else |
146 |
else |