mirror of
https://github.com/clearml/dropbear
synced 2025-04-08 14:45:41 +00:00
* add SSH_ASKPASS support (based on patch from Paul Whittaker
* don't exit if setnonblocking() fails with "not supported by device" (allows redirection from /dev/null) --HG-- extra : convert_revision : 02fb18acdb680a868b2bfbd6452b2ccdb4cdde99
This commit is contained in:
parent
03d78bbb31
commit
4127be0a95
@ -30,14 +30,106 @@
|
|||||||
#include "runopts.h"
|
#include "runopts.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CLI_PASSWORD_AUTH
|
#ifdef ENABLE_CLI_PASSWORD_AUTH
|
||||||
|
|
||||||
|
#ifdef ENABLE_CLI_ASKPASS_HELPER
|
||||||
|
/* Returns 1 if we want to use the askpass program, 0 otherwise */
|
||||||
|
static int want_askpass()
|
||||||
|
{
|
||||||
|
char* askpass_prog = NULL;
|
||||||
|
|
||||||
|
askpass_prog = getenv("SSH_ASKPASS");
|
||||||
|
return askpass_prog && !isatty(STDIN_FILENO) && getenv("DISPLAY");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns a statically allocated password from a helper app, or NULL
|
||||||
|
* on failure */
|
||||||
|
static char *gui_getpass(const char *prompt) {
|
||||||
|
|
||||||
|
pid_t pid;
|
||||||
|
int p[2], maxlen, len, status;
|
||||||
|
static char buf[DROPBEAR_MAX_CLI_PASS + 1];
|
||||||
|
char* helper = NULL;
|
||||||
|
|
||||||
|
TRACE(("enter gui_getpass"))
|
||||||
|
|
||||||
|
helper = getenv("SSH_ASKPASS");
|
||||||
|
if (!helper)
|
||||||
|
{
|
||||||
|
TRACE(("leave gui_getpass: no askpass program"))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pipe(p) < 0) {
|
||||||
|
TRACE(("error creating child pipe"))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if (pid < 0) {
|
||||||
|
TRACE(("fork error"))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pid) {
|
||||||
|
/* child */
|
||||||
|
close(p[0]);
|
||||||
|
if (dup2(p[1], STDOUT_FILENO) < 0) {
|
||||||
|
TRACE(("error redirecting stdout"))
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
close(p[1]);
|
||||||
|
execlp(helper, helper, prompt, (char *)0);
|
||||||
|
TRACE(("execlp error"))
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(p[1]);
|
||||||
|
maxlen = sizeof(buf);
|
||||||
|
while (maxlen > 0) {
|
||||||
|
len = read(p[0], buf + sizeof(buf) - maxlen, maxlen);
|
||||||
|
if (len > 0) {
|
||||||
|
maxlen -= len;
|
||||||
|
} else {
|
||||||
|
if (errno != EINTR)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(p[0]);
|
||||||
|
|
||||||
|
while (waitpid(pid, &status, 0) < 0 && errno == EINTR)
|
||||||
|
;
|
||||||
|
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
|
||||||
|
return(NULL);
|
||||||
|
|
||||||
|
len = sizeof(buf) - maxlen;
|
||||||
|
buf[len] = '\0';
|
||||||
|
if (len > 0 && buf[len - 1] == '\n')
|
||||||
|
buf[len - 1] = '\0';
|
||||||
|
|
||||||
|
TRACE(("leave gui_getpass"))
|
||||||
|
return(buf);
|
||||||
|
}
|
||||||
|
#endif /* ENABLE_CLI_ASKPASS_HELPER */
|
||||||
|
|
||||||
int cli_auth_password() {
|
int cli_auth_password() {
|
||||||
|
|
||||||
char* password = NULL;
|
char* password = NULL;
|
||||||
TRACE(("enter cli_auth_password"))
|
|
||||||
|
|
||||||
|
TRACE(("enter cli_auth_password"))
|
||||||
CHECKCLEARTOWRITE();
|
CHECKCLEARTOWRITE();
|
||||||
|
|
||||||
|
#ifdef ENABLE_CLI_ASKPASS_HELPER
|
||||||
|
if (want_askpass())
|
||||||
|
password = gui_getpass("Password: ");
|
||||||
|
else
|
||||||
|
#endif
|
||||||
password = getpass("Password: ");
|
password = getpass("Password: ");
|
||||||
|
|
||||||
|
if (password == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST);
|
buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST);
|
||||||
|
|
||||||
buf_putstring(ses.writepayload, cli_opts.username,
|
buf_putstring(ses.writepayload, cli_opts.username,
|
||||||
@ -60,4 +152,4 @@ int cli_auth_password() {
|
|||||||
return 1; /* Password auth can always be tried */
|
return 1; /* Password auth can always be tried */
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* ENABLE_CLI_PASSWORD_AUTH */
|
||||||
|
6
dbutil.c
6
dbutil.c
@ -627,7 +627,13 @@ void setnonblocking(int fd) {
|
|||||||
TRACE(("setnonblocking: %d", fd))
|
TRACE(("setnonblocking: %d", fd))
|
||||||
|
|
||||||
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
|
if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
|
||||||
|
if (errno == ENODEV) {
|
||||||
|
/* Some devices (like /dev/null redirected in)
|
||||||
|
* can't be set to non-blocking */
|
||||||
|
TRACE(("ignoring ENODEV for setnonblocking"))
|
||||||
|
} else {
|
||||||
dropbear_exit("Couldn't set nonblocking");
|
dropbear_exit("Couldn't set nonblocking");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
TRACE(("leave setnonblocking"))
|
TRACE(("leave setnonblocking"))
|
||||||
}
|
}
|
||||||
|
@ -126,6 +126,13 @@ etc) slower (perhaps by 50%). Recommended for most small systems. */
|
|||||||
#define ENABLE_CLI_PASSWORD_AUTH
|
#define ENABLE_CLI_PASSWORD_AUTH
|
||||||
#define ENABLE_CLI_PUBKEY_AUTH
|
#define ENABLE_CLI_PUBKEY_AUTH
|
||||||
|
|
||||||
|
/* Define this (as well as ENABLE_CLI_PASSWORD_AUTH) to allow the use of
|
||||||
|
* a helper program for the ssh client. The helper program should be
|
||||||
|
* specified in the SSH_ASKPASS environment variable, and dbclient
|
||||||
|
* should be run with DISPLAY set and no tty. The program should
|
||||||
|
* return the password on standard output */
|
||||||
|
/*#define ENABLE_CLI_ASKPASS_HELPER*/
|
||||||
|
|
||||||
/* Random device to use - define either DROPBEAR_RANDOM_DEV or
|
/* Random device to use - define either DROPBEAR_RANDOM_DEV or
|
||||||
* DROPBEAR_PRNGD_SOCKET.
|
* DROPBEAR_PRNGD_SOCKET.
|
||||||
* DROPBEAR_RANDOM_DEV is recommended on hosts with a good /dev/(u)random,
|
* DROPBEAR_RANDOM_DEV is recommended on hosts with a good /dev/(u)random,
|
||||||
@ -297,6 +304,8 @@ etc) slower (perhaps by 50%). Recommended for most small systems. */
|
|||||||
#define DROPBEAR_MAX_SOCKS 2 /* IPv4, IPv6 are all we'll get for now. Revisit
|
#define DROPBEAR_MAX_SOCKS 2 /* IPv4, IPv6 are all we'll get for now. Revisit
|
||||||
in a few years time.... */
|
in a few years time.... */
|
||||||
|
|
||||||
|
#define DROPBEAR_MAX_CLI_PASS 1024
|
||||||
|
|
||||||
#ifndef ENABLE_X11FWD
|
#ifndef ENABLE_X11FWD
|
||||||
#define DISABLE_X11FWD
|
#define DISABLE_X11FWD
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user