diff options
author | ilsimo <ilsimo> | 2006-11-24 20:46:45 +0000 |
---|---|---|
committer | ilsimo <ilsimo> | 2006-11-24 20:46:45 +0000 |
commit | 078b4d3f4127042b020e78bb9d9762196ff070c3 (patch) | |
tree | 9d0b7a5b0ffe2c8e2f07b2b45ebd950d43c59533 /sesman/scp_v1.c | |
parent | b681420acc6297f628d132946f6f9f94f536a358 (diff) | |
download | xrdp-proprietary-078b4d3f4127042b020e78bb9d9762196ff070c3.tar.gz xrdp-proprietary-078b4d3f4127042b020e78bb9d9762196ff070c3.zip |
adding scp v1 first code, fixed passwd auth for disabled password
Diffstat (limited to 'sesman/scp_v1.c')
-rw-r--r-- | sesman/scp_v1.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/sesman/scp_v1.c b/sesman/scp_v1.c new file mode 100644 index 00000000..03461b72 --- /dev/null +++ b/sesman/scp_v1.c @@ -0,0 +1,192 @@ +/* + 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_v1.c + * @brief scp version 1 implementation + * @author Jay Sorg, Simone Fedele + * + */ + +#include "sesman.h" + +//#include "libscp_types.h" +#include "libscp.h" + +extern struct config_sesman g_cfg; + +/******************************************************************************/ +void DEFAULT_CC +scp_v1_process(struct SCP_CONNECTION* c, struct SCP_SESSION* s) +{ + long data; + int display; + int retries; + int current_try; + enum SCP_SERVER_STATES_E e; + struct SCP_DISCONNECTED_SESSION* slist; + struct session_item* sitem; + int scount; + SCP_SID sid; + + retries=g_cfg.sec.login_retry; + current_try=retries; + + data=auth_userpass(s->username, s->password); + LOG_DBG("user: %s\npass: %s", s->username, s->password); + + while ((!data) && ((retries==0) || (current_try>0))) + { + LOG_DBG("data %d - retry %d - currenttry %d - expr %d", data, retries, current_try, ((!data) && ((retries==0) || (current_try>0)))); + + e=scp_v1s_request_password(c,s,"Wrong username and/or password"); + + switch (e) + { + case SCP_SERVER_STATE_OK: + /* all ok, we got new username and password */ + data=auth_userpass(s->username, s->password); + /* one try less */ + if (current_try>0) + { + current_try--; + } + break; + case SCP_SERVER_STATE_VERSION_ERR: + LOG_DBG("version error",0) + case SCP_SERVER_STATE_SIZE_ERR: + /* an unknown scp version was requested, so we shut down the */ + /* connection (and log the fact) */ + log_message(LOG_LEVEL_WARNING,"protocol violation. connection closed."); + return; + case SCP_SERVER_STATE_NETWORK_ERR: + log_message(LOG_LEVEL_WARNING,"libscp network error."); + return; + case SCP_SERVER_STATE_SEQUENCE_ERR: + log_message(LOG_LEVEL_WARNING,"libscp sequence error."); + return; + case SCP_SERVER_STATE_INTERNAL_ERR: + /* internal error occurred (eg. malloc() error, ecc.) */ + log_message(LOG_LEVEL_ERROR, "libscp internal error occurred."); + return; + default: + /* dummy: scp_v1s_request_password won't generate any other */ + /* error other than the ones before */ + log_message(LOG_LEVEL_ALWAYS, "unknown return from scp_v1s_request_password()"); + return; + } + } + + if (!data) + { + scp_v1s_deny_connection(c,"Login failed"); + log_message(LOG_LEVEL_INFO,"Login failed for user %s. Connection terminated", s->username); + free_session(s); + return; + } + + /* testing if login is allowed*/ + if (0==access_login_allowed(s->username)) + { + scp_v1s_deny_connection(c,"Access to Terminal Server not allowed."); + log_message(LOG_LEVEL_INFO,"User %s not allowed on TS. Connection terminated", s->username); + free_session(s); + return; + } + + //check if we need password change + + /* list disconnected sessions */ + slist=session_get_byuser(s->username, &scount); + + if (scount==0) + { +#warning FIXME we should check for MaxSessions + /* no disconnected sessions - start a new one */ + log_message(LOG_LEVEL_INFO, "granted TS access to user %s", s->username); + if (SCP_SESSION_TYPE_XVNC == s->type) + { + log_message(LOG_LEVEL_INFO, "starting Xvnc session..."); + display = session_start(s->width, s->height, s->bpp, s->username, s->password, + data, SESMAN_SESSION_TYPE_XVNC); + } + else + { + log_message(LOG_LEVEL_INFO, "starting Xrdp session..."); + display = session_start(s->width, s->height, s->bpp, s->username, s->password, + data, SESMAN_SESSION_TYPE_XRDP); + } + + e=scp_v1s_connect_new_session(c, display); + switch (e) + { + case SCP_SERVER_STATE_OK: + /* all ok, we got new username and password */ + break; + case SCP_SERVER_STATE_NETWORK_ERR: + log_message(LOG_LEVEL_WARNING,"libscp network error."); + return; + default: + return; + } + } + else if (scount==1) + { + /* there's only one session - returning that */ + sitem=session_get_bypid(slist->SID); +#warning FIXME session_get_by*() should return a malloc()ated struct +#warning FIXME or at least lock the chain + if (0==sitem) + { + e=scp_v1s_connection_error(c, "Internal error"); + log_message(LOG_LEVEL_INFO, "Cannot find session item on the chain"); + } + else + { + display=sitem->display; + e=scp_v1s_reconnect_session(c, slist, display); + log_message(LOG_LEVEL_INFO, "User %s reconnected to session %d on port %d", \ + s->username, sitem->pid, display); + } + g_free(slist); + } + else + { + /* 2 or more disconnected sessions - listing */ + + //max session x packet = 100 => pkt size = 1300 (13x100) + e=scp_v1s_list_sessions(c, scount, slist, &sid); + + //CHECK RETURN + + g_free(slist); + } + + /* resource management */ + if ((e==SCP_SERVER_STATE_OK) && (s->rsr)) + { + /* here goes scp resource sharing code */ + } + + /* cleanup */ + free_session(s); + auth_end(data); +} + |