diff options
Diffstat (limited to 'Spline/Srs.pm')
-rw-r--r-- | Spline/Srs.pm | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/Spline/Srs.pm b/Spline/Srs.pm new file mode 100644 index 0000000..d7fc795 --- /dev/null +++ b/Spline/Srs.pm @@ -0,0 +1,87 @@ +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: |