mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-07-21 13:04:57 +02:00
Reviewed and refactored some more diffs in ssh.exe
This commit is contained in:
parent
b65edccdf6
commit
c346800d8c
161
sshconnect.c
161
sshconnect.c
@ -73,9 +73,6 @@ Key *previous_host_key = NULL;
|
|||||||
static int matching_host_key_dns = 0;
|
static int matching_host_key_dns = 0;
|
||||||
|
|
||||||
#ifdef WIN32_FIXME
|
#ifdef WIN32_FIXME
|
||||||
|
|
||||||
#define ECONNABORTED WSAECONNABORTED
|
|
||||||
#define ECONNREFUSED WSAECONNREFUSED
|
|
||||||
#define FAIL(X) if (X) goto fail
|
#define FAIL(X) if (X) goto fail
|
||||||
|
|
||||||
HANDLE proxy_command_handle = NULL;
|
HANDLE proxy_command_handle = NULL;
|
||||||
@ -117,11 +114,7 @@ static int
|
|||||||
ssh_proxy_fdpass_connect(const char *host, u_short port,
|
ssh_proxy_fdpass_connect(const char *host, u_short port,
|
||||||
const char *proxy_command)
|
const char *proxy_command)
|
||||||
{
|
{
|
||||||
#ifdef WIN32_FIXME
|
#ifndef WIN32_FIXME//R
|
||||||
//PRAGMA:TODO
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
|
|
||||||
char *command_string;
|
char *command_string;
|
||||||
int sp[2], sock;
|
int sp[2], sock;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@ -191,6 +184,9 @@ ssh_proxy_fdpass_connect(const char *host, u_short port,
|
|||||||
/* Set the connection file descriptors. */
|
/* Set the connection file descriptors. */
|
||||||
packet_set_connection(sock, sock);
|
packet_set_connection(sock, sock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
fatal("proxy fdpass connect is not supported in Windows");
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -201,120 +197,8 @@ ssh_proxy_fdpass_connect(const char *host, u_short port,
|
|||||||
static int
|
static int
|
||||||
ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
|
ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
|
||||||
{
|
{
|
||||||
/*
|
#ifndef WIN32_FIXME//R
|
||||||
* Win32 code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef WIN32_FIXME
|
|
||||||
|
|
||||||
PROCESS_INFORMATION pi = {0};
|
|
||||||
|
|
||||||
STARTUPINFO si = {0};
|
|
||||||
|
|
||||||
char *fullCmd = NULL;
|
|
||||||
|
|
||||||
char strport[NI_MAXSERV] = {0};
|
|
||||||
|
|
||||||
int sockin[2] = {-1, -1};
|
|
||||||
int sockout[2] = {-1, -1};
|
|
||||||
|
|
||||||
int exitCode = -1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create command to execute as proxy.
|
|
||||||
*/
|
|
||||||
|
|
||||||
debug("Creating proxy command...");
|
|
||||||
|
|
||||||
snprintf(strport, sizeof strport, "%hu", port);
|
|
||||||
|
|
||||||
fullCmd = percent_expand(proxy_command, "h", host,
|
|
||||||
"p", strport, (char *) NULL);
|
|
||||||
|
|
||||||
FAIL(fullCmd == NULL);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create socket pairs for stdin and stdout.
|
|
||||||
*/
|
|
||||||
|
|
||||||
debug("Creating socket pairs for proxy process...");
|
|
||||||
|
|
||||||
pipe(sockin);
|
|
||||||
pipe(sockout);
|
|
||||||
|
|
||||||
debug("sockin[0]: %d sockin[1]: %d", sockin[0], sockin[1]);
|
|
||||||
debug("sockout[0]: %d sockout[1]: %d", sockout[0], sockout[1]);
|
|
||||||
|
|
||||||
permanently_drop_suid(original_real_uid);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Assign sockets to StartupInfo
|
|
||||||
*/
|
|
||||||
|
|
||||||
si.cb = sizeof(STARTUPINFO);
|
|
||||||
si.hStdInput = (HANDLE) sfd_to_handle(sockin[0]);
|
|
||||||
si.hStdOutput = (HANDLE) sfd_to_handle(sockout[0]);
|
|
||||||
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
|
||||||
si.wShowWindow = SW_HIDE;
|
|
||||||
si.dwFlags = STARTF_USESTDHANDLES;
|
|
||||||
si.lpDesktop = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Create proxy process with given stdout/stdin.
|
|
||||||
*/
|
|
||||||
|
|
||||||
debug("Executing proxy command: \"%.500s\"...\n", fullCmd);
|
|
||||||
|
|
||||||
FAIL(CreateProcess(NULL, fullCmd, NULL, NULL, TRUE,
|
|
||||||
CREATE_NEW_PROCESS_GROUP, NULL,
|
|
||||||
NULL, &si, &pi) == FALSE);
|
|
||||||
|
|
||||||
proxy_command_handle = pi.hProcess;
|
|
||||||
proxy_command_pid = pi.dwProcessId;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redirect network in/out to proxy sockets.
|
|
||||||
*/
|
|
||||||
|
|
||||||
packet_set_connection(sockout[1], sockin[1]);
|
|
||||||
|
|
||||||
|
|
||||||
exitCode = 0;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
|
|
||||||
/*
|
|
||||||
/ Clean up.
|
|
||||||
*/
|
|
||||||
|
|
||||||
close(sockout[0]);
|
|
||||||
close(sockin[0]);
|
|
||||||
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
|
|
||||||
free(fullCmd);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Error handler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (exitCode)
|
|
||||||
{
|
|
||||||
debug("Error cannot create proxy process (%u).\n", (unsigned int) GetLastError());
|
|
||||||
|
|
||||||
close(sockout[1]);
|
|
||||||
close(sockin[1]);
|
|
||||||
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
}
|
|
||||||
|
|
||||||
return exitCode;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Original OpenSSH code.
|
|
||||||
*/
|
|
||||||
char *command_string;
|
char *command_string;
|
||||||
int pin[2], pout[2];
|
int pin[2], pout[2];
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
@ -384,20 +268,21 @@ ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
|
|||||||
|
|
||||||
/* Indicate OK return */
|
/* Indicate OK return */
|
||||||
return 0;
|
return 0;
|
||||||
#endif /* else WIN32_FIXME */
|
#else
|
||||||
|
fatal("proxy connect is not supported in Windows");
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ssh_kill_proxy_command(void)
|
ssh_kill_proxy_command(void)
|
||||||
{
|
{
|
||||||
#ifndef WIN32_FIXME
|
|
||||||
/*
|
/*
|
||||||
* Send SIGHUP to proxy command if used. We don't wait() in
|
* Send SIGHUP to proxy command if used. We don't wait() in
|
||||||
* case it hangs and instead rely on init to reap the child
|
* case it hangs and instead rely on init to reap the child
|
||||||
*/
|
*/
|
||||||
if (proxy_command_pid > 1)
|
if (proxy_command_pid > 1)
|
||||||
kill(proxy_command_pid, SIGHUP);
|
kill(proxy_command_pid, SIGHUP);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -490,14 +375,8 @@ timeout_connect(int sockfd, const struct sockaddr *serv_addr,
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if(1)//ndef WIN32_FIXME
|
|
||||||
fdset = xcalloc(howmany(sockfd + 1, NFDBITS),
|
fdset = xcalloc(howmany(sockfd + 1, NFDBITS),
|
||||||
sizeof(fd_mask));
|
sizeof(fd_mask));
|
||||||
#else
|
|
||||||
fdset = xmalloc(sizeof(fd_set));
|
|
||||||
FD_ZERO(fdset);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
FD_SET(sockfd, fdset);
|
FD_SET(sockfd, fdset);
|
||||||
ms_to_timeval(&tv, *timeoutp);
|
ms_to_timeval(&tv, *timeoutp);
|
||||||
@ -573,11 +452,6 @@ ssh_connect_direct(const char *host, struct addrinfo *aitop,
|
|||||||
char ntop[NI_MAXHOST], strport[NI_MAXSERV];
|
char ntop[NI_MAXHOST], strport[NI_MAXSERV];
|
||||||
struct addrinfo *ai;
|
struct addrinfo *ai;
|
||||||
|
|
||||||
#ifdef WIN32_FIXME
|
|
||||||
|
|
||||||
DWORD error_win32 = 0;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
debug2("ssh_connect: needpriv %d", needpriv);
|
debug2("ssh_connect: needpriv %d", needpriv);
|
||||||
|
|
||||||
for (attempt = 0; attempt < connection_attempts; attempt++) {
|
for (attempt = 0; attempt < connection_attempts; attempt++) {
|
||||||
@ -617,9 +491,6 @@ ssh_connect_direct(const char *host, struct addrinfo *aitop,
|
|||||||
} else {
|
} else {
|
||||||
debug("connect to address %s port %s: %s",
|
debug("connect to address %s port %s: %s",
|
||||||
ntop, strport, strerror(errno));
|
ntop, strport, strerror(errno));
|
||||||
#ifdef WIN32_FIXME
|
|
||||||
error_win32 = WSAGetLastError();
|
|
||||||
#endif
|
|
||||||
close(sock);
|
close(sock);
|
||||||
sock = -1;
|
sock = -1;
|
||||||
}
|
}
|
||||||
@ -630,9 +501,6 @@ ssh_connect_direct(const char *host, struct addrinfo *aitop,
|
|||||||
|
|
||||||
/* Return failure if we didn't get a successful connection. */
|
/* Return failure if we didn't get a successful connection. */
|
||||||
if (sock == -1) {
|
if (sock == -1) {
|
||||||
#ifdef WIN32_FIXME
|
|
||||||
WSASetLastError(error_win32);
|
|
||||||
#endif
|
|
||||||
error("ssh: connect to host %s port %s: %s",
|
error("ssh: connect to host %s port %s: %s",
|
||||||
host, strport, strerror(errno));
|
host, strport, strerror(errno));
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -1650,12 +1518,7 @@ ssh_local_cmd(const char *args)
|
|||||||
|
|
||||||
return (WEXITSTATUS(status));
|
return (WEXITSTATUS(status));
|
||||||
#else
|
#else
|
||||||
|
fatal("executing local command is not supported in Windows");
|
||||||
/*
|
return 0;
|
||||||
* Not implemented on Win32.
|
#endif
|
||||||
*/
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
#endif /* else !WIN32_FIXME */
|
|
||||||
}
|
}
|
||||||
|
@ -642,28 +642,6 @@ userauth_gssapi(Authctxt *authctxt)
|
|||||||
OM_uint32 min;
|
OM_uint32 min;
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32_FIXME
|
|
||||||
/*
|
|
||||||
* Try native SSPI/Kerberos on windows first.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (userauth_sspi_kerberos(authctxt) == 1)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If SSPI failed check is MIT KfW libraries availible.
|
|
||||||
* Don't go on if not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (InitMitKerberos() != 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif /* WIN32_FIXME */
|
|
||||||
|
|
||||||
/* Try one GSSAPI method at a time, rather than sending them all at
|
/* Try one GSSAPI method at a time, rather than sending them all at
|
||||||
* once. */
|
* once. */
|
||||||
|
|
||||||
@ -1611,13 +1589,8 @@ ssh_keysign(struct sshkey *key, u_char **sigp, size_t *lenp,
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
#else
|
#else
|
||||||
|
fatal("keysign is not supported in Windows");
|
||||||
/*
|
|
||||||
* Not implemented on Win32.
|
|
||||||
*/
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user