2 * Administrative screen to add/change/delete user accounts
13 #include <sys/types.h>
15 #include <sys/socket.h>
18 #include <netinet/in.h>
27 #include "webserver.h"
33 void select_user_to_edit(char *message)
38 output_headers(3); /* No room banner on this screen */
40 if (message != NULL) wprintf(message);
42 wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=007700><TR><TD>");
43 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"<B>"
44 "Add/change/delete user accounts"
45 "</B></FONT></TD></TR></TABLE>\n");
47 wprintf("<TABLE border=0 CELLSPACING=10><TR VALIGN=TOP>"
48 "<TD>To edit an existing user account, select the user "
49 "name from the list and click 'Edit'.<BR><BR>");
51 wprintf("<CENTER><FORM METHOD=\"POST\" ACTION=\"/display_edituser\">\n");
52 wprintf("<SELECT NAME=\"username\" SIZE=10>\n");
56 while (serv_gets(buf), strcmp(buf, "000")) {
57 extract(username, buf, 0);
63 wprintf("</SELECT><BR>\n");
65 wprintf("<input type=submit name=sc value=\"Edit configuration\">");
66 wprintf("<input type=submit name=sc value=\"Edit address book entry\">");
67 wprintf("</FORM></CENTER>\n");
70 "To create a new user account, enter the desired "
71 "user name in the box below and click 'Create'.<BR><BR>");
73 wprintf("<CENTER><FORM METHOD=\"POST\" ACTION=\"/create_user\">\n");
74 wprintf("New user: ");
75 wprintf("<input type=text name=username><BR>\n"
76 "<input type=submit value=\"Create\">"
77 "</FORM></CENTER>\n");
79 wprintf("</TD></TR></TABLE>\n");
87 * Display the form for editing a user's address book entry
89 void display_edit_address_book_entry(char *username, long usernum) {
92 char error_message[SIZ];
93 long vcard_msgnum = (-1L);
94 char content_type[SIZ];
96 int already_tried_creating_one = 0;
103 struct stuff_t *stuff = NULL;
107 /* Locate the user's config room, creating it if necessary */
108 sprintf(roomname, "%010ld.My Citadel Config", usernum);
109 serv_printf("GOTO %s", roomname);
112 serv_printf("CRE8 1|%s|5|", roomname);
114 serv_printf("GOTO %s", roomname);
117 sprintf(error_message,
118 "<IMG SRC=\"static/error.gif\" VALIGN=CENTER>"
119 "%s<BR><BR>\n", &buf[4]);
120 select_user_to_edit(error_message);
126 /* Search for the user's vCard */
127 serv_puts("MSGS ALL");
129 if (buf[0] == '1') while (serv_gets(buf), strcmp(buf, "000")) {
130 ptr = malloc(sizeof(struct stuff_t));
131 ptr->msgnum = atol(buf);
136 /* Iterate throught the message list looking for vCards */
137 while (stuff != NULL) {
138 serv_printf("MSG0 %ld|2", stuff->msgnum);
141 while(serv_gets(buf), strcmp(buf, "000")) {
142 if (!strncasecmp(buf, "part=", 5)) {
143 extract(partnum, &buf[5], 2);
144 extract(content_type, &buf[5], 4);
145 if (!strcasecmp(content_type,
147 vcard_msgnum = stuff->msgnum;
158 lprintf(9, "vcard_msgnum == %ld\n", vcard_msgnum);
160 /* If there's no vcard, create one */
161 if (vcard_msgnum < 0) if (already_tried_creating_one == 0) {
162 already_tried_creating_one = 1;
163 serv_puts("ENT0 1|||4");
166 serv_puts("Content-type: text/x-vcard");
168 serv_puts("begin:vcard");
169 serv_puts("end:vcard");
175 if (vcard_msgnum < 0) {
176 sprintf(error_message,
177 "<IMG SRC=\"static/error.gif\" VALIGN=CENTER>"
178 "Could not create/edit vCard<BR><BR>\n");
179 select_user_to_edit(error_message);
183 do_edit_vcard(vcard_msgnum, "1", "/select_user_to_edit");
190 * Edit a user. If supplied_username is null, look in the "username"
191 * web variable for the name of the user to edit.
193 void display_edituser(char *supplied_username) {
195 char error_message[SIZ];
209 if (supplied_username != NULL) {
210 strcpy(username, supplied_username);
213 strcpy(username, bstr("username") );
216 serv_printf("AGUP %s", username);
219 sprintf(error_message,
220 "<IMG SRC=\"static/error.gif\" VALIGN=CENTER>"
221 "%s<BR><BR>\n", &buf[4]);
222 select_user_to_edit(error_message);
226 extract(username, &buf[4], 0);
227 extract(password, &buf[4], 1);
228 flags = extract_int(&buf[4], 2);
229 timescalled = extract_int(&buf[4], 3);
230 msgsposted = extract_int(&buf[4], 4);
231 axlevel = extract_int(&buf[4], 5);
232 usernum = extract_long(&buf[4], 6);
233 lastcall = extract_long(&buf[4], 7);
234 purgedays = extract_long(&buf[4], 8);
236 if (!strcmp(bstr("sc"), "Edit address book entry")) {
237 display_edit_address_book_entry(username, usernum);
241 output_headers(3); /* No room banner on this screen */
242 wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=007700><TR><TD>");
243 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"<B>"
244 "Edit user account: ");
246 wprintf("</B></FONT></TD></TR></TABLE>\n");
248 wprintf("<FORM METHOD=\"POST\" ACTION=\"/edituser\">\n"
249 "<INPUT TYPE=\"hidden\" NAME=\"username\" VALUE=\"");
253 wprintf("<INPUT TYPE=\"hidden\" NAME=\"flags\" VALUE=\"%d\">\n", flags);
255 wprintf("<CENTER><TABLE>");
257 wprintf("<TR><TD>Password</TD><TD>"
258 "<INPUT TYPE=\"password\" NAME=\"password\" VALUE=\"");
260 wprintf("\" MAXLENGTH=\"20\"></TD></TR>\n");
262 wprintf("<TR><TD>Times logged in</TD><TD>"
263 "<INPUT TYPE=\"text\" NAME=\"timescalled\" VALUE=\"");
264 wprintf("%d", timescalled);
265 wprintf("\" MAXLENGTH=\"6\"></TD></TR>\n");
267 wprintf("<TR><TD>Messages posted</TD><TD>"
268 "<INPUT TYPE=\"text\" NAME=\"msgsposted\" VALUE=\"");
269 wprintf("%d", msgsposted);
270 wprintf("\" MAXLENGTH=\"6\"></TD></TR>\n");
272 wprintf("<TR><TD>Access level</TD><TD>"
273 "<SELECT NAME=\"axlevel\">\n");
274 for (i=0; i<7; ++i) {
277 wprintf("SELECTED ");
279 wprintf("VALUE=\"%d\">%d - %s</OPTION>\n",
282 wprintf("</SELECT></TD></TR>\n");
284 wprintf("<TR><TD>User ID number</TD><TD>"
285 "<INPUT TYPE=\"text\" NAME=\"usernum\" VALUE=\"");
286 wprintf("%ld", usernum);
287 wprintf("\" MAXLENGTH=\"7\"></TD></TR>\n");
290 wprintf("<TR><TD>Date/time of last login</TD><TD>"
291 "<SELECT NAME=\"lastcall\">\n");
293 wprintf("<OPTION SELECTED VALUE=\"%ld\">", lastcall);
294 escputs(asctime(localtime(&lastcall)));
295 wprintf("</OPTION>\n");
297 wprintf("<OPTION VALUE=\"%ld\">", now);
298 escputs(asctime(localtime(&now)));
299 wprintf("</OPTION>\n");
301 wprintf("</SELECT></TD></TR>");
303 wprintf("<TR><TD>Auto-purge after days</TD><TD>"
304 "<INPUT TYPE=\"text\" NAME=\"purgedays\" VALUE=\"");
305 wprintf("%d", purgedays);
306 wprintf("\" MAXLENGTH=\"5\"></TD></TR>\n");
308 wprintf("</TABLE>\n");
310 wprintf("<INPUT type=\"submit\" NAME=\"action\" VALUE=\"OK\">\n"
311 "<INPUT type=\"submit\" NAME=\"action\" VALUE=\"Cancel\">\n"
312 "<BR><BR></FORM>\n");
314 wprintf("<A HREF=\"/dotgoto&room=%010ld.My%%20Citadel%%20Config\">",
316 wprintf("Click here to access the configuration room for ");
319 "(Contact information, Internet e-mail addresses, etc.)<BR>"
328 void edituser(void) {
332 if (strcasecmp(bstr("action"), "OK")) {
333 strcpy(message, "Edit user cancelled.");
338 serv_printf("ASUP %s|%s|%s|%s|%s|%s|%s|%s|%s|",
352 "<IMG SRC=\"static/error.gif\" VALIGN=CENTER>"
353 "%s<BR><BR>\n", &buf[4]);
360 select_user_to_edit(message);
366 void create_user(void) {
368 char error_message[SIZ];
371 strcpy(username, bstr("username"));
373 serv_printf("CREU %s", username);
377 display_edituser(username);
380 sprintf(error_message,
381 "<IMG SRC=\"static/error.gif\" VALIGN=CENTER>"
382 "%s<BR><BR>\n", &buf[4]);
383 select_user_to_edit(error_message);