]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_rwho.c
mk_module_init.sh now tests to see if echo supports -e and -E
[citadel.git] / citadel / serv_rwho.c
index a836e8d19f5b2518671673d576db78442c3de08e..553049c9b3bf61da5140f91605f5851066f0f548 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * $Id$
  *
- * This module implements the RWHO (Read WHO's online) server command.
+ * This module implementsserver commands related to the display and
+ * manipulation of the "Who's online" list.
  *
  */
 
 #include <pwd.h>
 #include <errno.h>
 #include <sys/types.h>
-#include <sys/time.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
 #include <sys/wait.h>
 #include <string.h>
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include <time.h>
-#include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
 #include "control.h"
-#include "dynloader.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
 #include "tools.h"
 
 
+#include "ctdl_module.h"
 
 
 /*
- * who's online
+ * display who's online
  */
 void cmd_rwho(char *argbuf) {
        struct CitContext *cptr;
        int spoofed = 0;
+       int user_spoofed = 0;
+       int room_spoofed = 0;
+       int host_spoofed = 0;
        int aide;
        char un[40];
        char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
-       char host[40], flags[5];
+       char host[64], flags[5];
        
-       aide = CC->usersupp.axlevel >= 6;
+       aide = CC->user.axlevel >= 6;
        cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
        
        for (cptr = ContextList; cptr != NULL; cptr = cptr->next) 
        {
                flags[0] = '\0';
                spoofed = 0;
+               user_spoofed = 0;
+               room_spoofed = 0;
+               host_spoofed = 0;
                
                if (cptr->cs_flags & CS_POSTING)
                   strcat(flags, "*");
@@ -65,6 +81,7 @@ void cmd_rwho(char *argbuf) {
                {
                   strcpy(un, cptr->fake_username);
                   spoofed = 1;
+                  user_spoofed = 1;
                }
                else
                   strcpy(un, cptr->curr_user);
@@ -73,6 +90,7 @@ void cmd_rwho(char *argbuf) {
                {
                   strcpy(host, cptr->fake_hostname);
                   spoofed = 1;
+                  host_spoofed = 1;
                }
                else
                   strcpy(host, cptr->cs_host);
@@ -82,34 +100,51 @@ void cmd_rwho(char *argbuf) {
                if (cptr->fake_roomname[0]) {
                        strcpy(room, cptr->fake_roomname);
                        spoofed = 1;
+                       room_spoofed = 1;
                }
                else {
                        strcpy(room, real_room);
                }
                
-                if ((aide) && (spoofed))
-                   strcat(flags, "+");
+                if ((aide) && (spoofed)) {
+                       strcat(flags, "+");
+               }
                
-               if ((cptr->cs_flags & CS_STEALTH) && (aide))
-                  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",
+                       cprintf("%d|%s|%s|%s|%s|%ld|%s|%s|",
                                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);
-               
+                               cptr->lastcmdname, flags
+                       );
+
+                       if ((user_spoofed) && (aide)) {
+                               cprintf("%s|", cptr->curr_user);
+                       }
+                       else {
+                               cprintf("|");
+                       }
+       
+                       if ((room_spoofed) && (aide)) {
+                               cprintf("%s|", real_room);
+                       }
+                       else {
+                               cprintf("|");
+                       }
+       
+                       if ((host_spoofed) && (aide)) {
+                               cprintf("%s|", cptr->cs_host);
+                       }
+                       else {
+                               cprintf("|");
+                       }
+       
+                       cprintf("%d\n", cptr->logged_in);
                }
        }
 
@@ -122,9 +157,110 @@ void cmd_rwho(char *argbuf) {
        }
 
 
+/*
+ * Masquerade roomname
+ */
+void cmd_rchg(char *argbuf)
+{
+       char newroomname[ROOMNAMELEN];
+
+       extract_token(newroomname, argbuf, 0, '|', sizeof newroomname);
+       newroomname[ROOMNAMELEN-1] = 0;
+       if (strlen(newroomname) > 0) {
+               safestrncpy(CC->fake_roomname, newroomname,
+                       sizeof(CC->fake_roomname) );
+       }
+       else {
+               safestrncpy(CC->fake_roomname, "", sizeof CC->fake_roomname);
+       }
+       cprintf("%d OK\n", CIT_OK);
+}
+
+/*
+ * Masquerade hostname 
+ */
+void cmd_hchg(char *argbuf)
+{
+       char newhostname[64];
+
+       extract_token(newhostname, argbuf, 0, '|', sizeof newhostname);
+       if (strlen(newhostname) > 0) {
+               safestrncpy(CC->fake_hostname, newhostname,
+                       sizeof(CC->fake_hostname) );
+       }
+       else {
+               safestrncpy(CC->fake_hostname, "", sizeof CC->fake_hostname);
+       }
+       cprintf("%d OK\n", CIT_OK);
+}
+
+
+/*
+ * Masquerade username (aides only)
+ */
+void cmd_uchg(char *argbuf)
+{
+
+       char newusername[USERNAME_SIZE];
+
+       extract_token(newusername, argbuf, 0, '|', sizeof newusername);
+
+       if (CtdlAccessCheck(ac_aide)) 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",CIT_OK);
+}
+
+
+
+
+/*
+ * enter or exit "stealth mode"
+ */
+void cmd_stel(char *cmdbuf)
+{
+       int requested_mode;
+
+       requested_mode = extract_int(cmdbuf,0);
+
+       if (CtdlAccessCheck(ac_logged_in)) return;
+
+       if (requested_mode == 1) {
+               CC->cs_flags = CC->cs_flags | CS_STEALTH;
+       }
+       if (requested_mode == 0) {
+               CC->cs_flags = CC->cs_flags & ~CS_STEALTH;
+       }
+
+       cprintf("%d %d\n", CIT_OK,
+               ((CC->cs_flags & CS_STEALTH) ? 1 : 0) );
+}
+
+
+
+
 
-char *Dynamic_Module_Init(void)
+
+
+CTDL_MODULE_INIT(rwho)
 {
         CtdlRegisterProtoHook(cmd_rwho, "RWHO", "Display who is online");
+        CtdlRegisterProtoHook(cmd_hchg, "HCHG", "Masquerade hostname");
+        CtdlRegisterProtoHook(cmd_rchg, "RCHG", "Masquerade roomname");
+        CtdlRegisterProtoHook(cmd_uchg, "UCHG", "Masquerade username");
+        CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");
+
+       /* return our Subversion id for the Log */
         return "$Id$";
 }