]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_notes.c
mk_module_init.sh now tests to see if echo supports -e and -E
[citadel.git] / citadel / serv_notes.c
index c5d537dc40ed53455d1507e2c5fb09e54740aa7a..47e968b03bd22cfc8ba6b00947e2edda66a9742a 100644 (file)
 #include <limits.h>
 #include "citadel.h"
 #include "server.h"
-#include "sysdep_decls.h"
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
-#include "serv_extensions.h"
 #include "room_ops.h"
 #include "user_ops.h"
 #include "policy.h"
 #include "database.h"
 #include "msgbase.h"
+#include "tools.h"
 
+#include "ctdl_module.h"
 
-char *serv_notes_init(void)
+
+
+/*
+ * If we are in a "notes" view room, and the client has sent an RFC822
+ * message containing an X-KOrg-Note-Id: field (Aethera does this, as
+ * do some Kolab clients) then set both the Subject and the Exclusive ID
+ * of the message to that.  It's going to be a UUID so we want to replace
+ * any existing message containing that UUID.
+ */
+int serv_notes_beforesave(struct CtdlMessage *msg)
 {
-   return "$Id$";
+       char *p;
+       int a, i;
+       char uuid[SIZ];
+
+       /* First determine if this room has the "notes" view set */
+
+       if (CC->room.QRdefaultview != VIEW_NOTES) {
+               return(0);                      /* not notes; do nothing */
+       }
+
+       /* It must be an RFC822 message! */
+       if (msg->cm_format_type != 4) {
+               return(0);      /* You tried to save a non-RFC822 message! */
+       }
+       
+       /* Find the X-KOrg-Note-Id: header */
+       strcpy(uuid, "");
+       p = msg->cm_fields['M'];
+       a = strlen(p);
+       while (--a > 0) {
+               if (!strncasecmp(p, "X-KOrg-Note-Id: ", 16)) {  /* Found it */
+                       safestrncpy(uuid, p + 16, sizeof(uuid));
+                       for (i = 0; i<strlen(uuid); ++i) {
+                               if ( (uuid[i] == '\r') || (uuid[i] == '\n') ) {
+                                       uuid[i] = 0;
+                               }
+                       }
+
+                       lprintf(9, "UUID of note is: %s\n", uuid);
+                       if (strlen(uuid) > 0) {
+
+                               if (msg->cm_fields['E'] != NULL) {
+                                       free(msg->cm_fields['E']);
+                               }
+                               msg->cm_fields['E'] = strdup(uuid);
+
+                               if (msg->cm_fields['U'] != NULL) {
+                                       free(msg->cm_fields['U']);
+                               }
+                               msg->cm_fields['U'] = strdup(uuid);
+                       }
+               }
+               p++;
+       }
+       
+       return(0);
+}
+
+
+CTDL_MODULE_INIT(notes)
+{
+       CtdlRegisterMessageHook(serv_notes_beforesave, EVT_BEFORESAVE);
+
+       /* return our Subversion id for the Log */
+       return "$Id$";
 }