Hi!

I've been trying this to work too.

I don't want clean emails above some size to be archived.

Michael Scheidell's code is in 'before_send', but in that point the disk archive is already written...

The only way I got this sort of working wast to create a new custom hook just before the disk archive gets written to disk:

in method do_notify_and_quarantine (before line 15737):

(...)
    my($hdr_edits) = prepare_header_edits_for_quarantine($msginfo);

#patch2 begin
    my($conn) = $msginfo->conn_obj;
    my($custom_object) = Amavis::Custom->new($conn,$msginfo);
    if (ref $custom_object) {
      my($which_section) = "custom-before_clean_quarantine";
      eval {
@q_tuples= $custom_object->before_clean_quarantine($conn,$msginfo,\@q_tuples);
        do_log(0, "[SELECTIVE ARCHIVE]: '" . Dumper(@q_tuples) );
        update_current_log_level();  1;
      } or do {
        my $eval_stat = $@ ne '' ? $@ : "errno=$!";  chomp $eval_stat;
        do_log(-1,"custom before_clean_quarantine error: %s", $eval_stat);
      };
      section_time($which_section);
    }
#patch2 end
    if (@q_tuples) {

(...)

What i want to change is the @q_tuples, so there is no reference there to disk quarantine.

The plugin:

package Amavis::Custom;
#using amavisd-custom.conf;

use strict;
use Data::Dumper;
use DBI qw(:sql_types);
use DBD::mysql;
my $__archive_quarantine_in;
BEGIN {
  import Amavis::Conf qw(:platform :confvars c cr ca $myhostname
@lookup_sql_dsn
  $sa_mail_body_size_limit);
  import Amavis::Util qw(do_log untaint safe_encode safe_decode);
}

sub new {
 my($class,$conn,$msginfo,$q_tuples) = @_;
   my($self) = bless {}, $class;
   my($conn_h) = Amavis::Out::SQL::Connection->new(@lookup_sql_dsn);
   $self->{'conn_h'} = $conn_h;
   $self;  # returning an object activates further callbacks,
}

sub before_clean_quarantine{
    my($self,$conn,$msginfo,$q_tuples) = @_;
my($ll) = 0; # log level (0 is the most important level, 1, 2,... 5 less o)
    my($too_large) = $msginfo->msg_size > $sa_mail_body_size_limit;
    my($is_clean) = $msginfo->is_in_contents_category( CC_CLEAN );
    #$msginfo->is_in_contents_category(
# {CC_SPAMMY,1, CC_SPAM,1, CC_BANNED,1, CC_VIRUS,1} );

    do_log($ll, "[SELECTIVE ARCHIVE]: '" . $msginfo->mail_id ."'" );

my($filename) = "/var/virusmails/". substr($msginfo->mail_id,0,1)."/".$msginfo->mail_id.".gz";
    if (-e $filename) {
do_log($ll, "[SELECTIVE ARCHIVE]: file: '" . $filename ."' exists" );

    }else{
do_log($ll, "[SELECTIVE ARCHIVE]: file: '" . $filename ."' does not exist" );
    }

    #message test start here!
    if($is_clean){
        if ($too_large)
        {
do_log($ll, "[SELECTIVE ARCHIVE]: UNWANTED Clean message too big (" . $msginfo->msg_size . "k > ".($sa_mail_body_size_limit/1024)."k) ");
            @$q_tuples=[]
        }
        else
        {
            do_log($ll, "[SELECTIVE ARCHIVE]: ". Dumper($msginfo));
        }
do_log($ll, "[SELECTIVE ARCHIVE]: Small Clean message (" . $msginfo->msg_size . "k > ".($sa_mail_body_size_limit/1024)."k) OK");
    }
    else
    {
        do_log($ll, "[SELECTIVE ARCHIVE]: Message is not clean");
    }

    return @$q_tuples;



}

I don't know if "@$q_tuples=[]" is the best way of doing this, but it works.
There is one problem: "my($is_clean) = $msginfo->is_in_contents_category( CC_CLEAN );" Does not work, this instruction is always true even form spam messages... I suppose that in this spot in the code, that information is not available yet?

What is the best way of doing this?

Thank you!


On 07/20/2011 09:46 PM, Michael Scheidell wrote:
I have a need to selectively NOT archive clean emails under certain circumstances. we archive clean email on some servers, NOT because we want the emails, but because we want to feed VIRGIN emails back to SA for learning. (exchange mashes the emails and headers.. imap wasn't so bad, but ews really mucks them up)
HOWEVER, I do NOT want to archive CLEAN emails > 400K.
(I still want to archive large viruses, attachments, and spam)

I have (almost) got this down, but just need last step. sql queries work, I can calculate size, read values, just want to DISABLE archiving for LARGE clean emails (note: maybe I am doing it in the wrong place, maybe I need a per-user loop.. since one users clean is another users spam.. but then again, maybe the flags are set on is_in_contents_category just fine)


using amavisd-custom.conf

use strict;
use DBI qw(:sql_types);
use DBD::mysql;
my $__archive_quarantine_in;
BEGIN {
import Amavis::Conf qw(:platform :confvars c cr ca $myhostname $clean_quarantine_method @lookup_sql_dsn
  $sa_mail_body_size_limit);
  import Amavis::Util qw(do_log untaint safe_encode safe_decode);
}

sub new {
 my($class,$conn,$msginfo) = @_;
   my($self) = bless {}, $class;
   my($conn_h) = Amavis::Out::SQL::Connection->new(@lookup_sql_dsn);
   $self->{'conn_h'} = $conn_h;
   $self;  # returning an object activates further callbacks,
}

sub before_send {
    my($self,$conn,$msginfo) = @_;
my($ll) = 3; # log level (0 is the most important level, 1, 2,... 5 less so)
    my($too_large) = $msginfo->msg_size > $sa_mail_body_size_limit;
    my($already_quarantined) = $msginfo->is_in_contents_category(
                   {CC_SPAMMY,1, CC_SPAM,1, CC_BANNED,1, CC_VIRUS,1} );

    if ($too_large) {
      if(! $already_quarantined && $clean_quarantine_method =~ /sql:/) {
do_log(0, "CUSTOM: UNWANTED = $msg_size"."k > ".($sa_mail_body_size_limit/1024)."k");
         # I want to NOT archive if it hits here.
        }
}

--
Michael Scheidell, CTO
o: 561-999-5000
d: 561-948-2259
>*| *SECNAP Network Security Corporation

  * Best Mobile Solutions Product of 2011
  * Best Intrusion Prevention Product
  * Hot Company Finalist 2011
  * Best Email Security Product
  * Certified SNORT Integrator


------------------------------------------------------------------------

This email has been scanned and certified safe by SpammerTrap®.
For Information please see http://www.secnap.com/products/spammertrap/

------------------------------------------------------------------------


Reply via email to