Server IP : 85.214.239.14 / Your IP : 18.188.62.10 Web Server : Apache/2.4.62 (Debian) System : Linux h2886529.stratoserver.net 4.9.0 #1 SMP Tue Jan 9 19:45:01 MSK 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.18 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /usr/share/perl5/Amavis/Unpackers/ |
Upload File : |
# 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;