lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/GrantSession.pm

95 lines
3.0 KiB
Perl
Raw Normal View History

2017-02-16 19:14:42 +01:00
package Lemonldap::NG::Portal::Plugins::GrantSession;
use strict;
use Mouse;
use Lemonldap::NG::Portal::Main::Constants qw(
2019-02-05 23:12:17 +01:00
PE_OK
PE_SESSIONNOTGRANTED
PE_BADCREDENTIALS
2017-02-16 19:14:42 +01:00
);
2019-02-05 18:44:31 +01:00
our $VERSION = '2.0.2';
2017-02-28 21:53:19 +01:00
2017-02-16 19:14:42 +01:00
extends 'Lemonldap::NG::Portal::Main::Plugin';
2018-10-01 15:20:41 +02:00
use constant afterData => 'run';
2017-02-16 19:14:42 +01:00
has rules => ( is => 'rw', default => sub { {} } );
sub init {
my ($self) = @_;
my $hd = $self->p->HANDLER;
2018-10-01 15:20:41 +02:00
foreach ( keys %{ $self->conf->{grantSessionRules} } ) {
$self->logger->debug("GrantRule key -> $_");
$self->logger->debug(
"GrantRule value -> " . $self->conf->{grantSessionRules}->{$_} );
2019-02-05 23:12:17 +01:00
my $rule =
$hd->buildSub(
2018-10-01 15:20:41 +02:00
$hd->substitute( $self->conf->{grantSessionRules}->{$_} ) );
2017-02-16 19:14:42 +01:00
unless ($rule) {
2019-02-05 23:12:17 +01:00
$self->error( "Bad grantSession rule " . $hd->tsv->{jail}->error );
2017-02-16 19:14:42 +01:00
return 0;
}
$self->rules->{$_} = $rule;
}
return 1;
}
2018-10-01 15:20:41 +02:00
sub run {
2017-02-16 19:14:42 +01:00
my ( $self, $req ) = @_;
sub sortByComment {
my $A = ( $a =~ /^.*?##(.*)$/ )[0];
my $B = ( $b =~ /^.*?##(.*)$/ )[0];
return !$A ? 1 : !$B ? -1 : $A cmp $B;
}
2019-02-04 18:59:37 +01:00
# Avoid display notification if AuthResult is not null
2019-02-06 13:20:35 +01:00
return PE_BADCREDENTIALS if $req->authResult > PE_OK;
2017-02-16 19:14:42 +01:00
foreach ( sort sortByComment keys %{ $self->rules } ) {
2018-10-01 22:46:28 +02:00
$self->logger->debug( "Grant session condition -> "
2019-02-05 23:12:17 +01:00
. $self->conf->{grantSessionRules}->{$_} );
unless ( $self->rules->{$_}->( $req, $req->sessionInfo ) ) {
2017-02-19 08:17:48 +01:00
$req->userData( {} );
# Catch rule message
$_ =~ /^(.*?)##.*$/;
2018-10-07 11:40:26 +02:00
if ($1) {
2018-10-01 22:46:28 +02:00
$self->logger->debug("Message -> $1");
2018-10-07 15:19:00 +02:00
2019-02-05 23:12:17 +01:00
# Message can contain session data as user attributes or macros
my $hd = $self->p->HANDLER;
my $msg = $hd->substitute($1);
2018-10-07 21:32:26 +02:00
unless ( $msg = $hd->buildSub($msg) ) {
$self->error( "Bad message " . $hd->tsv->{jail}->error );
2018-10-07 21:32:26 +02:00
return PE_OK;
}
$msg = $msg->( $req, $req->sessionInfo );
$req->info(
$self->loadTemplate(
'simpleInfo', params => { trspan => $msg }
)
);
$self->userLogger->error( 'User '
2019-02-05 23:12:17 +01:00
. $req->sessionInfo->{uid}
. " was not granted to open session (rule -> $msg)" );
$req->urldc( $self->conf->{portal} );
return $req->authResult(PE_SESSIONNOTGRANTED);
}
else {
$self->userLogger->error( 'User '
2019-02-05 23:12:17 +01:00
. $req->sessionInfo->{uid}
. " was not granted to open session (rule -> "
. $self->conf->{grantSessionRules}->{$_}
. ")" );
$req->urldc( $self->conf->{portal} );
return $req->authResult(PE_SESSIONNOTGRANTED);
}
2017-02-16 19:14:42 +01:00
}
}
2018-10-01 19:53:21 +02:00
return PE_OK;
2017-02-16 19:14:42 +01:00
}
1;