version 1.35, 2001/04/14 16:27:57 |
version 1.36, 2001/04/18 21:57:42 |
|
|
fprintf(stderr, "Failed to remove all identities.\n"); |
fprintf(stderr, "Failed to remove all identities.\n"); |
} |
} |
|
|
char * |
|
ssh_askpass(char *askpass, char *msg) |
|
{ |
|
pid_t pid; |
|
size_t len; |
|
char *nl, *pass; |
|
int p[2], status; |
|
char buf[1024]; |
|
|
|
if (fflush(stdout) != 0) |
|
error("ssh_askpass: fflush: %s", strerror(errno)); |
|
if (askpass == NULL) |
|
fatal("internal error: askpass undefined"); |
|
if (pipe(p) < 0) |
|
fatal("ssh_askpass: pipe: %s", strerror(errno)); |
|
if ((pid = fork()) < 0) |
|
fatal("ssh_askpass: fork: %s", strerror(errno)); |
|
if (pid == 0) { |
|
close(p[0]); |
|
if (dup2(p[1], STDOUT_FILENO) < 0) |
|
fatal("ssh_askpass: dup2: %s", strerror(errno)); |
|
execlp(askpass, askpass, msg, (char *) 0); |
|
fatal("ssh_askpass: exec(%s): %s", askpass, strerror(errno)); |
|
} |
|
close(p[1]); |
|
len = read(p[0], buf, sizeof buf); |
|
close(p[0]); |
|
while (waitpid(pid, &status, 0) < 0) |
|
if (errno != EINTR) |
|
break; |
|
if (len <= 1) |
|
return xstrdup(""); |
|
nl = strchr(buf, '\n'); |
|
if (nl) |
|
*nl = '\0'; |
|
pass = xstrdup(buf); |
|
memset(buf, 0, sizeof(buf)); |
|
return pass; |
|
} |
|
|
|
void |
void |
add_file(AuthenticationConnection *ac, const char *filename) |
add_file(AuthenticationConnection *ac, const char *filename) |
{ |
{ |
struct stat st; |
struct stat st; |
Key *private; |
Key *private; |
char *comment = NULL, *askpass = NULL; |
char *comment = NULL; |
char buf[1024], msg[1024]; |
char msg[1024]; |
int interactive = isatty(STDIN_FILENO); |
|
|
|
if (stat(filename, &st) < 0) { |
if (stat(filename, &st) < 0) { |
perror(filename); |
perror(filename); |
exit(1); |
exit(1); |
} |
} |
if (!interactive && getenv("DISPLAY")) { |
|
if (getenv(SSH_ASKPASS_ENV)) |
|
askpass = getenv(SSH_ASKPASS_ENV); |
|
else |
|
askpass = _PATH_SSH_ASKPASS_DEFAULT; |
|
} |
|
|
|
/* At first, try empty passphrase */ |
/* At first, try empty passphrase */ |
private = key_load_private(filename, "", &comment); |
private = key_load_private(filename, "", &comment); |
if (comment == NULL) |
if (comment == NULL) |
|
|
/* clear passphrase since it did not work */ |
/* clear passphrase since it did not work */ |
clear_pass(); |
clear_pass(); |
printf("Need passphrase for %.200s\n", filename); |
printf("Need passphrase for %.200s\n", filename); |
if (!interactive && askpass == NULL) { |
snprintf(msg, sizeof msg, "Enter passphrase for %.200s ", |
xfree(comment); |
comment); |
return; |
|
} |
|
snprintf(msg, sizeof msg, "Enter passphrase for %.200s", comment); |
|
for (;;) { |
for (;;) { |
if (interactive) { |
pass = read_passphrase(msg, 1); |
snprintf(buf, sizeof buf, "%s: ", msg); |
|
pass = read_passphrase(buf, 1); |
|
} else { |
|
pass = ssh_askpass(askpass, msg); |
|
} |
|
if (strcmp(pass, "") == 0) { |
if (strcmp(pass, "") == 0) { |
clear_pass(); |
clear_pass(); |
xfree(comment); |
xfree(comment); |
|
|
if (private != NULL) |
if (private != NULL) |
break; |
break; |
clear_pass(); |
clear_pass(); |
strlcpy(msg, "Bad passphrase, try again", sizeof msg); |
strlcpy(msg, "Bad passphrase, try again ", sizeof msg); |
} |
} |
} |
} |
if (ssh_add_identity(ac, private, comment)) |
if (ssh_add_identity(ac, private, comment)) |