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