The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
our $VERSION = '2.20191106'; # VERSION
use Sys::Syslog qw{:standard :macros};
sub default_config {
return {};
}
sub grafana_rows {
my ( $self ) = @_;
my @rows;
push @rows, $self->get_json( 'LocalIP_metrics' );
return \@rows;
}
sub is_local_ip_address {
my ( $self, $ip ) = @_;
my $ip_address = $ip->ip();
my $ip_type = $ip->iptype();
my $type_map = {
'PRIVATE' => 1,
'SHARED' => 1,
'LOOPBACK' => 1,
'LINK-LOCAL' => 1,
'RESERVED' => 1,
'TEST-NET' => 0,
'6TO4-RELAY' => 0,
'MULTICAST' => 0,
'BROADCAST' => 0,
'UNSPECIFIED' => 0,
'IPV4MAP' => 0,
'DISCARD' => 0,
'GLOBAL-UNICAST' => 0,
'TEREDO' => 0,
'BMWG' => 0,
'DOCUMENTATION' => 0,
'ORCHID' => 0,
'6TO4' => 0,
'UNIQUE-LOCAL-UNICAST' => 1,
'LINK-LOCAL-UNICAST' => 1,
};
$self->dbgout( 'IPAddress', "Address $ip_address detected as type $ip_type", LOG_DEBUG );
return $type_map->{ $ip_type } || 0;
}
sub register_metrics {
return {
'localip_connect_total' => 'The number of connections from a local IP',
};
}
sub connect_callback {
my ( $self, $hostname, $ip ) = @_;
$self->{'is_local_ip_address'} = 0;
if ( $self->is_local_ip_address($ip) ) {
$self->dbgout( 'LocalIP', 'pass', LOG_DEBUG );
my $header = Mail::AuthenticationResults::Header::Entry->new()->set_key( 'x-local-ip' )->safe_set_value( 'pass' );
$self->add_c_auth_header( $header );
$self->{'is_local_ip_address'} = 1;
$self->metric_count( 'localip_connect_total' );
}
return;
}
sub close_callback {
my ( $self ) = @_;
delete $self->{'is_local_ip_address'};
return;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Mail::Milter::Authentication::Handler::LocalIP
=head1 VERSION
version 2.20191106
=head1 DESCRIPTION
Detect a Local IP address and act accordingly.
=head1 CONFIGURATION
No configuration options exist for this handler.
=head1 AUTHOR
Marc Bradshaw <marc@marcbradshaw.net>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2018 by Marc Bradshaw.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut