summaryrefslogtreecommitdiffstats
path: root/Spline/Srs.pm
blob: d7fc7955cac78498cadd4869d28388ea0c095c1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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: