PagesController.php 11.5 KB
<?php
/**
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link      http://cakephp.org CakePHP(tm) Project
 * @since     0.2.9
 * @license   http://www.opensource.org/licenses/mit-license.php MIT License
 */
namespace App\Controller;

use Cake\Core\Configure;
use Cake\Network\Exception\NotFoundException;
use Cake\View\Exception\MissingTemplateException;
use Cake\ORM\TableRegistry;

/**
 * Static content controller
 *
 * This controller will render views from Template/Pages/
 *
 * @link http://book.cakephp.org/3.0/en/controllers/pages-controller.html
 */
class PagesController extends AppController
{

    /**
     *
     * @param
     *            $user
     * @return boolean Give authorization for materiels
     */
    /*
     * // (EP) TODO: ameliorer ca avec des variables globales IS_VALIDATED, IS_ADMIN, ...
     * public function isAuthorized($user) {
     * $path = func_get_args();
     * if($path[0] === null) {
     * $path[0] = '';
     * }
     * $page = $subpage = null;
     * if (!empty($path[0])) {
     * $page = $path[0];
     * }
     * if (!empty($path[1])) {
     * $subpage = $path[1];
     * }
     * if ($page == 'tools') {
     * // Autoriser seulement à partir du role ADMIN et +
     * if ($this->userHasRoleAtLeast('Utilisateur')) {
     * return false;
     * }
     * }
     * return true;
     * }
     */

    
    /*
     * Toute première méthode appelée,
     *
     * AVANT authentification
     *
     */
    public function initialize()
    {
        $this->myDebug("step 0A (specific): PagesController.initialize()");
        parent::initialize();
        // On autorise l'action add SANS authentification (unauthenticated)
        //$this->Auth->allow(['add']);
        //$this->LdapAuth->allow(['display']);
    }
    
    // (20200424 EP)
    public function beforeFilter(\Cake\Event\Event $event) {
        $this->myDebug("step 1A (specific): PagesController.beforeFilter()");
        // On donne d'abord les autorisations par défaut de AppController
        parent::beforeFilter($event);
        
        // Puis on ajoute les autorisations spécifiques
        /*
        $path = func_get_args();
        pr($path);
        $page = null;
        if (! empty($path[0])) $page = $path[0];
        */
        
        $pages_authorized_without_connexion = ['about', 'acls', 'changes'];
        $this->action = $this->getActionPassed();
        if ($this->action == "display") {
            $this->page = $this->request->getParam('pass.0');
            
            // On autorise l'action display SANS connexion 
            // mais seulement pour la page 'about' 
            //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no";
            //if ( $this->page == 'about' ) $this->LdapAuth->allow(['display']);
            if ( in_array($this->page, $pages_authorized_without_connexion) ) $this->LdapAuth->allow(['display']);
        }
        
    }
    
    /*
     * @Override
     *
     * Initialisation des autorisations pour les actions spécifiques à ce controleur
     *
     */
    protected function setAuthorizations() {

        // On supprime les autres actions par défaut (add, view, index, find)
        //foreach (array_keys($this->is_authorized_action[]) as $a) if ($a != 'display') unset($this->is_authorized_action[$a]);
        $this->is_authorized_action = [];
        
        // Action display 'about' (affichage de la page 'A propos')
        $this->setAuthorizationsForAction('display/about', 0);

        // Action display 'acls' (affichage de la page 'Autorisations')
        $this->setAuthorizationsForAction('display/acls', 0);
        $this->setAuthorizationsForAction('display/changes', 0);
        
        // Action display 'home' (affichage de la page 'Accueil')
        $this->setAuthorizationsForAction('display/home', 0);

        // Action display 'tools' (affichage de la page 'menu Outils')
        // admin (+) only
        $this->setAuthorizationsForAction('display/tools', -1, ['admin'=>0, 'super'=>0]);
        $this->setAuthorizationsForAction('display/tools-sm', -1, ['admin'=>0, 'super'=>0]);
        //$this->setAuthorizationsForAction('display/tools', 0);
        //$this->setAuthorizationsForAction('display/tools-sm', 0);
        
        $this->setAuthorizationsForAction('display/printers', 0);
        
        // Superadmin only :
        // - Action display 'infos' (affichage de la page 'Informations techniques sur le serveur')
        $this->setAuthorizationsForAction('display/infos', -1, ['super'=>0]);
        // - Action display 'logs' (affichage des messages de log')
        $this->setAuthorizationsForAction('display/logs', -1, ['super'=>0]);
        
    }
    
    
    /*
    public function isAuthorized($user,
        $action=null, $id=null, $role=null, $userCname=null) {
        $this->myDebug("step 2A (specific): PagesController.isAuthorized(user)");
        $this->myDebug("- user is:", $user);
        
        if ($this->action == 'display') {
            
            //$page = $this->request->getParam('pass.0');
            
            // Action display SANS nom de page => on redirige sur '/'
            // (c'est à dire sur /pages/home, c'est à dire /pages/display/home)
            // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/
            if (! $this->page) {
                $this->redirect('/');
                return false;
            }
            
            switch ($this->page) {
                
                // Page d'accueil autorisée à tous les profils (roles)
                case 'home': return true;
                
                // Page 'tools' seulement à partir de ADMIN
                // if (! $this->userHasRoleAtLeast('Administration')) {
                case 'tools': return $this->USER_IS_ADMIN_AT_LEAST();
                //case 'tools': return $this->USER_IS_USER();
                
                // Page 'infos' seulement pour SUPERADMIN
                //if (! $this->USER_IS_SUPERADMIN()) return $this->redirect('/');

                case 'infos': return $this->USER_IS_SUPERADMIN();
            
            }
            
        } // display

        // sinon, règle par défaut donnée par AppController
        return parent::isAuthorized($user);
    }
    */
    
    
    /**
     * Displays a view
     *
     * @return void|\Cake\Network\Response
     * @throws \Cake\Network\Exception\NotFoundException When the view file could not
     *         be found or \Cake\View\Exception\MissingTemplateException in debug mode.
     */
    public function display()
    {
        // (EP 21/5/19) 
        // On ne voit ce message que sur la page "about"
        // En effet, les autres pages nécessitant un login, 
        // on est redirigé sur la page login et donc la methode login() du controleur UsersController
        // Du coup, il faut décommenter la ligne "exit" juste après pour voir ce message (évite la redirection).
        $this->myDebug("step 2: PagesController.display()");
        
        $configuration = $this->confLabinvent;

        // Action display SANS nom de page => on redirige sur '/' 
        // (c'est à dire sur /pages/home, c'est à dire /pages/display/home)
        // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/
        ///$page = $this->request->getParam('pass.0');
        /*
        if (! $page) $this->redirect('/');
        */
        $subpage = $this->request->getParam('pass.1');
        //if (!$subpage) $subpage = null;
        /*        
        $path = func_get_args();
        if (! count($path)) return $this->redirect('/');
        if ($path[0] === null) $path[0] = '';
        $this->myDebug("- path is:");
        $this->myDebug($path);
        $page = $subpage = null;
        if (! empty($path[0])) $page = $path[0];
        if (! empty($path[1])) $subpage = $path[1];
        */
        $this->myDebug("- page is:");
        $this->myDebug($this->page);
        $this->myDebug("- subpage is:");
        $this->myDebug($subpage);
        
        /*
        // @todo : faire plus proprement, dans isAuthorized()
        // Si l'utilisateur n'est pas connecté, on le redirige vers la page login.ctp
        // sauf si l'action demandée est 'about' ou si le mode install est activé
        //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no";
        if ( $page != 'about' ) {
        // ! in_array($page, ['about', 'tools'])
            if ( 
                // pas logged (pas authentifié)
                ! $this->LdapAuth->user($configuration->ldap_authenticationType)[0]
                //&& $path[0]!='about' 
                //&& ! in_array($path[0], ['about', 'tools'])
                // et pas mode install 
                && ! $configuration->mode_install 
            ) {
                return $this->redirect([
                    'controller' => 'users',
                    'action' => 'login'
                ]);
            }
        }
        */
        
        /*
        // @todo : faire plus proprement, avec isAuthorized()
        // Page 'tools' seulement à partir de ADMIN
        if ($page == 'tools') {
            // if (! $this->userHasRoleAtLeast('Administration')) {
            if (! $this->USER_IS_ADMIN_AT_LEAST()) return false;
                //return $this->redirect('/');
        }
        // Page 'infos' seulement pour SUPERADMIN
        if ($page == 'infos') {
            //if (! $this->USER_IS_SUPERADMIN()) return $this->redirect('/');
            if (! $this->USER_IS_SUPERADMIN()) return false;
        }
        */

        // Finalement, on affiche la $page demandée (avec render())
        $this->set('page', $this->page);
        $this->set(compact('subpage'));
        
        // /pages/logs?level=info
        if ($this->page=='logs') {
            $info_levels = ['info','debug','notice'];
            $error_levels = ['warning', 'error', 'critical', 'alert', 'emergency'];
            // Paar défaut, level = INFO
            $level = 'Info';            
            $level_arg = $this->request->getQuery('level');
            if ($level_arg!==null && in_array($level_arg, array_merge($info_levels,$error_levels)))
                $level=$level_arg;
            //debug($level);
            $this->set(compact('level', 'info_levels', 'error_levels'));
        }

        if ($this->page=='acls') {
            $lab_name = $this->confLabinvent->labNameShort;
            if (!$lab_name) $lab_name = 'NOM_DU_LABO';
            $this->set(compact('lab_name'));
        }
        
        if ($this->page=='tools') {
            // Mode 'SA a tous les droits'
            $no_limit_mode = $this->confLabinvent->mode_nolimit;
            $this->set(compact('no_limit_mode'));
        }
        
        
        //debug(implode('/', $path));
        //debug(implode('/', array($page,$subpage)));
        try {
            //$this->render(implode('/', $path));
            //$this->render("$page/$subpage");
            $this->render($subpage ? $this->page.'/'.$subpage : $this->page);
            //$this->render(implode('/', array($page,$subpage)));
        } catch (MissingTemplateException $e) {
            if (Configure::read('debug')) throw $e;
            throw new NotFoundException();
        }
        
    } // display()
    
}