Lemonldap-NG-Portal
view release on metacpan or search on metacpan
lib/Lemonldap/NG/Portal/Main/Run.pm view on Meta::CPAN
)
{
$self->logger->debug("Session $args{kind} $id expired");
return;
}
$self->logger->debug( "Return $args{kind} session " . $as->id );
return $as;
}
# Try to recover the persistent session corresponding to uid and return session data.
sub getPersistentSession {
my ( $self, $uid, $info ) = @_;
return
unless ( defined $uid
and !$self->conf->{disablePersistentStorage} );
# Compute persistent identifier
my $pid = getPSessionID($uid);
$info->{_session_uid} = $uid;
my $ps = Lemonldap::NG::Common::Session->new( {
storageModule => $self->conf->{persistentStorage},
storageModuleOptions => $self->conf->{persistentStorageOptions},
id => $pid,
force => 1,
kind => "Persistent",
( $info ? ( info => $info ) : () ),
}
);
if ( $ps->error ) {
$self->logger->debug( $ps->error );
}
else {
# Set _session_uid if not already present
unless ( defined $ps->data->{_session_uid} ) {
$ps->update( { _session_uid => $uid } );
}
# Set _utime if not already present
unless ( defined $ps->data->{_utime} ) {
$ps->update( { _utime => time } );
}
}
return $ps;
}
# Update persistent session.
# Call updateSession() and store %$infos in a persistent session.
# Note that if the session does not exists, it will be created.
# @param infos hash reference of information to update
# @param uid optional Unhashed persistent session ID
# @param id optional SSO session ID
# @return nothing
sub updatePersistentSession {
my ( $self, $req, $infos, $uid, $id ) = @_;
# Return if no infos to update
return ()
unless ( ref $infos eq 'HASH'
and %$infos
and !$self->conf->{disablePersistentStorage} );
$uid ||= $req->{sessionInfo}->{ $self->conf->{whatToTrace} }
|| $req->userData->{ $self->conf->{whatToTrace} };
$self->logger->debug("Found 'whatToTrace' -> $uid");
unless ($uid) {
$self->logger->debug('No uid found, skipping updatePersistentSession');
return ();
}
$self->logger->debug("Update $uid persistent session");
# Update current session
$self->updateSession( $req, $infos, $id );
my $persistentSession = $self->getPersistentSession( $uid, $infos );
if ( $persistentSession->error ) {
$self->logger->error(
"Cannot update persistent session " . getPSessionID($uid) );
$self->logger->error( $persistentSession->error );
}
}
# Update session stored.
# If no id is given, try to get it from cookie.
# If the session is available, update data with $info.
# Note that outdated session data may remain some time on
# server local cache, if there are several LL::NG servers.
# @param infos hash reference of information to update
# @param id Session ID
# @return nothing
sub updateSession {
my ( $self, $req, $infos, $id ) = @_;
# Return if no infos to update
return () unless ( ref $infos eq 'HASH' and %$infos );
# Recover session ID unless given
$id ||= $req->id || $req->userData->{_session_id};
if ($id) {
# Update sessionInfo data
## sessionInfo updated if $id defined : quite strange!!
## See https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/issues/430
$self->logger->debug("Update session $id");
foreach ( keys %$infos ) {
$self->logger->debug("Update sessionInfo $_");
$self->_dump( $infos->{$_} );
$req->{sessionInfo}->{$_} = $infos->{$_};
if ( $self->HANDLER->data->{_session_id}
&& $id eq $self->HANDLER->data->{_session_id} )
{
$self->HANDLER->data->{$_} = $infos->{$_};
}
}
# Update session in global storage with _updateTime
$infos->{_updateTime} = strftime( "%Y%m%d%H%M%S", localtime() );
if ( my $apacheSession =
$self->getApacheSession( $id, info => $infos ) )
{
if ( $apacheSession->error ) {
$self->logger->error("Cannot update session $id");
$self->logger->error( $apacheSession->error );
}
}
# remove the corresponding session from handler cache
HANDLER->publishEvent( $req, { action => 'unlog', id => $id } );
}
}
# Delete an existing session. If "securedCookie" is set to 2, the http session
# will also be removed.
# @param h tied Apache::Session object
# @param preserveCookie do not delete cookie
# @return True if session has been deleted
sub _deleteSession {
my ( $self, $req, $session, $preserveCookie ) = @_;
# Invalidate http cookie and session, if set
if ( $self->conf->{securedCookie} >= 2 ) {
# Try to find a linked http session (securedCookie == 2)
if ( $self->conf->{securedCookie} == 2
and my $id2 = $session->data->{_httpSession} )
{
if ( my $session2 = $self->getApacheSession($id2) ) {
$session2->remove;
if ( $session2->error ) {
$self->logger->debug(
( run in 0.615 second using v1.01-cache-2.11-cpan-524268b4103 )