use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
$AddWarningsInline = 1;
$Stupidity{"NoMultipleInlines"} = 1;
#***********************************************************************
# %PROCEDURE: custom_list_replacement_urls
# %ARGUMENTS:
# entity
# %RETURNS:
# nothing
# %DESCRIPTION:
# Lists replacement URLs at end of body message for all removed attachments.
# Must be called from filter_end.
#***********************************************************************
sub custom_list_replacement_urls ($;$$) {
my($entity, $header, $footer) = @_;
my $plain = $header.join("\n", @attachURLlist).$footer;
my $html = $plain;
$html =~ s|(http://\S*)|$1|g;
$html =~ s/\n/
\n/g;
append_text_boilerplate($entity, $plain, 0);
append_html_boilerplate($entity, $html, 0);
}
#***********************************************************************
# %PROCEDURE: filter
#***********************************************************************
sub filter {
my($entity, $fname, $ext, $type) = @_;
return if message_rejected(); # Avoid unnecessary work
(...)
# Some senders do not get their mail filtered
if ( ($ext ne '') && ($Sender ne '') && ($Sender ne '') ) {
# If it's not a compressed file then zip it
my($comp_exts, $re);
$comp_exts = '(zip|gz|tgz|bz2|Z|\{[^\}]+\})';
$re = '\.' . $comp_exts . '\.*$';
my $zipped;
if (!re_match($entity, $re)) {
md_graphdefang_log('mail', 'CUSTOM_COMPRESS', $fname);
my $zip = Archive::Zip->new();
my $member;
$member = $zip->addFile($entity->bodyhandle->path, $fname);
# compress (DEFLATED) or not (STORED)
$member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$member->desiredCompressionLevel( COMPRESSION_LEVEL_BEST_COMPRESSION );
$fname = "$fname.zip" unless $fname =~ s/\.[^.]*$/\.zip/;
$zip->writeToFileNamed("./Work/CUSTOM_$fname");
action_replace_with_file($entity, "./Work/CUSTOM_$fname", $fname);
$zipped = 1;
}
my($custom_size, $custom_bandwidth);
$custom_bandwidth = (stat("./INPUTMSG"))[7]*scalar(@Recipients);
md_graphdefang_log('mail', 'CUSTOM_BANDWIDTH', $custom_bandwidth);
$custom_size = (stat($entity->bodyhandle->path))[7];
md_graphdefang_log('mail', 'CUSTOM_MSG_PART_SIZE', $custom_size);
if ( ($custom_size > 800*1024) || ($custom_bandwidth > 1300*1024) ) {
action_notify_sender("You e-mail has been filtered and sent. No further action required.\n");
return action_replace_with_url($entity,"/var/www/localhost/htdocs/dload","http://download.domain3.org/dload","You can download the attachment from:
\n_URL_
\nNOTICE: the attached file ($fname - $custom_size bytes) is available for about 1 week.\n","text/html","html","attachment",$fname);
}
if ($zipped) {
return 1;
}
}
return action_accept();
}
(...)
sub filter_end {
my($entity) = @_;
return if message_rejected();
if (@attachURLlist > 0) {
&custom_list_replacement_urls($entity,"The following is a list links to download attached files.\n","\nThe data is available for about 1 week.")
}