summaryrefslogtreecommitdiffstats
path: root/Spline/Srs.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Spline/Srs.pm')
-rw-r--r--Spline/Srs.pm87
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: