From 343f9361f2d98c1c36c0eeef8812b936867b5c2f Mon Sep 17 00:00:00 2001 From: ilsimo Date: Fri, 26 May 2006 13:10:14 +0000 Subject: [PATCH] preparing sources to add new sesman control protocol --- sesman/Doxyfile | 6 +-- sesman/Makefile | 3 +- sesman/scp.c | 84 +++++++++++++++++++++++++++++++++++++ sesman/scp.h | 45 ++++++++++++++++++++ sesman/scp_v0.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ sesman/scp_v0.h | 42 +++++++++++++++++++ sesman/sesman.c | 105 ++-------------------------------------------- sesman/sesman.h | 1 + 8 files changed, 290 insertions(+), 105 deletions(-) create mode 100644 sesman/scp.c create mode 100644 sesman/scp.h create mode 100644 sesman/scp_v0.c create mode 100644 sesman/scp_v0.h diff --git a/sesman/Doxyfile b/sesman/Doxyfile index 06e4de7c..436e5d9b 100644 --- a/sesman/Doxyfile +++ b/sesman/Doxyfile @@ -173,15 +173,15 @@ PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = NO +ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES +SEARCH_INCLUDES = NO INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES +SKIP_FUNCTION_MACROS = NO #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- diff --git a/sesman/Makefile b/sesman/Makefile index dd6c276f..dfedf852 100644 --- a/sesman/Makefile +++ b/sesman/Makefile @@ -1,6 +1,7 @@ # sesman makefile SESMANOBJ = sesman.o config.o tcp.o sig.o session.o env.o \ - os_calls.o d3des.o list.o file.o log.o access.o + os_calls.o d3des.o list.o file.o log.o access.o \ + scp.o scp_v0.o SESRUNOBJ = sesrun.o config.o tcp.o \ os_calls.o d3des.o list.o file.o log.o diff --git a/sesman/scp.c b/sesman/scp.c new file mode 100644 index 00000000..a89b3d7b --- /dev/null +++ b/sesman/scp.c @@ -0,0 +1,84 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2005-2006 +*/ + +/** + * + * @file scp.c + * @brief scp (sesman control protocol) common code + * scp (sesman control protocol) common code + * This code controls which version is being used and starts the appropriate process + * @author Jay Sorg, Simone Fedele + * + */ + +#include "sesman.h" + +/******************************************************************************/ +void DEFAULT_CC +scp_process_start(int sck) +{ + int socket; + int version; + int size; + struct stream* in_s; + struct stream* out_s; + + /* making a local copy of the socket */ + /* sck should NEVER be used after lock_socket_release() */ + /* probably this is just paranoia */ + socket = sck; +#warning locking disabled +// lock_socket_release(); + + make_stream(in_s); + make_stream(out_s); + + init_stream(in_s, 8192); + if (tcp_force_recv(socket, in_s->data, 8) == 0) + { + in_uint32_be(in_s, version); + in_uint32_be(in_s, size); + init_stream(in_s, 8192); + if (tcp_force_recv(socket, in_s->data, size - 8) == 0) + { + if (version == 0) + { + /* starts processing an scp v0 connection */ + scp_v0_process(socket, in_s, out_s); + } +#warning scp v1 is disabled +/* this is temporarily disabled... + else if (version == 1) + { + / * starts processing an scp v0 connection * / + //scp_v1_process(); + }*/ + else + { + /* an unknown scp version was requested, so we shut down the */ + /* connection (and log the fact) */ + log_message(LOG_LEVEL_WARNING,"unknown protocol version specified. connection refused."); + } + } + } + g_tcp_close(socket); + free_stream(in_s); + free_stream(out_s); +} + diff --git a/sesman/scp.h b/sesman/scp.h new file mode 100644 index 00000000..99d6aae1 --- /dev/null +++ b/sesman/scp.h @@ -0,0 +1,45 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2005-2006 +*/ + +/** + * + * @file scp.h + * @brief scp (sesman control protocol) common definitions + * @author Simone Fedele + * + */ + +#ifndef SCP_H +#define SCP_H + +#include "scp_v0.h" +//#include "scp_v1.h" + +/** + * + * @brief Starts a an scp protocol thread. + * Starts a an scp protocol thread. + * But does only version control.... + * @param socket the connection socket + * + */ +void DEFAULT_CC +scp_process_start(int socket); + +#endif diff --git a/sesman/scp_v0.c b/sesman/scp_v0.c new file mode 100644 index 00000000..f31cd4ff --- /dev/null +++ b/sesman/scp_v0.c @@ -0,0 +1,109 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2005-2006 +*/ + +/** + * + * @file scp_v0.c + * @brief scp version 0 implementation + * @author Jay Sorg, Simone Fedele + * + */ + +#include "sesman.h" + +/******************************************************************************/ +void DEFAULT_CC +scp_v0_process(int in_sck, struct stream* in_s, struct stream* out_s) +{ + int code; + int i; + int width; + int height; + int bpp; + int display; + char user[256]; + char pass[256]; + long data; + struct session_item* s_item; + + in_uint16_be(in_s, code); + if (code == 0 || code == 10) /* check username - password, */ + { /* start session */ + in_uint16_be(in_s, i); + in_uint8a(in_s, user, i); + user[i] = 0; + in_uint16_be(in_s, i); + in_uint8a(in_s, pass, i); + pass[i] = 0; + in_uint16_be(in_s, width); + in_uint16_be(in_s, height); + in_uint16_be(in_s, bpp); + data = auth_userpass(user, pass); + display = 0; + if (data) + { + s_item = session_get_bydata(user, width, height, bpp); + if (s_item != 0) + { + display = s_item->display; + auth_end(data); + /* don't set data to null here */ + } + else + { + g_printf("pre auth"); + if (1 == access_login_allowed(user)) + { + log_message(LOG_LEVEL_INFO, + "granted TS access to user %s", user); + if (0 == code) + { + log_message(LOG_LEVEL_INFO, "starting Xvnc session..."); + display = session_start(width, height, bpp, user, pass, + data, SESMAN_SESSION_TYPE_XVNC); + } + else + { + log_message(LOG_LEVEL_INFO, "starting Xrdp session..."); + display = session_start(width, height, bpp, user, pass, + data, SESMAN_SESSION_TYPE_XRDP); + } + } + else + { + display = 0; + } + } + if (display == 0) + { + auth_end(data); + data = 0; + } + } + init_stream(out_s, 8192); + out_uint32_be(out_s, 0); /* version */ + out_uint32_be(out_s, 14); /* size */ + out_uint16_be(out_s, 3); /* cmd */ + out_uint16_be(out_s, data != 0); /* data */ + out_uint16_be(out_s, display); /* data */ + s_mark_end(out_s); + tcp_force_send(in_sck, out_s->data, + out_s->end - out_s->data); + } +} diff --git a/sesman/scp_v0.h b/sesman/scp_v0.h new file mode 100644 index 00000000..652348e4 --- /dev/null +++ b/sesman/scp_v0.h @@ -0,0 +1,42 @@ +/* + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + xrdp: A Remote Desktop Protocol server. + Copyright (C) Jay Sorg 2005-2006 +*/ + +/** + * + * @file scp_v0.h + * @brief scp version 0 declarations + * @author Simone Fedele + * + */ + +#ifndef SCP_V0_H +#define SCP_V0_H + +/** + * + * @brief processes the stream using scp version 0 + * @param in_sck connection socket + * @param in_s input stream + * @param out_s output stream + * + */ +void DEFAULT_CC +scp_v0_process(int in_sck, struct stream* in_s, struct stream* out_s); + +#endif diff --git a/sesman/sesman.c b/sesman/sesman.c index e191f13c..7d3797b3 100644 --- a/sesman/sesman.c +++ b/sesman/sesman.c @@ -83,28 +83,9 @@ static void DEFAULT_CC sesman_main_loop() { int in_sck; - int code; - int i; - int size; - int version; - int width; - int height; - int bpp; - int display; int error; - struct stream* in_s; - struct stream* out_s; - char user[256]; - char pass[256]; - struct session_item* s_item; - long data; /*main program loop*/ - make_stream(in_s); - init_stream(in_s, 8192); - make_stream(out_s); - init_stream(out_s, 8192); - log_message(LOG_LEVEL_INFO, "listening..."); g_sck = g_tcp_socket(); g_tcp_set_non_blocking(g_sck); @@ -122,86 +103,10 @@ sesman_main_loop() } while (in_sck > 0) { - init_stream(in_s, 8192); - if (tcp_force_recv(in_sck, in_s->data, 8) == 0) - { - in_uint32_be(in_s, version); - in_uint32_be(in_s, size); - init_stream(in_s, 8192); - if (tcp_force_recv(in_sck, in_s->data, size - 8) == 0) - { - if (version == 0) - { - in_uint16_be(in_s, code); - if (code == 0 || code == 10) /* check username - password, */ - { /* start session */ - //g_server_type = code; - in_uint16_be(in_s, i); - in_uint8a(in_s, user, i); - user[i] = 0; - in_uint16_be(in_s, i); - in_uint8a(in_s, pass, i); - pass[i] = 0; - in_uint16_be(in_s, width); - in_uint16_be(in_s, height); - in_uint16_be(in_s, bpp); - data = auth_userpass(user, pass); - display = 0; - if (data) - { - //s_item = session_find_item(user, width, height, bpp); - s_item = session_get_bydata(user, width, height, bpp); - if (s_item != 0) - { - display = s_item->display; - auth_end(data); - /* don't set data to null here */ - } - else - { - g_printf("pre auth"); - if (1 == access_login_allowed(user)) - { - log_message(LOG_LEVEL_INFO, - "granted TS access to user %s", user); - if (0 == code) - { - log_message(LOG_LEVEL_INFO, "starting Xvnc session..."); - display = session_start(width, height, bpp, user, pass, - data, SESMAN_SESSION_TYPE_XVNC); - } - else - { - log_message(LOG_LEVEL_INFO, "starting Xrdp session..."); - display = session_start(width, height, bpp, user, pass, - data, SESMAN_SESSION_TYPE_XRDP); - } - } - else - { - display = 0; - } - } - if (display == 0) - { - auth_end(data); - data = 0; - } - } - init_stream(out_s, 8192); - out_uint32_be(out_s, 0); /* version */ - out_uint32_be(out_s, 14); /* size */ - out_uint16_be(out_s, 3); /* cmd */ - out_uint16_be(out_s, data != 0); /* data */ - out_uint16_be(out_s, display); /* data */ - s_mark_end(out_s); - tcp_force_send(in_sck, out_s->data, - out_s->end - out_s->data); - } - } - } - } - g_tcp_close(in_sck); + /* we've got a connection, so we pass it to scp code */ + scp_process_start(in_sck); + + /* once we've processed the connection, we go back listening */ in_sck = g_tcp_accept(g_sck); while (in_sck == -1 && g_tcp_last_error_would_block(g_sck)) { @@ -220,8 +125,6 @@ sesman_main_loop() log_message(LOG_LEVEL_ERROR, "bind error"); } g_tcp_close(g_sck); - free_stream(in_s); - free_stream(out_s); } /******************************************************************************/ diff --git a/sesman/sesman.h b/sesman/sesman.h index ddeb6996..45dac852 100644 --- a/sesman/sesman.h +++ b/sesman/sesman.h @@ -40,6 +40,7 @@ #include "sig.h" #include "session.h" #include "access.h" +#include "scp.h" #ifndef SESMAN_PID_FILE #define SESMAN_PID_FILE "./sesman.pid"