Skip to content
This repository was archived by the owner on Oct 25, 2023. It is now read-only.

Feature/connection tab #52

Open
wants to merge 70 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
3d43a64
feat:add connexion tab
May 3, 2018
2dd22a7
add tuupola/slim-basic-auth: PSR-7 and PSR-15 HTTP Basic
May 3, 2018
8345d27
add db migration for user
May 3, 2018
4f1a4e0
add button for connection
May 3, 2018
2645b72
WIP implement register
May 3, 2018
8362e68
Login - Logoff - Register
May 17, 2018
883bd59
Login is mandatory to add reference - State management
May 17, 2018
9302130
define routes and globals
May 17, 2018
74b5253
Profile page
May 17, 2018
dd541b0
Admin view
May 17, 2018
a446a56
Connection form warn - Table td overflow management
May 17, 2018
e81b8e1
New links to login-logoff-register-profile-admin
May 17, 2018
c45a74e
migration file for the features
May 17, 2018
d03354f
Refactor code to update profile
May 22, 2018
8376edb
migration for features
May 22, 2018
ff80d85
factorizing code
May 24, 2018
a0dedf7
added constants for status
May 24, 2018
c990555
empty lines dropped
May 24, 2018
fc3b603
configuration parameters simplifyer
May 24, 2018
7d4e6c1
uncommented recaptcha line
May 24, 2018
f0eb5b7
jquery metgods used - password conditions refactor
May 24, 2018
e766738
factorizing code to load filters and references
May 25, 2018
edb11ce
cs
May 25, 2018
abd9ce0
create navbar on admin page
May 25, 2018
266e1ab
cs + phpdoc
May 25, 2018
9df75c4
method visibility fix
May 25, 2018
97c96da
Route management on adminNavBar
May 28, 2018
64ce95f
admin users's table
May 29, 2018
4be7287
keep datas in database on migration
May 29, 2018
ef71733
delete welcome msg
May 29, 2018
cfd78e6
redesign main navbar with dropdown
May 29, 2018
8003bf3
connection dropdown in navbar
May 31, 2018
dfd2cf3
add title attribute on status img
May 31, 2018
e434dd2
admin form on action, email not mandatory
May 31, 2018
bebee8b
cs
May 31, 2018
8f5820d
Fix undefined index
trasher Jun 1, 2018
a973444
Do not duplicate template and route
trasher Jun 1, 2018
f22fc7e
Do not load login form until required, "better" display
trasher Jun 1, 2018
d3e97a7
Add missing method and action
trasher Jun 1, 2018
cbd8dfe
Fix CSRF and some html issues
trasher Jun 1, 2018
0124e5a
Fix csrf on standlone login page
trasher Jun 1, 2018
cbaeea8
variable name fixed
Jun 1, 2018
cce54c7
reference count on admin tab user's management
Jun 1, 2018
3bc7785
fix merge
Jun 1, 2018
6b8ebad
Other fix merge
Jun 1, 2018
dbe9de5
two differents views: refs and users management
Jun 11, 2018
2d730e9
right encoding
Jun 11, 2018
ad9139d
refactor code to factorize again query requests
Jun 11, 2018
a0b5d85
refactor to adapt it with customs filters
Jun 11, 2018
1046197
refactor to adapt with customs filters to launch query requests
Jun 11, 2018
bcd331f
function to catch username from ref_id
Jun 11, 2018
60e6cfa
convert function
Jun 11, 2018
c6b1106
better request
Jun 11, 2018
bc3d706
references management view improve for mass actions and filters
Jun 11, 2018
d9c7b26
users management view improve for mass actions and filters
Jun 11, 2018
31517be
profile view improve for mass actions and filters
Jun 11, 2018
c241a74
refactor code for filters
Jun 11, 2018
5e0725b
refactor code for filters
Jun 11, 2018
10ec17f
refactor code for filters
Jun 11, 2018
e05f05f
refactor routes
Jun 11, 2018
a913157
refactor mailing action
Jun 11, 2018
bccd5d2
some functions for mass actions
Jun 11, 2018
80e14df
remove this function from this file to globalize it
Jun 11, 2018
b6dcfb4
Filters class and filters table
Jun 11, 2018
4c93ee6
delete die;
Jun 11, 2018
df4fa84
uncomment recaptcha
Jun 11, 2018
155bfef
Fix sur un affichage de debug
Jun 12, 2018
13cdc67
better display for the connection dropdown
Jun 13, 2018
03e7bf9
recaptcha for contact page
Jun 14, 2018
abafe4c
fix massive action string display
AymLaf Jun 17, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 224 additions & 0 deletions app/Controllers/Admin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
<?php namespace GLPI\Telemetry\Controllers;

use GLPI\Telemetry\Controllers\ControllerAbstract;
use GLPI\Telemetry\Models\Reference as ReferenceModel;
use Slim\Http\Request;
use Slim\Http\Response;

class Admin extends ControllerAbstract
{
public function view(Request $req, Response $res, array $args)
{
$get = $req->getQueryParams();

$diff_filters = ReferenceModel::setDifferentsFilters($get, $args, $_SESSION['reference'], __CLASS__);
$_SESSION['reference'] = $diff_filters;

//check for refences presence
$dyn_refs = $this->container->project->getDynamicReferences();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This whole part is now repeated several times; this should be factorized

if (false === $dyn_refs) {
// retrieve data from model
$references = ReferenceModel::active()->orderBy(
$_SESSION['reference']['orderby'],
$_SESSION['reference']['sort']
)->paginate($_SESSION['reference']['pagination']);
} else {
try {
$join_table = $this->container->project->getSlug() . '_reference';
$order_field = $_SESSION['reference']['orderby'];
$order_table = (isset($dyn_refs[$order_field]) ? $join_table : 'reference');
// retrieve data from model
$ref = new ReferenceModel();
$model = $ref->newInstance();
$model = call_user_func_array(
[
$model,
'select'
],
array_merge(
['reference.*'],
array_map(
function ($key) use ($join_table) {
return $join_table . '.' . $key;
},
array_keys($dyn_refs)
)
)
);
$model->where('status', '=', $_SESSION['reference'][__CLASS__]);
$model->orderBy(
$order_table . '.' . $order_field,
$_SESSION['reference']['sort']
)
->leftJoin($join_table, 'reference.id', '=', $join_table . '.reference_id')
;
$references = $model->paginate($_SESSION['reference']['pagination']);
//var_dump($_SESSION['reference']);die;
} catch (\Illuminate\Database\QueryException $e) {
if ($e->getCode() == '42P01') {
//relation does not exists
throw new \RuntimeException(
'You have configured dynamic references for your project; but table ' .
$join_table . ' is missing!',
0,
$e
);
}
throw $e;
}
}

$ref_ref = new ReferenceModel;
$ref = $ref_ref->newInstance();
foreach ($references as $reference) {
$mails = $ref->findMails($reference['attributes']['id']);
if($mails !== false){
$ref_user_mails[$reference['attributes']['id']] = $mails;
}else{
$ref_user_mails[$reference['attributes']['id']] = null;
}
}



$references->setPath($this->container->router->pathFor('admin'));

// render in twig view
$this->render($this->container->project->pathFor('admin.html.twig'), [
'class' => 'admin',
'showmodal' => isset($get['showmodal']),
'uuid' => isset($get['uuid']) ? $get['uuid'] : '',
'references' => $references,
'pagination' => $references->appends($_GET)->render(),
'orderby' => $_SESSION['reference']['orderby'],
'sort' => $_SESSION['reference']['sort'],
'dyn_refs' => $dyn_refs,
'user_session' => $_SESSION['user'],
'status_page' => $_SESSION['reference'][__CLASS__],
'ref_user_mails'=> json_encode($ref_user_mails)
]);
}

public function filter(Request $req, Response $res, array $args)
{
$get = $req->getQueryParams();

// manage sorting
if (isset($args['orderby'])) {
if ($_SESSION['reference']['orderby'] == $args['orderby']) {
// toggle sort if orderby requested on the same column
$_SESSION['reference']['sort'] = ($_SESSION['reference']['sort'] == "desc"
? "asc"
: "desc");
}
$_SESSION['reference']['orderby'] = $args['orderby'];
}

return $res->withRedirect($this->container->router->pathFor('admin'));
}

public function ActionReferencePost(Request $req, Response $res)
{
$post = $req->getParsedBody();
$tmp = [];
if(isset($post['checkboxAdminActionForm1'])){
$tmp[] = $post['checkboxAdminActionForm1'];
}
if(isset($post['checkboxAdminActionForm2'])){
$tmp[] = $post['checkboxAdminActionForm2'];
}
if(isset($post['inputrow3col2'])){
$tmp[] = $post['inputrow3col2'];
}

return $this->ActionReference($req, $res,
[
'ref_id' => $post['ref_id_input'],
'status' => $post['status_input'],
'comment' => $post['comment'],
'mails' => $tmp
]
);
}

public function ActionReference(Request $req, Response $res, array $args)
{
$get = $req->getQueryParams();
$ref_ref = new ReferenceModel;
$ref = $ref_ref->newInstance();

$ref_status_before_update_res = $ref->where("id", "=", $args['ref_id'])->firstOrFail();
$ref_status_before_update = $ref_status_before_update_res['attributes']['status'];

$res_update = $ref->updateStatus($args['ref_id'], $args['status']);

if($res_update == 1){
$type = "success";
$msg_text = "Action done";
foreach ($args['mails'] as $key => $mail_to) {
$this->sendMail($req, $res, $args, $ref_status_before_update, $mail_to);
}
}else{
$type = "error";
$msg_text = "An error happened, bad insert, $res_update rows were updated, 1 row to update was expected";
}

$this->container->flash->addMessage(
$type,
$msg_text
);

return $res->withRedirect($this->container->router->pathFor('sorterAdmin', ['status'=>$ref_status_before_update]));
}

public function sendMail(Request $req, Response $res, array $args, $status_from, $mail_to)
{

$ref = new ReferenceModel();
$ref_model = $ref->newInstance();

$status_from = $ref_model->statusIntToText($status_from);
$status_to = $ref_model->statusIntToText($args['status']);

$join_table = $this->container->project->getSlug() . '_reference';

$res_ref = $ref_model->where("reference.id", "=", $args['ref_id'])
->leftJoin($join_table, $join_table.'.reference_id', '=', 'reference.id')
->firstOrFail();

if(isset($args['comment']) && !empty($args['comment'])){
$admin_msg = "Administrator's message :\n".$args['comment'];
}else{
$admin_msg = "";
}

$msg_ref =
"
Name : " . $res_ref['attributes']['name'] ."\n
Country : " . $res_ref['attributes']['country'] ."\n
Assets : " . $res_ref['attributes']['num_assets'] ."\n
Helpdesk : " . $res_ref['attributes']['num_helpdesk'] ."\n
Registration date : " . date("d M Y, h:i a",strtotime($res_ref['attributes']['created_at'])) ."\n
Comment : " . $res_ref['attributes']['comment']."\n";

$msg = "The status of your reference below has been changed by the admin from $status_from to $status_to :\n$msg_ref\n$admin_msg";

// prepare mail
$mail = new \PHPMailer;
$mail->setFrom($this->container['settings']['mail_admin']);
$mail->addAddress($mail_to);
$mail->Subject = "A new message from telemetry site : Reference status changed";
$mail->Body = $msg;
$send_ok = $mail->send();

if($send_ok === false){
$this->container->flash->addMessage(
"error",
"Error sending the mail to $mail_to.\n".$mail->ErrorInfo
);
return false;
} else {
return true;
}
}
}
59 changes: 59 additions & 0 deletions app/Controllers/Connection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php namespace GLPI\Telemetry\Controllers;

use GLPI\Telemetry\Controllers\ControllerAbstract;
use Slim\Http\Request;
use Slim\Http\Response;
use GLPI\Telemetry\Models\Authentication as AuthenticationModel;

class Connection extends ControllerAbstract
{
public function view()
{
$this->render($this->container->project->pathFor('connection.html.twig'), [
'class' => 'connection'
]);
}

public function send(Request $req, Response $res, $redirect='telemetry')
{
$post = $req->getParsedBody();

$auth_ref = new AuthenticationModel;
$auth = $auth_ref->newInstance();

if($auth->Authenticate($post)) {
// store a message for user (displayed after redirect)
$msg_text = "You are now connected !";
$this->container->flash->addMessage(
'success',
$msg_text
);
$this->container->flash->addMessage(
'success',
'Welcome '.$post['user']
);

$_SESSION['user'] = $auth->getUser()['attributes'];

//redirect
return $res->withRedirect($this->container->router->pathFor($redirect));

} else {
// store a message for user (displayed after redirect)
$this->container->flash->addMessage(
'warn',
'Wrong username or password'
);
//redirect
return $res->withRedirect($this->container->router->pathFor('connection'));

}

}

public function disconnect(Request $req, Response $res)
{
unset($_SESSION['user']);
return $res->withRedirect($this->container->router->pathFor('telemetry'));
}
}
Loading