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[64], 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|%d|",
120 cptr->cs_pid, un, room,
121 host, cptr->cs_clientname,
122 (long)(cptr->lastidle),
123 cptr->lastcmdname, flags,
127 if ((user_spoofed) && (aide)) {
128 cprintf("%s|", cptr->curr_user);
134 if ((room_spoofed) && (aide)) {
135 cprintf("%s|", real_room);
141 if ((host_spoofed) && (aide)) {
142 cprintf("%s|", cptr->cs_host);
152 /* Now it's magic time. Before we finish, call any EVT_RWHO hooks
153 * so that external paging modules such as serv_icq can add more
154 * content to the Wholist.
156 PerformSessionHooks(EVT_RWHO);
162 * Masquerade roomname
164 void cmd_rchg(char *argbuf)
166 char newroomname[SIZ];
168 extract(newroomname, argbuf, 0);
169 newroomname[ROOMNAMELEN-1] = 0;
170 if (strlen(newroomname) > 0) {
171 safestrncpy(CC->fake_roomname, newroomname,
172 sizeof(CC->fake_roomname) );
175 strcpy(CC->fake_roomname, "");
177 cprintf("%d OK\n", CIT_OK);
181 * Masquerade hostname
183 void cmd_hchg(char *argbuf)
185 char newhostname[SIZ];
187 extract(newhostname, argbuf, 0);
188 if (strlen(newhostname) > 0) {
189 safestrncpy(CC->fake_hostname, newhostname,
190 sizeof(CC->fake_hostname) );
193 strcpy(CC->fake_hostname, "");
195 cprintf("%d OK\n", CIT_OK);
200 * Masquerade username (aides only)
202 void cmd_uchg(char *argbuf)
205 char newusername[SIZ];
207 extract(newusername, argbuf, 0);
209 if (CtdlAccessCheck(ac_aide)) return;
211 if (strlen(newusername) > 0) {
212 CC->cs_flags &= ~CS_STEALTH;
213 memset(CC->fake_username, 0, 32);
214 if (strncasecmp(newusername, CC->curr_user,
215 strlen(CC->curr_user)))
216 safestrncpy(CC->fake_username, newusername,
217 sizeof(CC->fake_username));
220 CC->fake_username[0] = '\0';
221 CC->cs_flags |= CS_STEALTH;
223 cprintf("%d\n",CIT_OK);
230 * enter or exit "stealth mode"
232 void cmd_stel(char *cmdbuf)
236 requested_mode = extract_int(cmdbuf,0);
238 if (CtdlAccessCheck(ac_logged_in)) return;
240 if (requested_mode == 1) {
241 CC->cs_flags = CC->cs_flags | CS_STEALTH;
243 if (requested_mode == 0) {
244 CC->cs_flags = CC->cs_flags & ~CS_STEALTH;
247 cprintf("%d %d\n", CIT_OK,
248 ((CC->cs_flags & CS_STEALTH) ? 1 : 0) );
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");