2016-06-12 18:52:37 +02:00
|
|
|
package Lemonldap::NG::Portal::Issuer::Get;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use Mouse;
|
2016-06-12 21:26:14 +02:00
|
|
|
use URI::Escape;
|
2018-06-26 19:13:06 +02:00
|
|
|
use Lemonldap::NG::Common::FormEncode;
|
2019-03-07 18:22:16 +01:00
|
|
|
use Lemonldap::NG::Portal::Main::Constants
|
|
|
|
qw(PE_OK PE_BADURL PE_GET_SERVICE_NOT_ALLOWED);
|
2016-06-12 18:52:37 +02:00
|
|
|
|
2019-02-12 18:21:38 +01:00
|
|
|
our $VERSION = '2.1.0';
|
2016-06-12 18:52:37 +02:00
|
|
|
|
|
|
|
extends 'Lemonldap::NG::Portal::Main::Issuer';
|
|
|
|
|
2019-02-14 22:12:40 +01:00
|
|
|
has rule => ( is => 'rw' );
|
2019-02-07 17:16:29 +01:00
|
|
|
|
|
|
|
# INITIALIZATION
|
|
|
|
|
|
|
|
sub init {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
# Parse activation rule
|
|
|
|
my $hd = $self->p->HANDLER;
|
2019-03-07 18:22:16 +01:00
|
|
|
$self->logger->debug( "GET rule -> " . $self->conf->{issuerDBGetRule} );
|
2019-02-07 17:16:29 +01:00
|
|
|
my $rule =
|
2019-03-07 18:22:16 +01:00
|
|
|
$hd->buildSub( $hd->substitute( $self->conf->{issuerDBGetRule} ) );
|
2019-02-07 17:16:29 +01:00
|
|
|
unless ($rule) {
|
2020-03-28 18:12:34 +01:00
|
|
|
my $error = $hd->tsv->{jail}->error || '???';
|
2020-05-23 23:52:09 +02:00
|
|
|
$self->error("Bad GET activation rule -> $error");
|
2019-02-07 17:16:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
$self->{rule} = $rule;
|
|
|
|
return 0 unless ( $self->SUPER::init() );
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2016-06-12 18:52:37 +02:00
|
|
|
# RUNNING METHODS
|
|
|
|
|
|
|
|
sub run {
|
|
|
|
my ( $self, $req ) = @_;
|
|
|
|
|
2019-02-07 17:16:29 +01:00
|
|
|
# Check activation rule
|
|
|
|
unless ( $self->rule->( $req, $req->sessionInfo ) ) {
|
|
|
|
$self->userLogger->error('GET service not authorized');
|
|
|
|
return PE_GET_SERVICE_NOT_ALLOWED;
|
|
|
|
}
|
|
|
|
|
2016-06-12 18:52:37 +02:00
|
|
|
# Session ID
|
2019-12-31 17:14:44 +01:00
|
|
|
my $session_id = $req->{sessionInfo}->{_session_id} || $req->id;
|
2016-06-12 18:52:37 +02:00
|
|
|
|
|
|
|
# Session creation timestamp
|
2017-03-03 13:17:15 +01:00
|
|
|
my $time = $req->{sessionInfo}->{_utime} || time();
|
2016-06-12 21:26:14 +02:00
|
|
|
$req->path =~ m#^$self->{conf}->{issuerDBGetPath}/(log(?:in|out))#;
|
2016-06-12 18:52:37 +02:00
|
|
|
my $logInOut = $1 || 'login';
|
|
|
|
if ( $logInOut eq 'login' ) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->debug("IssuerGet: request for login");
|
2016-06-12 18:52:37 +02:00
|
|
|
$self->computeGetParams($req);
|
|
|
|
return PE_OK;
|
|
|
|
}
|
|
|
|
elsif ( $logInOut eq 'logout' ) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->debug("IssuerGet: request for logout");
|
2016-06-12 18:52:37 +02:00
|
|
|
|
|
|
|
# TODO
|
|
|
|
# Display a link to the provided URL
|
|
|
|
return PE_OK;
|
|
|
|
}
|
|
|
|
else {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->error("IssuerGet: bad url");
|
2016-06-12 18:52:37 +02:00
|
|
|
return PE_BADURL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Nothing to do here for now
|
|
|
|
sub logout {
|
|
|
|
PE_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
# INTERNAL METHODS
|
|
|
|
|
|
|
|
sub computeGetParams {
|
|
|
|
my ( $self, $req ) = @_;
|
|
|
|
|
|
|
|
# Additional GET variables
|
2018-06-26 19:13:06 +02:00
|
|
|
my %getPrms;
|
2016-06-12 18:52:37 +02:00
|
|
|
if ( exists $self->conf->{issuerDBGetParameters} ) {
|
|
|
|
unless ( $req->urldc =~ m#^https?://([^/]+)# ) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->error("Malformed url $req->urldc");
|
2016-06-12 18:52:37 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
my $vhost = $1;
|
|
|
|
my $prms = $self->conf->{issuerDBGetParameters}->{$vhost};
|
|
|
|
unless ($prms) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->warn("IssuerGet: $vhost has no configuration");
|
2016-06-12 18:52:37 +02:00
|
|
|
return '';
|
|
|
|
}
|
|
|
|
foreach my $param ( keys %$prms ) {
|
2018-06-26 19:13:06 +02:00
|
|
|
my $value = $req->{sessionInfo}->{ $prms->{$param} };
|
2016-06-12 18:52:37 +02:00
|
|
|
$value =~ s/[\r\n\t]//;
|
2018-06-26 19:13:06 +02:00
|
|
|
$getPrms{$param} = $value;
|
2016-06-12 18:52:37 +02:00
|
|
|
}
|
2020-06-18 18:01:33 +02:00
|
|
|
$self->userLogger->notice( 'User '
|
|
|
|
. $req->sessionInfo->{ $self->conf->{whatToTrace} }
|
|
|
|
. " is authorized to access to $vhost" );
|
2016-06-12 18:52:37 +02:00
|
|
|
}
|
|
|
|
else {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->warn("IssuerGet: no configuration");
|
2016-06-12 18:52:37 +02:00
|
|
|
return;
|
|
|
|
}
|
2018-06-26 19:13:06 +02:00
|
|
|
my $getVars = build_urlencoded(%getPrms);
|
2016-06-12 18:52:37 +02:00
|
|
|
|
|
|
|
# If there are some GET variables to send
|
|
|
|
# Add them to URL string
|
|
|
|
if ( $getVars ne "" ) {
|
|
|
|
my $urldc = $req->urldc;
|
|
|
|
|
|
|
|
$urldc .= ( $urldc =~ /\?\w/ )
|
|
|
|
?
|
|
|
|
|
|
|
|
# there are already get variables
|
|
|
|
"&" . $getVars
|
|
|
|
:
|
|
|
|
|
|
|
|
# there are no get variables
|
|
|
|
"?" . $getVars;
|
|
|
|
$req->urldc($urldc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|