Integrated the DKIM signer into serv_smtpclient, but disabled it
[citadel.git] / webcit / sitemap.c
index 306979571f83a0bcbda48122a805261175789ba7..a0fec9ad7537c791b15c6bd9d7f5fc87f4782a52 100644 (file)
@@ -1,32 +1,25 @@
 /*
  * XML sitemap generator
  *
- * Copyright (c) 2010 by the citadel.org team
+ * Copyright (c) 2010-2021 by the citadel.org team
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
+ * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include "webcit.h"
-#include "webserver.h"
+
 
 
 /*
- * XML sitemap generator -- go through the message list
+ * XML sitemap generator -- go through the message list for a BBS room
  */
-void sitemap_do_messages(void) {
-       wcsession *WCC = WC;
+void sitemap_do_bbs(void) {
        int num_msgs = 0;
        int i;
        SharedMessageStatus Stat;
@@ -36,14 +29,14 @@ void sitemap_do_messages(void) {
        Stat.maxload = INT_MAX;
        Stat.lowest_found = (-1);
        Stat.highest_found = (-1);
-       num_msgs = load_msg_ptrs("MSGS ALL", &Stat, NULL);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, NULL, &Stat, NULL, NULL, NULL, NULL, 0);
        if (num_msgs < 1) return;
 
        for (i=0; i<num_msgs; i+=20) {
-               Msg = GetMessagePtrAt(i, WCC->summ);
+               Msg = GetMessagePtrAt(i, WC->summ);
                if (Msg != NULL) {
                        wc_printf("<url><loc>%s/readfwd", ChrPtr(site_prefix));
-                       wc_printf("?gotofirst=");
+                       wc_printf("?go=");
                        urlescputs(ChrPtr(WC->CurRoom.name));
                        wc_printf("?start_reading_at=%ld", Msg->msgnum);
                        wc_printf("</loc></url>\r\n");
@@ -52,11 +45,81 @@ void sitemap_do_messages(void) {
 }
 
 
+/*
+ * 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; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WC->summ);
+               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("<url><loc>%s/wiki", ChrPtr(site_prefix));
+                                       wc_printf("?go=");
+                                       urlescputs(ChrPtr(WC->CurRoom.name));
+                                       wc_printf("?page=%s", &buf[5]);
+                                       wc_printf("</loc></url>\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(
@@ -70,24 +133,34 @@ void sitemap(void) {
        wc_printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
        wc_printf("<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n");
 
-       HashList *roomlist = GetRoomListHashLKRA(NULL, NULL);
-       HashPos *it = GetNewHashPos(roomlist, 0);
-       long HKlen;
-       const char *HashKey;
-       folder *room;
+       roomlist = sitemap_load_roomlist();
 
-       while (GetNextHashPos(roomlist, it, &HKlen, &HashKey, (void *)&room))
+       while (roomlist != NULL)
        {
-               /* Output the messages in this room only if it's a message board */
-               if (room->defview == VIEW_BBS)
-               {
-                       gotoroom(room->name);
-                       sitemap_do_messages();
+               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;
                }
-       }
 
-       DeleteHashPos(&it);
-       /* DeleteHash(&roomlist); This will be freed when the session closes */
+               ptr = roomlist;
+               roomlist = roomlist->next;
+               FreeStrBuf(&ptr->roomname);
+               free(ptr);
+       }
 
        wc_printf("</urlset>\r\n");
        wDumpContent(0);
@@ -99,4 +172,5 @@ InitModule_SITEMAP
 (void)
 {
        WebcitAddUrlHandler(HKEY("sitemap"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
+       WebcitAddUrlHandler(HKEY("sitemap.xml"), "", 0, sitemap, ANONYMOUS|COOKIEUNNEEDED);
 }