]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* Shut off hostname resolution when dealing with Unix domain sockets
[citadel.git] / citadel / citserver.c
index c61944d938ef597058d291965776d7a3cf5d7217..5aafb8a518a399a3253e7bcef46e277d1d7735fe 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);
        
@@ -297,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(' ');
                }
@@ -452,7 +401,7 @@ void cmd_iden(char *argbuf)
        if (num_parms(argbuf)<4) {
                cprintf("%d usage error\n",ERROR);
                return;
-               }
+       }
 
        dev_code = extract_int(argbuf,0);
        cli_code = extract_int(argbuf,1);
@@ -470,15 +419,15 @@ void cmd_iden(char *argbuf)
        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 ((strlen(from_host)>0)
+         && ( (CC->is_local_socket) || (is_public_client(CC->cs_host)))) {
                if ((addr.s_addr = inet_addr(from_host)) != INADDR_NONE)
                        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",
                dev_code,
@@ -487,43 +436,7 @@ void cmd_iden(char *argbuf)
                (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;
-               }
-
-       cprintf("%d Ok\n",OK);
-       }
-
-
+}
 
 
 /*
@@ -650,90 +563,6 @@ void GenerateRoomDisplay(char *real_room,
 }
 
 
-/*
- * who's online
- */
-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);
-
-               GenerateRoomDisplay(real_room, cptr, CC);
-
-               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);
-               
-               }
-       }
-
-       /* 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");
-       }
-
 
 /*
  * Terminate another running session
@@ -892,8 +721,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 +799,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 +996,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]);
                }
@@ -1253,10 +1084,6 @@ void do_command_loop(void) {
                cmd_lbio();
                }
 
-       else if (!strncasecmp(cmdbuf,"STEL",4)) {
-               cmd_stel(&cmdbuf[5]);
-               }
-
        else if (!strncasecmp(cmdbuf,"TERM",4)) {
                cmd_term(&cmdbuf[5]);
                }
@@ -1277,22 +1104,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]);
                }