/*
- * $Id$
- *
- * This module implementsserver commands related to the display and
+ * This module implements server commands related to the display and
* manipulation of the "Who's online" list.
*
+ * Copyright (c) 1987-2012 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
*/
#include "sysdep.h"
#include "support.h"
#include "config.h"
#include "control.h"
-#include "room_ops.h"
#include "user_ops.h"
-#include "policy.h"
#include "database.h"
#include "msgbase.h"
#include "ctdl_module.h"
+/* Don't show the names of private rooms unless the viewing
+ * user also knows the rooms.
+ */
+void GenerateRoomDisplay(char *real_room,
+ CitContext *viewed,
+ CitContext *viewer) {
+
+ int ra;
+
+ strcpy(real_room, viewed->room.QRname);
+ if (viewed->room.QRflags & QR_MAILBOX) {
+ strcpy(real_room, &real_room[11]);
+ }
+ if (viewed->room.QRflags & QR_PRIVATE) {
+ CtdlRoomAccess(&viewed->room, &viewer->user, &ra, NULL);
+ if ( (ra & UA_KNOWN) == 0) {
+ strcpy(real_room, " ");
+ }
+ }
+
+ if (viewed->cs_flags & CS_CHAT) {
+ while (strlen(real_room) < 14) {
+ strcat(real_room, " ");
+ }
+ strcpy(&real_room[14], "<chat>");
+ }
+
+}
+
+
/*
* display who's online
*/
void cmd_rwho(char *argbuf) {
- struct CitContext *cptr;
+ struct CitContext *nptr;
+ int nContexts, i;
int spoofed = 0;
int user_spoofed = 0;
int room_spoofed = 0;
char real_room[ROOMNAMELEN], room[ROOMNAMELEN];
char host[64], flags[5];
- aide = CC->user.axlevel >= 6;
+ /* So that we don't keep the context list locked for a long time
+ * we create a copy of it first
+ */
+ nptr = CtdlGetContextArray(&nContexts) ;
+ if (!nptr)
+ {
+ /* Couldn't malloc so we have to bail but stick to the protocol */
+ cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
+ cprintf("000\n");
+ return;
+ }
+
+ aide = ( (CC->user.axlevel >= AxAideU) || (CC->internal_pgm) ) ;
cprintf("%d%c \n", LISTING_FOLLOWS, CtdlCheckExpress() );
- for (cptr = ContextList; cptr != NULL; cptr = cptr->next)
+ for (i=0; i<nContexts; i++)
{
flags[0] = '\0';
spoofed = 0;
room_spoofed = 0;
host_spoofed = 0;
- if (cptr->cs_flags & CS_POSTING)
+ if (!aide && nptr[i].state == CON_SYS)
+ continue;
+
+ if (!aide && nptr[i].kill_me != 0)
+ continue;
+
+ if (nptr[i].cs_flags & CS_POSTING)
strcat(flags, "*");
else
strcat(flags, ".");
- if (cptr->fake_username[0])
+ if (nptr[i].fake_username[0])
{
- strcpy(un, cptr->fake_username);
+ strcpy(un, nptr[i].fake_username);
spoofed = 1;
user_spoofed = 1;
}
else
- strcpy(un, cptr->curr_user);
+ strcpy(un, nptr[i].curr_user);
- if (cptr->fake_hostname[0])
+ if (nptr[i].fake_hostname[0])
{
- strcpy(host, cptr->fake_hostname);
+ strcpy(host, nptr[i].fake_hostname);
spoofed = 1;
host_spoofed = 1;
}
else
- strcpy(host, cptr->cs_host);
+ strcpy(host, nptr[i].cs_host);
- GenerateRoomDisplay(real_room, cptr, CC);
+ GenerateRoomDisplay(real_room, &nptr[i], CC);
- if (cptr->fake_roomname[0]) {
- strcpy(room, cptr->fake_roomname);
+ if (nptr[i].fake_roomname[0]) {
+ strcpy(room, nptr[i].fake_roomname);
spoofed = 1;
room_spoofed = 1;
}
strcat(flags, "+");
}
- if ((cptr->cs_flags & CS_STEALTH) && (aide)) {
+ if ((nptr[i].cs_flags & CS_STEALTH) && (aide)) {
strcat(flags, "-");
}
- if (((cptr->cs_flags&CS_STEALTH)==0) || (aide))
+ if (((nptr[i].cs_flags&CS_STEALTH)==0) || (aide))
{
cprintf("%d|%s|%s|%s|%s|%ld|%s|%s|",
- cptr->cs_pid, un, room,
- host, cptr->cs_clientname,
- (long)(cptr->lastidle),
- cptr->lastcmdname, flags
+ nptr[i].cs_pid, un, room,
+ host, nptr[i].cs_clientname,
+ (long)(nptr[i].lastidle),
+ nptr[i].lastcmdname, flags
);
if ((user_spoofed) && (aide)) {
- cprintf("%s|", cptr->curr_user);
+ cprintf("%s|", nptr[i].curr_user);
}
else {
cprintf("|");
}
if ((host_spoofed) && (aide)) {
- cprintf("%s|", cptr->cs_host);
+ cprintf("%s|", nptr[i].cs_host);
}
else {
cprintf("|");
}
- cprintf("%d\n", cptr->logged_in);
+ cprintf("%d\n", nptr[i].logged_in);
}
}
+
+ /* release out copy of the context list */
+ free(nptr);
/* Now it's magic time. Before we finish, call any EVT_RWHO hooks
* so that external paging modules such as serv_icq can add more
if (requested_mode == 1) {
CC->cs_flags = CC->cs_flags | CS_STEALTH;
+ PerformSessionHooks(EVT_STEALTH);
}
if (requested_mode == 0) {
CC->cs_flags = CC->cs_flags & ~CS_STEALTH;
+ PerformSessionHooks(EVT_UNSTEALTH);
}
cprintf("%d %d\n", CIT_OK,
CtdlRegisterProtoHook(cmd_stel, "STEL", "Enter/exit stealth mode");
}
- /* return our Subversion id for the Log */
- return "$Id$";
+ /* return our module name for the log */
+ return "rwho";
}