]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/wiki/serv_wiki.c
Fixed a problem with wiki history display being broken because carriage returns are...
[citadel.git] / citadel / modules / wiki / serv_wiki.c
index 4643d917d3a2669da8f5e890474cc77565fbc987..07e5eed41e231aca188764b375681559b62d8692 100644 (file)
@@ -1,21 +1,15 @@
 /*
  * Server-side module for Wiki rooms.  This handles things like version control. 
  * 
- * Copyright (c) 2009-2011 by the citadel.org team
+ * Copyright (c) 2009-2012 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 as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
+ * 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 "sysdep.h"
@@ -168,7 +162,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) {
        fclose(fp);
 
        snprintf(diff_cmd, sizeof diff_cmd,
-               "diff -u %s %s >%s",
+               DIFF " -u %s %s >%s",
                diff_new_filename,
                ((old_msg != NULL) ? diff_old_filename : "/dev/null"),
                diff_out_filename
@@ -193,7 +187,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) {
                fclose(fp);
        }
 
-       syslog(LOG_DEBUG, "diff length is %d bytes", diffbuf_len);
+       syslog(LOG_DEBUG, "diff length is "SIZE_T_FMT" bytes", diffbuf_len);
 
        unlink(diff_old_filename);
        unlink(diff_new_filename);
@@ -431,10 +425,10 @@ void wiki_rev_callback(char *name, char *filename, char *partnum, char *disp,
 
        CtdlDecodeBase64(memo, filename, strlen(filename));
        extract_token(this_rev, memo, 0, '|', sizeof this_rev);
-       syslog(LOG_DEBUG, "callback found rev: %s\n", this_rev);
+       striplt(this_rev);
 
        /* Perform the patch */
-       fp = popen("patch -f -s -p0 -r /dev/null >/dev/null 2>/dev/null", "w");
+       fp = popen(PATCH " -f -s -p0 -r /dev/null >/dev/null 2>/dev/null", "w");
        if (fp) {
                /* Replace the filenames in the patch with the tempfilename we're actually tweaking */
                fprintf(fp, "--- %s\n", hecbd->tempfilename);
@@ -566,6 +560,7 @@ void wiki_rev(char *pagename, char *rev, char *operation)
        memset(&hecbd, 0, sizeof(struct HistoryEraserCallBackData));
        hecbd.tempfilename = temp;
        hecbd.stop_when = rev;
+       striplt(hecbd.stop_when);
 
        mime_parser(msg->cm_fields['M'], NULL, *wiki_rev_callback, NULL, NULL, (void *)&hecbd, 0);
        CtdlFreeMessage(msg);
@@ -603,6 +598,24 @@ void wiki_rev(char *pagename, char *rev, char *operation)
                        msg->cm_fields['A'] = strdup("Citadel");
                        CtdlCreateRoom(wwm, 5, "", 0, 1, 1, VIEW_BBS);  /* Not an error if already exists */
                        msgnum = CtdlSubmitMsg(msg, NULL, wwm, 0);      /* Store the revision here */
+
+                       /*
+                        * WARNING: VILE SLEAZY HACK
+                        * This will avoid the 'message xxx is not in this room' security error,
+                        * but only if the client fetches the message we just generated immediately
+                        * without first trying to perform other fetch operations.
+                        */
+                       if (CC->cached_msglist != NULL) {
+                               free(CC->cached_msglist);
+                               CC->cached_msglist = NULL;
+                               CC->cached_num_msgs = 0;
+                       }
+                       CC->cached_msglist = malloc(sizeof(long));
+                       if (CC->cached_msglist != NULL) {
+                               CC->cached_num_msgs = 1;
+                               CC->cached_msglist[0] = msgnum;
+                       }
+
                }
                else if (!strcasecmp(operation, "revert")) {
                        snprintf(timestamp, sizeof timestamp, "%ld", time(NULL));
@@ -679,6 +692,6 @@ CTDL_MODULE_INIT(wiki)
                CtdlRegisterProtoHook(cmd_wiki, "WIKI", "Commands related to Wiki management");
        }
 
-       /* return our Subversion id for the Log */
+       /* return our module name for the log */
        return "wiki";
 }