mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-08-01 11:26:52 +03:00
channels: Add originator to ssh_channel_accept
Added API function ssh_channel_open_forward_port that is the same as ssh_channel_accept_forward with the addition to determine the originator address and port Signed-off-by: Tomas Holmqvist <tomhol@gmail.com> Reviewed-by: Jakub Jelen <jjelen@redhat.com>
This commit is contained in:
committed by
Jakub Jelen
parent
fef0b3208a
commit
dd318aa1a1
@ -165,6 +165,8 @@ int web_server(ssh_session session)
|
|||||||
char buffer[256];
|
char buffer[256];
|
||||||
int nbytes, nwritten;
|
int nbytes, nwritten;
|
||||||
int port = 0;
|
int port = 0;
|
||||||
|
char *peer_address = NULL;
|
||||||
|
int peer_port = 0;
|
||||||
char *helloworld = ""
|
char *helloworld = ""
|
||||||
"HTTP/1.1 200 OK\n"
|
"HTTP/1.1 200 OK\n"
|
||||||
"Content-Type: text/html\n"
|
"Content-Type: text/html\n"
|
||||||
@ -187,7 +189,8 @@ int web_server(ssh_session session)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
channel = ssh_channel_accept_forward(session, 60000, &port);
|
channel = ssh_channel_open_forward_port(session, 60000, &port,
|
||||||
|
&peer_address, &peer_port);
|
||||||
if (channel == NULL)
|
if (channel == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Error waiting for incoming connection: %s\n",
|
fprintf(stderr, "Error waiting for incoming connection: %s\n",
|
||||||
@ -204,6 +207,7 @@ int web_server(ssh_session session)
|
|||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
ssh_channel_send_eof(channel);
|
ssh_channel_send_eof(channel);
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
|
ssh_string_free_char(peer_address);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
if (strncmp(buffer, "GET /", 5)) continue;
|
if (strncmp(buffer, "GET /", 5)) continue;
|
||||||
@ -216,13 +220,15 @@ int web_server(ssh_session session)
|
|||||||
ssh_get_error(session));
|
ssh_get_error(session));
|
||||||
ssh_channel_send_eof(channel);
|
ssh_channel_send_eof(channel);
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
|
ssh_string_free_char(peer_address);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
printf("Sent answer\n");
|
printf("Sent answer to %s:%d\n", peer_address, peer_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_channel_send_eof(channel);
|
ssh_channel_send_eof(channel);
|
||||||
ssh_channel_free(channel);
|
ssh_channel_free(channel);
|
||||||
|
ssh_string_free_char(peer_address);
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
@ -510,7 +510,12 @@ LIBSSH_API char *ssh_dirname (const char *path);
|
|||||||
LIBSSH_API int ssh_finalize(void);
|
LIBSSH_API int ssh_finalize(void);
|
||||||
|
|
||||||
/* REVERSE PORT FORWARDING */
|
/* REVERSE PORT FORWARDING */
|
||||||
LIBSSH_API ssh_channel ssh_channel_accept_forward(ssh_session session,
|
LIBSSH_API ssh_channel ssh_channel_open_forward_port(ssh_session session,
|
||||||
|
int timeout_ms,
|
||||||
|
int *destination_port,
|
||||||
|
char **originator,
|
||||||
|
int *originator_port);
|
||||||
|
SSH_DEPRECATED LIBSSH_API ssh_channel ssh_channel_accept_forward(ssh_session session,
|
||||||
int timeout_ms,
|
int timeout_ms,
|
||||||
int *destination_port);
|
int *destination_port);
|
||||||
LIBSSH_API int ssh_channel_cancel_forward(ssh_session session,
|
LIBSSH_API int ssh_channel_cancel_forward(ssh_session session,
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
#ifdef HAVE_SYS_TIME_H
|
#ifdef HAVE_SYS_TIME_H
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif /* HAVE_SYS_TIME_H */
|
#endif /* HAVE_SYS_TIME_H */
|
||||||
@ -2135,7 +2136,7 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
||||||
int timeout_ms, int *destination_port) {
|
int timeout_ms, int *destination_port, char **originator, int *originator_port) {
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static const struct timespec ts = {
|
static const struct timespec ts = {
|
||||||
.tv_sec = 0,
|
.tv_sec = 0,
|
||||||
@ -2169,6 +2170,12 @@ static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
|||||||
if(destination_port) {
|
if(destination_port) {
|
||||||
*destination_port=msg->channel_request_open.destination_port;
|
*destination_port=msg->channel_request_open.destination_port;
|
||||||
}
|
}
|
||||||
|
if(originator) {
|
||||||
|
*originator=strdup(msg->channel_request_open.originator);
|
||||||
|
}
|
||||||
|
if(originator_port) {
|
||||||
|
*originator_port=msg->channel_request_open.originator_port;
|
||||||
|
}
|
||||||
|
|
||||||
ssh_message_free(msg);
|
ssh_message_free(msg);
|
||||||
return channel;
|
return channel;
|
||||||
@ -2200,7 +2207,7 @@ static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
|||||||
* the server.
|
* the server.
|
||||||
*/
|
*/
|
||||||
ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms) {
|
ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms) {
|
||||||
return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL);
|
return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2454,11 +2461,11 @@ int ssh_forward_listen(ssh_session session, const char *address, int port, int *
|
|||||||
|
|
||||||
/* DEPRECATED */
|
/* DEPRECATED */
|
||||||
ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) {
|
ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) {
|
||||||
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL);
|
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Accept an incoming TCP/IP forwarding channel and get information
|
* @brief Accept an incoming TCP/IP forwarding channel and get some information
|
||||||
* about incomming connection
|
* about incomming connection
|
||||||
* @param[in] session The ssh session to use.
|
* @param[in] session The ssh session to use.
|
||||||
*
|
*
|
||||||
@ -2470,7 +2477,30 @@ ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) {
|
|||||||
* the server
|
* the server
|
||||||
*/
|
*/
|
||||||
ssh_channel ssh_channel_accept_forward(ssh_session session, int timeout_ms, int* destination_port) {
|
ssh_channel ssh_channel_accept_forward(ssh_session session, int timeout_ms, int* destination_port) {
|
||||||
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, destination_port);
|
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, destination_port, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Accept an incoming TCP/IP forwarding channel and get information
|
||||||
|
* about incomming connection
|
||||||
|
* @param[in] session The ssh session to use.
|
||||||
|
*
|
||||||
|
* @param[in] timeout_ms A timeout in milliseconds.
|
||||||
|
*
|
||||||
|
* @param[out] destination_port A pointer to destination port or NULL.
|
||||||
|
*
|
||||||
|
* @param[out] originator A pointer to a pointer to a string of originator host or NULL.
|
||||||
|
* That the caller is responsible for to ssh_string_free_char().
|
||||||
|
*
|
||||||
|
* @param[out] originator_port A pointer to originator port or NULL.
|
||||||
|
*
|
||||||
|
* @return Newly created channel, or NULL if no incoming channel request from
|
||||||
|
* the server
|
||||||
|
*
|
||||||
|
* @see ssh_string_free_char()
|
||||||
|
*/
|
||||||
|
ssh_channel ssh_channel_open_forward_port(ssh_session session, int timeout_ms, int *destination_port, char **originator, int *originator_port) {
|
||||||
|
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, destination_port, originator, originator_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,6 +82,8 @@ static void torture_ssh_forward(void **state)
|
|||||||
ssh_channel c;
|
ssh_channel c;
|
||||||
int dport;
|
int dport;
|
||||||
int bound_port;
|
int bound_port;
|
||||||
|
char *originator_host = NULL;
|
||||||
|
int originator_port;
|
||||||
int rc;
|
int rc;
|
||||||
int verbosity = SSH_LOG_TRACE;
|
int verbosity = SSH_LOG_TRACE;
|
||||||
|
|
||||||
@ -90,7 +92,7 @@ static void torture_ssh_forward(void **state)
|
|||||||
rc = ssh_channel_listen_forward(session, "127.0.0.21", 8080, &bound_port);
|
rc = ssh_channel_listen_forward(session, "127.0.0.21", 8080, &bound_port);
|
||||||
assert_ssh_return_code(session, rc);
|
assert_ssh_return_code(session, rc);
|
||||||
|
|
||||||
c = ssh_channel_accept_forward(session, 10, &dport);
|
c = ssh_channel_open_forward_port(session, 10, &dport, &originator_host, &originator_port);
|
||||||
/* We do not get a listener and run into the timeout here */
|
/* We do not get a listener and run into the timeout here */
|
||||||
assert_null(c);
|
assert_null(c);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user