X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fwiki%2Fserv_wiki.c;h=fe318a0080e44f574801b8cf0e493eb2ba3fd824;hb=b1910ef61b4a0e42302c8f3dcac63442562230e5;hp=52ce1282177b1f738256cd81b42bc629d6f268e2;hpb=0f21bcc1b3553d8e4c17bda0c80941b94b55b8a6;p=citadel.git diff --git a/citadel/modules/wiki/serv_wiki.c b/citadel/modules/wiki/serv_wiki.c index 52ce12821..fe318a008 100644 --- a/citadel/modules/wiki/serv_wiki.c +++ b/citadel/modules/wiki/serv_wiki.c @@ -3,7 +3,21 @@ * * Server-side module for Wiki rooms. This will handle things like version control. * - * Copyright (c) 2009 / released under the GNU General Public License v3 + * Copyright (c) 2009-2009 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 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" @@ -60,11 +74,15 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { char diff_new_filename[PATH_MAX]; char diff_cmd[PATH_MAX]; FILE *fp; - char buf[1024]; int rv; char history_page[1024]; char boundary[256]; - int nbytes; + char endary[260]; + char buf[1024]; + int nbytes = 0; + char *diffbuf = NULL; + size_t diffbuf_len = 0; + char *ptr = NULL; if (!CCC->logged_in) return(0); /* Only do this if logged in. */ @@ -116,22 +134,33 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { rv = fwrite(msg->cm_fields['M'], strlen(msg->cm_fields['M']), 1, fp); fclose(fp); + diffbuf_len = 0; + diffbuf = NULL; snprintf(diff_cmd, sizeof diff_cmd, "diff -u %s %s", diff_old_filename, diff_new_filename); fp = popen(diff_cmd, "r"); if (fp != NULL) { do { - nbytes = fread(buf, 1, sizeof buf, fp); - if (nbytes > 0) { - /* FIXME now do something with it */ - CtdlLogPrintf(CTDL_DEBUG, "\033[32mREAD %d BYTES\033[0m\n", nbytes); - } - } while (nbytes == sizeof(buf)); + diffbuf = realloc(diffbuf, diffbuf_len + 1025); + nbytes = fread(&diffbuf[diffbuf_len], 1, 1024, fp); + diffbuf_len += nbytes; + } while (nbytes == 1024); + diffbuf[diffbuf_len] = 0; pclose(fp); } + CtdlLogPrintf(CTDL_DEBUG, "diff length is %d bytes\n", diffbuf_len); unlink(diff_old_filename); unlink(diff_new_filename); + /* Determine whether this was a bogus (empty) edit */ + if ((diffbuf_len = 0) && (diffbuf != NULL)) { + free(diffbuf); + diffbuf = NULL; + } + if (diffbuf == NULL) { + return(1); /* No changes at all? Abandon the post entirely! */ + } + /* Now look for the existing edit history */ history_msgnum = locate_message_by_euid(history_page, &CCC->room); @@ -161,11 +190,68 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { } /* Update the history message (regardless of whether it's new or existing) */ - /* FIXME now do something with it */ - CtdlLogPrintf(CTDL_DEBUG, "\033[31m%s\033[0m", history_msg->cm_fields['M']); - /* FIXME */ + /* First, figure out the boundary string. We do this even when we generated the + * boundary string in the above code, just to be safe and consistent. + */ + strcpy(boundary, ""); + + ptr = history_msg->cm_fields['M']; + do { + ptr = memreadline(ptr, buf, sizeof buf); + if (*ptr != 0) { + striplt(buf); + if (!IsEmptyStr(buf) && (!strncasecmp(buf, "Content-type:", 13))) { + if ( + (bmstrcasestr(buf, "multipart") != NULL) + && (bmstrcasestr(buf, "boundary=") != NULL) + ) { + safestrncpy(boundary, bmstrcasestr(buf, "\""), sizeof boundary); + char *qu; + qu = strchr(boundary, '\"'); + if (qu) { + strcpy(boundary, ++qu); + } + qu = strchr(boundary, '\"'); + if (qu) { + *qu = 0; + } + } + } + } + } while ( (IsEmptyStr(boundary)) && (*ptr != 0) ); + + if (!IsEmptyStr(boundary)) { + snprintf(endary, sizeof endary, "--%s--", boundary); + history_msg->cm_fields['M'] = realloc(history_msg->cm_fields['M'], + strlen(history_msg->cm_fields['M']) + strlen(diffbuf) + 512 + ); + ptr = bmstrcasestr(history_msg->cm_fields['M'], endary); + if (ptr != NULL) { + sprintf(ptr, "--%s\n" + "Content-type: text/plain\n" + "From: %s <%s>\n" + "\n" + "%s\n" + "--%s--\n" + , + boundary, + CCC->user.fullname, + CCC->cs_inet_email, + diffbuf, + boundary + ); + } + + history_msg->cm_fields['T'] = realloc(history_msg->cm_fields['T'], 32); + snprintf(history_msg->cm_fields['T'], 32, "%ld", time(NULL)); + + CtdlLogPrintf(CTDL_DEBUG, "\033[31m%s\033[0m", history_msg->cm_fields['M']); + /* FIXME now do something with it */ + } + + free(diffbuf); free(history_msg); return(0); }