]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* Replaced most of the very repetitive and very redundant access level checks
[citadel.git] / citadel / citserver.c
index e9573ad588489b0284feea018bc1251db4924eeb..c5417bedecb85dc29517358b776deec5860f2a36 100644 (file)
@@ -55,9 +55,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 +70,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 +158,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 +176,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);
        
@@ -254,6 +263,25 @@ void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes)
 }
 
 
+/* 
+ * Change the size of a buffer allocated with CtdlAllocUserData()
+ */
+void CtdlReallocUserData(unsigned long requested_sym, size_t num_bytes)
+{
+       struct CtdlSessData *ptr;
+
+       for (ptr = CC->FirstSessData; ptr != NULL; ptr = ptr->next)  {
+               if (ptr->sym_id == requested_sym) {
+                       ptr->sym_data = reallok(ptr->sym_data, num_bytes);
+                       return;
+               }
+       }
+
+       lprintf(2, "CtdlReallocUserData() ERROR: symbol %ld not found!\n",
+               requested_sym);
+}
+
+
 
 
 
@@ -278,72 +306,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(' ');
                }
@@ -398,8 +366,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);
@@ -429,11 +399,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);
@@ -450,61 +421,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);
-       }
-
-
+}
 
 
 /*
@@ -564,11 +511,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 */
@@ -630,91 +573,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
@@ -725,16 +620,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) {
@@ -806,16 +692,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();
@@ -828,16 +706,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)) {
@@ -873,8 +742,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;
@@ -945,7 +820,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)) {
@@ -1142,10 +1017,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]);
                }
@@ -1222,22 +1093,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]);
                }
@@ -1258,22 +1113,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]);
                }