lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/FavApps.pm
2019-04-27 17:46:59 +02:00

197 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 ( $uri, $result );
unless ( $uri = $req->param('uri') ) {
return $self->p->sendError( $req, 'Missing App. URI', 400 );
}
$self->logger->debug("Favorite application URI received : $uri");
my $id = $req->param('id') || '';
my $logo = $req->param('logo') || '';
my $desc = $req->param('desc') || '';
my $name = $req->param('name') || '';
# 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, $uri ) ) {
$_favApps = $self->_removeFavApp( $_favApps, $uri );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":0}';
$self->userLogger->notice(
"Favorite apps deletion of $uri succeeds for $user");
}
else {
if ( $nbrApps < $self->conf->{favAppsMaxNumber} ) {
$_favApps =
$self->_appendFavApp( $_favApps, $uri, $id, $logo, $desc, $name );
$self->p->updatePersistentSession( $req,
{ _favApps => to_json($_favApps) } );
$result = '{"result":1}';
$self->userLogger->notice(
"Favorite apps registration of $uri 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->userData->{ $self->conf->{whatToTrace} };
# Read existing favorite Apps
$self->logger->debug("Looking for 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");
$_favApps = [];
}
# Serialize data
my $data = to_json( {
result => 1,
apps => $_favApps
}
);
$self->logger->debug(
scalar @$_favApps . " favorite Apps found for $user" );
return [
200,
[
'Content-Type' => 'application/json',
'Content-Length' => length($data),
],
[$data]
];
}
sub _isFavApp {
my ( $self, $_favApps, $uri ) = @_;
my $test = 0;
foreach (@$_favApps) {
if ( $_->{appuri} eq $uri ) {
$test = 1;
last;
}
}
$self->logger->debug("App. already registered? $test");
return $test;
}
sub _appendFavApp {
my ( $self, $_favApps, $uri, $id, $logo, $desc, $name ) = @_;
push @$_favApps,
{
appuri => $uri,
appid => $id,
applogo => $logo,
appdesc => $desc,
appname => $name
};
$self->logger->debug("App. $uri appended");
return $_favApps;
}
sub _removeFavApp {
my ( $self, $_favApps, $uri ) = @_;
@$_favApps = grep { $_->{appuri} ne $uri } @$_favApps;
$self->logger->debug("App. $uri removed");
return $_favApps;
}
1;