- }
-
- my.keep = 0; /* Set to 1 to declare an *explicit* keep */
- my.cancel_implicit_keep = 0; /* Some actions will cancel the implicit keep */
- my.usernum = atol(CC->room.QRname); /* Keep track of the owner of the room's namespace */
- my.msgnum = msgnum; /* Keep track of the message number in our local store */
- my.u = u; /* Hand off a pointer to the rest of this info */
-
- /* Keep track of the recipient so we can do handling based on it later */
- process_rfc822_addr(msg->cm_fields[eRecipient], my.recp_user, my.recp_node, my.recp_name);
-
- /* Keep track of the sender so we can use it for REJECT and VACATION responses */
- if (!CM_IsEmpty(msg, erFc822Addr)) {
- safestrncpy(my.sender, msg->cm_fields[erFc822Addr], sizeof my.sender);
- }
- else if (!CM_IsEmpty(msg, eAuthor)) {
- safestrncpy(my.sender, msg->cm_fields[eAuthor], sizeof my.sender);
- }
- else {
- strcpy(my.sender, "");
- }
-
- /* Keep track of the subject so we can use it for VACATION responses */
- if (!CM_IsEmpty(msg, eMsgSubject)) {
- safestrncpy(my.subject, msg->cm_fields[eMsgSubject], sizeof my.subject);
- }
- else {
- strcpy(my.subject, "");
- }
-
- /* Keep track of the envelope-from address (use body-from if not found) */
- if (!CM_IsEmpty(msg, eMessagePath)) {
- safestrncpy(my.envelope_from, msg->cm_fields[eMessagePath], sizeof my.envelope_from);
- stripallbut(my.envelope_from, '<', '>');
- }
- else if (!CM_IsEmpty(msg, erFc822Addr)) {
- safestrncpy(my.envelope_from, msg->cm_fields[erFc822Addr], sizeof my.envelope_from);
- stripallbut(my.envelope_from, '<', '>');
- }
- else {
- strcpy(my.envelope_from, "");
- }
-
- 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, CtdlGetConfigStr("c_fqdn"));
- }
-
- /* Keep track of the envelope-to address (use body-to if not found) */
- if (!CM_IsEmpty(msg, eenVelopeTo)) {
- safestrncpy(my.envelope_to, msg->cm_fields[eenVelopeTo], sizeof my.envelope_to);
- stripallbut(my.envelope_to, '<', '>');
- }
- else if (!CM_IsEmpty(msg, eRecipient)) {
- safestrncpy(my.envelope_to, msg->cm_fields[eRecipient], sizeof my.envelope_to);
- stripallbut(my.envelope_to, '<', '>');
- }
- 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, CtdlGetConfigStr("c_fqdn"));
- }
-
- CM_Free(msg);
-
- syslog(LOG_DEBUG, "Calling sieve2_execute()");
- res = sieve2_execute(sieve2_context, &my);
- if (res != SIEVE2_OK) {
- syslog(LOG_ERR, "sieve2_execute() returned %d: %s", res, sieve2_errstr(res));
- }
-
- free(my.rfc822headers);
- my.rfc822headers = NULL;
-
- /*
- * Delete the message from the inbox unless either we were told not to, or
- * if no other action was successfully taken.
- */
- if ( (!my.keep) && (my.cancel_implicit_keep) ) {
- syslog(LOG_DEBUG, "keep is 0 -- deleting message from inbox");
- CtdlDeleteMessages(CC->room.QRname, &msgnum, 1, "");
- }
-
- syslog(LOG_DEBUG, "Completed sieve processing on msg <%ld>", msgnum);
- u->lastproc = msgnum;
-
- return;
-}
-