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 "serv_extensions.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->user.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
126 if ((user_spoofed) && (aide)) {
127 cprintf("%s|", cptr->curr_user);
133 if ((room_spoofed) && (aide)) {
134 cprintf("%s|", real_room);
140 if ((host_spoofed) && (aide)) {
141 cprintf("%s|", cptr->cs_host);
147 cprintf("%d\n", cptr->logged_in);
151 /* Now it's magic time. Before we finish, call any EVT_RWHO hooks
152 * so that external paging modules such as serv_icq can add more
153 * content to the Wholist.
155 PerformSessionHooks(EVT_RWHO);
161 * Masquerade roomname
163 void cmd_rchg(char *argbuf)
165 char newroomname[ROOMNAMELEN];
167 extract_token(newroomname, argbuf, 0, '|', sizeof newroomname);
168 newroomname[ROOMNAMELEN-1] = 0;
169 if (strlen(newroomname) > 0) {
170 safestrncpy(CC->fake_roomname, newroomname,
171 sizeof(CC->fake_roomname) );
174 safestrncpy(CC->fake_roomname, "", sizeof CC->fake_roomname);
176 cprintf("%d OK\n", CIT_OK);
180 * Masquerade hostname
182 void cmd_hchg(char *argbuf)
184 char newhostname[64];
186 extract_token(newhostname, argbuf, 0, '|', sizeof newhostname);
187 if (strlen(newhostname) > 0) {
188 safestrncpy(CC->fake_hostname, newhostname,
189 sizeof(CC->fake_hostname) );
192 safestrncpy(CC->fake_hostname, "", sizeof CC->fake_hostname);
194 cprintf("%d OK\n", CIT_OK);
199 * Masquerade username (aides only)
201 void cmd_uchg(char *argbuf)
204 char newusername[USERNAME_SIZE];
206 extract_token(newusername, argbuf, 0, '|', sizeof newusername);
208 if (CtdlAccessCheck(ac_aide)) return;
210 if (strlen(newusername) > 0) {
211 CC->cs_flags &= ~CS_STEALTH;
212 memset(CC->fake_username, 0, 32);
213 if (strncasecmp(newusername, CC->curr_user,
214 strlen(CC->curr_user)))
215 safestrncpy(CC->fake_username, newusername,
216 sizeof(CC->fake_username));
219 CC->fake_username[0] = '\0';
220 CC->cs_flags |= CS_STEALTH;
222 cprintf("%d\n",CIT_OK);
229 * enter or exit "stealth mode"
231 void cmd_stel(char *cmdbuf)
235 requested_mode = extract_int(cmdbuf,0);
237 if (CtdlAccessCheck(ac_logged_in)) return;
239 if (requested_mode == 1) {
240 CC->cs_flags = CC->cs_flags | CS_STEALTH;
242 if (requested_mode == 0) {
243 CC->cs_flags = CC->cs_flags & ~CS_STEALTH;
246 cprintf("%d %d\n", CIT_OK,
247 ((CC->cs_flags & CS_STEALTH) ? 1 : 0) );
256 char *serv_rwho_init(void)
258 CtdlRegisterProtoHook(cmd_rwho, "RWHO", "Display who is online");
259 CtdlRegisterProtoHook(cmd_hchg, "HCHG", "Masquerade hostname");
260 CtdlRegisterProtoHook(cmd_rchg, "RCHG", "Masquerade roomname");
261 CtdlRegisterProtoHook(cmd_uchg, "UCHG", "Masquerade username");
262 CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");
264 /* return our Subversion id for the Log */