15 * Look for URL's embedded in a buffer and make them linkable. We use a
16 * target window in order to keep the BBS session in its own window.
31 for (pos=0; pos<strlen(buf); ++pos) {
32 if (!strncasecmp(&buf[pos],"http://",7)) start = pos;
33 if (!strncasecmp(&buf[pos],"ftp://",6)) start = pos;
38 if ((start>0)&&(buf[start-1]=='<')) ench = '>';
39 if ((start>0)&&(buf[start-1]=='[')) ench = ']';
40 if ((start>0)&&(buf[start-1]=='(')) ench = ')';
41 if ((start>0)&&(buf[start-1]=='{')) ench = '}';
43 for (pos=strlen(buf); pos>start; --pos) {
44 if ((buf[pos]==' ')||(buf[pos]==ench)) end = pos;
47 strncpy(urlbuf,&buf[start],end-start);
48 urlbuf[end-start] = 0;
51 strncpy(outbuf,buf,start);
52 sprintf(&outbuf[start],"%cA HREF=%c%s%c TARGET=%c%s%c%c%s%c/A%c",
53 LB,QU,urlbuf,QU,QU,TARGET,QU,RB,urlbuf,LB,RB);
54 strcat(outbuf,&buf[end]);
59 void read_message(msgnum, oper)
71 sprintf(buf,"MSG0 %ld",msgnum);
75 wprintf("<STRONG>ERROR:</STRONG> %s<BR>\n",&buf[4]);
79 wprintf("<TABLE WIDTH=100% BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=000077><TR><TD>\n");
80 wprintf("<FONT SIZE=+1 COLOR=\"FFFF00\"> ");
83 strcpy(reply_to,"nobody...xxxxx");
84 while(serv_gets(buf), strncasecmp(buf,"text",4)) {
85 if (!strncasecmp(buf,"nhdr=yes",8)) nhdr=1;
86 if (nhdr==1) buf[0]='_';
87 if (!strncasecmp(buf,"type=",5))
88 format_type=atoi(&buf[5]);
89 if (!strncasecmp(buf,"from=",5)) {
90 wprintf("from %s ",&buf[5]);
93 if (!strncasecmp(buf,"path=",5))
94 strcpy(reply_to,&buf[5]);
95 if (!strncasecmp(buf,"subj=",5))
96 strcpy(m_subject,&buf[5]);
97 if ((!strncasecmp(buf,"hnod=",5))
98 && (strcasecmp(&buf[5],serv_info.serv_humannode)))
99 wprintf("(%s) ",&buf[5]);
100 if ((!strncasecmp(buf,"room=",5))
101 && (strcasecmp(&buf[5],wc_roomname)))
102 wprintf("in %s> ",&buf[5]);
104 if (!strncasecmp(buf,"node=",5)) {
105 if ( (room_flags&QR_NETWORK)
106 || ((strcasecmp(&buf[5],serv_info.serv_nodename)
107 &&(strcasecmp(&buf[5],serv_info.serv_fqdn)))))
109 wprintf("@%s ",&buf[5]);
111 if ((!strcasecmp(&buf[5],serv_info.serv_nodename))
112 ||(!strcasecmp(&buf[5],serv_info.serv_fqdn)))
114 strcpy(reply_to,from);
116 else if (haschar(&buf[5],'.')==0) {
117 sprintf(reply_to,"%s @ %s",from,&buf[5]);
121 if (!strncasecmp(buf,"rcpt=",5))
122 wprintf("to %s ",&buf[5]);
123 if (!strncasecmp(buf,"time=",5)) {
125 tm=(struct tm *)localtime(&now);
126 strcpy(buf,(char *)asctime(tm)); buf[strlen(buf)-1]=0;
127 strcpy(&buf[16],&buf[19]);
128 wprintf("%s ",&buf[4]);
132 if (nhdr==1) wprintf("****");
133 wprintf("</FONT></TD>");
136 wprintf("<TD ALIGN=RIGHT NOWRAP><FONT COLOR=\"FFFF00\"><B>");
138 wprintf("<A HREF=\"/confirm_move_msg");
139 wprintf("&msgid=%ld", msgnum);
140 wprintf("\">Move</A>");
142 wprintf(" ");
144 wprintf("<A HREF=\"/confirm_delete_msg");
145 wprintf("&msgid=%ld", msgnum);
146 wprintf("\">Del</A>");
148 wprintf("</B></FONT></TD>");
151 wprintf("</TR></TABLE>\n");
153 if (strlen(m_subject)>0) {
154 wprintf("Subject: %s<BR>\n",m_subject);
157 if (format_type == 0) {
161 while(serv_gets(buf), strcmp(buf,"000")) {
162 while ((strlen(buf)>0)&&(isspace(buf[strlen(buf)-1])))
163 buf[strlen(buf)-1] = 0;
165 ((!strncmp(buf,">",1))||(!strncmp(buf," >",2))||(!strncmp(buf," :-)",4)))) {
166 wprintf("<FONT COLOR=\"000044\"><I>");
170 (strncmp(buf,">",1))&&(strncmp(buf," >",2))&&(strncmp(buf," :-)",4))) {
171 wprintf("</FONT></I>");
177 wprintf("</TT><BR>\n");
186 * load message pointers from the server
188 int load_msg_ptrs(servcmd)
197 wprintf("<EM>%s</EM><BR>\n",&buf[4]);
200 while (serv_gets(buf), strcmp(buf,"000")) {
201 msgarr[nummsgs] = atol(buf);
209 * command loop for reading messages
211 void readloop(char *oper) {
216 printf("HTTP/1.0 200 OK\n");
217 output_headers(1, "bottom");
219 wprintf("<CENTER><B>%s - ",wc_roomname);
220 if (!strcmp(oper,"readnew")) {
221 strcpy(cmd,"MSGS NEW");
222 wprintf("new messages");
224 else if (!strcmp(oper,"readold")) {
225 strcpy(cmd,"MSGS OLD");
226 wprintf("old messages");
229 strcpy(cmd,"MSGS ALL");
230 wprintf("all messages");
232 wprintf("</B></CENTER><BR>\n");
234 nummsgs = load_msg_ptrs(cmd);
236 if (!strcmp(oper,"readnew")) {
237 wprintf("<EM>No new messages in this room.</EM>\n");
239 else if (!strcmp(oper,"readold")) {
240 wprintf("<EM>No old messages in this room.</EM>\n");
243 wprintf("<EM>This room is empty.</EM>\n");
248 for (a=0; a<nummsgs; ++a) {
249 read_message(msgarr[a], oper);
252 DONE: wprintf("</BODY></HTML>\n");
260 * post message (or don't post message)
262 void post_message(void) {
265 printf("HTTP/1.0 200 OK\n");
266 output_headers(1, "bottom");
268 strcpy(buf, bstr("sc"));
269 if (strcasecmp(buf, "Save message")) {
270 wprintf("Cancelled. Message was not posted.<BR>\n");
274 sprintf(buf,"ENT0 1|%s|0|0",bstr("recp"));
278 text_to_server(bstr("msgtext"));
280 wprintf("Message has been posted.<BR>\n");
283 wprintf("<EM>%s</EM><BR>\n",&buf[4]);
287 wprintf("</BODY></HTML>\n");
299 * prompt for a recipient (to be called from display_enter() only)
301 void prompt_for_recipient() {
303 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=007700><TR><TD>");
304 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
305 wprintf("<B>Send private e-mail</B>\n");
306 wprintf("</FONT></TD></TR></TABLE>\n");
309 wprintf("<FORM METHOD=\"POST\" ACTION=\"/display_enter\">\n");
310 wprintf("Enter recipient: ");
311 wprintf("<INPUT TYPE=\"text\" NAME=\"recp\" MAXLENGTH=\"64\"><BR>\n");
312 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Enter message\">");
313 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\">");
314 wprintf("</FORM></CENTER>\n");
320 * display the message entry screen
322 void display_enter(void) {
327 printf("HTTP/1.0 200 OK\n");
328 output_headers(1, "bottom");
330 sprintf(buf,"ENT0 0|%s|0|0",bstr("recp"));
334 if (!strncmp(buf,"570",3)) {
335 if (strlen(bstr("recp"))>0) {
336 wprintf("<EM>%s</EM><BR>\n",&buf[4]);
338 prompt_for_recipient();
343 wprintf("<EM>%s</EM><BR>\n",&buf[4]);
347 wprintf("<CENTER>Enter message below. Messages are formatted to\n");
348 wprintf("the <EM>reader's</EM> screen width. To defeat the\n");
349 wprintf("formatting, indent a line at least one space. \n");
353 tm=(struct tm *)localtime(&now);
354 strcpy(buf,(char *)asctime(tm)); buf[strlen(buf)-1]=0;
355 strcpy(&buf[16],&buf[19]);
356 wprintf("</CENTER><FONT COLOR=\"440000\"><B> %s ",&buf[4]);
357 wprintf("from %s ",wc_username);
358 if (strlen(bstr("recp"))>0) wprintf("to %s ",bstr("recp"));
359 wprintf("in %s> ",wc_roomname);
360 wprintf("</B></FONT><BR><CENTER>\n");
362 wprintf("<FORM METHOD=\"POST\" ACTION=\"/post\">\n");
363 wprintf("<INPUT TYPE=\"hidden\" NAME=\"recp\" VALUE=\"%s\">\n",
365 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Save message\">");
366 wprintf("<INPUT TYPE=\"submit\" NAME=\"sc\" VALUE=\"Cancel\"><BR>\n");
368 wprintf("<TEXTAREA NAME=\"msgtext\" wrap=soft ROWS=30 COLS=80 WIDTH=80></TEXTAREA><P>\n");
370 wprintf("</FORM></CENTER>\n");
371 DONE: wprintf("</BODY></HTML>\n");
385 * Confirm deletion of a message
387 void confirm_delete_msg(void) {
390 msgid = atol(bstr("msgid"));
392 printf("HTTP/1.0 200 OK\n");
393 output_headers(1, "bottom");
395 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
396 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
397 wprintf("<B>Confirm deletion of message</B>\n");
398 wprintf("</FONT></TD></TR></TABLE>\n");
402 wprintf("Are you sure you want to delete this message? <BR>\n");
404 wprintf("<FORM METHOD=\"POST\" ACTION=\"/delete_msg\">\n");
405 wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgid\" VALUE=\"%s\">\n",
407 wprintf("<INPUT TYPE=\"submit\" NAME=\"yesno\" VALUE=\"Yes\">");
408 wprintf("<INPUT TYPE=\"submit\" NAME=\"yesno\" VALUE=\"No\">");
409 wprintf("</FORM></CENTER>\n");
411 wprintf("</CENTER>\n");
412 wprintf("</BODY></HTML>\n");
418 void delete_msg(void) {
422 msgid = atol(bstr("msgid"));
424 printf("HTTP/1.0 200 OK\n");
425 output_headers(1, "bottom");
427 if (!strcasecmp(bstr("yesno"), "Yes")) {
428 sprintf(buf, "DELE %ld", msgid);
431 wprintf("<EM>%s</EM><BR>\n", &buf[4]);
434 wprintf("<EM>Message not deleted.</EM><BR>\n");
437 wprintf("</BODY></HTML>\n");
445 * Confirm move of a message
447 void confirm_move_msg(void) {
452 msgid = atol(bstr("msgid"));
454 printf("HTTP/1.0 200 OK\n");
455 output_headers(1, "bottom");
457 wprintf("<TABLE WIDTH=100% BORDER=0 BGCOLOR=770000><TR><TD>");
458 wprintf("<FONT SIZE=+1 COLOR=\"FFFFFF\"");
459 wprintf("<B>Confirm move of message</B>\n");
460 wprintf("</FONT></TD></TR></TABLE>\n");
464 wprintf("Please select the room to which you would like this message moved:<BR>\n");
466 wprintf("<FORM METHOD=\"POST\" ACTION=\"/move_msg\">\n");
467 wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgid\" VALUE=\"%s\">\n",
471 wprintf("<SELECT NAME=\"target_room\" SIZE=5>\n");
475 while(serv_gets(buf), strcmp(buf,"000")) {
482 wprintf("</SELECT>\n");
485 wprintf("<INPUT TYPE=\"submit\" NAME=\"yesno\" VALUE=\"Move\">");
486 wprintf("<INPUT TYPE=\"submit\" NAME=\"yesno\" VALUE=\"Cancel\">");
487 wprintf("</FORM></CENTER>\n");
489 wprintf("</CENTER>\n");
490 wprintf("</BODY></HTML>\n");
496 void move_msg(void) {
500 msgid = atol(bstr("msgid"));
502 printf("HTTP/1.0 200 OK\n");
503 output_headers(1, "bottom");
505 if (!strcasecmp(bstr("yesno"), "Move")) {
506 sprintf(buf, "MOVE %ld|%s", msgid, bstr("target_room"));
509 wprintf("<EM>%s</EM><BR>\n", &buf[4]);
512 wprintf("<EM>Message not deleted.</EM><BR>\n");
515 wprintf("</BODY></HTML>\n");