package Spline::Srs; use strict; use warnings; use Mail::SRS; use Spline::Netstring; use base 'Exporter'; our @EXPORT = qw( ); our @EXPORT_OK = qw( check_exclude srs_forward srs_reverse ); our $alias = 'spline.inf.fu-berlin.de'; our @excludes = ( 'spline.inf.fu-berlin.de', '.spline.inf.fu-berlin.de', 'spline.de', '.spline.de', ); my $srs = new Mail::SRS( Secret => "", MaxAge => 49, HashLength => 5, HashMin => 4, ); sub check_exclude($@) { my $addr = shift; my @excludes = @_; my @parts = split(/@/, $addr); my $domain = $parts[-1]; for my $exclude (@excludes) { if ($exclude =~ m/^\./) { return 1 if $domain =~ m/\Q$exclude\E$/; } else { return 1 if $domain eq $exclude; } } return 0; } sub srs_forward($) { my $addr = shift; return if check_exclude($addr, @excludes); return $srs->forward($addr, $alias); } sub srs_reverse($) { my $addr = shift; return $srs->reverse($addr); } sub handle($$) { my ($map, $key) = @_; my $result; if ($map eq 'forward') { $result = srs_forward($key); } elsif ($map eq 'reverse') { $result = srs_reverse($key); } else { return "PERM Invalid request"; } if (!defined($result)) { return 'NOTFOUND '; } else { return 'OK ' . $result; } } 1; # vim: set et ts=4: