X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Frss.c;h=ab01a2aef1d598d1062a8966a3047c0bf2848969;hb=1b302cba797e9b8d6f94304f80c52ac63845503a;hp=9d0a424020a066b210404f880f5cb8b41ed18cad;hpb=bc17ed696720ce8a4726f6aaa70171f061319763;p=citadel.git diff --git a/webcit/rss.c b/webcit/rss.c index 9d0a42402..ab01a2aef 100644 --- a/webcit/rss.c +++ b/webcit/rss.c @@ -1,48 +1,66 @@ /* * $Id$ - * - * Generate some RSS for our rooms. */ #include "webcit.h" #include "webserver.h" +/* Since we don't have anonymous Webcit access yet, you can + * allow the feed to be produced by a special user created just for + * this purpose. The Citadel Developers do not take any responsibility + * for the security of your system when you use this 'feature' */ +#define ALLOW_ANON_RSS 0 +#define ANON_RSS_USER "" +#define ANON_RSS_PASS "" +time_t if_modified_since; /**< the last modified stamp */ -time_t if_modified_since; - - +/* + * view rss Config menu + * reply_to the original author + * subject the subject of the feed + */ void display_rss_control(char *reply_to, char *subject) { wprintf("

\n"); wprintf("[%s] \n", _("Reply")); wprintf("[%s]\n", _("Email")); wprintf("

\n"); } -void display_rss(char *roomname, char *request_method) +/* + * print the feed to the subscriber + * roomname the room we sould print out as rss + * request_method the way the rss is requested???? + */ +void display_rss(const StrBuf *roomname, StrBuf *request_method) { + message_summary *Msg; + wcsession *WCC = WC; int nummsgs; int a, b; int bq = 0; time_t now = 0L; struct tm now_tm; +#ifdef HAVE_ICONV iconv_t ic = (iconv_t)(-1) ; - char *ibuf; /* Buffer of characters to be converted */ - char *obuf; /* Buffer for converted characters */ - size_t ibuflen; /* Length of input buffer */ - size_t obuflen; /* Length of output buffer */ - char *osav; /* Saved pointer to output buffer */ + char *ibuf; /**< Buffer of characters to be converted */ + char *obuf; /**< Buffer for converted characters */ + size_t ibuflen; /**< Length of input buffer */ + size_t obuflen; /**< Length of output buffer */ + char *osav; /**< Saved pointer to output buffer */ +#endif + char description[SIZ] = ""; char buf[SIZ]; char date[30]; char from[256]; @@ -55,33 +73,54 @@ void display_rss(char *roomname, char *request_method) char msgn[256]; char content_type[256]; char charset[256]; + + if (!WCC->logged_in) { + #ifdef ALLOW_ANON_RSS + StrBuf *User; + StrBuf *Pass; + StrBuf *Buf; + serv_printf("USER %s", ANON_RSS_USER); + serv_getln(buf, sizeof buf); + serv_printf("PASS %s", ANON_RSS_PASS); - if (!WC->logged_in) { + StrBuf_ServGetln(Buf); + User = NewStrBufPlain(HKEY(ANON_RSS_USER)); + Pass = NewStrBufPlain(HKEY(ANON_RSS_PASS)); + become_logged_in(User, Pass, Buf); + WCC->killthis = 1; + FreeStrBuf(&User); + FreeStrBuf(&Pass); + FreeStrBuf(&Buf); + #else authorization_required(_("Not logged in")); return; + #endif } - if (gotoroom((char *)roomname)) { + if (gotoroom(roomname)) { lprintf(3, "RSS: Can't goto requested room\n"); - wprintf("HTTP/1.1 404 Not Found\r\n"); - wprintf("Content-Type: text/html\r\n"); - wprintf("\r\n"); + hprintf("HTTP/1.1 404 Not Found\r\n"); + hprintf("Content-Type: text/html\r\n"); wprintf("Error retrieving RSS feed: couldn't find room\n"); + end_burst(); return; } - nummsgs = load_msg_ptrs("MSGS LAST|15", 0); + nummsgs = load_msg_ptrs("MSGS LAST|15", 0); if (nummsgs == 0) { lprintf(3, "RSS: No messages found\n"); - wprintf("HTTP/1.1 404 Not Found\r\n"); - wprintf("Content-Type: text/html\r\n"); - wprintf("\r\n"); + hprintf("HTTP/1.1 404 Not Found\r\n"); + hprintf("Content-Type: text/html\r\n"); wprintf(_("Error retrieving RSS feed: couldn't find messages\n")); + end_burst(); return; - } + } + - /* Read time of last message immediately */ - serv_printf("MSG4 %ld", WC->msgarr[nummsgs - 1]); + /** Read time of last message immediately */ + Msg = GetMessagePtrAt(nummsgs - 1, WCC->summ); + + serv_printf("MSG4 %ld", (Msg==NULL)? 0 : Msg->msgnum); serv_getln(buf, sizeof buf); if (buf[0] == '1') { while (serv_getln(buf, sizeof buf), strcasecmp(buf, "000")) { @@ -95,41 +134,40 @@ void display_rss(char *roomname, char *request_method) } } } - - if (if_modified_since > 0 && if_modified_since > now) { + /*/ Commented out. Play dumb for now, also doesn't work with anonrss hack */ + /* if (if_modified_since > 0 && if_modified_since > now) { lprintf(3, "RSS: Feed not updated since the last time you looked\n"); - wprintf("HTTP/1.1 304 Not Modified\r\n"); - wprintf("Last-Modified: %s\r\n", date); + hprintf("HTTP/1.1 304 Not Modified\r\n"); + hprintf("Last-Modified: %s\r\n", date); now = time(NULL); gmtime_r(&now, &now_tm); strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm); - wprintf("Date: %s\r\n", date); -/* if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */ - wDumpContent(0); - return; - } + hprintf("Date: %s\r\n", date); + if (*msgn) hprintf("ETag: %s\r\n", msgn); * / + // wDumpContent(0); + // return; + //} */ /* Do RSS header */ lprintf(3, "RSS: Yum yum! This feed is tasty!\n"); - wprintf("HTTP/1.1 200 OK\r\n"); - wprintf("Last-Modified: %s\r\n", date); + hprintf("HTTP/1.1 200 OK\r\n"); + hprintf("Last-Modified: %s\r\n", date); /* if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */ - wprintf("Content-Type: application/rss+xml\r\n"); - wprintf("$erver: %s\r\n", SERVER); - wprintf("Connection: close\r\n"); - wprintf("\r\n"); - if (!strcasecmp(request_method, "HEAD")) + hprintf("Content-Type: application/rss+xml\r\n"); + hprintf("Server: %s\r\n", PACKAGE_STRING); + hprintf("Connection: close\r\n"); + if (!strcasecmp(ChrPtr(request_method), "HEAD")) return; - wprintf("\n"); - wprintf("\n"); - wprintf(" \n"); - wprintf(" %s - %s\n", WC->wc_roomname, serv_info.serv_humannode); - wprintf(" %s://%s:%d/dotgoto?room=", (is_https ? "https" : "http"), WC->http_host, PORT_NUM); - escputs(roomname); - wprintf("\n"); - wprintf(" "); - /* Get room info for description */ + /* "); + svput("XML_STYLE", WCS_STRING, ""); + SVPutBuf("ROOM", WCC->wc_roomname, 1); + SVPutBuf("NODE", WCC->serv_info->serv_humannode, 1); + /* TODO: Fix me */ + svprintf(HKEY("ROOM_LINK"), WCS_STRING, "%s://%s/", (is_https ? "https" : "http"), ChrPtr(WCC->http_host)); + + /** Get room info for description */ serv_puts("RINF"); serv_getln(buf, sizeof buf); if (buf[0] == '1') { @@ -137,21 +175,21 @@ void display_rss(char *roomname, char *request_method) serv_getln(buf, sizeof buf); if (!strcmp(buf, "000")) break; - wprintf("%s\n", buf); + strncat(description, buf, strlen(buf)); } } - wprintf("\n"); + svput("ROOM_DESCRIPTION", WCS_STRING, description); if (now) { - wprintf(" %s\n", date); + svput("822_PUB_DATE", WCS_STRING, date); } - wprintf(" %s\n", SERVER); - wprintf(" http://blogs.law.harvard.edu/tech/rss\n"); - wprintf(" 30\n"); + svput("GENERATOR", WCS_STRING, PACKAGE_STRING); + do_template("rss_head", NULL); - /* Read all messages and output as RSS items */ + /** Read all messages and output as RSS items */ for (a = 0; a < nummsgs; ++a) { - /* Read message and output each as RSS item */ - serv_printf("MSG4 %ld", WC->msgarr[a]); + /** Read message and output each as RSS item */ + Msg = GetMessagePtrAt(a, WCC->summ); + serv_printf("MSG4 %ld", (Msg==NULL)? 0 : Msg->msgnum); serv_getln(buf, sizeof buf); if (buf[0] != '1') continue; @@ -166,17 +204,13 @@ void display_rss(char *roomname, char *request_method) while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) { if (!strcmp(buf, "000")) { - goto ENDITEM; /* screw it */ + goto ENDITEM; /** screw it */ } else if (!strncasecmp(buf, "from=", 5)) { strcpy(from, &buf[5]); -#ifdef HAVE_ICONV utf8ify_rfc822_string(from); -#endif } else if (!strncasecmp(buf, "subj=", 5)) { strcpy(subj, &buf[5]); -#ifdef HAVE_ICONV utf8ify_rfc822_string(subj); -#endif } else if (!strncasecmp(buf, "hnod=", 5)) { strcpy(node, &buf[5]); } else if (!strncasecmp(buf, "room=", 5)) { @@ -193,60 +227,60 @@ void display_rss(char *roomname, char *request_method) strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm); } } - wprintf(" \n"); if (subj[0]) { - wprintf(" %s from", subj); + svprintf(HKEY("SUBJ"), WCS_STRING, _("%s from"), subj); } else { - wprintf(" <title>From"); + svput("SUBJ", WCS_STRING, _("From")); } - wprintf(" %s", from); - wprintf(" in %s", room); - if (strcmp(hnod, serv_info.serv_humannode) && strlen(hnod) > 0) { - wprintf(" on %s", hnod); + svprintf(HKEY("IN_ROOM"), WCS_STRING, _("%s in %s"), from, room); + if (strcmp(hnod, ChrPtr(WCC->serv_info->serv_humannode)) && !IsEmptyStr(hnod)) { + svprintf(HKEY("NODE"), WCS_STRING, _(" on %s"), hnod); } - wprintf("\n"); if (now) { - wprintf(" %s\n", date); + svprintf(HKEY("822_PUB_DATE"),WCS_STRING, _("%s"), date); } - wprintf(" %s\n", msgn); - /* Now the hard part, the message itself */ + svprintf(HKEY("GUID"), WCS_STRING,"%s", msgn); + do_template("rss_item", NULL); + /** Now the hard part, the message itself */ strcpy(content_type, "text/plain"); - while (serv_getln(buf, sizeof buf), strlen(buf) > 0) { + while (serv_getln(buf, sizeof buf), !IsEmptyStr(buf)) { if (!strcmp(buf, "000")) { goto ENDBODY; } if (!strncasecmp(buf, "Content-type: ", 14)) { + int len; safestrncpy(content_type, &buf[14], sizeof content_type); - for (b = 0; b < strlen(content_type); ++b) { + len = strlen (content_type); + for (b = 0; b < len; ++b) { if (!strncasecmp(&content_type[b], "charset=", 8)) { safestrncpy(charset, &content_type[b + 8], sizeof charset); } } - for (b = 0; b < strlen(content_type); ++b) { + for (b = 0; b < len; ++b) { if (content_type[b] == ';') { content_type[b] = 0; + len = b - 1; } } } } - /* Set up a character set conversion if we need to */ -#ifdef HAVE_ICONV + /** Set up a character set conversion if we need to */ + #ifdef HAVE_ICONV if (strcasecmp(charset, "us-ascii") && strcasecmp(charset, "utf-8") && strcasecmp(charset, "") ) { - ic = iconv_open("UTF-8", charset); + ctdl_iconv_open("UTF-8", charset, &ic); if (ic == (iconv_t)(-1)) { lprintf(5, "%s:%d iconv_open() failed: %s\n", __FILE__, __LINE__, strerror(errno)); goto ENDBODY; } } -#endif +#endif - /* Messages in legacy Citadel variformat get handled thusly... */ + /** Messages in legacy Citadel variformat get handled thusly... */ if (!strcasecmp(content_type, "text/x-citadel-variformat")) { int intext = 0; - wprintf(" "); bq = 0; } - url(buf); + url(buf, sizeof(buf)); escputs(buf); wprintf("\n"); } display_rss_control(from, subj); - wprintf("]]>\n"); - } - /* Boring old 80-column fixed format text gets handled this way... */ + } + /** Boring old 80-column fixed format text gets handled this way... */ else if (!strcasecmp(content_type, "text/plain")) { - wprintf(" 0) && (isspace(buf[strlen(buf) - 1]))) - buf[strlen(buf) - 1] = 0; + len = strlen (buf); + while ((!IsEmptyStr(buf)) && (isspace(buf[len - 1]))) + buf[--len] = 0; if ((bq == 0) && ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) || (!strncmp(buf, " :-)", 4)))) { wprintf("
"); @@ -306,28 +340,33 @@ void display_rss(char *roomname, char *request_method) bq = 0; } wprintf(""); - url(buf); + url(buf, sizeof(buf)); escputs(buf); wprintf("
\n"); } display_rss_control(from, subj); - wprintf("]]>\n"); - } - /* HTML is fun, but we've got to strip it first */ + } + /** HTML is fun, but we've got to strip it first */ else if (!strcasecmp(content_type, "text/html")) { - wprintf(" \n"); - } + Msg = GetMessagePtrAt(a, WCC->summ); + + output_html(charset, 0, (Msg==NULL)? 0 : Msg->msgnum, NULL, NULL); + } ENDBODY: - wprintf(" \n"); + /* wprintf(" \n"); */ + do_template("rss_item_end", NULL); ENDITEM: now = 0L; } - /* Do RSS footer */ + /** Do RSS footer */ wprintf(" \n"); wprintf("\n"); wDumpContent(0); + #ifdef ALLOW_ANON_RSS + end_webcit_session(); + #endif } + +