lemonldap-ng/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Lib/ServiceToken.pm

65 lines
1.8 KiB
Perl
Raw Normal View History

2017-03-03 07:29:50 +01:00
package Lemonldap::NG::Handler::Lib::ServiceToken;
use strict;
2019-08-26 22:52:15 +02:00
our $VERSION = '2.0.6';
2017-03-03 07:29:50 +01:00
sub fetchId {
my ( $class, $req ) = @_;
my $token = $req->{env}->{HTTP_X_LLNG_TOKEN};
return $class->Lemonldap::NG::Handler::Main::fetchId($req) unless ($token);
2017-03-03 07:29:50 +01:00
$class->logger->debug('Found token header');
2018-04-22 16:08:34 +02:00
# Decrypt token
2017-03-03 18:25:03 +01:00
my $s = $class->tsv->{cipher}->decrypt($token);
2018-04-22 16:08:34 +02:00
2019-06-12 22:43:16 +02:00
# Token format:
# time:_session_id:vhost1:vhost2:serviceHeader1=value1:serviceHeader2=value2,...
2017-03-03 18:25:03 +01:00
my ( $t, $_session_id, @vhosts ) = split /:/, $s;
2018-04-22 16:08:34 +02:00
# Looking for service headers
my $vh = $class->resolveAlias($req);
2019-06-12 22:53:41 +02:00
my %serviceHeaders;
@vhosts = grep {
if (/^([\w\-]+)=(.+)$/) {
$serviceHeaders{$1} = $2;
2019-06-14 17:23:26 +02:00
$class->logger->debug("Found service header: $1 => $2");
2019-06-12 22:53:41 +02:00
0;
}
else { 1 }
} @vhosts;
2019-05-26 22:37:59 +02:00
# $_session_id and at least one vhost
2019-05-27 23:07:18 +02:00
unless ( @vhosts and $_session_id ) {
2018-04-22 16:08:34 +02:00
$class->userLogger->error('Bad service token');
2017-03-03 07:29:50 +01:00
return 0;
}
2018-04-22 16:08:34 +02:00
# Is vhost listed in token ?
2017-03-04 13:24:56 +01:00
unless ( grep { $_ eq $vh } @vhosts ) {
$class->userLogger->error(
2019-05-26 10:32:27 +02:00
"$vh not authorized in token (" . join( ', ', @vhosts ) . ')' );
2017-03-04 13:24:56 +01:00
return 0;
}
2019-05-26 21:43:13 +02:00
# Is token in good interval ?
my $localConfig = $class->localConfig;
2019-05-27 23:07:18 +02:00
my $ttl =
$localConfig->{vhostOptions}->{$vh}->{vhostServiceTokenTTL} <= 0
? $class->tsv->{handlerServiceTokenTTL}
: $localConfig->{vhostOptions}->{$vh}->{vhostServiceTokenTTL};
2019-05-26 21:43:13 +02:00
unless ( $t <= time and $t > time - $ttl ) {
$class->userLogger->warn('Expired service token');
return 0;
}
if (%serviceHeaders) {
$class->logger->debug("Append service header(s)...");
$class->set_header_out( $req, %serviceHeaders );
}
2017-03-03 07:29:50 +01:00
return $_session_id;
}
1;