X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fwiki%2Fserv_wiki.c;h=680f63733aed4c47088b8da5b60c075a87f8b1fb;hb=1428026a3d58abcf316a7f9aacdf110cc78add85;hp=1f171c588f54e01f44924e0ba0e8985818214e4e;hpb=6bda4cbebcc91c035d43c79aad533cc9811003d3;p=citadel.git diff --git a/citadel/modules/wiki/serv_wiki.c b/citadel/modules/wiki/serv_wiki.c index 1f171c588..680f63733 100644 --- a/citadel/modules/wiki/serv_wiki.c +++ b/citadel/modules/wiki/serv_wiki.c @@ -83,6 +83,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { struct CtdlMessage *history_msg = NULL; char diff_old_filename[PATH_MAX]; char diff_new_filename[PATH_MAX]; + char diff_out_filename[PATH_MAX]; char diff_cmd[PATH_MAX]; FILE *fp; int rv; @@ -90,7 +91,6 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { char boundary[256]; char prefixed_boundary[258]; char buf[1024]; - int nbytes = 0; char *diffbuf = NULL; size_t diffbuf_len = 0; char *ptr = NULL; @@ -116,7 +116,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { if ( (strlen(msg->cm_fields['E']) >= 9) && (!strcasecmp(&msg->cm_fields['E'][strlen(msg->cm_fields['E'])-9], "_HISTORY_")) ) { - CtdlLogPrintf(CTDL_DEBUG, "History page not being historied\n"); + syslog(LOG_DEBUG, "History page not being historied\n"); return(0); } @@ -154,6 +154,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { */ CtdlMakeTempFileName(diff_old_filename, sizeof diff_old_filename); CtdlMakeTempFileName(diff_new_filename, sizeof diff_new_filename); + CtdlMakeTempFileName(diff_out_filename, sizeof diff_out_filename); if (old_msg != NULL) { fp = fopen(diff_old_filename, "w"); @@ -166,29 +167,37 @@ 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 " -u %s %s >%s", diff_new_filename, - ((old_msg != NULL) ? diff_old_filename : "/dev/null") + ((old_msg != NULL) ? diff_old_filename : "/dev/null"), + diff_out_filename ); - fp = popen(diff_cmd, "r"); + syslog(LOG_DEBUG, "diff cmd: %s", diff_cmd); + rv = system(diff_cmd); + syslog(LOG_DEBUG, "diff cmd returned %d", rv); + + diffbuf_len = 0; + diffbuf = NULL; + fp = fopen(diff_out_filename, "r"); + if (fp == NULL) { + fp = fopen("/dev/null", "r"); + } if (fp != NULL) { - do { - diffbuf = realloc(diffbuf, diffbuf_len + 1025); - nbytes = fread(&diffbuf[diffbuf_len], 1, 1024, fp); - diffbuf_len += nbytes; - } while (nbytes == 1024); + fseek(fp, 0L, SEEK_END); + diffbuf_len = ftell(fp); + fseek(fp, 0L, SEEK_SET); + diffbuf = malloc(diffbuf_len + 1); + fread(diffbuf, diffbuf_len, 1, fp); diffbuf[diffbuf_len] = 0; - if (pclose(fp) != 0) { - CtdlLogPrintf(CTDL_ERR, "pclose() returned an error - diff failed\n"); - } + fclose(fp); } - CtdlLogPrintf(CTDL_DEBUG, "diff length is %d bytes\n", diffbuf_len); + + syslog(LOG_DEBUG, "diff length is "SIZE_T_FMT" bytes", diffbuf_len); unlink(diff_old_filename); unlink(diff_new_filename); + unlink(diff_out_filename); /* Determine whether this was a bogus (empty) edit */ if ((diffbuf_len = 0) && (diffbuf != NULL)) { @@ -239,6 +248,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { */ if (history_msg->cm_fields['I'] != NULL) { free(history_msg->cm_fields['I']); + history_msg->cm_fields['I'] = NULL; } /* Figure out the boundary string. We do this even when we generated the @@ -271,7 +281,8 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { } } while ( (IsEmptyStr(boundary)) && (*ptr != 0) ); - /* Now look for the first boundary. That is where we need to insert our fun. + /* + * Now look for the first boundary. That is where we need to insert our fun. */ if (!IsEmptyStr(boundary)) { snprintf(prefixed_boundary, sizeof prefixed_boundary, "--%s", boundary); @@ -281,16 +292,15 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { ptr = bmstrcasestr(history_msg->cm_fields['M'], prefixed_boundary); if (ptr != NULL) { char *the_rest_of_it = strdup(ptr); - char uuid[32]; + char uuid[64]; char memo[512]; - char encoded_memo[768]; + char encoded_memo[1024]; generate_uuid(uuid); snprintf(memo, sizeof memo, "%s|%ld|%s|%s", uuid, time(NULL), CCC->user.fullname, config.c_nodename - /* no longer logging CCC->cs_inet_email */ ); CtdlEncodeBase64(encoded_memo, memo, strlen(memo), 0); sprintf(ptr, "--%s\n" @@ -310,12 +320,14 @@ int wiki_upload_beforesave(struct CtdlMessage *msg) { } history_msg->cm_fields['T'] = realloc(history_msg->cm_fields['T'], 32); - snprintf(history_msg->cm_fields['T'], 32, "%ld", time(NULL)); + if (history_msg->cm_fields['T'] != NULL) { + snprintf(history_msg->cm_fields['T'], 32, "%ld", time(NULL)); + } CtdlSubmitMsg(history_msg, NULL, "", 0); } else { - CtdlLogPrintf(CTDL_ALERT, "Empty boundary string in history message. No history!\n"); + syslog(LOG_ALERT, "Empty boundary string in history message. No history!\n"); } free(diffbuf); @@ -419,10 +431,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); - CtdlLogPrintf(CTDL_DEBUG, "callback found rev: %s\n", this_rev); + syslog(LOG_DEBUG, "callback found rev: %s\n", 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); @@ -443,13 +455,13 @@ void wiki_rev_callback(char *name, char *filename, char *partnum, char *disp, } } while ((*ptr != 0) && (ptr < ((char*)content + length))); if (pclose(fp) != 0) { - CtdlLogPrintf(CTDL_ERR, "pclose() returned an error - patch failed\n"); + syslog(LOG_ERR, "pclose() returned an error - patch failed\n"); } } if (!strcasecmp(this_rev, hecbd->stop_when)) { /* Found our target rev. Tell any subsequent callbacks to suppress processing. */ - CtdlLogPrintf(CTDL_DEBUG, "Target revision has been reached -- stop patching.\n"); + syslog(LOG_DEBUG, "Target revision has been reached -- stop patching.\n"); hecbd->done = 1; } } @@ -522,7 +534,7 @@ void wiki_rev(char *pagename, char *rev, char *operation) fclose(fp); } else { - CtdlLogPrintf(CTDL_ALERT, "Cannot open %s: %s\n", temp, strerror(errno)); + syslog(LOG_ALERT, "Cannot open %s: %s\n", temp, strerror(errno)); } CtdlFreeMessage(msg); @@ -580,7 +592,7 @@ void wiki_rev(char *pagename, char *rev, char *operation) fseek(fp, 0L, SEEK_SET); msg->cm_fields['M'] = malloc(len + 1); rv = fread(msg->cm_fields['M'], len, 1, fp); - CtdlLogPrintf(CTDL_DEBUG, "did %d blocks of %d bytes\n", rv, len); + syslog(LOG_DEBUG, "did %d blocks of %ld bytes\n", rv, len); msg->cm_fields['M'][len] = 0; fclose(fp); } @@ -591,6 +603,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)); @@ -667,6 +697,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"; }