126 lines
3.1 KiB
Perl
126 lines
3.1 KiB
Perl
package Lemonldap::NG::Portal::Lib::SOAPProxy;
|
|
|
|
use strict;
|
|
use Mouse;
|
|
use SOAP::Lite;
|
|
use Lemonldap::NG::Portal::Main::Constants qw(
|
|
URIRE
|
|
PE_OK
|
|
PE_ERROR
|
|
PE_BADCREDENTIALS
|
|
);
|
|
|
|
our $VERSION = '2.0.14';
|
|
|
|
# INITIALIZATION
|
|
|
|
has cookieName => ( is => 'rw' );
|
|
has sessionService => ( is => 'rw' );
|
|
has urn => (
|
|
is => 'rw',
|
|
lazy => 1,
|
|
default => sub {
|
|
$_[0]->conf->{soapProxyUrn};
|
|
}
|
|
);
|
|
|
|
sub init {
|
|
my ($self) = @_;
|
|
|
|
unless ( defined $self->conf->{proxyAuthService}
|
|
&& $self->conf->{proxyAuthService} =~ URIRE )
|
|
{
|
|
$self->error("Bad or missing proxyAuthService parameter");
|
|
return 0;
|
|
}
|
|
|
|
my $sessionService = $self->conf->{proxySessionService}
|
|
|| $self->conf->{proxyAuthService};
|
|
unless ( $sessionService =~ URIRE ) {
|
|
$self->error("Malformed proxySessionService parameter");
|
|
return 0;
|
|
}
|
|
$self->sessionService($sessionService);
|
|
$self->cookieName( $self->conf->{proxyCookieName}
|
|
|| $self->conf->{cookieName} );
|
|
|
|
return 1;
|
|
}
|
|
|
|
# RUNNING METHODS
|
|
|
|
no warnings 'once';
|
|
*authenticate = *getUser;
|
|
|
|
sub getUser {
|
|
my ( $self, $req ) = @_;
|
|
return PE_OK if ( $req->data->{_proxyQueryDone} );
|
|
$self->logger->debug(
|
|
'Proxy push auth to ' . $self->conf->{proxyAuthService} );
|
|
my $soap =
|
|
SOAP::Lite->proxy( $self->conf->{proxyAuthService} )->uri( $self->urn );
|
|
my $r = $soap->getCookies( $req->{user}, $req->data->{password} );
|
|
if ( $r->fault ) {
|
|
$self->logger->error( "Unable to query authentication service: "
|
|
. $r->fault->{faultstring} );
|
|
return PE_ERROR;
|
|
}
|
|
$self->logger->debug('Proxy gets a response');
|
|
my $res = $r->result();
|
|
|
|
# If authentication failed, display error
|
|
if ( $res->{errorCode} ) {
|
|
$self->userLogger->warn(
|
|
"Authentication failed for $req->{user}: error $res->{errorCode}");
|
|
$self->setSecurity($req);
|
|
return PE_BADCREDENTIALS;
|
|
}
|
|
unless ( $req->data->{_remoteId} = $res->{cookies}->{ $self->cookieName } )
|
|
{
|
|
$self->logger->error("No cookie named $self->{remoteCookieName}");
|
|
return PE_ERROR;
|
|
}
|
|
$req->data->{_proxyQueryDone}++;
|
|
|
|
return PE_OK;
|
|
}
|
|
|
|
sub findUser {
|
|
|
|
# Nothing to do here
|
|
return PE_OK;
|
|
}
|
|
|
|
sub setSessionInfo {
|
|
my ( $self, $req ) = @_;
|
|
return PE_OK if ( $req->data->{_setSessionInfoDone} );
|
|
$self->logger->debug(
|
|
'Proxy requests sessionInfo to ' . $self->sessionService . '/global' );
|
|
my $soap = SOAP::Lite->proxy( $self->sessionService )->uri( $self->urn );
|
|
my $r = $soap->getAttributes( $req->data->{_remoteId} );
|
|
$self->logger->error(
|
|
"Unable to query session service: " . $r->fault->{faultstring} )
|
|
if ( $r->fault );
|
|
|
|
my $res = $r->result();
|
|
if ( $res->{error} ) {
|
|
$self->userLogger->warn("Unable to get attributes for $self->{user}");
|
|
return PE_ERROR;
|
|
}
|
|
foreach ( keys %{ $res->{attributes} } ) {
|
|
$req->{sessionInfo}->{$_} ||= $res->{attributes}->{$_}
|
|
unless (/^_/);
|
|
}
|
|
$req->data->{_setSessionInfoDone}++;
|
|
|
|
return PE_OK;
|
|
}
|
|
|
|
sub authLogout {
|
|
|
|
# Nothing to do here
|
|
return PE_OK;
|
|
}
|
|
|
|
1;
|