108 lines
2.8 KiB
Perl
108 lines
2.8 KiB
Perl
# --
|
|
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
|
|
# --
|
|
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
|
|
# the enclosed file COPYING for license information (GPL). If you
|
|
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
|
|
# --
|
|
|
|
package Kernel::System::PostMaster::LoopProtection::FS;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use parent 'Kernel::System::PostMaster::LoopProtectionCommon';
|
|
|
|
our @ObjectDependencies = (
|
|
'Kernel::Config',
|
|
'Kernel::System::Log',
|
|
'Kernel::System::DateTime',
|
|
);
|
|
|
|
sub new {
|
|
my ( $Type, %Param ) = @_;
|
|
my $Self = $Type->SUPER::new(%Param);
|
|
|
|
$Self->{LoopProtectionLog} = $Kernel::OM->Get('Kernel::Config')->Get('LoopProtectionLog')
|
|
|| die 'No Config option "LoopProtectionLog"!';
|
|
$Self->{LoopProtectionLog} .= '-' . $Self->{LoopProtectionDate} . '.log';
|
|
|
|
return $Self;
|
|
}
|
|
|
|
sub SendEmail {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my $To = $Param{To} || return;
|
|
|
|
# write log
|
|
## no critic
|
|
if ( open( my $Out, '>>', $Self->{LoopProtectionLog} ) ) {
|
|
my $DateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime');
|
|
## use critic
|
|
print $Out "$To;" . $DateTimeObject->Format( Format => '%a %b %{day} %H:%M:%S %Y' ) . ";\n"; ## no critic
|
|
close($Out);
|
|
}
|
|
else {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "LoopProtection! Can't write '$Self->{LoopProtectionLog}': $!!",
|
|
);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub Check {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my $To = $Param{To} || return;
|
|
my $Count = 0;
|
|
|
|
# check existing logfile
|
|
## no critic
|
|
if ( !open( my $In, '<', $Self->{LoopProtectionLog} ) ) {
|
|
## use critic
|
|
|
|
# create new log file
|
|
## no critic
|
|
if ( !open( my $Out, '>', $Self->{LoopProtectionLog} ) ) {
|
|
## use critic
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "LoopProtection! Can't write '$Self->{LoopProtectionLog}': $!!",
|
|
);
|
|
}
|
|
else {
|
|
close($Out);
|
|
}
|
|
}
|
|
else {
|
|
|
|
# open old log file
|
|
while (<$In>) {
|
|
my @Data = split( /;/, $_ );
|
|
if ( $Data[0] eq $To ) {
|
|
$Count++;
|
|
}
|
|
}
|
|
close($In);
|
|
}
|
|
|
|
# check possible loop
|
|
my $Max = $Self->{PostmasterMaxEmailsPerAddress}{ lc $To } // $Self->{PostmasterMaxEmails};
|
|
|
|
if ( $Max && $Count >= $Max ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'notice',
|
|
Message =>
|
|
"LoopProtection: send no more emails to '$To'! Max. count of $Self->{PostmasterMaxEmails} has been reached!",
|
|
);
|
|
return;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
1;
|