]> code.citadel.org Git - citadel.git/blob - webcit/who.c
c4a654650616092ca6cba6f6b403f8d349358bb3
[citadel.git] / webcit / who.c
1 /* $Id$ */
2
3 #include <stdlib.h>
4 #ifdef HAVE_UNISTD_H
5 #include <unistd.h>
6 #endif
7 #include <stdio.h>
8 #include <signal.h>
9 #include <sys/types.h>
10 #include <ctype.h>
11 #include <string.h>
12 #include "webcit.h"
13 #include "child.h"
14
15 struct whouser {
16         struct whouser *next;
17         int sessionnum;
18         char username[256];
19         char roomname[256];
20         char hostname[256];
21         char clientsoftware[256];
22         };
23         
24 /*
25  * who is on?
26  */
27 void whobbs(void) {
28         struct whouser *wlist = NULL;
29         struct whouser *wptr = NULL;
30         char buf[256],sess,user[256],room[256],host[256];
31         int foundit;
32
33         printf("HTTP/1.0 200 OK\n");
34         output_headers(1, "bottom");
35
36         wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=007700><TR><TD>");
37         wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"<B>Users currently on ");
38         escputs(serv_info.serv_humannode);
39         wprintf("</B></FONT></TD></TR></TABLE>\n");
40
41         wprintf("<CENTER>\n<TABLE BORDER=1>\n<TR>\n");
42         wprintf("<TH><FONT FACE=\"Arial,Helvetica,sans-serif\">Session ID</FONT></TH>\n");
43         wprintf("<TH><FONT FACE=\"Arial,Helvetica,sans-serif\">User Name</FONT></TH>\n");
44         wprintf("<TH><FONT FACE=\"Arial,Helvetica,sans-serif\">Room</FONT></TH>");
45         wprintf("<TH><FONT FACE=\"Arial,Helvetica,sans-serif\">From host</FONT></TH>\n</TR>\n");
46         serv_puts("RWHO");
47         serv_gets(buf);
48         if (buf[0]=='1') {
49                 while(serv_gets(buf), strcmp(buf,"000")) {
50                         sess = extract_int(buf, 0);
51                         extract(user, buf, 1);
52                         extract(room, buf, 2);
53                         extract(host, buf, 3);
54
55                         foundit = 0;
56                         for (wptr = wlist; wptr != NULL; wptr = wptr -> next) {
57                                 if (wptr->sessionnum == sess) {
58                                         foundit = 1;
59                                         if (strcasecmp(user, wptr->username)) {
60                                                 sprintf(buf, "%cBR%c%s", 
61                                                         LB, RB, user);
62                                                 strcat(wptr->username, buf);
63                                                 }
64                                         if (strcasecmp(room, wptr->roomname)) {
65                                                 sprintf(buf, "%cBR%c%s", 
66                                                         LB, RB, room);
67                                                 strcat(wptr->roomname, buf);
68                                                 }
69                                         if (strcasecmp(host, wptr->hostname)) {
70                                                 sprintf(buf, "%cBR%c%s", 
71                                                         LB, RB, host);
72                                                 strcat(wptr->hostname, buf);
73                                                 }
74                                         }
75                                 }
76
77                         if (foundit == 0) {
78                                 wptr = (struct whouser *)
79                                         malloc(sizeof(struct whouser));
80                                 wptr->next = wlist;
81                                 wlist = wptr;
82                                 strcpy(wlist->username, user);
83                                 strcpy(wlist->roomname, room);
84                                 strcpy(wlist->hostname, host);
85                                 wlist->sessionnum = sess;
86                                 }
87                         }
88
89                 while (wlist != NULL) {
90                         wprintf("<TR>\n\t<TD ALIGN=center><FONT FACE=\"Arial,Helvetica,sans-serif\">%d", wlist->sessionnum);
91                         if ( (is_aide) &&
92                            (wlist->sessionnum != serv_info.serv_pid) ) {
93                                 wprintf(" <A HREF=\"/terminate_session&which_session=%d&session_owner=", wlist->sessionnum);
94                                 urlescputs(wlist->username);
95                                 wprintf("\">(kill)</A>");
96                                 }
97                         if (wlist->sessionnum == serv_info.serv_pid) {
98                                 wprintf(" <A HREF=\"/edit_me\">(edit)</A>");
99                                 }
100                         /* username */
101                         wprintf("</FONT></TD>\n\t<TD><FONT FACE=\"Arial,Helvetica,sans-serif\"><A HREF=\"/showuser?who=");
102                         escputs(wlist->username);
103                         wprintf("\" onMouseOver=\"window.status='View profile for ");
104                         escputs(wlist->username);
105                         wprintf("'; return true\">");
106                         escputs(wlist->username);
107                         wprintf("</A>");
108                         /* room */
109                         wprintf("</FONT></TD>\n\t<TD><FONT FACE=\"Arial,Helvetica,sans-serif\">");
110                         /* handle chat */
111                         if(strstr(wlist->roomname,"chat") != NULL){
112                                 wprintf("<A HREF=\"/chat\" onMouseOver=\"window.status='Chat'; return true\">&lt;chat&gt;</A>");
113                                 }
114                         else {
115                                 wprintf("<A HREF=\"/dotgoto&room=");
116                                 escputs(wlist->roomname);
117                                 wprintf("\" onMouseOver=\"window.status='Go to room ");
118                                 escputs(wlist->roomname);
119                                 wprintf("'; return true\">");
120                                 escputs(wlist->roomname);
121                                 wprintf("</A>");
122                                 }
123                         wprintf("</FONT></TD><TD><FONT FACE=\"Arial,Helvetica,sans-serif\">");
124                         /* hostname */
125                         escputs(wlist->hostname);
126                         wprintf("</FONT></TD>\n</TR>");
127                         wptr = wlist->next;
128                         free(wlist);
129                         wlist = wptr;
130                         }
131                 }
132         wprintf("</TABLE>\n<BR><BR>\n");
133         wprintf("<TABLE BORDER=0 BGCOLOR=\"#003399\">\n<TR><TD ALIGN=center VALIGN=center CELLPADING=10>\n");
134         wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\" SIZE=+2><B><A HREF=\"/whobbs\"><FONT COLOR=\"#FF0000\">Refresh</FONT></A></B></FONT>\n");
135         wprintf("</TD></TR>\n</TABLE>\n</CENTER>");
136         wDumpContent(1);
137         }
138
139
140 void terminate_session(void) {
141         char buf[256];
142
143         if (!strcasecmp(bstr("confirm"), "Yes")) {
144                 serv_printf("TERM %s", bstr("which_session"));
145                 serv_gets(buf);
146                 if (buf[0]=='2') {
147                         whobbs();
148                         }
149                 else {
150                         display_error(&buf[4]);
151                         }
152                 }
153
154         else {
155                 printf("HTTP/1.0 200 OK\n");
156                 output_headers(1, "bottom");
157                 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
158                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\" SIZE=+1 COLOR=\"FFFFFF\"<B>Confirm session termination");
159                 wprintf("</B></FONT></TD></TR></TABLE>\n");
160         
161                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\">Are you sure you want to terminate session %s",
162                         bstr("which_session"));
163                 if (strlen(bstr("session_owner"))>0) {
164                         wprintf(" (");
165                         escputs(bstr("session_owner"));
166                         wprintf(")");
167                         }
168                 wprintf("?<BR><BR>\n");
169         
170                 wprintf("<A HREF=\"/terminate_session&which_session=%s&confirm=yes\">",
171                         bstr("which_session"));
172                 wprintf("Yes</A>&nbsp;&nbsp;&nbsp;");
173                 wprintf("<A HREF=\"/whobbs\">No</A></FONT>");
174                 wDumpContent(1);
175                 }
176
177         }
178
179
180
181 /*
182  * Change your session info (fake roomname and hostname)
183  */
184 void edit_me(void) {
185         char buf[256];
186
187         printf("HTTP/1.0 200 OK\n");
188         output_headers(1, "bottom");
189
190         if (!strcasecmp(bstr("sc"), "Change room name")) {
191                 serv_printf("RCHG %s", bstr("fake_roomname"));
192                 serv_gets(buf);
193                 whobbs();
194                 }
195         else if (!strcasecmp(bstr("sc"), "Change host name")) {
196                 serv_printf("HCHG %s", bstr("fake_hostname"));
197                 serv_gets(buf);
198                 whobbs();
199                 }
200         else if (!strcasecmp(bstr("sc"), "Change user name")) {
201                 serv_printf("UCHG %s", bstr("fake_username"));
202                 serv_gets(buf);
203                 whobbs();
204                 }
205         else if (!strcasecmp(bstr("sc"), "Cancel")) {
206                 whobbs();
207                 }
208         else {
209
210                 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=000077><TR><TD>");
211                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\" SIZE=+1 COLOR=\"FFFFFF\"><B>");
212                 wprintf("Edit your session display");
213                 wprintf("</B></FONT></TD></TR></TABLE>\n");
214                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\">");
215                 wprintf("This screen allows you to change the way your\n");
216                 wprintf("session appears in the 'Who is online' listing.\n");
217                 wprintf("To turn off any 'fake' name you've previously\n");
218                 wprintf("set, simply click the appropriate 'change' button\n");
219                 wprintf("without typing anything in the corresponding box.\n");
220                 wprintf("<BR>\n</FONT>\n");
221
222                 wprintf("<FORM METHOD=\"POST\" ACTION=\"/edit_me\">\n");
223
224                 wprintf("<TABLE border=0 width=100%>\n");
225
226                 wprintf("<TR><TD><FONT FACE=\"Arial,Helvetica,sans-serif\"><B>Room name:</B></FONT></TD>\n<TD>");
227                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"text\" NAME=\"fake_roomname\" MAXLENGTH=\"64\">\n");
228                 wprintf("</FONT></TD>\n<TD ALIGN=center>");
229                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Change room name\">");
230                 wprintf("</FONT></TD>\n</TR>\n");
231
232                 wprintf("<TR><TD><FONT FACE=\"Arial,Helvetica,sans-serif\"><B>Host name:</B></FONT></TD><TD>");
233                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"text\" NAME=\"fake_hostname\" MAXLENGTH=\"64\">\n");
234                 wprintf("</FONT></TD>\n<TD ALIGN=center>");
235                 wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Change host name\">");
236                 wprintf("</FONT></TD>\n</TR>\n");
237
238                 if (is_aide) {
239                         wprintf("<TR><TD><FONT FACE=\"Arial,Helvetica,sans-serif\"><B>User name:</B></FONT></TD><TD>");
240                         wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"text\" NAME=\"fake_username\" MAXLENGTH=\"64\">\n");
241                         wprintf("</FONT></TD>\n<TD ALIGN=center>");
242                         wprintf("<FONT FACE=\"Arial,Helvetica,sans-serif\"><INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Change user name\">");
243                         wprintf("</FONT></TD>\n</TR>\n");
244                         }
245
246                 wprintf("<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD ALIGN=center>");
247                 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
248                 wprintf("</TD></TR></TABLE>\n");
249
250                 wprintf("</FORM></CENTER>\n");
251                 wDumpContent(1);
252                 }
253         }
254