aboutsummaryrefslogtreecommitdiff
path: root/src/proxy.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/proxy.c')
-rw-r--r--src/proxy.c219
1 files changed, 0 insertions, 219 deletions
diff --git a/src/proxy.c b/src/proxy.c
deleted file mode 100644
index 7d410db..0000000
--- a/src/proxy.c
+++ /dev/null
@@ -1,219 +0,0 @@
-#include <libssh/callbacks.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "client.h"
-#include "mysql.h"
-#include "proxy.h"
-#include "state.h"
-
-// callback function for channel data and exceptions
-static int proxy_data_function(ssh_session session, ssh_channel channel, void *data,
- uint32_t len, int is_stderr, void *userdata) {
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *) userdata;
- (void) session;
- (void) channel;
- (void) is_stderr;
-
- if (ssh_channel_is_open(pdata->client_channel))
- return ssh_channel_write(pdata->client_channel, (char*) data, len);
- else
- return SSH_ERROR;
-}
-
-// callback function for SSH channel PTY request from a client
-static int proxy_pty_request(ssh_session session, ssh_channel channel,
- const char *term, int cols, int rows, int py, int px,
- void *userdata) {
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *)userdata;
-
- (void) session;
- (void) channel;
- (void) py;
- (void) px;
-
- // TODO record pty size in recorder
- if (ssh_channel_is_open(pdata->client_channel)) {
- if (ssh_channel_request_pty_size(pdata->client_channel, term, cols, rows) == SSH_OK)
- return SSH_OK;
- else
- fprintf(stderr, "pty request failed\n");
- } else {
- fprintf(stderr, "pty request while client_channel not opened\n");
- }
- return SSH_ERROR;
-}
-
-// callback function for SSH channel PTY resize from a client
-static int proxy_pty_resize(ssh_session session, ssh_channel channel, int cols,
- int rows, int py, int px, void *userdata) {
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *)userdata;
-
- (void) session;
- (void) channel;
- (void) py;
- (void) px;
-
- // TODO record pty size in recorder
- if (ssh_channel_is_open(pdata->client_channel)) {
- if (ssh_channel_change_pty_size(pdata->client_channel, cols, rows) == SSH_OK)
- return SSH_OK;
- else
- fprintf(stderr, "pty resize failed\n");
- } else {
- fprintf(stderr, "pty resize while client_channel not opened\n");
- }
- return SSH_ERROR;
-}
-
-static int proxy_exec_request(ssh_session session, ssh_channel channel,
- const char *command, void *userdata) {
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *) userdata;
-
- (void) session;
- (void) channel;
-
- if (ssh_channel_is_open(pdata->client_channel)) {
- if (ssh_channel_request_exec(pdata->client_channel, command) == SSH_OK)
- return SSH_OK;
- else
- printf("exec request failed\n");
- } else {
- fprintf(stderr, "exec request while client_channel not opened\n");
- }
- return SSH_ERROR;
-}
-
-static int proxy_shell_request(ssh_session session, ssh_channel channel,
- void *userdata) {
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *) userdata;
-
- (void) session;
- (void) channel;
-
- if (ssh_channel_is_open(pdata->client_channel)) {
- if (ssh_channel_request_shell(pdata->client_channel) == SSH_OK)
- return SSH_OK;
- else
- fprintf(stderr, "shell request failed\n");
- } else {
- fprintf(stderr, "shell request while client channel not opened\n");
- }
- return SSH_ERROR;
-}
-
-static int proxy_subsystem_request(ssh_session session, ssh_channel channel,
- const char *subsystem, void *userdata) {
- (void) session;
- (void) channel;
- (void) subsystem;
- (void) userdata;
- return SSH_ERROR; // TODO ssh subsystem request
- //if (ssh_channel_is_open(pdata->client_channel)) {
- //}
-}
-
-static void proxy_channel_eof_callback (ssh_session session, ssh_channel channel, void *userdata)
-{
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *) userdata;
- (void) session;
- (void) channel;
- if (ssh_channel_is_open(pdata->client_channel))
- ssh_channel_send_eof(pdata->client_channel);
-}
-
-static void proxy_channel_close_callback (ssh_session session, ssh_channel channel, void *userdata)
-{
- struct proxy_channel_data_struct *pdata = (struct proxy_channel_data_struct *) userdata;
- (void) session;
- (void) channel;
- if (ssh_channel_is_open(pdata->client_channel))
- ssh_channel_close(pdata->client_channel);
-}
-
-static void proxy_channel_exit_status_callback (ssh_session session, ssh_channel channel, int exit_status, void *userdata)
-{
- (void) session;
- (void) channel;
- (void) exit_status;
- (void) userdata;
- printf("proxy exit status callback\n");
-}
-
-static void proxy_channel_signal_callback (ssh_session session, ssh_channel channel,
- const char *signal, void *userdata) {
- (void) session;
- (void) channel;
- (void) signal;
- (void) userdata;
- printf("proxy signal callback\n");
-}
-
-static void proxy_channel_exit_signal_callback (ssh_session session, ssh_channel channel,
- const char *signal, int core, const char *errmsg,
- const char *lang, void *userdata) {
- (void) session;
- (void) channel;
- (void) signal;
- (void) core;
- (void) errmsg;
- (void) lang;
- (void) userdata;
- printf("proxy exit signal callback\n");
-}
-
-void handle_proxy_session(ssh_event event, ssh_session session, ssh_channel my_channel)
-{
- struct client_channel_data_struct * cdata;
-
- struct proxy_channel_data_struct pdata = {
- .event = event,
- .my_session = session,
- .my_channel = my_channel,
- .client_channel = NULL,
- };
-
- cdata = client_dial(event, &pdata);
-
- if (cdata == NULL) {
- return;
- }
- pdata.client_channel = cdata->my_channel;
-
- /* We tie everything together */
- struct ssh_channel_callbacks_struct channel_cb = {
- .userdata = &pdata,
- .channel_data_function = proxy_data_function,
- .channel_eof_function = proxy_channel_eof_callback,
- .channel_close_function = proxy_channel_close_callback,
- .channel_signal_function = proxy_channel_signal_callback,
- .channel_exit_status_function = proxy_channel_exit_status_callback,
- .channel_exit_signal_function = proxy_channel_exit_signal_callback,
- .channel_pty_request_function = proxy_pty_request,
- .channel_shell_request_function = proxy_shell_request,
- .channel_pty_window_change_function = proxy_pty_resize,
- .channel_exec_request_function = proxy_exec_request,
- .channel_subsystem_request_function = proxy_subsystem_request,
- .channel_auth_agent_req_function = NULL,
- .channel_x11_req_function = NULL,
- .channel_env_request_function = NULL,
- .channel_write_wontblock_function = NULL,
- };
- ssh_callbacks_init(&channel_cb);
- ssh_set_channel_callbacks(my_channel, &channel_cb);
-
- db_clean(); // we close the mysql connection before the main loop, as to not waste ressources
-
- do {
- /* Poll the main event which takes care of the sessions and channels */
- if (ssh_event_dopoll(event, -1) == SSH_ERROR) {
- break;
- }
- } while(ssh_channel_is_open(my_channel) && ssh_channel_is_open(pdata.client_channel));
- if (ssh_channel_is_open(my_channel))
- ssh_channel_close(my_channel);
- if (ssh_channel_is_open(cdata->my_channel))
- ssh_channel_close(cdata->my_channel);
-
- client_cleanup(cdata);
-}