From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
use Mouse;
our $VERSION = '2.21.0';
has authRoutes => (
is => 'rw',
isa => 'HashRef',
default => sub {
{
GET => {},
POST => {},
PUT => {},
PATCH => {},
DELETE => {},
OPTIONS => {}
}
}
);
has unAuthRoutes => (
is => 'rw',
isa => 'HashRef',
default => sub {
{
GET => {},
POST => {},
PUT => {},
PATCH => {},
DELETE => {},
OPTIONS => {}
}
}
);
sub addRoute {
die;
}
sub addAuthRoute {
my $self = shift;
$self->routes( $self->authRoutes );
$self->logger->debug('Declaring auth route');
return $self->SUPER::addRoute(@_);
}
sub addUnauthRoute {
my $self = shift;
$self->routes( $self->unAuthRoutes );
$self->logger->debug('Declaring unauth route');
return $self->SUPER::addRoute(@_);
}
sub addAuthRouteWithRedirect {
my $self = shift;
$self->logger->debug("Route with redirect to $_[0]");
$self->addAuthRoute(@_);
$self->addUnauthRoute( $_[0] => '_auth_and_redirect', [ 'GET', 'POST' ] );
}
sub _auth_and_redirect {
my ( $self, $req ) = @_;
$self->api->goToPortal( $req, $req->{env}->{REQUEST_URI} );
return [ 302, [ $req->spliceHdrs ], [] ];
}
sub defaultAuthRoute {
my $self = shift;
$self->routes( $self->authRoutes );
return $self->SUPER::defaultRoute(@_);
}
sub defaultUnauthRoute {
my $self = shift;
$self->routes( $self->unAuthRoutes );
return $self->SUPER::defaultRoute(@_);
}
sub _run {
my $self = shift;
return $self->psgiAdapter(
sub {
my $req = $_[0];
my $res = $self->_authAndTrace( $req, 1 );
if ( $res->[0] < 300 ) {
$self->routes( $self->authRoutes );
$req->userData( $self->api->data );
$req->respHeaders( $res->[1] );
}
else {
my $mt = $self->api->checkMaintenanceMode($req);
if (
not $req->data->{noTry}
and (
# Normal case, only Forbidden response are given directly
( $res->[0] != 403 and !$mt )
# If portal is in maintainance mode call it only to display /lmerror
or ( $mt and $req->path_info =~ m#^/+lmerror/#i )
)
)
{
# Unset headers (handler adds a Location header)
$self->logger->debug(
"User not authenticated, Try in use, cancel redirection"
);
$req->userData( {} );
$req->respHeaders( [] );
$self->routes( $self->unAuthRoutes );
}
else {
return $res;
}
}
$res = $self->handler($req);
push @{ $res->[1] }, $req->spliceHdrs;
return $res;
}
);
}
1;
__END__
=head1 NAME
=encoding utf8
Lemonldap::NG::Handler::PSGI::Try - Special handler for Lemonldap::NG Portal
=head1 SYNOPSIS
package My::PSGI;
use base Lemonldap::NG::Handler::PSGI::Try;
sub init {
my ($self,$args) = @_;
# Declare REST routes for authenticated users (could be HTML templates or
# methods)
$self->addAuthRoute ( 'index.html', undef, ['GET'] )
->addAuthRoute ( books => { ':book' => 'booksMethod' }, ['GET', 'POST'] );
# Default route (ie: PATH_INFO == '/')
$self->defaultAuthRoute('index.html');
# Same for unauthenticated users
$self->addUnauthRoute ( 'login.html', undef, ['GET'] )
->addUnauthRoute ( 'login', undef, ['POST'] );
$self->defaultUnauthRoute('login.html');
# Return a boolean. If false, then error message has to be stored in
# $self->error
return 1;
}
sub booksMethod {
my ( $self, $req, @otherPathInfo ) = @_;
# Will be called only if authorized
my $userId = $self->userId;
my $book = $req->params('book');
my $method = $req->method;
...
$self->sendJSONresponse(...);
}
=head1 DESCRIPTION
Lemonldap::NG::Handler::PSGI::Try is a L<Lemonldap::NG::Handler::PSGI::Router>
package that provides 2 REST routers: one for authenticated users and one for
unauthenticated users.
=head1 METHODS
Same as L<Lemonldap::NG::Handler::PSGI::Router> (inherits from
L<Lemonldap::NG::Common::PSGI::Router>) except that:
=over
=item addRoute() must be replaced by addAuthRoute() or addUnauthRoute()
=item defaultRoute() must be replaced by defaultAuthRoute() or defaultUnauthRoute()
=back
Note also that user session datas are available in $req parameter (first argument
received by REST methods):
=over
=item $req->userData() returns a hash reference containing user session data
=back
=head1 SEE ALSO
See L<Lemonldap::NG::Common::PSGI::Router> for more.
=head1 AUTHORS
=over
=item LemonLDAP::NG team L<http://lemonldap-ng.org/team>
=back
=head1 BUG REPORT
Use OW2 system to report bug or ask for features:
=head1 DOWNLOAD
Lemonldap::NG is available at
=head1 COPYRIGHT AND LICENSE
See COPYING file for details.
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see L<http://www.gnu.org/licenses/>.
=cut