4 * This module implementsserver commands related to the display and
5 * manipulation of the "Who's online" list.
17 #include <sys/types.h>
25 #include "sysdep_decls.h"
26 #include "citserver.h"
30 #include "dynloader.h"
41 * display who's online
43 void cmd_rwho(char *argbuf) {
44 struct CitContext *cptr;
48 char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
49 char host[40], flags[5];
51 aide = CC->usersupp.axlevel >= 6;
52 cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
54 for (cptr = ContextList; cptr != NULL; cptr = cptr->next)
59 if (cptr->cs_flags & CS_POSTING)
64 if (cptr->fake_username[0])
66 strcpy(un, cptr->fake_username);
70 strcpy(un, cptr->curr_user);
72 if (cptr->fake_hostname[0])
74 strcpy(host, cptr->fake_hostname);
78 strcpy(host, cptr->cs_host);
80 GenerateRoomDisplay(real_room, cptr, CC);
82 if (cptr->fake_roomname[0]) {
83 strcpy(room, cptr->fake_roomname);
87 strcpy(room, real_room);
90 if ((aide) && (spoofed))
93 if ((cptr->cs_flags & CS_STEALTH) && (aide))
96 if (((cptr->cs_flags&CS_STEALTH)==0) || (aide))
98 cprintf("%d|%s|%s|%s|%s|%ld|%s|%s\n",
99 cptr->cs_pid, un, room,
100 host, cptr->cs_clientname,
101 (long)(cptr->lastidle),
102 cptr->lastcmdname, flags);
104 if ((spoofed) && (aide))
106 cprintf("%d|%s|%s|%s|%s|%ld|%s|%s\n",
107 cptr->cs_pid, cptr->curr_user,
109 cptr->cs_host, cptr->cs_clientname,
110 (long)(cptr->lastidle),
111 cptr->lastcmdname, flags);
116 /* Now it's magic time. Before we finish, call any EVT_RWHO hooks
117 * so that external paging modules such as serv_icq can add more
118 * content to the Wholist.
120 PerformSessionHooks(EVT_RWHO);
126 * Masquerade roomname
128 void cmd_rchg(char *argbuf)
130 char newroomname[256];
132 extract(newroomname, argbuf, 0);
133 newroomname[ROOMNAMELEN-1] = 0;
134 if (strlen(newroomname) > 0) {
135 safestrncpy(CC->fake_roomname, newroomname,
136 sizeof(CC->fake_roomname) );
139 strcpy(CC->fake_roomname, "");
141 cprintf("%d OK\n", OK);
145 * Masquerade hostname
147 void cmd_hchg(char *argbuf)
149 char newhostname[256];
151 extract(newhostname, argbuf, 0);
152 if (strlen(newhostname) > 0) {
153 safestrncpy(CC->fake_hostname, newhostname,
154 sizeof(CC->fake_hostname) );
157 strcpy(CC->fake_hostname, "");
159 cprintf("%d OK\n", OK);
164 * Masquerade username (aides only)
166 void cmd_uchg(char *argbuf)
169 char newusername[256];
171 extract(newusername, argbuf, 0);
173 if (CtdlAccessCheck(ac_aide)) return;
175 if (strlen(newusername) > 0) {
176 CC->cs_flags &= ~CS_STEALTH;
177 memset(CC->fake_username, 0, 32);
178 if (strncasecmp(newusername, CC->curr_user,
179 strlen(CC->curr_user)))
180 safestrncpy(CC->fake_username, newusername,
181 sizeof(CC->fake_username));
184 CC->fake_username[0] = '\0';
185 CC->cs_flags |= CS_STEALTH;
194 * enter or exit "stealth mode"
196 void cmd_stel(char *cmdbuf)
200 requested_mode = extract_int(cmdbuf,0);
201 if (requested_mode !=0) requested_mode = 1;
203 if (CtdlAccessCheck(ac_aide)) return;
205 if (CC->cs_flags & CS_STEALTH) {
206 if (requested_mode == 0)
207 CC->cs_flags = CC->cs_flags-CS_STEALTH;
210 if (requested_mode == 1)
211 CC->cs_flags = CC->cs_flags|CS_STEALTH;
214 cprintf("%d Ok\n",OK);
223 char *Dynamic_Module_Init(void)
225 CtdlRegisterProtoHook(cmd_rwho, "RWHO", "Display who is online");
226 CtdlRegisterProtoHook(cmd_hchg, "HCHG", "Masquerade hostname");
227 CtdlRegisterProtoHook(cmd_rchg, "RCHG", "Masquerade roomname");
228 CtdlRegisterProtoHook(cmd_uchg, "UCHG", "Masquerade username");
229 CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");