X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsitemap.c;fp=webcit%2Fsitemap.c;h=50618e63608ef2609b10d20b45b911c21707f9b1;hb=8611acef7ff4213c28ad20ff755d34509870bc96;hp=0000000000000000000000000000000000000000;hpb=76a0f8571de023fe6bd20390174a2302e0a0b982;p=citadel.git diff --git a/webcit/sitemap.c b/webcit/sitemap.c new file mode 100644 index 000000000..50618e636 --- /dev/null +++ b/webcit/sitemap.c @@ -0,0 +1,176 @@ +/* + * XML sitemap generator + * + * Copyright (c) 2010-2021 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 "webcit.h" +#include "webserver.h" + + +/* + * XML sitemap generator -- go through the message list for a BBS room + */ +void sitemap_do_bbs(void) { + int num_msgs = 0; + int i; + SharedMessageStatus Stat; + message_summary *Msg = NULL; + + memset(&Stat, 0, sizeof Stat); + Stat.maxload = INT_MAX; + Stat.lowest_found = (-1); + Stat.highest_found = (-1); + num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0); + if (num_msgs < 1) return; + + for (i=0; isumm); + if (Msg != NULL) { + wc_printf("%s/readfwd", ChrPtr(site_prefix)); + wc_printf("?go="); + urlescputs(ChrPtr(WC->CurRoom.name)); + wc_printf("?start_reading_at=%ld", Msg->msgnum); + wc_printf("\r\n"); + } + } +} + + +/* + * XML sitemap generator -- go through the message list for a wiki room + */ +void sitemap_do_wiki(void) { + int num_msgs = 0; + int i; + SharedMessageStatus Stat; + message_summary *Msg = NULL; + char buf[256]; + + memset(&Stat, 0, sizeof Stat); + Stat.maxload = INT_MAX; + Stat.lowest_found = (-1); + Stat.highest_found = (-1); + num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0); + if (num_msgs < 1) return; + + for (i=0; isumm); + if (Msg != NULL) { + + serv_printf("MSG0 %ld|3", Msg->msgnum); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + if ( (!strncasecmp(buf, "exti=", 5)) + && (!bmstrcasestr(buf, "_HISTORY_")) + ) { + wc_printf("%s/wiki", ChrPtr(site_prefix)); + wc_printf("?go="); + urlescputs(ChrPtr(WC->CurRoom.name)); + wc_printf("?page=%s", &buf[5]); + wc_printf("\r\n"); + } + } + } + } +} + + +struct sitemap_room_list { + struct sitemap_room_list *next; + StrBuf *roomname; + int defview; +}; + + +/* + * Load the room list for the sitemap + */ +struct sitemap_room_list *sitemap_load_roomlist(void) { + char buf[SIZ]; + char roomname_plain[SIZ]; + struct sitemap_room_list *roomlist = NULL; + + serv_puts("LKRA"); + serv_getln(buf, sizeof buf); + if (buf[0] == '1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) { + struct sitemap_room_list *ptr = malloc(sizeof(struct sitemap_room_list)); + extract_token(roomname_plain, buf, 0, '|', sizeof roomname_plain); + ptr->roomname = NewStrBufPlain(roomname_plain, -1); + ptr->defview = extract_int(buf, 6); + ptr->next = roomlist; + roomlist = ptr; + } + + return(roomlist); +} + +extern void sitemap_do_blog(void); + +/* + * Entry point for RSS feed generator + */ +void sitemap(void) { + struct sitemap_room_list *roomlist = NULL; + output_headers(0, 0, 0, 0, 1, 0); + hprintf("Content-type: text/xml\r\n"); + hprintf( + "Server: %s / %s\r\n" + "Connection: close\r\n" + , + PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software) + ); + begin_burst(); + + wc_printf("\r\n"); + wc_printf("\r\n"); + + roomlist = sitemap_load_roomlist(); + + while (roomlist != NULL) + { + struct sitemap_room_list *ptr; + + gotoroom(roomlist->roomname); + + /* Output the messages in this room only if it's a room type we can make sense of */ + switch(roomlist->defview) { + case VIEW_BBS: + sitemap_do_bbs(); + break; + case VIEW_WIKI: + sitemap_do_wiki(); + break; + case VIEW_BLOG: + sitemap_do_blog(); + break; + default: + break; + } + + ptr = roomlist; + roomlist = roomlist->next; + FreeStrBuf(&ptr->roomname); + free(ptr); + } + + wc_printf("\r\n"); + wDumpContent(0); +} + + +void +InitModule_SITEMAP +(void) +{ + WebcitAddUrlHandler(HKEY("sitemap"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED); + WebcitAddUrlHandler(HKEY("sitemap.xml"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED); +}