PagesController.php 8.62 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];
        */
        $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($page, ['about', 'tools']) ) $this->LdapAuth->allow(['display']);
        }
        
    }
    
    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'));
        //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()
    
}