/*
- * $Id: serv_sieve.c 3850 2005-09-13 14:00:24Z ajc $
+ * $Id$
*
* This module glues libSieve to the Citadel server in order to implement
* the Sieve mailbox filtering language (RFC 3028).
#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 "policy.h"
#include "database.h"
#include "internet_addressing.h"
#include "tools.h"
+
+#include "ctdl_module.h"
+
+
#ifdef HAVE_LIBSIEVE
#include "serv_sieve.h"
/*
* Callback function to send libSieve trace messages to Citadel log facility
- * Set ctdl_libsieve_debug=1 to see extremely verbose libSieve trace
*/
int ctdl_debug(sieve2_context_t *s, void *my)
{
- static int ctdl_libsieve_debug = 0;
-
- if (ctdl_libsieve_debug) {
-/*
- lprintf(CTDL_DEBUG, "Sieve: level [%d] module [%s] file [%s] function [%s]\n",
- sieve2_getvalue_int(s, "level"),
- sieve2_getvalue_string(s, "module"),
- sieve2_getvalue_string(s, "file"),
- sieve2_getvalue_string(s, "function"));
- */
- lprintf(CTDL_DEBUG, "Sieve: %s\n",
- sieve2_getvalue_string(s, "message"));
- }
+ lprintf(CTDL_DEBUG, "Sieve: %s\n", sieve2_getvalue_string(s, "message"));
return SIEVE2_OK;
}
ptr->next = sieve_list;
sieve_list = ptr;
end_critical_section(S_SIEVELIST);
+ lprintf(CTDL_DEBUG, "<%s> queued for Sieve processing\n", which_room->QRname);
}
struct CtdlMessage *msg;
int i;
size_t headers_len = 0;
+ int len = 0;
lprintf(CTDL_DEBUG, "Performing sieve processing on msg <%ld>\n", msgnum);
strcpy(my.envelope_from, "");
}
- /* Keep track of the envelope-to address */
+ len = strlen(my.envelope_from);
+ for (i=0; i<len; ++i) {
+ if (isspace(my.envelope_from[i])) my.envelope_from[i] = '_';
+ }
+ if (haschar(my.envelope_from, '@') == 0) {
+ strcat(my.envelope_from, "@");
+ strcat(my.envelope_from, config.c_fqdn);
+ }
+
+ /* Keep track of the envelope-to address (use body-to if not found) */
if (msg->cm_fields['V'] != NULL) {
safestrncpy(my.envelope_to, msg->cm_fields['V'], sizeof my.envelope_to);
}
+ else if (msg->cm_fields['R'] != NULL) {
+ safestrncpy(my.envelope_to, msg->cm_fields['R'], sizeof my.envelope_to);
+ if (msg->cm_fields['D'] != NULL) {
+ strcat(my.envelope_to, "@");
+ strcat(my.envelope_to, msg->cm_fields['D']);
+ }
+ }
else {
strcpy(my.envelope_to, "");
}
+ len = strlen(my.envelope_to);
+ for (i=0; i<len; ++i) {
+ if (isspace(my.envelope_to[i])) my.envelope_to[i] = '_';
+ }
+ if (haschar(my.envelope_to, '@') == 0) {
+ strcat(my.envelope_to, "@");
+ strcat(my.envelope_to, config.c_fqdn);
+ }
+
CtdlFreeMessage(msg);
sieve2_setvalue_string(sieve2_context, "allheaders", my.rfc822headers);
}
+int serv_sieve_room(struct ctdlroom *room)
+{
+ if (!strcasecmp(&room->QRname[11], MAILROOM)) {
+ sieve_queue_room(room);
+ }
+ return 0;
+}
+#endif /* HAVE_LIBSIEVE */
-char *serv_sieve_init(void)
+CTDL_MODULE_INIT(sieve)
{
+
+#ifdef HAVE_LIBSIEVE
+
ctdl_sieve_init();
CtdlRegisterProtoHook(cmd_msiv, "MSIV", "Manage Sieve scripts");
- return "$Id: serv_sieve.c 3850 2005-09-13 14:00:24Z ajc $";
-}
+
+ CtdlRegisterRoomHook(serv_sieve_room);
+
+ CtdlRegisterSessionHook(perform_sieve_processing, EVT_HOUSE);
#else /* HAVE_LIBSIEVE */
-char *serv_sieve_init(void)
-{
lprintf(CTDL_INFO, "This server is missing libsieve. Mailbox filtering will be disabled.\n");
- return "$Id: serv_sieve.c 3850 2005-09-13 14:00:24Z ajc $";
-}
#endif /* HAVE_LIBSIEVE */
+
+ /* return our Subversion id for the Log */
+ return "$Id$";
+}
+