lemonldap-ng/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Viewer.pm

185 lines
5.4 KiB
Perl
Raw Normal View History

2019-03-12 16:33:09 +01:00
package Lemonldap::NG::Manager::Viewer;
use 5.10.0;
use utf8;
use Mouse;
use Lemonldap::NG::Common::Conf::Constants;
use Lemonldap::NG::Common::UserAgent;
use URI::URL;
use feature 'state';
2019-03-14 16:39:49 +01:00
extends 'Lemonldap::NG::Manager::Conf';
2019-03-12 16:33:09 +01:00
2020-01-27 18:32:59 +01:00
has diffRule => ( is => 'rw', default => sub { 0 } );
2020-02-20 23:34:02 +01:00
has brwRule => ( is => 'rw', default => sub { 0 } );
2020-01-27 18:32:59 +01:00
2019-04-05 10:10:40 +02:00
our $VERSION = '2.1.0';
2019-03-12 16:33:09 +01:00
#############################
# I. INITIALIZATION METHODS #
#############################
use constant defaultRoute => 'viewer.html';
has ua => ( is => 'rw' );
2020-01-27 18:32:59 +01:00
sub init {
2019-03-12 16:33:09 +01:00
my ( $self, $conf ) = @_;
$self->ua( Lemonldap::NG::Common::UserAgent->new($conf) );
2020-01-27 18:32:59 +01:00
my $hd = "Lemonldap::NG::Handler::PSGI::Main";
# Parse Diff activation rule
$conf->{viewerAllowDiff} //= 0;
$self->logger->debug(
"Diff activation rule -> " . ( $conf->{viewerAllowDiff} ) );
my $rule = $hd->buildSub( $hd->substitute( $conf->{viewerAllowDiff} ) );
unless ($rule) {
$self->logger->error(
"Bad Diff activation rule -> " . $hd->tsv->{jail}->error );
return 0;
}
$self->diffRule($rule);
# Parse Browser activation rule
$conf->{viewerAllowBrowser} //= 0;
$self->logger->debug(
"Browser activation rule -> " . ( $conf->{viewerAllowBrowser} ) );
$rule = $hd->buildSub( $hd->substitute( $conf->{viewerAllowBrowser} ) );
unless ($rule) {
$self->logger->error(
"Bad Browser activation rule -> " . $hd->tsv->{jail}->error );
return 0;
}
$self->brwRule($rule);
2019-03-12 16:33:09 +01:00
2020-01-27 18:32:59 +01:00
my $hiddenKeys = $conf->{viewerHiddenKeys} || '';
2019-05-12 21:07:47 +02:00
my @enabledKeys = ();
2019-05-16 20:45:14 +02:00
my @keys = qw(virtualHosts samlIDPMetaDataNodes samlSPMetaDataNodes
2019-03-13 22:56:16 +01:00
applicationList oidcOPMetaDataNodes oidcRPMetaDataNodes
2019-08-18 11:14:42 +02:00
casSrvMetaDataNodes casAppMetaDataNodes sfExtra
2019-03-13 22:56:16 +01:00
authChoiceModules grantSessionRules combModules
openIdIDPList);
foreach (@keys) {
# Ignore hidden ConfTree Primary Keys
2019-05-12 21:07:47 +02:00
push @enabledKeys, $_
unless ( $hiddenKeys =~ /\b$_\b/ );
2019-03-13 22:56:16 +01:00
}
# Forbid hidden keys
2019-05-12 21:07:47 +02:00
foreach ( split /\s+/, $hiddenKeys ) {
$self->addRoute(
view => { ':cfgNum' => { $_ => 'rejectKey' } },
['GET']
);
}
# HTML templates
2019-03-12 16:33:09 +01:00
$self->addRoute( 'viewer.html', undef, ['GET'] )
->addRoute( 'viewDiff.html', undef, ['GET'] )
2019-03-12 16:33:09 +01:00
# READ
# Special keys
->addRoute(
2019-03-12 22:59:15 +01:00
view => {
2019-05-12 21:07:47 +02:00
':cfgNum' => \@enabledKeys
2019-03-12 16:33:09 +01:00
},
['GET']
)
2019-03-19 17:56:23 +01:00
# Difference between confs
->addRoute(
view => { diff => { ':conf1' => { ':conf2' => 'viewDiff' } } } )
2019-03-12 16:33:09 +01:00
# Other keys
->addRoute( view => { ':cfgNum' => { '*' => 'viewKey' } }, ['GET'] );
2020-01-27 18:32:59 +01:00
return 1;
2019-03-12 16:33:09 +01:00
}
sub getConfByNum {
my ( $self, $cfgNum, @args ) = @_;
2019-03-14 16:39:49 +01:00
$self->SUPER::getConfByNum( $cfgNum, @args );
2019-03-12 16:33:09 +01:00
}
2019-04-01 14:42:25 +02:00
sub viewDiff {
2019-03-12 16:33:09 +01:00
my ( $self, $req, @path ) = @_;
# Check Diff activation rule
unless ( $self->diffRule->( $req, $req->{userData} ) ) {
my $user = $req->{userData}->{_whatToTrace} || 'anonymous';
2020-02-20 23:34:02 +01:00
$self->userLogger->warn(
"$user is not authorized to compare configurations");
return $self->sendJSONresponse( $req, { 'value' => '_Hidden_' } );
}
2019-04-01 14:42:25 +02:00
return $self->sendError( $req, 'to many arguments in path info', 400 )
if (@path);
my @cfgNum =
( scalar( $req->param('conf1') ), scalar( $req->param('conf2') ) );
my @conf;
$self->logger->debug(" Loading confs");
# Load the 2 configurations
for ( my $i = 0 ; $i < 2 ; $i++ ) {
if ( %{ $self->currentConf }
and $cfgNum[$i] == $self->currentConf->{cfgNum} )
{
$conf[$i] = $self->currentConf;
}
else {
$conf[$i] = $self->confAcc->getConf(
{ cfgNum => $cfgNum[$i], raw => 1, noCache => 1 } );
return $self->sendError(
$req,
"Configuration $cfgNum[$i] not available $Lemonldap::NG::Common::Conf::msg",
400
) unless ( $conf[$i] );
}
}
require Lemonldap::NG::Manager::Conf::Diff;
my @res =
$self->Lemonldap::NG::Manager::Conf::Diff::diff( $conf[0], $conf[1] );
2019-04-01 14:52:23 +02:00
my $hiddenKeys = $self->{viewerHiddenKeys} || '';
2019-04-01 14:42:25 +02:00
$self->logger->debug("Deleting hidden Conf keys...");
foreach ( split /\s+/, $hiddenKeys ) {
$self->logger->debug("-> Delete $_");
delete $res[0]->{$_};
delete $res[1]->{$_};
}
return $self->sendJSONresponse( $req, [@res] );
2019-03-12 16:33:09 +01:00
}
2019-03-19 17:56:23 +01:00
sub rejectKey {
2019-04-14 21:13:43 +02:00
my ( $self, $req, @args ) = @_;
2019-03-19 17:56:23 +01:00
return $self->sendJSONresponse( $req, { 'value' => '_Hidden_' } );
}
2019-04-14 21:13:43 +02:00
sub viewKey {
my ( $self, $req, @args ) = @_;
$self->logger->debug("Viewer requested URI -> $req->{env}->{REQUEST_URI}");
# Check Browser activation rule
if ( $self->brwRule->( $req, $req->{userData} ) ) {
2019-04-14 21:13:43 +02:00
$self->logger->debug(" No restriction");
$self->SUPER::getKey( $req, @args );
}
else {
if ( $req->{env}->{REQUEST_URI} =~ m%/view/(?:latest|\d+/\w+)$% ) {
$self->logger->debug(" $req->{env}->{REQUEST_URI} -> URI allowed");
$self->SUPER::getKey( $req, @args );
}
else {
$self->logger->debug(
" $req->{env}->{REQUEST_URI} -> URI FORBIDDEN");
my $user = $req->{userData}->{_whatToTrace} || 'anonymous';
2020-02-20 23:34:02 +01:00
$self->userLogger->warn(
"$user is not authorized to browse configurations");
2019-04-14 21:13:43 +02:00
$self->rejectKey( $req, @args );
}
}
}
2019-03-12 16:33:09 +01:00
1;