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:
|