[exim-cvs] cvs commit: exim/exim-src/exim_monitor em_globals…

Góra strony
Delete this message
Reply to this message
Autor: Tom Kistner
Data:  
Dla: exim-cvs
Temat: [exim-cvs] cvs commit: exim/exim-src/exim_monitor em_globals.c exim/exim-src/src EDITME config.h.defaults exim.c expand.c functions.h globals.c globals.h header.c local_scan.h macros.h readconf.c r
tom 2004/12/02 09:15:12 GMT

  Modified files:        (Branch: EXISCAN)
    exim-src/exim_monitor em_globals.c 
    exim-src/src         EDITME config.h.defaults exim.c expand.c 
                         functions.h globals.c globals.h header.c 
                         local_scan.h macros.h readconf.c 
                         receive.c smtp_in.c spool_in.c 
                         spool_out.c 
  Log:
  more W.I.P


  Revision  Changes    Path
  1.1.2.1   +9 -0      exim/exim-src/exim_monitor/em_globals.c
  1.4.2.2   +10 -0     exim/exim-src/src/EDITME
  1.2.2.2   +2 -2      exim/exim-src/src/config.h.defaults
  1.9.2.1   +3 -0      exim/exim-src/src/exim.c
  1.7.2.1   +37 -0     exim/exim-src/src/expand.c
  1.5.2.2   +6 -0      exim/exim-src/src/functions.h
  1.6.2.3   +8 -0      exim/exim-src/src/globals.c
  1.6.2.2   +8 -0      exim/exim-src/src/globals.h
  1.1.2.1   +13 -0     exim/exim-src/src/header.c
  1.1.2.1   +1 -0      exim/exim-src/src/local_scan.h
  1.2.2.3   +4 -3      exim/exim-src/src/macros.h
  1.2.2.1   +9 -0      exim/exim-src/src/readconf.c
  1.4.2.1   +171 -0    exim/exim-src/src/receive.c
  1.5.2.1   +11 -0     exim/exim-src/src/smtp_in.c
  1.1.2.1   +9 -0      exim/exim-src/src/spool_in.c
  1.1.2.1   +3 -0      exim/exim-src/src/spool_out.c


  Index: em_globals.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/exim_monitor/em_globals.c,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- em_globals.c    7 Oct 2004 10:39:01 -0000    1.1
  +++ em_globals.c    2 Dec 2004 09:15:11 -0000    1.1.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/exim_monitor/em_globals.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/exim_monitor/em_globals.c,v 1.1.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *                Exim Monitor                    *
  @@ -132,6 +132,10 @@
   BOOL    deliver_manual_thaw    = FALSE;
   BOOL    dont_deliver           = FALSE;


  +#ifdef WITH_CONTENT_SCAN
  +BOOL   fake_reject             = FALSE;
  +#endif
  +
   header_line *header_last       = NULL;
   header_line *header_list       = NULL;


  @@ -142,6 +146,11 @@
   BOOL    local_error_message    = FALSE;
   uschar *local_scan_data        = NULL;
   BOOL    log_timezone           = FALSE;
  +
  +#ifdef WITH_CONTENT_SCAN
  +uschar *spam_score_int         = NULL;
  +#endif
  +
   int     message_age            = 0;
   uschar *message_id;
   uschar *message_id_external;


  Index: EDITME
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/EDITME,v
  retrieving revision 1.4.2.1
  retrieving revision 1.4.2.2
  diff -u -r1.4.2.1 -r1.4.2.2
  --- EDITME    25 Nov 2004 15:33:54 -0000    1.4.2.1
  +++ EDITME    2 Dec 2004 09:15:11 -0000    1.4.2.2
  @@ -1,4 +1,4 @@
  -# $Cambridge: exim/exim-src/src/EDITME,v 1.4.2.1 2004/11/25 15:33:54 tom Exp $
  +# $Cambridge: exim/exim-src/src/EDITME,v 1.4.2.2 2004/12/02 09:15:11 tom Exp $


   ##################################################
   #          The Exim mail transport agent         #
  @@ -322,6 +322,16 @@
   # features.


#WITH_CONTENT_SCAN=yes
+
+# If you want to use the deprecated "demime" condition in the DATA ACL,
+# uncomment the line below. Doing so will also explicitly turn on the
+# WITH_CONTENT_SCAN option. If possible, use the MIME ACL instead of
+# the "demime" condition.
+
+#WITH_OLD_DEMIME=yes
+
+
+

   ###############################################################################
   #                 THESE ARE THINGS YOU MIGHT WANT TO SPECIFY                  #


  Index: config.h.defaults
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/config.h.defaults,v
  retrieving revision 1.2.2.1
  retrieving revision 1.2.2.2
  diff -u -r1.2.2.1 -r1.2.2.2
  --- config.h.defaults    30 Nov 2004 15:18:58 -0000    1.2.2.1
  +++ config.h.defaults    2 Dec 2004 09:15:11 -0000    1.2.2.2
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/config.h.defaults,v 1.2.2.1 2004/11/30 15:18:58 tom Exp $ */
  +/* $Cambridge: exim/exim-src/src/config.h.defaults,v 1.2.2.2 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -53,7 +53,7 @@
   #define HAVE_CRYPT16
   #define HAVE_SA_LEN
   #define HEADERS_CHARSET           "ISO-8859-1"
  -#define HEADER_ADD_BUFFER_SIZE     8192
  +#define HEADER_ADD_BUFFER_SIZE    (8192 * 4)
   #define HEADER_MAXSIZE            (1024*1024)


   #define INPUT_DIRECTORY_MODE       0750
  @@ -107,7 +107,7 @@
   #define SPOOL_DIRECTORY
   #define SPOOL_DIRECTORY_MODE       0750
   #define SPOOL_MODE                 0640
  -#define STRING_SPRINTF_BUFFER_SIZE 8192
  +#define STRING_SPRINTF_BUFFER_SIZE (8192 * 4)


#define SUPPORT_A6
#define SUPPORT_CRYPTEQ

  Index: exim.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/exim.c,v
  retrieving revision 1.9
  retrieving revision 1.9.2.1
  diff -u -r1.9 -r1.9.2.1
  --- exim.c    18 Nov 2004 11:17:33 -0000    1.9
  +++ exim.c    2 Dec 2004 09:15:11 -0000    1.9.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/exim.c,v 1.9 2004/11/18 11:17:33 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/exim.c,v 1.9.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -838,6 +838,9 @@
     #else
     fprintf(f, " OpenSSL");
     #endif
  +#endif
  +#ifdef WITH_CONTENT_SCAN
  +  fprintf(f, " Content_Scanning");
   #endif
   fprintf(f, "\n");



  Index: expand.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/expand.c,v
  retrieving revision 1.7
  retrieving revision 1.7.2.1
  diff -u -r1.7 -r1.7.2.1
  --- expand.c    18 Nov 2004 11:17:33 -0000    1.7
  +++ expand.c    2 Dec 2004 09:15:11 -0000    1.7.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/expand.c,v 1.7 2004/11/18 11:17:33 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/expand.c,v 1.7.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -326,6 +326,10 @@
     { "caller_uid",          vtype_uid,         &real_uid },
     { "compile_date",        vtype_stringptr,   &version_date },
     { "compile_number",      vtype_stringptr,   &version_cnumber },
  +#ifdef WITH_OLD_DEMIME
  +  { "demime_errorlevel",   vtype_int,         &demime_errorlevel },
  +  { "demime_reason",       vtype_stringptr,   &demime_reason },
  +#endif
     { "dnslist_domain",      vtype_stringptr,   &dnslist_domain },
     { "dnslist_text",        vtype_stringptr,   &dnslist_text },
     { "dnslist_value",       vtype_stringptr,   &dnslist_value },
  @@ -334,6 +338,9 @@
     { "exim_gid",            vtype_gid,         &exim_gid },
     { "exim_path",           vtype_stringptr,   &exim_path },
     { "exim_uid",            vtype_uid,         &exim_uid },
  +#ifdef WITH_OLD_DEMIME
  +  { "found_extension",     vtype_stringptr,   &found_extension },
  +#endif 
     { "home",                vtype_stringptr,   &deliver_home },
     { "host",                vtype_stringptr,   &deliver_host },
     { "host_address",        vtype_stringptr,   &deliver_host_address },
  @@ -357,6 +364,9 @@
     { "log_inodes",          vtype_pinodes,     (void *)FALSE },
     { "log_space",           vtype_pspace,      (void *)FALSE },  
     { "mailstore_basename",  vtype_stringptr,   &mailstore_basename },
  +#ifdef WITH_CONTENT_SCAN
  +  { "malware_name",        vtype_stringptr,   &malware_name },
  +#endif
     { "message_age",         vtype_int,         &message_age },
     { "message_body",        vtype_msgbody,     &message_body },
     { "message_body_end",    vtype_msgbody_end, &message_body_end },
  @@ -364,6 +374,24 @@
     { "message_headers",     vtype_msgheaders,  NULL },
     { "message_id",          vtype_stringptr,   &message_id },
     { "message_size",        vtype_int,         &message_size },
  +#ifdef WITH_CONTENT_SCAN
  +  { "mime_anomaly_level",  vtype_int,         &mime_anomaly_level },
  +  { "mime_anomaly_text",   vtype_stringptr,   &mime_anomaly_text },
  +  { "mime_boundary",       vtype_stringptr,   &mime_boundary },
  +  { "mime_charset",        vtype_stringptr,   &mime_charset },
  +  { "mime_content_description", vtype_stringptr, &mime_content_description },
  +  { "mime_content_disposition", vtype_stringptr, &mime_content_disposition },
  +  { "mime_content_id",     vtype_stringptr,   &mime_content_id },
  +  { "mime_content_size",   vtype_int,         &mime_content_size },
  +  { "mime_content_transfer_encoding",vtype_stringptr, &mime_content_transfer_encoding },
  +  { "mime_content_type",   vtype_stringptr,   &mime_content_type },
  +  { "mime_decoded_filename", vtype_stringptr, &mime_decoded_filename },
  +  { "mime_filename",       vtype_stringptr,   &mime_filename },
  +  { "mime_is_coverletter", vtype_int,         &mime_is_coverletter },
  +  { "mime_is_multipart",   vtype_int,         &mime_is_multipart },
  +  { "mime_is_rfc822",      vtype_int,         &mime_is_rfc822 },
  +  { "mime_part_count",     vtype_int,         &mime_part_count },
  +#endif
     { "n0",                  vtype_filter_int,  &filter_n[0] },
     { "n1",                  vtype_filter_int,  &filter_n[1] },
     { "n2",                  vtype_filter_int,  &filter_n[2] },
  @@ -394,6 +422,9 @@
     { "recipient_verify_failure",vtype_stringptr,&recipient_verify_failure }, 
     { "recipients",          vtype_recipients,  NULL },
     { "recipients_count",    vtype_int,         &recipients_count },
  +#ifdef WITH_CONTENT_SCAN
  +  { "regex_match_string",  vtype_stringptr,   &regex_match_string },
  +#endif
     { "reply_address",       vtype_reply,       NULL },
     { "return_path",         vtype_stringptr,   &return_path },
     { "return_size_limit",   vtype_int,         &bounce_return_size_limit },
  @@ -424,6 +455,12 @@
     { "sn7",                 vtype_filter_int,  &filter_sn[7] },
     { "sn8",                 vtype_filter_int,  &filter_sn[8] },
     { "sn9",                 vtype_filter_int,  &filter_sn[9] },
  +#ifdef WITH_CONTENT_SCAN
  +  { "spam_bar",            vtype_stringptr,   &spam_bar },
  +  { "spam_report",         vtype_stringptr,   &spam_report },
  +  { "spam_score",          vtype_stringptr,   &spam_score },
  +  { "spam_score_int",      vtype_stringptr,   &spam_score_int },
  +#endif
     { "spool_directory",     vtype_stringptr,   &spool_directory },
     { "spool_inodes",        vtype_pinodes,     (void *)TRUE },
     { "spool_space",         vtype_pspace,      (void *)TRUE },  


  Index: functions.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/functions.h,v
  retrieving revision 1.5.2.1
  retrieving revision 1.5.2.2
  diff -u -r1.5.2.1 -r1.5.2.2
  --- functions.h    30 Nov 2004 15:18:58 -0000    1.5.2.1
  +++ functions.h    2 Dec 2004 09:15:11 -0000    1.5.2.2
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/functions.h,v 1.5.2.1 2004/11/30 15:18:58 tom Exp $ */
  +/* $Cambridge: exim/exim-src/src/functions.h,v 1.5.2.2 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -68,6 +68,9 @@
   extern void    deliver_set_expansions(address_item *);
   extern int     deliver_split_address(address_item *);
   extern void    deliver_succeeded(address_item *);
  +#ifdef WITH_OLD_DEMIME
  +extern int     demime(uschar **);
  +#endif
   extern BOOL    directory_make(uschar *, uschar *, int, BOOL);
   extern dns_address *dns_address_from_rr(dns_answer *, dns_record *);
   extern void    dns_build_reverse(uschar *, uschar *);
  @@ -173,6 +176,9 @@
   extern void    queue_run(uschar *, uschar *, BOOL);


   extern int     random_number(int);
  +#ifdef WITH_CONTENT_SCAN
  +extern int     recv_line(int, uschar *, int);
  +#endif
   extern int     rda_interpret(redirect_block *, int, uschar *, uschar *, ugid_block *,
                    address_item **, uschar **, error_block **, int *, uschar *);
   extern int     rda_is_filter(const uschar *);


  Index: globals.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/globals.c,v
  retrieving revision 1.6.2.2
  retrieving revision 1.6.2.3
  diff -u -r1.6.2.2 -r1.6.2.3
  --- globals.c    26 Nov 2004 16:04:26 -0000    1.6.2.2
  +++ globals.c    2 Dec 2004 09:15:11 -0000    1.6.2.3
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/globals.c,v 1.6.2.2 2004/11/26 16:04:26 tom Exp $ */
  +/* $Cambridge: exim/exim-src/src/globals.c,v 1.6.2.3 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -447,6 +447,11 @@
   BOOL    deliver_selectstring_regex = FALSE;
   uschar *deliver_selectstring_sender = NULL;
   BOOL    deliver_selectstring_sender_regex = FALSE;
  +#ifdef WITH_OLD_DEMIME
  +int     demime_errorlevel      = 0;
  +int     demime_ok              = 0;
  +uschar *demime_reason          = NULL;
  +#endif
   BOOL    disable_logging        = FALSE;


   uschar *dns_again_means_nonexist = NULL;
  @@ -494,6 +499,9 @@
   uschar *filter_test            = NULL;
   uschar *filter_thisaddress     = NULL;
   int     finduser_retries       = 0;
  +#ifdef WITH_OLD_DEMIME
  +uschar *found_extension        = NULL;
  +#endif
   uid_t   fixed_never_users[]    = { FIXED_NEVER_USERS };
   uschar *freeze_tell            = NULL;
   uschar *fudged_queue_times     = US"";


  Index: globals.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/globals.h,v
  retrieving revision 1.6.2.1
  retrieving revision 1.6.2.2
  diff -u -r1.6.2.1 -r1.6.2.2
  --- globals.h    26 Nov 2004 16:04:26 -0000    1.6.2.1
  +++ globals.h    2 Dec 2004 09:15:11 -0000    1.6.2.2
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/globals.h,v 1.6.2.1 2004/11/26 16:04:26 tom Exp $ */
  +/* $Cambridge: exim/exim-src/src/globals.h,v 1.6.2.2 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -241,6 +241,11 @@
   extern BOOL    deliver_selectstring_regex; /* String is regex */
   extern uschar *deliver_selectstring_sender; /* For selecting by sender */
   extern BOOL    deliver_selectstring_sender_regex; /* String is regex */
  +#ifdef WITH_OLD_DEMIME
  +extern int     demime_errorlevel;      /* Severity of MIME error */
  +extern int     demime_ok;              /* Nonzero if message has been demimed */
  +extern uschar *demime_reason;          /* Reason for broken MIME container */
  +#endif
   extern BOOL    disable_logging;        /* Disables log writing when TRUE */


   extern uschar *dns_again_means_nonexist; /* Domains that are badly set up */
  @@ -288,6 +293,9 @@
   extern uschar *filter_thisaddress;     /* For address looping */
   extern int     finduser_retries;       /* Retry count for getpwnam() */
   extern uid_t   fixed_never_users[];    /* Can't be overridden */
  +#ifdef WITH_OLD_DEMIME
  +extern uschar *found_extension;        /* demime acl condition: file extension found */
  +#endif
   extern uschar *freeze_tell;            /* Message on (some) freezings */
   extern uschar *fudged_queue_times;     /* For use in test harness */



  Index: header.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/header.c,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- header.c    7 Oct 2004 10:39:01 -0000    1.1
  +++ header.c    2 Dec 2004 09:15:11 -0000    1.1.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/header.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/header.c,v 1.1.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -40,6 +40,19 @@
   return *tt == ':';
   }


+/* This is a copy of the function above, only that it is possible to pass
+ only the beginning of a header name. It simply does a front-anchored
+ substring match. Arguments and Return codes are the same as for
+ header_testname() above. */
+
+BOOL
+header_testname_incomplete(header_line *h, uschar *name, int len, BOOL notdel)
+{
+uschar *tt;
+if (h->type == '*' && notdel) return FALSE;
+if (h->text == NULL || strncmpic(h->text, name, len) != 0) return FALSE;
+return TRUE;
+}


/*************************************************

  Index: local_scan.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/local_scan.h,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- local_scan.h    7 Oct 2004 10:39:01 -0000    1.1
  +++ local_scan.h    2 Dec 2004 09:15:11 -0000    1.1.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/local_scan.h,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/local_scan.h,v 1.1.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -147,6 +147,7 @@
   extern void    header_add_at_position(BOOL, uschar *, BOOL, int, char *, ...);
   extern void    header_remove(int, uschar *);
   extern BOOL    header_testname(header_line *, uschar *, int, BOOL);
  +extern BOOL    header_testname_incomplete(header_line *, uschar *, int, BOOL);
   extern void    log_write(unsigned int, int, char *format, ...);
   extern int     lss_b64decode(uschar *, uschar **);
   extern uschar *lss_b64encode(uschar *, int);


  Index: macros.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/macros.h,v
  retrieving revision 1.2.2.2
  retrieving revision 1.2.2.3
  diff -u -r1.2.2.2 -r1.2.2.3
  --- macros.h    30 Nov 2004 15:18:58 -0000    1.2.2.2
  +++ macros.h    2 Dec 2004 09:15:11 -0000    1.2.2.3
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/macros.h,v 1.2.2.2 2004/11/30 15:18:58 tom Exp $ */
  +/* $Cambridge: exim/exim-src/src/macros.h,v 1.2.2.3 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -131,12 +131,12 @@
   into big_buffer_size and in some circumstances increased. It should be at least
   as long as the maximum path length. */


-#if defined PATH_MAX && PATH_MAX > 1024
+#if defined PATH_MAX && PATH_MAX > 16384
#define BIG_BUFFER_SIZE PATH_MAX
-#elif defined MAXPATHLEN && MAXPATHLEN > 1024
+#elif defined MAXPATHLEN && MAXPATHLEN > 16384
#define BIG_BUFFER_SIZE MAXPATHLEN
#else
-#define BIG_BUFFER_SIZE 1024
+#define BIG_BUFFER_SIZE 16384
#endif

   /* This limits the length of data returned by local_scan(). Because it is
  @@ -545,6 +545,7 @@
   #define htype_add_top       'a'
   #define htype_add_rec       'r'
   #define htype_add_bot       'z'
  +#define htype_add_rfc       'f'


/* Types of item in options lists. These are the bottom 8 bits of the "type"
field, which is an int. The opt_void value is used for entries in tables that

  Index: readconf.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/readconf.c,v
  retrieving revision 1.2
  retrieving revision 1.2.2.1
  diff -u -r1.2 -r1.2.2.1
  --- readconf.c    18 Oct 2004 09:16:57 -0000    1.2
  +++ readconf.c    2 Dec 2004 09:15:11 -0000    1.2.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/readconf.c,v 1.2 2004/10/18 09:16:57 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/readconf.c,v 1.2.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -143,6 +143,9 @@
     { "acl_smtp_helo",            opt_stringptr,   &acl_smtp_helo },
     { "acl_smtp_mail",            opt_stringptr,   &acl_smtp_mail },
     { "acl_smtp_mailauth",        opt_stringptr,   &acl_smtp_mailauth },
  +#ifdef WITH_CONTENT_SCAN
  +  { "acl_smtp_mime",            opt_stringptr,   &acl_smtp_mime },
  +#endif
     { "acl_smtp_predata",         opt_stringptr,   &acl_smtp_predata },
     { "acl_smtp_quit",            opt_stringptr,   &acl_smtp_quit },
     { "acl_smtp_rcpt",            opt_stringptr,   &acl_smtp_rcpt },
  @@ -156,6 +159,9 @@
     { "allow_utf8_domains",       opt_bool,        &allow_utf8_domains },
     { "auth_advertise_hosts",     opt_stringptr,   &auth_advertise_hosts },
     { "auto_thaw",                opt_time,        &auto_thaw },
  +#ifdef WITH_CONTENT_SCAN
  +  { "av_scanner",               opt_stringptr,   &av_scanner },
  +#endif
     { "bi_command",               opt_stringptr,   &bi_command },
     { "bounce_message_file",      opt_stringptr,   &bounce_message_file },
     { "bounce_message_text",      opt_stringptr,   &bounce_message_text },
  @@ -318,6 +324,9 @@
     { "smtp_receive_timeout",     opt_time,        &smtp_receive_timeout },
     { "smtp_reserve_hosts",       opt_stringptr,   &smtp_reserve_hosts },
     { "smtp_return_error_details",opt_bool,        &smtp_return_error_details },
  +#ifdef WITH_CONTENT_SCAN
  +  { "spamd_address",            opt_stringptr,   &spamd_address },
  +#endif
     { "split_spool_directory",    opt_bool,        &split_spool_directory },
     { "spool_directory",          opt_stringptr,   &spool_directory },
     { "strip_excess_angle_brackets", opt_bool,     &strip_excess_angle_brackets },


  Index: receive.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/receive.c,v
  retrieving revision 1.4
  retrieving revision 1.4.2.1
  diff -u -r1.4 -r1.4.2.1
  --- receive.c    17 Nov 2004 14:32:25 -0000    1.4
  +++ receive.c    2 Dec 2004 09:15:11 -0000    1.4.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/receive.c,v 1.4 2004/11/17 14:32:25 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/receive.c,v 1.4.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -918,6 +918,21 @@
       DEBUG(D_receive|D_acl) debug_printf("  (after Received:)");
       break;


  +    case htype_add_rfc:
  +    /* add header before any header which is NOT Received: or Resent- */
  +    last_received = header_list;
  +    while ( (last_received->next != NULL) &&
  +            ( (header_testname(last_received->next, US"Received", 8, FALSE)) ||
  +              (header_testname_incomplete(last_received->next, US"Resent-", 7, FALSE)) ) )
  +              last_received = last_received->next;
  +    /* last_received now points to the last Received: or Resent-* header
  +       in an uninterrupted chain of those header types (seen from the beginning
  +       of all headers. Our current header must follow it. */
  +    h->next = last_received->next;
  +    last_received->next = h;
  +    DEBUG(D_receive|D_acl) debug_printf("  (before any non-Received: or Resent-*: header)");        
  +    break;
  +
       default:
       h->next = NULL;
       header_last->next = h;
  @@ -2716,6 +2731,130 @@


     if (smtp_input && !smtp_batched_input)
       {
  +
  +#ifdef WITH_CONTENT_SCAN
  +     /* MIME ACL hook */
  +    if (acl_smtp_mime != NULL && recipients_count > 0)
  +      {
  +      FILE *mbox_file;
  +      uschar rfc822_file_path[2048];
  +      unsigned long long mbox_size;
  +      header_line *my_headerlist;
  +      uschar *user_msg, *log_msg;
  +      int mime_part_count_buffer = -1;
  +      
  +      memset(CS rfc822_file_path,0,2048);
  +      
  +      /* check if it is a MIME message */
  +      my_headerlist = header_list;
  +      while (my_headerlist != NULL) {
  +        /* skip deleted headers */
  +        if (my_headerlist->type == '*') {
  +          my_headerlist = my_headerlist->next;
  +          continue;
  +        };
  +        if (strncmpic(my_headerlist->text, US"Content-Type:", 13) == 0) {
  +          DEBUG(D_receive) debug_printf("Found Content-Type: header - executing acl_smtp_mime.\n");
  +          goto DO_MIME_ACL;
  +        };
  +        my_headerlist = my_headerlist->next;
  +      };
  +      
  +      DEBUG(D_receive) debug_printf("No Content-Type: header - presumably not a MIME message.\n");
  +      goto NO_MIME_ACL;
  +      
  +      DO_MIME_ACL:
  +      /* make sure the eml mbox file is spooled up */
  +      mbox_file = spool_mbox(&mbox_size);
  +      if (mbox_file == NULL) {
  +        /* error while spooling */
  +        log_write(0, LOG_MAIN|LOG_PANIC,
  +               "acl_smtp_mime: error while creating mbox spool file, message temporarily rejected.");
  +        Uunlink(spool_name);
  +        unspool_mbox(); 
  +        smtp_respond(451, TRUE, US"temporary local problem");
  +        message_id[0] = 0;            /* Indicate no message accepted */
  +        smtp_reply = US"";            /* Indicate reply already sent */
  +        goto TIDYUP;                  /* Skip to end of function */
  +      };
  +      
  +      mime_is_rfc822 = 0;
  +
  +      MIME_ACL_CHECK:
  +      mime_part_count = -1;
  +      rc = mime_acl_check(mbox_file, NULL, &user_msg, &log_msg);
  +      fclose(mbox_file);
  +      
  +      if (Ustrlen(rfc822_file_path) > 0) {
  +        mime_part_count = mime_part_count_buffer;
  +        
  +        if (unlink(CS rfc822_file_path) == -1) {
  +          log_write(0, LOG_PANIC,
  +               "acl_smtp_mime: can't unlink RFC822 spool file, skipping.");
  +            goto END_MIME_ACL;
  +        };
  +      };
  +      
  +      /* check if we must check any message/rfc822 attachments */
  +      if (rc == OK) {
  +        uschar temp_path[1024];
  +        int n;
  +        struct dirent *entry;
  +        DIR *tempdir;
  + 
  +        snprintf(CS temp_path, 1024, "%s/scan/%s", spool_directory, message_id);
  +
  +       tempdir = opendir(CS temp_path);
  +       n = 0;
  +       do {
  +         entry = readdir(tempdir);
  +         if (entry == NULL) break;
  +          if (strncmpic(US entry->d_name,US"__rfc822_",9) == 0) {
  +            snprintf(CS rfc822_file_path, 2048,"%s/scan/%s/%s", spool_directory, message_id, entry->d_name);
  +           debug_printf("RFC822 attachment detected: running MIME ACL for '%s'\n", rfc822_file_path);
  +           break;
  +          }; 
  +       } while (1);
  +       closedir(tempdir);
  +        
  +        if (entry != NULL) {
  +          mbox_file = Ufopen(rfc822_file_path,"r");
  +          if (mbox_file == NULL) {
  +            log_write(0, LOG_PANIC,
  +               "acl_smtp_mime: can't open RFC822 spool file, skipping.");
  +            unlink(CS rfc822_file_path);
  +            goto END_MIME_ACL;
  +          };
  +          /* set RFC822 expansion variable */
  +          mime_is_rfc822 = 1;
  +          mime_part_count_buffer = mime_part_count;
  +          goto MIME_ACL_CHECK;
  +        };
  +      };
  +      
  +      END_MIME_ACL:
  +      add_acl_headers(US"MIME");
  +      if (rc == DISCARD)      
  +        {
  +        recipients_count = 0;
  +        blackholed_by = US"MIME ACL";
  +        }
  +      else if (rc != OK)
  +        {
  +        Uunlink(spool_name);
  +        unspool_mbox();
  +        if (smtp_handle_acl_fail(ACL_WHERE_MIME, rc, user_msg, log_msg) != 0)
  +          smtp_yield = FALSE;    /* No more messsages after dropped connection */
  +        smtp_reply = US"";       /* Indicate reply already sent */
  +        message_id[0] = 0;       /* Indicate no message accepted */
  +        goto TIDYUP;             /* Skip to end of function */
  +        }; 
  +      }
  + 
  +    NO_MIME_ACL:      
  +#endif /* WITH_CONTENT_SCAN */
  +
  +
       if (acl_smtp_data != NULL && recipients_count > 0)
         {
         uschar *user_msg, *log_msg;
  @@ -2729,6 +2868,9 @@
         else if (rc != OK)
           {
           Uunlink(spool_name);
  +#ifdef WITH_CONTENT_SCAN
  +        unspool_mbox();
  +#endif
           if (smtp_handle_acl_fail(ACL_WHERE_DATA, rc, user_msg, log_msg) != 0)
             smtp_yield = FALSE;    /* No more messsages after dropped connection */
           smtp_reply = US"";       /* Indicate reply already sent */
  @@ -2779,6 +2921,10 @@
     enable_dollar_recipients = FALSE;
     }


  +#ifdef WITH_CONTENT_SCAN
  +unspool_mbox();
  +#endif
  +
   /* The final check on the message is to run the scan_local() function. The
   version supplied with Exim always accepts, but this is a hook for sysadmins to
   supply their own checking code. The local_scan() function is run even when all
  @@ -3235,12 +3381,37 @@
       {
       if (smtp_reply == NULL)
         {
  +#ifndef WITH_CONTENT_SCAN
         smtp_printf("250 OK id=%s\r\n", message_id);
  +#elif      
  +        if (fake_reject)
  +          {
  +            smtp_printf("550-FAKE_REJECT id=%s\r\n", message_id);
  +            smtp_printf("550-Your message has been rejected but is being kept for evaluation.\r\n");
  +            smtp_printf("550 If it was a legit message, it may still be delivered to the target recipient(s).\r\n");
  +          }
  +        else  
  +          smtp_printf("250 OK id=%s\r\n", message_id);      
  +#endif     
         if (host_checking)
           fprintf(stdout,
             "\n**** SMTP testing: that is not a real message id!\n\n");
         }
  +#ifndef WITH_CONTENT_SCAN
       else if (smtp_reply[0] != 0) smtp_printf("%.1024s\r\n", smtp_reply);
  +#elif
  +    else if (smtp_reply[0] != 0)
  +      {
  +        if (fake_reject && (smtp_reply[0] == '2'))
  +        {
  +          smtp_printf("550-FAKE_REJECT id=%s\r\n", message_id);
  +          smtp_printf("550-Your message has been rejected but is being kept for evaluation.\r\n");
  +          smtp_printf("550 If it was a legit message, it may still be delivered to the target recipient(s).\r\n");
  +        }
  +        else 
  +          smtp_printf("%.1024s\r\n", smtp_reply);
  +      };
  +#endif
       }


     /* For batched SMTP, generate an error message on failure, and do


  Index: smtp_in.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/smtp_in.c,v
  retrieving revision 1.5
  retrieving revision 1.5.2.1
  diff -u -r1.5 -r1.5.2.1
  --- smtp_in.c    10 Nov 2004 15:21:16 -0000    1.5
  +++ smtp_in.c    2 Dec 2004 09:15:11 -0000    1.5.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/smtp_in.c,v 1.5 2004/11/10 15:21:16 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/smtp_in.c,v 1.5.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -805,6 +805,10 @@
   acl_warn_headers = NULL;
   queue_only_policy = FALSE;
   deliver_freeze = FALSE;                              /* Can be set by ACL */
  +#ifdef WITH_CONTENT_SCAN
  +fake_reject = FALSE;                                 /* Can be set by ACL */
  +no_mbox_unspool = FALSE;                             /* Can be set by ACL */
  +#endif
   submission_mode = FALSE;                             /* Can be set by ACL */
   active_local_from_check = local_from_check;          /* Can be set by ACL */
   active_local_sender_retain = local_sender_retain;    /* Can be set by ACL */
  @@ -1774,6 +1778,9 @@
   uschar *lognl;
   uschar *sender_info = US"";
   uschar *what = (where == ACL_WHERE_PREDATA)? US"DATA" :
  +#ifdef WITH_CONTENT_SCAN
  +               (where == ACL_WHERE_MIME)? US"during MIME ACL checks" :
  +#endif  
                  (where == ACL_WHERE_DATA)? US"after DATA" :
     string_sprintf("%s %s", acl_wherenames[where], smtp_data);


@@ -1785,7 +1792,11 @@
this is what should be logged, so I've changed to logging the unrewritten
address to retain backward compatibility. */

  +#ifndef WITH_CONTENT_SCAN
   if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA)
  +#elif
  +if (where == ACL_WHERE_RCPT || where == ACL_WHERE_DATA || where == ACL_WHERE_MIME)
  +#endif
     {
     sender_info = string_sprintf("F=<%s> ", (sender_address_unrewritten != NULL)?
       sender_address_unrewritten : sender_address);


  Index: spool_in.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/spool_in.c,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- spool_in.c    7 Oct 2004 10:39:01 -0000    1.1
  +++ spool_in.c    2 Dec 2004 09:15:11 -0000    1.1.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/spool_in.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/spool_in.c,v 1.1.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -277,6 +277,11 @@
   tls_peerdn = NULL;
   #endif


  +#ifdef WITH_CONTENT_SCAN
  +fake_reject = FALSE;
  +spam_score_int = NULL;
  +#endif
  +
   /* Generate the full name and open the file. If message_subdir is already
   set, just look in the given directory. Otherwise, look in both the split
   and unsplit directories, as for the data file above. */
  @@ -369,6 +374,10 @@
       local_error_message = TRUE;
     else if (Ustrncmp(big_buffer, "-local_scan ", 12) == 0)
       local_scan_data = string_copy(big_buffer + 12);
  +#ifdef WITH_CONTENT_SCAN    
  +  else if (Ustrncmp(big_buffer, "-spam_score_int ", 16) == 0)
  +    spam_score_int = string_copy(big_buffer + 16);  
  +#endif    
     else if (Ustrcmp(big_buffer, "-host_lookup_failed") == 0)
       host_lookup_failed = TRUE;
     else if (Ustrncmp(big_buffer, "-body_linecount", 15) == 0)


  Index: spool_out.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/spool_out.c,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- spool_out.c    7 Oct 2004 10:39:01 -0000    1.1
  +++ spool_out.c    2 Dec 2004 09:15:11 -0000    1.1.2.1
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/spool_out.c,v 1.1 2004/10/07 10:39:01 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/spool_out.c,v 1.1.2.1 2004/12/02 09:15:11 tom Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -216,6 +216,9 @@
   if (sender_local) fprintf(f, "-local\n");
   if (local_error_message) fprintf(f, "-localerror\n");
   if (local_scan_data != NULL) fprintf(f, "-local_scan %s\n", local_scan_data);
  +#ifdef WITH_CONTENT_SCAN
  +if (spam_score_int != NULL) fprintf(f,"-spam_score_int %s\n", spam_score_int);
  +#endif
   if (deliver_manual_thaw) fprintf(f, "-manual_thaw\n");
   if (sender_set_untrusted) fprintf(f, "-sender_set_untrusted\n");