197 lines
5.4 KiB
Perl
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;
|