X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcitserver.c;h=cd13b3e3c297c2e5fd6f8be04c25ed0e55ed5627;hb=0eea6dcc234e0f524bbf2a1d909455d41ed02314;hp=2f5f24690fa0b0277967e9344db044c48c9a3632;hpb=a6661f91205678c55c1e14511d73c376d3b3d90e;p=citadel.git diff --git a/citadel/citserver.c b/citadel/citserver.c index 2f5f24690..cd13b3e3c 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -3,21 +3,21 @@ * * Main source module for the Citadel server * - * Copyright (c) 1987-2009 by the citadel.org team + * Copyright (c) 1987-2010 by the citadel.org team * - * 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 3 of the License, or - * (at your option) any later version. + * 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 3 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. + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -29,7 +29,6 @@ #include #include - #if TIME_WITH_SYS_TIME # include # include @@ -70,9 +69,9 @@ #include "locate_host.h" #include "room_ops.h" #include "file_ops.h" -#include "policy.h" #include "control.h" #include "euidindex.h" +#include "context.h" #include "svn_revision.h" #ifndef HAVE_SNPRINTF @@ -81,16 +80,13 @@ #include "ctdl_module.h" - -struct CitContext *ContextList = NULL; -struct CitContext* next_session = NULL; char *unique_session_numbers; int ScheduledShutdown = 0; time_t server_startup_time; int panic_fd; -/** - * \brief print the actual stack frame. +/* + * print the actual stack frame. */ void cit_backtrace(void) { @@ -112,8 +108,8 @@ void cit_backtrace(void) #endif } -/** - * \brief print the actual stack frame. +/* + * print the actual stack frame. */ void cit_panic_backtrace(int SigNum) { @@ -161,7 +157,7 @@ void master_startup(void) { CtdlLogPrintf(CTDL_INFO, "Creating base rooms (if necessary)\n"); CtdlCreateRoom(config.c_baseroom, 0, "", 0, 1, 0, VIEW_BBS); CtdlCreateRoom(AIDEROOM, 3, "", 0, 1, 0, VIEW_BBS); - CtdlCreateRoom(SYSCONFIGROOM, 3, "", 0, 1, 0, VIEW_BBS); + CtdlCreateRoom(SYSCONFIGROOM, 3, "", 0, 1, 0, VIEW_BBS); CtdlCreateRoom(config.c_twitroom, 0, "", 0, 1, 0, VIEW_BBS); /* The "Local System Configuration" room doesn't need to be visible */ @@ -244,53 +240,13 @@ void master_cleanup(int exitcode) { if (restart_server != 0) exit(1); - if ((running_as_daemon != 0) && (exitcode == 0)) + if ((running_as_daemon != 0) && ((exitcode == 0) )) exitcode = CTDLEXIT_SHUTDOWN; exit(exitcode); } -/* - * Terminate a session. - */ -void RemoveContext (struct CitContext *con) -{ - if (con==NULL) { - CtdlLogPrintf(CTDL_ERR, - "WARNING: RemoveContext() called with NULL!\n"); - return; - } - CtdlLogPrintf(CTDL_DEBUG, "RemoveContext() session %d\n", con->cs_pid); - - /* Run any cleanup routines registered by loadable modules. - * Note: We have to "become_session()" because the cleanup functions - * might make references to "CC" assuming it's the right one. - */ - become_session(con); - logout(); - PerformSessionHooks(EVT_STOP); - become_session(NULL); - - CtdlLogPrintf(CTDL_NOTICE, "[%3d] Session ended.\n", con->cs_pid); - - /* If the client is still connected, blow 'em away. */ - CtdlLogPrintf(CTDL_DEBUG, "Closing socket %d\n", con->client_socket); - close(con->client_socket); - - /* If using AUTHMODE_LDAP, free the DN */ - if (con->ldap_dn) { - free(con->ldap_dn); - con->ldap_dn = NULL; - } - - CtdlLogPrintf(CTDL_DEBUG, "Done with RemoveContext()\n"); -} - - - - - /* * cmd_info() - tell the client about this server */ @@ -398,10 +354,7 @@ int is_public_client(void) #define LOCALHOSTSTR "127.0.0.1" - snprintf(public_clients_file, - sizeof public_clients_file, - "%s/public_clients", - ctdl_etc_dir); + snprintf(public_clients_file, sizeof public_clients_file, "%s/public_clients", ctdl_etc_dir); /* * Check the time stamp on the public_clients file. If it's been @@ -537,7 +490,8 @@ void cmd_iden(char *argbuf) (rev_level / 100), (rev_level % 100), desc, - CC->cs_host); + CC->cs_host + ); cprintf("%d Ok\n",CIT_OK); } @@ -681,8 +635,8 @@ void cmd_emsg(char *mname) * user also knows the rooms. */ void GenerateRoomDisplay(char *real_room, - struct CitContext *viewed, - struct CitContext *viewer) { + CitContext *viewed, + CitContext *viewer) { int ra; @@ -723,7 +677,7 @@ int CtdlAccessCheck(int required_level) { return(-1); } - if (CC->user.axlevel >= 6) return(0); + if (CC->user.axlevel >= AxAideU) return(0); if (required_level >= ac_aide) { cprintf("%d This command requires Aide access.\n", ERROR + HIGHER_ACCESS_REQUIRED); @@ -749,35 +703,19 @@ int CtdlAccessCheck(int required_level) { void cmd_term(char *cmdbuf) { int session_num; - struct CitContext *ccptr; - int found_it = 0; - int allowed = 0; + int terminated = 0; session_num = extract_int(cmdbuf, 0); - if (session_num == CC->cs_pid) { + + terminated = CtdlTerminateOtherSession(session_num); + + if (terminated < 0) { cprintf("%d You can't kill your own session.\n", ERROR + ILLEGAL_VALUE); return; } - CtdlLogPrintf(CTDL_DEBUG, "Locating session to kill\n"); - begin_critical_section(S_SESSION_TABLE); - for (ccptr = ContextList; ccptr != NULL; ccptr = ccptr->next) { - if (session_num == ccptr->cs_pid) { - found_it = 1; - if ((ccptr->user.usernum == CC->user.usernum) - || (CC->user.axlevel >= 6)) { - allowed = 1; - ccptr->kill_me = 1; - } - else { - allowed = 0; - } - } - } - end_critical_section(S_SESSION_TABLE); - - if (found_it) { - if (allowed) { + if (terminated & TERM_FOUND) { + if (terminated == TERM_KILLED) { cprintf("%d Session terminated.\n", CIT_OK); } else { @@ -791,9 +729,6 @@ void cmd_term(char *cmdbuf) } - - - /* * get the paginator prompt */ @@ -801,6 +736,7 @@ void cmd_more(char *argbuf) { cprintf("%d %s\n", CIT_OK, config.c_moreprompt); } + /* * echo */ @@ -810,9 +746,8 @@ void cmd_echo(char *etext) } - /* - * identify as internal program + * Perform privilege escalation for an internal program */ void cmd_ipgm(char *argbuf) { @@ -825,8 +760,7 @@ void cmd_ipgm(char *argbuf) */ if (!CC->is_local_socket) { sleep(5); - cprintf("%d Authentication failed.\n", - ERROR + PASSWORD_REQUIRED); + cprintf("%d Authentication failed.\n", ERROR + PASSWORD_REQUIRED); } else if (secret == config.c_ipgm_secret) { CC->internal_pgm = 1; @@ -836,8 +770,7 @@ void cmd_ipgm(char *argbuf) } else { sleep(5); - cprintf("%d Authentication failed.\n", - ERROR + PASSWORD_REQUIRED); + cprintf("%d Authentication failed.\n", ERROR + PASSWORD_REQUIRED); CtdlLogPrintf(CTDL_ERR, "Warning: ipgm authentication failed.\n"); CC->kill_me = 1; } @@ -873,9 +806,11 @@ void cmd_down(char *argbuf) { { cprintf(Reply, CIT_OK + SERVER_SHUTTING_DOWN); } + CC->kill_me = 1; /* Even the DOWN command has to follow correct proceedure when disconecting */ CtdlThreadStopAll(); } + /* * Halt the server without exiting the server process. */ @@ -888,6 +823,7 @@ void cmd_halt(char *argbuf) { shutdown_and_halt = 1; } + /* * Schedule or cancel a server shutdown */ @@ -941,7 +877,7 @@ void cmd_asyn(char *argbuf) * RFC 1725 et al specify a PID to be placed in front of the nonce. * Quoth BTX: That would be stupid. */ -void generate_nonce(struct CitContext *con) { +void generate_nonce(CitContext *con) { struct timeval tv; memset(con->cs_nonce, NONCE_SIZE, 0); @@ -952,12 +888,10 @@ void generate_nonce(struct CitContext *con) { } - - /* * Back-end function for starting a session */ -void begin_session(struct CitContext *con) +void begin_session(CitContext *con) { socklen_t len; struct sockaddr_in sin; @@ -1060,30 +994,33 @@ void citproto_begin_session() { } - void cmd_noop(char *argbuf) { cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() ); } + void cmd_qnop(char *argbuf) { /* do nothing, this command returns no response */ } + void cmd_quit(char *argbuf) { cprintf("%d Goodbye.\n", CIT_OK); CC->kill_me = 1; } + void cmd_lout(char *argbuf) { if (CC->logged_in) - logout(); + CtdlUserLogout(); cprintf("%d logged out.\n", CIT_OK); } + /* * This loop recognizes all server commands. */ @@ -1103,12 +1040,11 @@ void do_command_loop(void) { } /* Log the server command, but don't show passwords... */ - if ( (strncasecmp(cmdbuf, "PASS", 4)) - && (strncasecmp(cmdbuf, "SETP", 4)) ) { + if ( (strncasecmp(cmdbuf, "PASS", 4)) && (strncasecmp(cmdbuf, "SETP", 4)) ) { CtdlLogPrintf(CTDL_INFO, "%s\n", cmdbuf); } else { - CtdlLogPrintf(CTDL_INFO, "\n"); + CtdlLogPrintf(CTDL_INFO, "