lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FavApps.pm
2019-04-25 23:02:37 +02:00

194 lines
5.4 KiB
Perl

package Lemonldap::NG::Portal::Plugins::FavApps;
use strict;
use Mouse;
use JSON qw(from_json to_json);
our $VERSION = '2.1.0';
extends 'Lemonldap::NG::Portal::Main::Plugin';
# INITIALIZATION
has rule => ( is => 'rw', default => sub { 1 } );
sub init {
my $self = shift;
my $hd = $self->p->HANDLER;
$self->addAuthRoute( favapps => 'register', ['POST'] );
$self->addAuthRoute( favapps => 'read', ['GET'] );
# Parse activation rule
$self->logger->debug(
"FavApps activation rule -> " . $self->conf->{portalDisplayFavApps} );
my $rule =
$hd->buildSub( $hd->substitute( $self->conf->{portalDisplayFavApps} ) );
unless ($rule) {
$self->error(
"Bad FavApps activation rule -> " . $hd->tsv->{jail}->error );
return 0;
}
$self->rule($rule);
return 1;
}
# RUNNING METHODS
sub register {
my ( $self, $req ) = @_;
my $user = $req->userData->{ $self->conf->{whatToTrace} };
# Check activation rule
unless ( $self->rule->( $req, $req->userData ) ) {
$self->userLogger->warn(
'FavApps requested by an unauthorized user ('
. $req->{user}
. ')' );
$self->logger->debug('FavApps not authorized');
return [
200,
[
'Content-Type' => 'application/json',
'Content-Length' => 11,
],
['{"error":0}']
];
}
my ( $app, $result );
unless ( $app = $req->param('app') ) {
return $self->p->sendError( $req, 'Missing App. URI', 400 );
}
$self->logger->debug("Favorite application received : $app");
my $logo = $req->param('logo') || '';
my $desc = $req->param('desc') || '';
my $title = $req->param('title') || '';
# Read existing favorite Apps
$self->logger->debug("Looking for $user favorite Apps...");
my $_favApps;
if ( $req->userData->{_favApps} ) {
$_favApps = eval {
from_json( $req->userData->{_favApps}, { allow_nonref => 1 } );
};
if ($@) {
$self->logger->error("Corrupted session (_favApps): $@");
return $self->p->sendError( $req, "Corrupted session", 500 );
}
}
else {
$self->logger->debug("No favorite Apps found for $user");
$_favApps = [];
}
# Append or remove favorite application
my $nbrApps = @$_favApps;
$self->logger->debug("$nbrApps favorite Apps found");
if ( $nbrApps && $self->_isFavApp( $_favApps, $app ) ) {
$_favApps = $self->_removeFavApp( $_favApps, $app );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":0}';
$self->userLogger->notice(
"Favorite apps deletion of $app succeeds for $user");
}
else {
if ( $nbrApps < $self->conf->{favAppsMaxNumber} ) {
$_favApps =
$self->_appendFavApp( $_favApps, $app, $logo, $desc, $title );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":1}';
$self->userLogger->notice(
"Favorite apps registration of $app succeeds for $user");
}
else {
$result = '{"error":1}';
$self->userLogger->notice(
"Max number of favorite apps reached for $user");
}
}
return [
200,
[
'Content-Type' => 'application/json',
'Content-Length' => length($result),
],
[$result]
];
}
sub read {
my ( $self, $req ) = @_;
my $user = $req->sessionInfo->{ $self->conf->{whatToTrace} };
# Read existing favorite Apps
$self->logger->debug("Looking for favorite Apps...");
my $_favapps;
if ( $req->sessionInfo->{_favApps} ) {
$_favapps = eval {
from_json( $req->sessionInfo->{_favapps}, { allow_nonref => 1 } );
};
if ($@) {
$self->logger->error("Corrupted session (_favApps): $@");
return $self->p->sendError( $req, "Corrupted session", 500 );
}
}
else {
$self->logger->debug("No favorite Apps found");
$_favapps = [];
}
# Serialize data
my $data = to_json( {
result => 1,
apps => $_favapps
}
);
$self->logger->debug( scalar @$_favapps . " Apps found for $user" );
return [
200,
[
'Content-Type' => 'application/json',
'Content-Length' => length($data),
],
[$data]
];
}
sub _isFavApp {
my ( $self, $_favApps, $app ) = @_;
my $test = 0;
foreach (@$_favApps) {
if ( $_->{app} eq $app ) {
$test = 1;
last;
}
}
$self->logger->debug("App. already registered? $test");
return $test;
}
sub _appendFavApp {
my ( $self, $_favApps, $app, $logo, $desc, $title ) = @_;
push @$_favApps,
{ app => $app, logo => $logo, desc => $desc, title => $title };
$self->logger->debug("App. $app appended");
return $_favApps;
}
sub _removeFavApp {
my ( $self, $_favApps, $app ) = @_;
my $keep = [];
while (@$_favApps) {
my $element = shift @$_favApps;
$self->logger->debug("Looking for favorite App to remove...");
push @$keep, $element unless ( $element->{app} eq $app );
}
$self->logger->debug("App. $app removed");
return $keep;
}
1;