X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fwiki%2Fserv_wiki.c;h=ebbb3292554c9141dee3b608dad3aabce2c6f384;hb=2e4e67a1f7f65568abace99d13a71024ad06ebde;hp=7320a156e94a9e4acdf4e12ee15620561171a826;hpb=c4609169aa7baf208848e72c16d33a3f892353b8;p=citadel.git diff --git a/citadel/modules/wiki/serv_wiki.c b/citadel/modules/wiki/serv_wiki.c index 7320a156e..ebbb32925 100644 --- a/citadel/modules/wiki/serv_wiki.c +++ b/citadel/modules/wiki/serv_wiki.c @@ -1,7 +1,7 @@ /* * Server-side module for Wiki rooms. This handles things like version control. * - * Copyright (c) 2009-2015 by the citadel.org team + * Copyright (c) 2009-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. @@ -22,18 +22,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include #include @@ -70,8 +59,7 @@ char *wwm = "9999999999.WikiWaybackMachine"; * Before allowing a wiki page save to execute, we have to perform version control. * This involves fetching the old version of the page if it exists. */ -int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { - struct CitContext *CCC = CC; +int wiki_upload_beforesave(struct CtdlMessage *msg, struct recptypes *recp) { long old_msgnum = (-1L); struct CtdlMessage *old_msg = NULL; long history_msgnum = (-1L); @@ -90,12 +78,13 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { char *diffbuf = NULL; size_t diffbuf_len = 0; char *ptr = NULL; + long newmsgid; + StrBuf *msgidbuf; - if (!CCC->logged_in) return(0); /* Only do this if logged in. */ + if (!CC->logged_in) return(0); /* Only do this if logged in. */ /* Is this a room with a Wiki in it, don't run this hook. */ - if ((CCC->room.QRdefaultview != VIEW_WIKI) && - (CCC->room.QRdefaultview != VIEW_WIKIMD)) { + if (CC->room.QRdefaultview != VIEW_WIKI) { return(0); } @@ -105,6 +94,17 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { /* If there's no EUID we can't do this. Reject the post. */ if (CM_IsEmpty(msg, eExclusiveID)) return(1); + newmsgid = get_new_message_number(); + msgidbuf = NewStrBuf(); + StrBufPrintf(msgidbuf, "%08lX-%08lX@%s/%s", + (long unsigned int) time(NULL), + (long unsigned int) newmsgid, + CtdlGetConfigStr("c_fqdn"), + msg->cm_fields[eExclusiveID] + ); + + CM_SetAsFieldSB(msg, emessageId, &msgidbuf); + history_page_len = snprintf(history_page, sizeof history_page, "%s_HISTORY_", msg->cm_fields[eExclusiveID]); @@ -125,9 +125,9 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { CM_CopyField(msg, eMsgSubject, eExclusiveID); /* See if we can retrieve the previous version. */ - old_msgnum = CtdlLocateMessageByEuid(msg->cm_fields[eExclusiveID], &CCC->room); + old_msgnum = CtdlLocateMessageByEuid(msg->cm_fields[eExclusiveID], &CC->room); if (old_msgnum > 0L) { - old_msg = CtdlFetchMessage(old_msgnum, 1, 1); + old_msg = CtdlFetchMessage(old_msgnum, 1); } else { old_msg = NULL; @@ -205,10 +205,10 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { /* Now look for the existing edit history */ - history_msgnum = CtdlLocateMessageByEuid(history_page, &CCC->room); + history_msgnum = CtdlLocateMessageByEuid(history_page, &CC->room); history_msg = NULL; if (history_msgnum > 0L) { - history_msg = CtdlFetchMessage(history_msgnum, 1, 1); + history_msg = CtdlFetchMessage(history_msgnum, 1); } /* Create a new history message if necessary */ @@ -222,8 +222,8 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { history_msg->cm_anon_type = MES_NORMAL; history_msg->cm_format_type = FMT_RFC822; CM_SetField(history_msg, eAuthor, HKEY("Citadel")); - if (!IsEmptyStr(CCC->room.QRname)){ - CM_SetField(history_msg, eRecipient, CCC->room.QRname, strlen(CCC->room.QRname)); + if (!IsEmptyStr(CC->room.QRname)){ + CM_SetField(history_msg, eRecipient, CC->room.QRname, strlen(CC->room.QRname)); } CM_SetField(history_msg, eExclusiveID, history_page, history_page_len); CM_SetField(history_msg, eMsgSubject, history_page, history_page_len); @@ -304,7 +304,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { memolen = snprintf(memo, sizeof(memo), "%s|%ld|%s|%s", uuid, Now, - CCC->user.fullname, + CC->user.fullname, CtdlGetConfigStr("c_nodename")); memolen = CtdlEncodeBase64(encoded_memo, memo, memolen, 0); @@ -339,7 +339,7 @@ int wiki_upload_beforesave(struct CtdlMessage *msg, recptypes *recp) { CM_SetFieldLONG(history_msg, eTimestamp, Now); - CtdlSubmitMsg(history_msg, NULL, "", 0); + CtdlSubmitMsg(history_msg, NULL, ""); } else { syslog(LOG_ALERT, "Empty boundary string in history message. No history!\n"); @@ -392,7 +392,7 @@ void wiki_history(char *pagename) { snprintf(history_page_name, sizeof history_page_name, "%s_HISTORY_", pagename); msgnum = CtdlLocateMessageByEuid(history_page_name, &CC->room); if (msgnum > 0L) { - msg = CtdlFetchMessage(msgnum, 1, 1); + msg = CtdlFetchMessage(msgnum, 1); } else { msg = NULL; @@ -489,7 +489,6 @@ void wiki_rev_callback(char *name, char *filename, char *partnum, char *disp, */ void wiki_rev(char *pagename, char *rev, char *operation) { - struct CitContext *CCC = CC; int r; char history_page_name[270]; long msgnum; @@ -522,9 +521,9 @@ void wiki_rev(char *pagename, char *rev, char *operation) /* Begin by fetching the current version of the page. We're going to patch * backwards through the diffs until we get the one we want. */ - msgnum = CtdlLocateMessageByEuid(pagename, &CCC->room); + msgnum = CtdlLocateMessageByEuid(pagename, &CC->room); if (msgnum > 0L) { - msg = CtdlFetchMessage(msgnum, 1, 1); + msg = CtdlFetchMessage(msgnum, 1); } else { msg = NULL; @@ -549,16 +548,16 @@ void wiki_rev(char *pagename, char *rev, char *operation) fclose(fp); } else { - syslog(LOG_ALERT, "Cannot open %s: %s\n", temp, strerror(errno)); + syslog(LOG_ERR, "%s: %m", temp); } CM_Free(msg); /* Get the revision history */ snprintf(history_page_name, sizeof history_page_name, "%s_HISTORY_", pagename); - msgnum = CtdlLocateMessageByEuid(history_page_name, &CCC->room); + msgnum = CtdlLocateMessageByEuid(history_page_name, &CC->room); if (msgnum > 0L) { - msg = CtdlFetchMessage(msgnum, 1, 1); + msg = CtdlFetchMessage(msgnum, 1); } else { msg = NULL; @@ -620,7 +619,7 @@ void wiki_rev(char *pagename, char *rev, char *operation) else if (!strcasecmp(operation, "fetch")) { CM_SetField(msg, eAuthor, HKEY("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 */ + msgnum = CtdlSubmitMsg(msg, NULL, wwm); /* Store the revision here */ /* * WARNING: VILE SLEAZY HACK @@ -628,38 +627,36 @@ void wiki_rev(char *pagename, char *rev, char *operation) * but only if the client fetches the message we just generated immediately * without first trying to perform other fetch operations. */ - if (CCC->cached_msglist != NULL) { - free(CCC->cached_msglist); - CCC->cached_msglist = NULL; - CCC->cached_num_msgs = 0; + if (CC->cached_msglist != NULL) { + free(CC->cached_msglist); + CC->cached_msglist = NULL; + CC->cached_num_msgs = 0; } - CCC->cached_msglist = malloc(sizeof(long)); - if (CCC->cached_msglist != NULL) { - CCC->cached_num_msgs = 1; - CCC->cached_msglist[0] = msgnum; + 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")) { CM_SetFieldLONG(msg, eTimestamp, time(NULL)); - if (!IsEmptyStr(CCC->user.fullname)) { - CM_SetField(msg, eAuthor, CCC->user.fullname, strlen(CCC->user.fullname)); + if (!IsEmptyStr(CC->user.fullname)) { + CM_SetField(msg, eAuthor, CC->user.fullname, strlen(CC->user.fullname)); } - if (!IsEmptyStr(CCC->cs_inet_email)) { - CM_SetField(msg, erFc822Addr, CCC->cs_inet_email, strlen(CCC->cs_inet_email)); + if (!IsEmptyStr(CC->cs_inet_email)) { + CM_SetField(msg, erFc822Addr, CC->cs_inet_email, strlen(CC->cs_inet_email)); } - if (!IsEmptyStr(CCC->room.QRname)) { - CM_SetField(msg, eOriginalRoom, CCC->room.QRname, strlen(CCC->room.QRname)); + if (!IsEmptyStr(CC->room.QRname)) { + CM_SetField(msg, eOriginalRoom, CC->room.QRname, strlen(CC->room.QRname)); } - CM_SetField(msg, eNodeName, CtdlGetConfigStr("c_nodename"), strlen(CtdlGetConfigStr("c_nodename"))); - if (!IsEmptyStr(pagename)) { CM_SetField(msg, eExclusiveID, pagename, strlen(pagename)); } - msgnum = CtdlSubmitMsg(msg, NULL, "", 0); /* Replace the current revision */ + msgnum = CtdlSubmitMsg(msg, NULL, ""); /* Replace the current revision */ } else { /* Theoretically it is impossible to get here, but throw an error anyway */