]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* Changed the comments at the beginning of each file to a consistent format
[citadel.git] / citadel / citserver.c
index c61944d938ef597058d291965776d7a3cf5d7217..89f65d295c86c3f3a2f7d1adcd4c07438cdd792a 100644 (file)
@@ -1,4 +1,10 @@
-/* $Id$ */
+/* 
+ * $Id$
+ *
+ * Main source module for the Citadel server
+ *
+ */
+
 #include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
@@ -55,9 +61,10 @@ void master_startup(void) {
        check_ref_counts();
 
        lprintf(7, "Creating base rooms (if necessary)\n");
-       create_room(BASEROOM, 0, "", 0);
-       create_room(AIDEROOM, 4, "", 0);
-       create_room(config.c_twitroom, 0, "", 0);
+       create_room(BASEROOM,           0, "", 0);
+       create_room(AIDEROOM,           3, "", 0);
+       create_room(SYSCONFIGROOM,      3, "", 0);
+       create_room(config.c_twitroom,  0, "", 0);
        }
 
 /*
@@ -69,7 +76,7 @@ void master_cleanup(void) {
        /* Cancel all running sessions */
        lprintf(7, "Cancelling running sessions...\n");
 
-/* FIX do something here
+/* FIXME do something here
        while (ContextList != NULL) {
                }
  */
@@ -157,6 +164,16 @@ void RemoveContext (struct CitContext *con)
                return;
        }
 
+       /* Run any cleanup routines registered by loadable modules.
+        * Note 1: This must occur *before* deallocate_user_data() because the
+        *         cleanup functions might touch dynamic session data.
+        * Note 2: We have to "become_session()" because the cleanup functions
+        *         might make references to "CC" assuming it's the right one.
+        */
+       become_session(con);
+       PerformSessionHooks(EVT_STOP);
+       become_session(NULL);
+
        /* Now handle all of the administrivia. */
        lprintf(7, "Calling logout(%d)\n", con->cs_pid);
        logout(con);
@@ -165,8 +182,6 @@ void RemoveContext (struct CitContext *con)
        unlink(con->temp);
        lprintf(3, "citserver[%3d]: ended.\n", con->cs_pid);
        
-       /* Run any cleanup routines registered by loadable modules */
-       PerformSessionHooks(EVT_STOP);
 
        syslog(LOG_NOTICE,"session %d ended", con->cs_pid);
        
@@ -297,72 +312,12 @@ void cmd_info(void) {
        cprintf("000\n");
        }
 
-void cmd_rchg(char *argbuf)
-{
-       char newroomname[256];
-
-       extract(newroomname, argbuf, 0);
-       newroomname[ROOMNAMELEN-1] = 0;
-       if (strlen(newroomname) > 0) {
-               safestrncpy(CC->fake_roomname, newroomname,
-                       sizeof(CC->fake_roomname) );
-               }
-       else {
-               strcpy(CC->fake_roomname, "");
-               }
-       cprintf("%d OK\n", OK);
-}
-
-void cmd_hchg(char *argbuf)
-{
-       char newhostname[256];
-
-       extract(newhostname, argbuf, 0);
-       if (strlen(newhostname) > 0) {
-               safestrncpy(CC->fake_hostname, newhostname,
-                       sizeof(CC->fake_hostname) );
-               }
-       else {
-               strcpy(CC->fake_hostname, "");
-               }
-       cprintf("%d OK\n", OK);
-}
-
-void cmd_uchg(char *argbuf)
-{
-
-       char newusername[256];
-
-       extract(newusername, argbuf, 0);
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to masquerade your name.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-       }
-
-       if (strlen(newusername) > 0) {
-               CC->cs_flags &= ~CS_STEALTH;
-               memset(CC->fake_username, 0, 32);
-               if (strncasecmp(newusername, CC->curr_user,
-                               strlen(CC->curr_user)))
-                       safestrncpy(CC->fake_username, newusername,
-                               sizeof(CC->fake_username));
-       }
-       else {
-               CC->fake_username[0] = '\0';
-               CC->cs_flags |= CS_STEALTH;
-       }
-       cprintf("%d\n",OK);
-}
-
-
 
 /*
  * returns an asterisk if there are any express messages waiting,
  * space otherwise.
  */
-char check_express(void) {
+char CtdlCheckExpress(void) {
        if (CC->FirstExpressMessage == NULL) {
                return(' ');
                }
@@ -417,8 +372,10 @@ int is_public_client(char *where)
        char buf[256];
        FILE *fp;
 
-       if (hostnames_match(where,"localhost")) return(1);
-       if (hostnames_match(where,config.c_fqdn)) return(1);
+       lprintf(9, "Checking whether %s is a public client\n", where);
+
+       if (hostnames_match(where, "localhost")) return(1);
+       if (hostnames_match(where, config.c_fqdn)) return(1);
 
        fp = fopen("public_clients","r");
        if (fp == NULL) return(0);
@@ -448,11 +405,12 @@ void cmd_iden(char *argbuf)
        char desc[256];
        char from_host[256];
        struct in_addr addr;
+       int do_lookup = 0;
 
        if (num_parms(argbuf)<4) {
                cprintf("%d usage error\n",ERROR);
                return;
-               }
+       }
 
        dev_code = extract_int(argbuf,0);
        cli_code = extract_int(argbuf,1);
@@ -469,61 +427,37 @@ void cmd_iden(char *argbuf)
        safestrncpy(CC->cs_clientname, desc, sizeof CC->cs_clientname);
        CC->cs_clientname[31] = 0;
 
-       lprintf(9, "Looking up hostname '%s'\n", from_host);
-       if ((strlen(from_host)>0) && 
-          (is_public_client(CC->cs_host))) {
-               if ((addr.s_addr = inet_addr(from_host)) != INADDR_NONE)
+       if (strlen(from_host) > 0) {
+               if (CC->is_local_socket) do_lookup = 1;
+               else if (is_public_client(CC->cs_host)) do_lookup = 1;
+       }
+
+       if (do_lookup) {
+               lprintf(9, "Looking up hostname '%s'\n", from_host);
+               if ((addr.s_addr = inet_addr(from_host)) != -1) {
                        locate_host(CC->cs_host, &addr);
+               }
                else {
                        safestrncpy(CC->cs_host, from_host, sizeof CC->cs_host);
                        CC->cs_host[24] = 0;
-                       }
                }
+       }
 
-       syslog(LOG_NOTICE,"client %d/%d/%01d.%02d (%s)\n",
+       lprintf(7, "client %d/%d/%01d.%02d (%s)\n",
                dev_code,
                cli_code,
                (rev_level / 100),
                (rev_level % 100),
                desc);
-               cprintf("%d Ok\n",OK);
-       }
-
-
-/*
- * enter or exit "stealth mode"
- */
-void cmd_stel(char *cmdbuf)
-{
-       int requested_mode;
-
-       requested_mode = extract_int(cmdbuf,0);
-       if (requested_mode !=0) requested_mode = 1;
-
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to use stealth mode.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
-
-       if (CC->cs_flags & CS_STEALTH) {
-               if (requested_mode == 0)
-                       CC->cs_flags = CC->cs_flags-CS_STEALTH;
-               }
-       else {
-               if (requested_mode == 1)
-                       CC->cs_flags = CC->cs_flags|CS_STEALTH;
-               }
 
+       syslog(LOG_NOTICE,"client %d/%d/%01d.%02d (%s)\n",
+               dev_code,
+               cli_code,
+               (rev_level / 100),
+               (rev_level % 100),
+               desc);
        cprintf("%d Ok\n",OK);
-       }
-
-
+}
 
 
 /*
@@ -583,11 +517,7 @@ void cmd_emsg(char *mname)
        char *dirs[2];
        int a;
 
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to edit system messages.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        extract(buf,mname,0);
        for (a=0; a<strlen(buf); ++a) {         /* security measure */
@@ -649,91 +579,43 @@ void GenerateRoomDisplay(char *real_room,
 
 }
 
-
 /*
- * who's online
+ * Convenience function.
  */
-void cmd_rwho(void) {
-       struct CitContext *cptr;
-       int spoofed = 0;
-       int aide;
-       char un[40];
-       char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
-       char host[40], flags[5];
-       
-       aide = CC->usersupp.axlevel >= 6;
-       cprintf("%d%c \n", LISTING_FOLLOWS, check_express() );
-       
-       for (cptr = ContextList; cptr != NULL; cptr = cptr->next) 
-       {
-               flags[0] = '\0';
-               spoofed = 0;
-               
-               if (cptr->cs_flags & CS_POSTING)
-                  strcat(flags, "*");
-               else
-                  strcat(flags, ".");
-                  
-               if (cptr->fake_username[0])
-               {
-                  strcpy(un, cptr->fake_username);
-                  spoofed = 1;
-               }
-               else
-                  strcpy(un, cptr->curr_user);
-                  
-               if (cptr->fake_hostname[0])
-               {
-                  strcpy(host, cptr->fake_hostname);
-                  spoofed = 1;
-               }
-               else
-                  strcpy(host, cptr->cs_host);
+int CtdlAccessCheck(int required_level) {
 
-               GenerateRoomDisplay(real_room, cptr, CC);
+       if (CC->internal_pgm) return(0);
+       if (required_level >= ac_internal) {
+               cprintf("%d This is not a user-level command.\n",
+                       ERROR+HIGHER_ACCESS_REQUIRED);
+               return(-1);
+       }
 
-               if (cptr->fake_roomname[0]) {
-                       strcpy(room, cptr->fake_roomname);
-                       spoofed = 1;
-               }
-               else {
-                       strcpy(room, real_room);
-               }
-               
-                if ((aide) && (spoofed))
-                   strcat(flags, "+");
-               
-               if ((cptr->cs_flags & CS_STEALTH) && (aide))
-                  strcat(flags, "-");
-               
-               if (((cptr->cs_flags&CS_STEALTH)==0) || (aide))
-               {
-                       cprintf("%d|%s|%s|%s|%s|%ld|%s|%s\n",
-                               cptr->cs_pid, un, room,
-                               host, cptr->cs_clientname,
-                               (long)(cptr->lastidle),
-                               cptr->lastcmdname, flags);
-               }
-               if ((spoofed) && (aide))
-               {
-                       cprintf("%d|%s|%s|%s|%s|%ld|%s|%s\n",
-                               cptr->cs_pid, cptr->curr_user,
-                               real_room,
-                               cptr->cs_host, cptr->cs_clientname,
-                               (long)(cptr->lastidle),
-                               cptr->lastcmdname, flags);
-               
-               }
+       if (CC->usersupp.axlevel >= 6) return(0);
+       if (required_level >= ac_aide) {
+               cprintf("%d This command requires Aide access.\n",
+                       ERROR+HIGHER_ACCESS_REQUIRED);
+               return(-1);
        }
 
-       /* Now it's magic time.  Before we finish, call any EVT_RWHO hooks
-        * so that external paging modules such as serv_icq can add more
-        * content to the Wholist.
-        */
-       PerformSessionHooks(EVT_RWHO);
-       cprintf("000\n");
+       if (is_room_aide()) return(0);
+       if (required_level >= ac_room_aide) {
+               cprintf("%d This command requires Aide or Room Aide access.\n",
+                       ERROR + HIGHER_ACCESS_REQUIRED);
+               return(-1);
+       }
+
+       if (CC->logged_in) return(0);
+       if (required_level >= ac_logged_in) {
+               cprintf("%d Not logged in.\n", ERROR+NOT_LOGGED_IN);
+               return(-1);
        }
 
+       /* shhh ... succeed quietly */
+       return(0);
+}
+
+
 
 /*
  * Terminate another running session
@@ -744,16 +626,7 @@ void cmd_term(char *cmdbuf)
        struct CitContext *ccptr;
        int found_it = 0;
 
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to terminate sessions.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        session_num = extract_int(cmdbuf, 0);
        if (session_num == CC->cs_pid) {
@@ -825,16 +698,8 @@ void cmd_ipgm(char *argbuf)
  * Shut down the server
  */
 void cmd_down(void) {
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n", ERROR+NOT_LOGGED_IN);
-               return;
-               }
 
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to shut down the server.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        cprintf("%d Shutting down server.  Goodbye.\n", OK);
        master_cleanup();
@@ -847,16 +712,7 @@ void cmd_scdn(char *argbuf)
 {
        int new_state;
 
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to schedule a shutdown.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        new_state = extract_int(argbuf, 0);
        if ((new_state == 0) || (new_state == 1)) {
@@ -892,8 +748,14 @@ void begin_session(struct CitContext *con)
        safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
        con->cs_host[sizeof con->cs_host - 1] = 0;
        len = sizeof sin;
-       if (!getpeername(con->client_socket, (struct sockaddr *) &sin, &len))
-               locate_host(con->cs_host, &sin.sin_addr);
+       if (!CC->is_local_socket) {
+               if (!getpeername(con->client_socket,
+                  (struct sockaddr *) &sin, &len))
+                       locate_host(con->cs_host, &sin.sin_addr);
+       }
+       else {
+               strcpy(con->cs_host, "");
+       }
        con->cs_flags = 0;
        con->upload_type = UPL_FILE;
        con->dl_is_net = 0;
@@ -964,7 +826,7 @@ void do_command_loop(void) {
        }
                   
        if (!strncasecmp(cmdbuf,"NOOP",4)) {
-               cprintf("%d%cok\n",OK,check_express());
+               cprintf("%d%cok\n",OK,CtdlCheckExpress());
                }
 
        else if (!strncasecmp(cmdbuf,"QUIT",4)) {
@@ -1161,10 +1023,6 @@ void do_command_loop(void) {
                cmd_netf(&cmdbuf[5]);
                }
 
-       else if (!strncasecmp(cmdbuf,"RWHO",4)) {
-               cmd_rwho();
-               }
-
        else if (!strncasecmp(cmdbuf,"OPEN",4)) {
                cmd_open(&cmdbuf[5]);
                }
@@ -1241,22 +1099,6 @@ void do_command_loop(void) {
                cmd_ipgm(&cmdbuf[5]);
                }
 
-       else if (!strncasecmp(cmdbuf,"EBIO",4)) {
-               cmd_ebio();
-               }
-
-       else if (!strncasecmp(cmdbuf,"RBIO",4)) {
-               cmd_rbio(&cmdbuf[5]);
-               }
-
-       else if (!strncasecmp(cmdbuf,"LBIO",4)) {
-               cmd_lbio();
-               }
-
-       else if (!strncasecmp(cmdbuf,"STEL",4)) {
-               cmd_stel(&cmdbuf[5]);
-               }
-
        else if (!strncasecmp(cmdbuf,"TERM",4)) {
                cmd_term(&cmdbuf[5]);
                }
@@ -1277,22 +1119,10 @@ void do_command_loop(void) {
                cmd_uimg(&cmdbuf[5]);
                }
 
-       else if (!strncasecmp(cmdbuf, "UCHG", 4)) {
-               cmd_uchg(&cmdbuf[5]);
-               }
-
        else if (!strncasecmp(cmdbuf, "TIME", 4)) {
                cmd_time();
                }
 
-       else if (!strncasecmp(cmdbuf, "HCHG", 4)) {
-               cmd_hchg(&cmdbuf[5]);
-               }
-
-       else if (!strncasecmp(cmdbuf, "RCHG", 4)) {
-               cmd_rchg(&cmdbuf[5]);
-               }
-
        else if (!strncasecmp(cmdbuf, "AGUP", 4)) {
                cmd_agup(&cmdbuf[5]);
                }