diff options
author | milo <milo@r0ot.me> | 2010-09-29 17:45:04 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-02 22:51:35 +0200 |
commit | 26d40b5354d6760472127f2c16045fbbb2f12fee (patch) | |
tree | de30f65d560762a324734d48c70872fdc50fcaaa /src/messages.c | |
parent | c4356531f78fdcf2f3b6a9861f6129eac81990f8 (diff) | |
download | libssh-26d40b5354d6760472127f2c16045fbbb2f12fee.tar.gz libssh-26d40b5354d6760472127f2c16045fbbb2f12fee.tar.xz libssh-26d40b5354d6760472127f2c16045fbbb2f12fee.zip |
Handle global requests and reverse forwarding
Diffstat (limited to 'src/messages.c')
-rw-r--r-- | src/messages.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/messages.c b/src/messages.c index 027daf2..e1297c2 100644 --- a/src/messages.c +++ b/src/messages.c @@ -39,6 +39,9 @@ #include "libssh/keys.h" #include "libssh/dh.h" #include "libssh/messages.h" +#if WITH_SERVER +#include "libssh/server.h" +#endif /** * @defgroup libssh_messages The SSH message functions @@ -64,6 +67,85 @@ static ssh_message ssh_message_new(ssh_session session){ return msg; } +SSH_PACKET_CALLBACK(ssh_packet_global_request){ + ssh_message msg = NULL; + ssh_string request_s=NULL; + char *request=NULL; + ssh_string bind_addr_s=NULL; + char *bind_addr=NULL; + uint32_t bind_port; + uint8_t want_reply; + (void)user; + (void)type; + (void)packet; + + request_s = buffer_get_ssh_string(packet); + if (request_s != NULL) { + request = ssh_string_to_char(request_s); + ssh_string_free(request_s); + } + + buffer_get_u8(packet, &want_reply); + + ssh_log(session,SSH_LOG_PROTOCOL,"Received SSH_MSG_GLOBAL_REQUEST packet"); + + msg = ssh_message_new(session); + msg->type = SSH_REQUEST_GLOBAL; + + if(!strcmp(request, "tcpip-forward")) { + bind_addr_s = buffer_get_ssh_string(packet); + if (bind_addr_s != NULL) { + bind_addr = ssh_string_to_char(bind_addr_s); + ssh_string_free(bind_addr_s); + } + + buffer_get_u32(packet, &bind_port); + bind_port = ntohl(bind_port); + + msg->global_request.type = SSH_GLOBAL_REQUEST_TCPIP_FORWARD; + msg->global_request.want_reply = want_reply; + msg->global_request.bind_address = bind_addr; + msg->global_request.bind_port = bind_port; + + ssh_log(session, SSH_LOG_PROTOCOL, "Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); + + if(ssh_callbacks_exists(session->callbacks, global_request_function)) { + ssh_log(session, SSH_LOG_PROTOCOL, "Calling callback for SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); + session->callbacks->global_request_function(session, msg, session->callbacks->userdata); + } else { + ssh_message_reply_default(msg); + } + } else if(!strcmp(request, "cancel-tcpip-forward")) { + bind_addr_s = buffer_get_ssh_string(packet); + if (bind_addr_s != NULL) { + bind_addr = ssh_string_to_char(bind_addr_s); + ssh_string_free(bind_addr_s); + } + buffer_get_u32(packet, &bind_port); + bind_port = ntohl(bind_port); + + msg->global_request.type = SSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD; + msg->global_request.want_reply = want_reply; + msg->global_request.bind_address = bind_addr; + msg->global_request.bind_port = bind_port; + + ssh_log(session, SSH_LOG_PROTOCOL, "Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); + + if(ssh_callbacks_exists(session->callbacks, global_request_function)) { + session->callbacks->global_request_function(session, msg, session->callbacks->userdata); + } else { + ssh_message_reply_default(msg); + } + } else { + ssh_log(session, SSH_LOG_PROTOCOL, "UNKNOWN SSH_MSG_GLOBAL_REQUEST %s %d", request, want_reply); + } + + SAFE_FREE(msg); + SAFE_FREE(request); + SAFE_FREE(bind_addr); + return SSH_PACKET_USED; +} + SSH_PACKET_CALLBACK(ssh_packet_service_request){ ssh_string service = NULL; char *service_c = NULL; @@ -763,6 +845,8 @@ int ssh_message_subtype(ssh_message msg) { return msg->channel_request_open.type; case SSH_REQUEST_CHANNEL: return msg->channel_request.type; + case SSH_REQUEST_GLOBAL: + return msg->global_request.type; } return -1; @@ -798,6 +882,9 @@ void ssh_message_free(ssh_message msg){ case SSH_REQUEST_SERVICE: SAFE_FREE(msg->service_request.service); break; + case SSH_REQUEST_GLOBAL: + SAFE_FREE(msg->global_request.bind_address); + break; } ZERO_STRUCTP(msg); SAFE_FREE(msg); |