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;
51 char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
52 char host[40], flags[5];
54 aide = CC->usersupp.axlevel >= 6;
55 cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
57 for (cptr = ContextList; cptr != NULL; cptr = cptr->next)
65 if (cptr->cs_flags & CS_POSTING)
70 if (cptr->fake_username[0])
72 strcpy(un, cptr->fake_username);
77 strcpy(un, cptr->curr_user);
79 if (cptr->fake_hostname[0])
81 strcpy(host, cptr->fake_hostname);
86 strcpy(host, cptr->cs_host);
88 GenerateRoomDisplay(real_room, cptr, CC);
90 if (cptr->fake_roomname[0]) {
91 strcpy(room, cptr->fake_roomname);
96 strcpy(room, real_room);
99 if ((aide) && (spoofed))
102 if ((cptr->cs_flags & CS_STEALTH) && (aide))
105 if (((cptr->cs_flags&CS_STEALTH)==0) || (aide))
107 cprintf("%d|%s|%s|%s|%s|%ld|%s|%s|",
108 cptr->cs_pid, un, room,
109 host, cptr->cs_clientname,
110 (long)(cptr->lastidle),
111 cptr->lastcmdname, flags);
114 if ((user_spoofed) && (aide)) {
115 cprintf("%s|", cptr->curr_user);
121 if ((room_spoofed) && (aide)) {
122 cprintf("%s|", real_room);
128 if ((host_spoofed) && (aide)) {
129 cprintf("%s|", cptr->cs_host);
139 /* Now it's magic time. Before we finish, call any EVT_RWHO hooks
140 * so that external paging modules such as serv_icq can add more
141 * content to the Wholist.
143 PerformSessionHooks(EVT_RWHO);
149 * Masquerade roomname
151 void cmd_rchg(char *argbuf)
153 char newroomname[SIZ];
155 extract(newroomname, argbuf, 0);
156 newroomname[ROOMNAMELEN-1] = 0;
157 if (strlen(newroomname) > 0) {
158 safestrncpy(CC->fake_roomname, newroomname,
159 sizeof(CC->fake_roomname) );
162 strcpy(CC->fake_roomname, "");
164 cprintf("%d OK\n", OK);
168 * Masquerade hostname
170 void cmd_hchg(char *argbuf)
172 char newhostname[SIZ];
174 extract(newhostname, argbuf, 0);
175 if (strlen(newhostname) > 0) {
176 safestrncpy(CC->fake_hostname, newhostname,
177 sizeof(CC->fake_hostname) );
180 strcpy(CC->fake_hostname, "");
182 cprintf("%d OK\n", OK);
187 * Masquerade username (aides only)
189 void cmd_uchg(char *argbuf)
192 char newusername[SIZ];
194 extract(newusername, argbuf, 0);
196 if (CtdlAccessCheck(ac_aide)) return;
198 if (strlen(newusername) > 0) {
199 CC->cs_flags &= ~CS_STEALTH;
200 memset(CC->fake_username, 0, 32);
201 if (strncasecmp(newusername, CC->curr_user,
202 strlen(CC->curr_user)))
203 safestrncpy(CC->fake_username, newusername,
204 sizeof(CC->fake_username));
207 CC->fake_username[0] = '\0';
208 CC->cs_flags |= CS_STEALTH;
217 * enter or exit "stealth mode"
219 void cmd_stel(char *cmdbuf)
223 requested_mode = extract_int(cmdbuf,0);
224 if (requested_mode !=0) requested_mode = 1;
226 if (CtdlAccessCheck(ac_aide)) return;
228 if (CC->cs_flags & CS_STEALTH) {
229 if (requested_mode == 0)
230 CC->cs_flags = CC->cs_flags-CS_STEALTH;
233 if (requested_mode == 1)
234 CC->cs_flags = CC->cs_flags|CS_STEALTH;
237 cprintf("%d Ok\n",OK);
246 char *Dynamic_Module_Init(void)
248 CtdlRegisterProtoHook(cmd_rwho, "RWHO", "Display who is online");
249 CtdlRegisterProtoHook(cmd_hchg, "HCHG", "Masquerade hostname");
250 CtdlRegisterProtoHook(cmd_rchg, "RCHG", "Masquerade roomname");
251 CtdlRegisterProtoHook(cmd_uchg, "UCHG", "Masquerade username");
252 CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");