summaryrefslogtreecommitdiffstats
path: root/Spline/Socketmap/Srs.pm
blob: 5917c0063a92fea7d41c0a6f9e4fadbc6ae9550c (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package Spline::Socketmap::Srs;

use strict;
use warnings;

use base qw( Spline::Socketmap );
use Spline::Srs;

sub lookup($$) {
    my $self = shift;
    my ($map, $key) = @_;

    $self->{srs}->handle($map, $key);
}

sub options($$) {
    my $self     = shift;
    my $template = shift;
    my $prop     = $self->{server};

    $self->SUPER::options($template);

    # single value options
    for my $opt (qw(alias secret_file max_age hash_length hash_min ignore_time srsalt_fallback)) {
        $template->{$opt} = \$prop->{$opt};
    }
   
    # array options
    for my $opt (qw(excludes secret)) {
        if (! defined $prop->{$opt}) {
            $prop->{$opt} = [];
        } elsif (! ref $prop->{$opt}) {
            $prop->{$opt} = [$prop->{$opt}];
        }
        $template->{$opt} = $prop->{$opt};
    }
    
}

sub post_configure_hook {
    my $self = shift;
    my $prop = $self->{'server'};

    # boolean values
    for my $opt (qw(ignore_time srsalt_fallback)) {
        if (defined $prop->{$opt}) {
            $prop->{$opt} = 1;
        }
        else {
            $prop->{$opt} = 0;
        }
    }

    # secrets
    my @secrets = ();
    if (defined $prop->{secret_file}) {
        if (open(my $file, '<', $prop->{secret_file})) {
            while (<$file>) {
                chomp;
                push @secrets, $_;
            }
            close($file);
        }
        else {
            $self->log(1, 'ERROR: Cannot open secret_file: "' . $prop->{secret_file} . '"');
        }
    }

    if (defined $prop->{secret} && scalar @{$prop->{secret}} ne 0) {
        if (scalar @secrets gt 0) {
            $self->log(1, 'WARNING: Using both "--secret" and "--secret-file" will '.
                          'use the first line from the file for generating hashes');
        }

        for (@{$prop->{secret}}) {
            push @secrets, $_;
        }
    }

    # default values
    my %defaults = (
        max_age => 49,
        hash_length => 5,
        hash_min => 5, 
    );

    for my $opt (keys %defaults) {
        if (!defined($prop->{$opt}) || $prop->{$opt} !~ m/^\d+$/ || $prop->{$opt} le 0) {
            if (defined $prop->{$opt}) {
                $self->log(2, "Invalid value for '$opt', using default value '$defaults{$opt}'");
            }

            $prop->{$opt} = $defaults{$opt};
        }
    }

    $self->{srs} = new Spline::Srs({
        alias           => $prop->{alias},
        excludes        => $prop->{excludes},
        secret          => \@secrets,
        max_age         => $prop->{max_age},
        hash_length     => $prop->{hash_length},
        hash_min        => $prop->{hash_min},
        ignore_time     => $prop->{ignore_time},
        srsalt_fallback => $prop->{srsalt_fallback},
    });
}

1;

# vim: set et ts=4: