4 * This module implementsserver commands related to the display and
5 * manipulation of the "Who's online" list.
17 #include <sys/types.h>
19 #if TIME_WITH_SYS_TIME
20 # include <sys/time.h>
24 # include <sys/time.h>
35 #include "sysdep_decls.h"
36 #include "citserver.h"
40 #include "dynloader.h"
51 * display who's online
53 void cmd_rwho(char *argbuf) {
54 struct CitContext *cptr;
61 char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
62 char host[40], flags[5];
64 aide = CC->usersupp.axlevel >= 6;
65 cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
67 for (cptr = ContextList; cptr != NULL; cptr = cptr->next)
75 if (cptr->cs_flags & CS_POSTING)
80 if (cptr->fake_username[0])
82 strcpy(un, cptr->fake_username);
87 strcpy(un, cptr->curr_user);
89 if (cptr->fake_hostname[0])
91 strcpy(host, cptr->fake_hostname);
96 strcpy(host, cptr->cs_host);
98 GenerateRoomDisplay(real_room, cptr, CC);
100 if (cptr->fake_roomname[0]) {
101 strcpy(room, cptr->fake_roomname);
106 strcpy(room, real_room);
109 if ((aide) && (spoofed)) {
113 if ((cptr->cs_flags & CS_STEALTH) && (aide)) {
117 if (((cptr->cs_flags&CS_STEALTH)==0) || (aide))
119 cprintf("%d|%s|%s|%s|%s|%ld|%s|%s|",
120 cptr->cs_pid, un, room,
121 host, cptr->cs_clientname,
122 (long)(cptr->lastidle),
123 cptr->lastcmdname, flags);
125 if ((user_spoofed) && (aide)) {
126 cprintf("%s|", cptr->curr_user);
132 if ((room_spoofed) && (aide)) {
133 cprintf("%s|", real_room);
139 if ((host_spoofed) && (aide)) {
140 cprintf("%s|", cptr->cs_host);
150 /* Now it's magic time. Before we finish, call any EVT_RWHO hooks
151 * so that external paging modules such as serv_icq can add more
152 * content to the Wholist.
154 PerformSessionHooks(EVT_RWHO);
160 * Masquerade roomname
162 void cmd_rchg(char *argbuf)
164 char newroomname[SIZ];
166 extract(newroomname, argbuf, 0);
167 newroomname[ROOMNAMELEN-1] = 0;
168 if (strlen(newroomname) > 0) {
169 safestrncpy(CC->fake_roomname, newroomname,
170 sizeof(CC->fake_roomname) );
173 strcpy(CC->fake_roomname, "");
175 cprintf("%d OK\n", OK);
179 * Masquerade hostname
181 void cmd_hchg(char *argbuf)
183 char newhostname[SIZ];
185 extract(newhostname, argbuf, 0);
186 if (strlen(newhostname) > 0) {
187 safestrncpy(CC->fake_hostname, newhostname,
188 sizeof(CC->fake_hostname) );
191 strcpy(CC->fake_hostname, "");
193 cprintf("%d OK\n", OK);
198 * Masquerade username (aides only)
200 void cmd_uchg(char *argbuf)
203 char newusername[SIZ];
205 extract(newusername, argbuf, 0);
207 if (CtdlAccessCheck(ac_aide)) return;
209 if (strlen(newusername) > 0) {
210 CC->cs_flags &= ~CS_STEALTH;
211 memset(CC->fake_username, 0, 32);
212 if (strncasecmp(newusername, CC->curr_user,
213 strlen(CC->curr_user)))
214 safestrncpy(CC->fake_username, newusername,
215 sizeof(CC->fake_username));
218 CC->fake_username[0] = '\0';
219 CC->cs_flags |= CS_STEALTH;
228 * enter or exit "stealth mode"
230 void cmd_stel(char *cmdbuf)
234 requested_mode = extract_int(cmdbuf,0);
235 if (requested_mode !=0) requested_mode = 1;
237 if (CtdlAccessCheck(ac_aide)) return;
239 if (CC->cs_flags & CS_STEALTH) {
240 if (requested_mode == 0)
241 CC->cs_flags = CC->cs_flags-CS_STEALTH;
244 if (requested_mode == 1)
245 CC->cs_flags = CC->cs_flags|CS_STEALTH;
248 cprintf("%d Ok\n",OK);
257 char *Dynamic_Module_Init(void)
259 CtdlRegisterProtoHook(cmd_rwho, "RWHO", "Display who is online");
260 CtdlRegisterProtoHook(cmd_hchg, "HCHG", "Masquerade hostname");
261 CtdlRegisterProtoHook(cmd_rchg, "RCHG", "Masquerade roomname");
262 CtdlRegisterProtoHook(cmd_uchg, "UCHG", "Masquerade username");
263 CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");