Current File : //usr/share/perl5/vendor_perl/Amavis/Unpackers/NewFilename.pm |
# SPDX-License-Identifier: GPL-2.0-or-later
package Amavis::Unpackers::NewFilename;
use strict;
use re 'taint';
BEGIN {
require Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
$VERSION = '2.412';
@ISA = qw(Exporter);
@EXPORT_OK = qw(&consumed_bytes);
}
use Amavis::Conf qw(c cr ca
$MIN_EXPANSION_QUOTA $MIN_EXPANSION_FACTOR
$MAX_EXPANSION_QUOTA $MAX_EXPANSION_FACTOR);
use Amavis::Util qw(ll do_log min max minmax);
use vars qw($avail_quota); # available bytes quota for unpacked mail
use vars qw($rem_quota); # remaining bytes quota for unpacked mail
sub new($;$$) { # create a file name generator object
my($class, $maxfiles,$mail_size) = @_;
# calculate and initialize quota
$avail_quota = $rem_quota = # quota in bytes
max($MIN_EXPANSION_QUOTA, $mail_size * $MIN_EXPANSION_FACTOR,
min($MAX_EXPANSION_QUOTA, $mail_size * $MAX_EXPANSION_FACTOR));
ll(4) && do_log(4,'Original mail size: %d; quota set to: %d bytes '.
'(fmin=%s, fmax=%s, qmin=%s, qmax=%s)',
$mail_size, $avail_quota,
map(defined $_ ? "$_" : 'UNDEF',
$MIN_EXPANSION_FACTOR, $MAX_EXPANSION_FACTOR,
$MIN_EXPANSION_QUOTA, $MAX_EXPANSION_QUOTA));
# create object
bless {
num_of_issued_names => 0, first_issued_ind => 1, last_issued_ind => 0,
maxfiles => $maxfiles, # undef disables limit
objlist => [],
}, $class;
}
sub parts_list_reset($) { # clear a list of recently issued names
my $self = $_[0];
$self->{num_of_issued_names} = 0;
$self->{first_issued_ind} = $self->{last_issued_ind} + 1;
$self->{objlist} = [];
}
sub parts_list($) { # returns a ref to a list of recently issued names
my $self = $_[0];
$self->{objlist};
}
sub parts_list_add($$) { # add a parts object to the list of parts
my($self, $part) = @_;
push(@{$self->{objlist}}, $part);
}
sub generate_new_num($$) { # make-up a new number for a file and return it
my($self, $ignore_limit) = @_;
if (!$ignore_limit && defined($self->{maxfiles}) &&
$self->{num_of_issued_names} >= $self->{maxfiles}) {
# do not change the text in die without adjusting decompose_part()
die "Maximum number of files ($self->{maxfiles}) exceeded";
}
$self->{num_of_issued_names}++; $self->{last_issued_ind}++;
$self->{last_issued_ind};
}
sub consumed_bytes($$;$$) {
my($bytes, $bywhom, $tentatively, $exquota) = @_;
if (ll(4)) {
my $perc = !$avail_quota ? '' : sprintf(", (%.0f%%)",
100 * ($avail_quota - ($rem_quota - $bytes)) / $avail_quota);
do_log(4,"Charging %d bytes to remaining quota %d (out of %d%s) - by %s",
$bytes, $rem_quota, $avail_quota, $perc, $bywhom);
}
if ($bytes > $rem_quota && $rem_quota >= 0) {
# Do not modify the following signal text, it gets matched elsewhere!
my $msg = "Exceeded storage quota $avail_quota bytes by $bywhom; ".
"last chunk $bytes bytes";
do_log(-1, "%s", $msg);
die "$msg\n" if !$exquota; # die, unless allowed to exceed quota
}
$rem_quota -= $bytes unless $tentatively;
$rem_quota; # return remaining quota
}
1;