Commit 02b7f0bea25e60a9da81eb4983b9e927f020c9bb

Authored by Etienne Pallier
1 parent 02692f05
Exists in master and in 1 other branch dev

Diverses améliorations, simplifications, optimisations

	- Ajout de $this->entity, $this->action et $this->action_id (...) dans
beforeFilter() pour simplifier et optimiser la suite des traitements
	- simplification du isAuthorizedAction() de Materiels
	- Optimisations pour éviter trop de requetes en BD et simplification
des tests acl
	- Meilleure gestion des aspects authentification et authorization
	- mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer
plus facilement des boutons !! :
	- migration des fonctions getActionButton() et displayElement() dans
MyButtonHelper et remplacement progressif dans les vues
README.md
... ... @@ -55,13 +55,15 @@ VERSION ACTUELLE
55 55  
56 56  
57 57  
58   -Date: 24/04/2020
59   -Version: 3.7.9.20
  58 +Date: 28/04/2020
  59 +Version: 3.7.9.21
60 60 Author: EP
61 61 Commentaire:
62   - Améliorations diverses :
63   - - Meilleure gestion des aspects authentification et authorization (car je comprends mieux maintenant)
64   - - PagesController maintenant bien plus clean
  62 + Diverses améliorations, simplifications, optimisations :
  63 + - Ajout de $this->entity, $this->action et $this->action_id (...) dans beforeFilter() pour simplifier et optimiser la suite des traitements
  64 + - simplification du isAuthorizedAction() de Materiels
  65 + - Optimisations pour éviter trop de requetes en BD et simplification des tests acl
  66 + - Meilleure gestion des aspects authentification et authorization
65 67 - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! :
66 68 - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues
67 69  
... ... @@ -98,6 +100,13 @@ La liste ci-dessous n'est plus à jour, elle est désormais en ligne ici : https
98 100  
99 101 -----------------------------------------------------------------------------------------------------------
100 102  
  103 +24/04/2020 Version 3.7.9.20 (EP)
  104 + Améliorations diverses :
  105 + - Meilleure gestion des aspects authentification et authorization (car je comprends mieux maintenant)
  106 + - PagesController maintenant bien plus clean
  107 + - mon 1er View Helper dans src/View/Helper (MyButtonHelper) pour créer plus facilement des boutons !! :
  108 + - migration des fonctions getActionButton() et displayElement() dans MyButtonHelper et remplacement progressif dans les vues
  109 +
101 110 20/04/2020 Version 3.7.9.19 (EP)
102 111 Améliorations EMPRUNT... :
103 112 - Améliorations EMPRUNT
... ...
src/Controller/AppController.php
... ... @@ -359,104 +359,50 @@ class AppController extends Controller
359 359 return (int) $this->request->getParam('pass.0');
360 360 }
361 361  
362   - /**
363   - * Initialization hook method.
364   - * Use this method to add common initialization code like loading components.
365   - * e.g. `$this->loadComponent('Security');`
366   - *
367   - * @return void
  362 + /* (EP 20200428)
  363 + *
  364 + * Méthode pour optimiser les accès à la BD.
  365 + * Retourne l'entité concernée par l'action.
  366 + *
  367 + * Cette méthode ne doit être appelée que lorsque c'est approprié
  368 + * (actions 'edit', 'view', ..., mais pas 'add', 'find', 'index', ...)
  369 + * sinon ça provoque une exception...
  370 + *
  371 + * Optimisation : l'entité n'est récupérée dans la BD qu'une seule fois pour toutes
  372 + *
368 373 */
369   - public function initialize()
370   - {
371   - $this->myDebug("step 0B (general): AppController.initialize()");
372   -
373   - parent::initialize();
374   -
375   - $this->loadComponent('RequestHandler');
376   - $this->loadComponent('Flash');
377   -
378   - // Composant en charge de l'authentification
379   -
380   - // - sans LDAP :
  374 + protected function getEntity($id=null) {
  375 + // Si pas d'id => exception (stop)
  376 + //assert($this->action_id>0);
  377 + if (!$this->action_id && !$id) throw new \Exception(__("cette methode doit etre appelée avec un id déjà positionné !!!"));
  378 +
  379 + // Si l'entité actuellement en mémoire n'est pas la bonne, la mettre à null pour obliger à la recharger
  380 + if ($id && $this->entity && $this->entity->id != $id) $this->entity = null;
  381 +
  382 + // Les 3 sont possibles
  383 + //$model = $this->request->getParam('controller'); // ex: Materiels
  384 + //$model = $this->name; // ex: Materiels
  385 + $model = $this->modelClass; // ex: Materiels
  386 +
381 387 /*
382   - $this->loadComponent('Auth', [
383   - 'authenticate' => [
384   - 'Form' => [
385   - 'fields' => [
386   - 'username' => 'email',
387   - 'password' => 'password'
388   - ]
389   - ]
390   - ],
391   - 'loginAction' => [
392   - 'controller' => 'Users',
393   - 'action' => 'login'
394   - ],
395   - // If unauthorized, return them to page they were just on
396   - 'unauthorizedRedirect' => $this->referer()
397   - ]);
398   - // Allow the display action so our PagesController
399   - // continues to work. Also enable the read only actions.
400   - $this->Auth->allow(['display', 'view', 'index']);
401   - // Les autres actions sont redirigées sur /users/login
  388 + debug("model2");
  389 + $model = $this->$model;
  390 + debug($model);
402 391 */
403   -
404   - // - avec LDAP :
405   - /*
406   - * If none of your users have hashed passwords, comment this block and $this->Auth->allow() calls.
407   - * (par exemple dans beforeFilter())
408   - * Then go and edit the user, saving a new password for them.
409   - * After saving a new password for the user,
410   - * make sure to uncomment the lines we just temporarily commented!
411   - */
412   - $this->loadComponent('LdapAuth', [
413   - // Les AUTHORIZATIONS sont faites par Controleur
414   - // (et non pas par un Component ou plugin)
415   - // TODO: utiliser Authorization component plugin (cakephp v4)
416   - //'authorize'=> 'Controller',
417   - 'authorize' => ['Controller'],
418   - /*
419   - 'authenticate' => [
420   - 'Form' => [
421   - 'fields' => [
422   - 'username' => 'email',
423   - 'password' => 'password'
424   - ]
425   - ]
426   - ],
427   - */
428   - 'loginRedirect' => [
429   - 'controller' => 'Pages',
430   - //'action' => 'home'
431   - 'action' => 'display',
432   - 'home'
433   - ],
434   - 'logoutRedirect' => [
435   - 'controller' => 'Pages',
436   - 'action' => 'home'
437   - ]
438   - ]);
439   - // Actions autorisées SANS authentification
440   - // Allow the display action so our PagesController continues to work.
441   - // Also enable the read only actions.
442   - // Déplacé dans beforeFilter()
443   - //$this->LdapAuth->allow(['display', 'view', 'index']);
444   - // Autoriser TOUTES les actions SANS authentification :
445   - //$this->LdapAuth->allow();
446   -
447   - // On charge la configuration
  392 +
  393 + //ex: if (! $this->entity) $this->entity = $this->Materiels->get($this->action_id);
  394 + if (! $this->entity) $this->entity = $this->$model->get($this->action_id);
448 395 /*
449   - $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()
450   - ->where([
451   - 'id =' => 1
452   - ])
453   - ->first();
  396 + * Avec les entités associées :
  397 + if (! $this->entity) $this->entity = $this->$model->get($this->action_id, [
  398 + 'contain' => ['Comments']
  399 + ]);
454 400 */
455   - $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first();
456   - // (EP 23/5/19) Exception si la config est vide, inutile d'aller plus loin !
457   - if (is_null($this->confLabinvent)) throw new \Exception("EXCEPTION: La table 'configurations' de la base de données est vide");
  401 + //debug($this->entity);
  402 + return $this->entity;
458 403 }
459 404  
  405 +
460 406 /**
461 407 * (EP)
462 408 * Autorisations PAR DÉFAUT
... ... @@ -472,19 +418,16 @@ class AppController extends Controller
472 418  
473 419 // $role = $this->getUserRole($user);
474 420  
475   - // Seul Administration (et +) peut ajouter, supprimer ou modifier
476   - if (in_array($action, ['add', 'edit', 'delete'])) {
  421 + // Seul Administration (et +) peut ajouter, supprimer ou modifier (pour la plupart des controleurs)
  422 + if (in_array($action, ['add', 'edit', 'delete']))
477 423 return ($this->USER_IS_ADMIN_AT_LEAST());
478 424 /*
479 425 if ($this->USER_IS_ADMIN_AT_LEAST()) return true;
480 426 // Les autres n'y ont pas accès
481 427 return false;
482 428 */
483   - }
484   -
485   - // By default
486   - // return parent::isAuthorized($user);
487 429  
  430 + // Sinon, on applique les règles générales par défaut
488 431 // Ne pas faire ça car $this sera interprété comme le controleur SPECIFIQUE et non AppController :
489 432 //return $this->isAuthorized($user);
490 433 // Donc, il faut être explicite :
... ... @@ -498,16 +441,22 @@ class AppController extends Controller
498 441 * Check whether a LOGGED in user has a set of permissions to perform a given action
499 442 * Give authorization in general
500 443 *
501   - * Autorisations APRES connexion
502   - * (AVANT, c'est initialize() et beforeFilter() qui s'en occupent)
  444 + * Autorisations APRES connexion, donc à partir d'ici le user est obligatoirement identifié
  445 + * (AVANT connexion, c'est initialize() et beforeFilter() qui gèrent)
503 446 *
504 447 * On tente d’autoriser ici les actions qui n’ont pas été autorisées
505 448 * par la méthode isAuthorized du controleur spécifique
506 449 *
  450 + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#autorisation
  451 + *
  452 + * $user est l'equivalent de $this->LdapAuth->user()
  453 + *
507 454 */
508 455 public function isAuthorized($user)
509 456 {
510 457 $this->myDebug("step 2C (general): AppController.isAuthorized()");
  458 +
  459 + // $user est l'equivalent de $this->LdapAuth->user()
511 460 $this->myDebug("- user is:", $user);
512 461  
513 462 /*
... ... @@ -517,39 +466,54 @@ class AppController extends Controller
517 466 * return true;
518 467 * }
519 468 */
520   - $configuration = $this->confLabinvent;
521   - $role = $this->getUserRole($user);
  469 + //$configuration = $this->confLabinvent;
  470 + //$role = $this->getUserRole($user);
  471 +
522 472 /*
523 473 * $role = TableRegistry::getTableLocator()->get('Users')->find()
524 474 * ->where(['username' => $user[$configuration->authentificationType_ldap][0]])
525 475 * ->first()['role'];
526 476 */
527   - $this->myDebug("- role is " . $role);
  477 + $this->myDebug("- role is " . $this->userRole);
  478 +
  479 + /*
  480 + $prefix = $this->request->getParam('prefix');
  481 + $this->myDebug("- prefix is $prefix");
  482 + */
528 483  
529 484 // BETTER:
530 485 // $action = $this->request->getAttribute('params')['action'];
531 486 // $action = $this->request->getParam('action');
532   - $action = $this->getActionPassed();
  487 + //$action = $this->getActionPassed();
533 488  
534 489 // error_log($action);
535   - $this->myDebug("- action is $action");
536   -
  490 + //$this->myDebug("- action is $action");
  491 + $this->myDebug("- action is $this->action");
  492 +
537 493 // On autorise ou pas l’action demandée :
538 494 // - Super-Admin peut accéder à toutes les actions
539   - if ($role == 'Super Administrateur') return true;
540   - // - Actions accessibles à TOUS les roles (profils), quelque soit le controleur
541   - if (in_array($action, [
  495 + //if ($role == 'Super Administrateur') return true;
  496 + if ($this->USER_IS_SUPERADMIN) return true;
  497 + // - Actions générales accessibles à TOUS les roles (profils), pour TOUT controleur
  498 + if (in_array($this->action, [
542 499 'index',
543 500 'view',
544 501 'add',
545 502 'find',
  503 + /* (EP sale ! => migré dans chaque controleur spécifique concerné)
  504 + // QrCode
546 505 'creer',
  506 + // Suivis
547 507 'getNextDate',
  508 + // Materiels
548 509 'getDateGarantie'
  510 + */
549 511 ])) return true;
550   - // - Pour toutes les autres actions => accès refusé (denied)
  512 +
  513 + // - Pour toutes les autres actions, par défaut => accès refusé (denied)
551 514 return false;
552   - }
  515 +
  516 + } // isAuthorized()
553 517  
554 518  
555 519 // (EP) Used by Materiels and Users Controllers
... ... @@ -663,6 +627,127 @@ class AppController extends Controller
663 627 return $this->userHasRole('Utilisateur');
664 628 }
665 629  
  630 +
  631 +
  632 + /**
  633 + * Initialization hook method.
  634 + * Use this method to add common initialization code like loading components.
  635 + * e.g. `$this->loadComponent('Security');`
  636 + *
  637 + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#id1
  638 + * ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#configuration-des-gestionnaires-d-authentification
  639 + *
  640 + * @return void
  641 + */
  642 + public function initialize()
  643 + {
  644 + $this->myDebug("step 0B (general): AppController.initialize()");
  645 +
  646 + parent::initialize();
  647 +
  648 + $this->loadComponent('RequestHandler');
  649 + $this->loadComponent('Flash');
  650 +
  651 + // Composant en charge de l'authentification
  652 +
  653 + // - sans LDAP :
  654 + /*
  655 + $this->loadComponent('Auth', [
  656 + 'authenticate' => [
  657 + 'Form' => [
  658 + 'fields' => [
  659 + 'username' => 'email',
  660 + 'password' => 'password'
  661 + ]
  662 + ]
  663 + // avec finder redéfini
  664 + 'Form' => [
  665 + 'finder' => 'auth' // va utiliser une méthode findAuth() dans UsersTable
  666 + ]
  667 + ],
  668 + 'loginAction' => [
  669 + 'controller' => 'Users',
  670 + 'action' => 'login'
  671 + ],
  672 + // If unauthorized, return them to page they were just on
  673 + 'unauthorizedRedirect' => $this->referer()
  674 + ]);
  675 + // Allow the display action so our PagesController
  676 + // continues to work. Also enable the read only actions.
  677 + $this->Auth->allow(['display', 'view', 'index']);
  678 + // Les autres actions sont redirigées sur /users/login
  679 + */
  680 +
  681 + // - avec LDAP :
  682 + /*
  683 + * If none of your users have hashed passwords, comment this block and $this->Auth->allow() calls.
  684 + * (par exemple dans beforeFilter())
  685 + * Then go and edit the user, saving a new password for them.
  686 + * After saving a new password for the user,
  687 + * make sure to uncomment the lines we just temporarily commented!
  688 + */
  689 + $this->loadComponent('LdapAuth', [
  690 + // Les AUTHORIZATIONS sont faites par Controleur
  691 + // (et non pas par un Component ou plugin)
  692 + // TODO: utiliser Authorization component plugin (cakephp v4)
  693 + //'authorize'=> 'Controller',
  694 + 'authorize' => ['Controller'],
  695 + /* pour Auth (au lieu de LdapAuth) on aurait aussi mis ceci :
  696 + 'authenticate' => [
  697 + 'Form' => [
  698 + 'fields' => [
  699 + 'userna100000000000000000000000000000000me' => 'email',
  700 + 'password' => 'password'
  701 + ]
  702 + ]
  703 + ],
  704 + */
  705 + // Redirection après login :
  706 + 'loginRedirect' => [
  707 + 'controller' => 'Pages',
  708 + //'action' => 'home'
  709 + 'action' => 'display',
  710 + 'home'
  711 + ],
  712 + // Redirection après logout :
  713 + 'logoutRedirect' => [
  714 + 'controller' => 'Pages',
  715 + 'action' => 'home'
  716 + ]
  717 + ]);
  718 + // On peut aussi configurer après :
  719 + // Message d'erreur en cas de refus de connexion
  720 + $this->LdapAuth->setConfig('authError', "Désolé, vous n'êtes pas autorisé à accéder à cette zone.");
  721 + /* Autres possibilités de config :
  722 + * $this->Auth->config('authenticate', [
  723 + * 'Form' => ['userModel' => 'Members']
  724 + * //'Basic' => ['userModel' => 'Members'],
  725 + * ]);
  726 + * $this->Auth->config('authorize', ['Controller']);
  727 + */
  728 + // Actions autorisées SANS authentification
  729 + // Allow the display action so our PagesController continues to work.
  730 + // Also enable the read only actions.
  731 + // Déplacé dans beforeFilter()
  732 + //$this->LdapAuth->allow(['display', 'view', 'index']);
  733 + // Autoriser TOUTES les actions SANS authentification :
  734 + //$this->LdapAuth->allow();
  735 +
  736 + // On charge la configuration
  737 + /*
  738 + $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()
  739 + ->where([
  740 + 'id =' => 1
  741 + ])
  742 + ->first();
  743 + */
  744 + $this->confLabinvent = TableRegistry::getTableLocator()->get('Configurations')->find()->first();
  745 + // (EP 23/5/19) Exception si la config est vide, inutile d'aller plus loin !
  746 + if (is_null($this->confLabinvent)) throw new \Exception("EXCEPTION: La table 'configurations' de la base de données est vide");
  747 +
  748 + } // initialize()
  749 +
  750 +
666 751 /**
667 752 *
668 753 * {@inheritdoc}
... ... @@ -679,19 +764,28 @@ class AppController extends Controller
679 764 */
680 765 public function beforeFilter(Event $event) {
681 766 // Affichages pour debug
  767 + //pr($event);
682 768 $this->myDebug("step 1B (general): AppController.beforeFilter()");
683 769 $controllerName = $this->request->getParam('controller');
684 770 $this->myDebug("- controller passed : $controllerName");
685   - $this->myDebug("- action passed : ".$this->getActionPassed());
686 771 $passedArgs = $this->request->getParam('pass');
687 772 $this->myDebug("- args passed : ", $passedArgs);
688 773 $query = $this->request->getQueryParams();
689 774 $this->myDebug("- query passed : ", $query);
690   - //pr($event);
691   -
692   - // !!! Ne jamais autoriser l'action 'login', sinon cela va créer des problèmes sur le fonctionnement normal de AuthComponent (cf doc) !!!
  775 +
  776 + // Initialisations pour la suite
  777 + // - L'entité concernée par l'action
  778 + // Par défaut null car certaines actions n'ont pas d'entité (ex : 'add', 'find', 'index', ...)
  779 + $this->entity = null;
  780 + // - L'action demandée et son id le cas échéant (nul par défaut, égal 0)
  781 + $this->action = $this->getActionPassed();
  782 + $this->myDebug("- action passed : ".$this->action);
  783 + $this->action_id = $this->getIdPassed();
  784 + $this->myDebug("- id passed : ".$this->action);
  785 +
693 786 parent::beforeFilter($event);
694 787  
  788 + // !!! Ne jamais autoriser l'action 'login', sinon cela va créer des problèmes sur le fonctionnement normal de AuthComponent (cf doc) !!!
695 789 /*
696 790 * EXEMPLES d'utilisation:
697 791 * // to allow all access to all actions:
... ... @@ -713,72 +807,75 @@ class AppController extends Controller
713 807 // TODO: (EP) A quoi ça sert ???
714 808 $this->request->getSession()->write("authType", $configuration->ldap_authenticationType);
715 809  
716   - // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié
717   - // (c'est à dire s'il n'est pas dans la table "utilisateurs")
718   - $this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists();
719   - //$role = $this->getUserRole();
720   - $this->userRole = $this->getUserRole();
721   - $profile = self::PROFILES["$this->userRole"];
722   - $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile");
723   -
724   - // Set General CONSTANTS for all CONTROLLERS
725   - // (Before, they used to be in beforeFilter())
726   - // - Users constants
727   - $this->userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0];
728   - //$this->set('username', $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]);
729   -
730   - $this->USER_IS_UTILISATEUR = ($profile == self::PROFILE_USER);
731   - $this->USER_IS_RESPONSABLE = ($profile == self::PROFILE_RESPONSABLE);
732   - $this->USER_IS_ADMIN = ($profile == self::PROFILE_ADMIN);
733   - $this->USER_IS_ADMINPLUS = ($profile == self::PROFILE_ADMINPLUS);
734   - $this->USER_IS_SUPERADMIN = ($profile == self::PROFILE_SUPERADMIN);
735   -
736   - $this->USER_IS_RESPONSABLE_OR_MORE = ($profile >= self::PROFILE_RESPONSABLE);
737   - $this->USER_IS_ADMIN_OR_MORE = ($profile >= self::PROFILE_ADMIN);
738   - $this->USER_IS_ADMINPLUS_OR_MORE = ($profile >= self::PROFILE_ADMINPLUS);
739   -
740   -
741   - // - Misc constants
742   - $this->idGmNa = TableRegistry::getTableLocator()->get('GroupesMetiers')->find()
743   - ->where([
744   - 'nom =' => 'N/A'
745   - ])
746   - ->first()['id'];
747   - $this->idGtNa = TableRegistry::getTableLocator()->get('GroupesThematiques')->find()
748   - ->where([
749   - 'nom =' => 'N/A'
750   - ])
751   - ->first()['id'];
  810 + // Groupes métier et technique
  811 + // id du Groupe métier N/A
  812 + $this->idGmNa = TableRegistry::getTableLocator()->get('GroupesMetiers')
  813 + ->find()->where(['nom =' => 'N/A'])->first()['id'];
  814 + // id du Groupe technique N/A
  815 + $this->idGtNa = TableRegistry::getTableLocator()->get('GroupesThematiques')
  816 + ->find()->where(['nom =' => 'N/A'])->first()['id'];
  817 +
  818 + // Utilisateur connecté (identifié) ?
  819 + $this->myDebug("- Utilisateur connecté ? : ", $this->LdapAuth->user() ? "oui" : "non");
  820 + $this->myDebug($this->LdapAuth->user());
  821 + // Si le user est connecté (identifié), on positionne quelques variables utiles
  822 + // - pour le controleur spécifique,
  823 + // - et pour la vue
  824 + if ($this->LdapAuth->user()) {
  825 + // ATTENTION, $priviledgedUser = NULL si l'utilisateur courant n'est pas un utilisateur privilégié
  826 + // (c'est à dire s'il n'est pas dans la table "utilisateurs")
  827 + $this->priviledgedUser = $this->getTablePriviledgedUserFromCurrentSessionUserIfExists();
  828 + //$role = $this->getUserRole();
  829 + $this->userRole = $this->getUserRole();
  830 + $profile = self::PROFILES["$this->userRole"];
  831 + $this->myDebug("- priviledgedUser is {$this->priviledgedUser}");
  832 + $this->myDebug("- userRole is {$this->getUserRole()}", "- profile is: $profile");
  833 + // L'utilisateur connecté (return null si pas connecté)
  834 + // $this->Auth->user('id');
  835 + $this->userName = $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0];
  836 + //$this->set('username', $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]);
  837 + $this->USER_IS_UTILISATEUR = ($profile == self::PROFILE_USER);
  838 + $this->USER_IS_RESPONSABLE = ($profile == self::PROFILE_RESPONSABLE);
  839 + $this->USER_IS_ADMIN = ($profile == self::PROFILE_ADMIN);
  840 + $this->USER_IS_ADMINPLUS = ($profile == self::PROFILE_ADMINPLUS);
  841 + $this->USER_IS_SUPERADMIN = ($profile == self::PROFILE_SUPERADMIN);
  842 +
  843 + $this->USER_IS_RESPONSABLE_OR_MORE = ($profile >= self::PROFILE_RESPONSABLE);
  844 + $this->USER_IS_ADMIN_OR_MORE = ($profile >= self::PROFILE_ADMIN);
  845 + $this->USER_IS_ADMINPLUS_OR_MORE = ($profile >= self::PROFILE_ADMINPLUS);
  846 +
  847 + // Positionne ces variables pour TOUTES les vues
  848 + $this->set('role', $this->userRole);
  849 + $this->set('profile', $profile);
  850 + $this->set('username', $this->userName);
  851 + $this->set('priviledgedUser', $this->priviledgedUser);
  852 +
  853 + $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR);
  854 + $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN);
  855 + $this->set('USER_IS_ADMINPLUS', $this->USER_IS_ADMINPLUS);
  856 + $this->set('USER_IS_SUPERADMIN', $this->USER_IS_SUPERADMIN);
  857 + $this->set('USER_IS_RESPONSABLE_OR_MORE', $this->USER_IS_RESPONSABLE_OR_MORE);
  858 + $this->set('USER_IS_RESPONSABLE', $this->USER_IS_RESPONSABLE);
  859 + //$this->set(compact('USER_IS_ADMIN_OR_MORE'));
  860 + $this->set('USER_IS_ADMIN_OR_MORE', $this->USER_IS_ADMIN_OR_MORE);
  861 + $this->set('USER_IS_ADMINPLUS_OR_MORE', $this->USER_IS_ADMINPLUS_OR_MORE);
  862 +
  863 + // (EP) TODO: vraiment utile ??? A virer, non ?
  864 + $this->set('PROFILE_USER', self::PROFILE_USER);
  865 + $this->set('PROFILE_ADMIN', self::PROFILE_ADMIN);
  866 + $this->set('PROFILE_RESPONSABLE', self::PROFILE_RESPONSABLE);
  867 + $this->set('PROFILE_ADMINPLUS', self::PROFILE_ADMINPLUS);
  868 + $this->set('PROFILE_SUPERADMIN', self::PROFILE_SUPERADMIN);
  869 + // $this->set('allProfiles', $this->allProfiles);
  870 + $this->set('allProfiles', self::PROFILES);
  871 + }
752 872  
753 873 // Now, set these constants for all VIEWS
754   -
755 874 $this->set(compact('configuration'));
756 875 $this->set(compact('D'));
757 876  
758   - $this->set('role', $this->userRole);
759   - $this->set('profile', $profile);
760   - $this->set('username', $this->userName);
761   - $this->set('priviledgedUser', $this->priviledgedUser);
762 877 $this->set('idGmNa', $this->idGmNa);
763 878 $this->set('idGtNa', $this->idGtNa);
764   - $this->set('USER_IS_UTILISATEUR', $this->USER_IS_UTILISATEUR);
765   - $this->set('USER_IS_ADMIN', $this->USER_IS_ADMIN);
766   - $this->set('USER_IS_ADMINPLUS', $this->USER_IS_ADMINPLUS);
767   - $this->set('USER_IS_SUPERADMIN', $this->USER_IS_SUPERADMIN);
768   - $this->set('USER_IS_RESPONSABLE_OR_MORE', $this->USER_IS_RESPONSABLE_OR_MORE);
769   - $this->set('USER_IS_RESPONSABLE', $this->USER_IS_RESPONSABLE);
770   - //$this->set(compact('USER_IS_ADMIN_OR_MORE'));
771   - $this->set('USER_IS_ADMIN_OR_MORE', $this->USER_IS_ADMIN_OR_MORE);
772   - $this->set('USER_IS_ADMINPLUS_OR_MORE', $this->USER_IS_ADMINPLUS_OR_MORE);
773   -
774   - // (EP) TODO: vraiment utile ??? A virer, non ?
775   - $this->set('PROFILE_USER', self::PROFILE_USER);
776   - $this->set('PROFILE_ADMIN', self::PROFILE_ADMIN);
777   - $this->set('PROFILE_RESPONSABLE', self::PROFILE_RESPONSABLE);
778   - $this->set('PROFILE_ADMINPLUS', self::PROFILE_ADMINPLUS);
779   - $this->set('PROFILE_SUPERADMIN', self::PROFILE_SUPERADMIN);
780   - // $this->set('allProfiles', $this->allProfiles);
781   - $this->set('allProfiles', self::PROFILES);
782 879  
783 880 // On autorise certaines actions SANS connexion (ces actions sont donc publiques)
784 881 // - pour le mode spécial “installation” => on autorise pleins d’actions sans login
... ... @@ -796,11 +893,12 @@ class AppController extends Controller
796 893 // Autoriser TOUTES les actions SANS authentification
797 894 //$this->LdapAuth->allow();
798 895  
799   - $allowed_actions = $this->LdapAuth->allowedActions;
800   - $this->myDebug("- Actions allowed are: ", $allowed_actions);
  896 + $this->myDebug("- Actions allowed are: ", $this->LdapAuth->allowedActions);
801 897  
  898 + /* (EP 20200427 migré dans initialize())
  899 + // Message d'erreur en cas de refus de connexion
802 900 $this->LdapAuth->setConfig('authError', "Désolé, vous n'êtes pas autorisé à accéder à cette zone.");
803   - //exit;
  901 + */
804 902  
805 903 } // beforeFilter()
806 904  
... ... @@ -914,25 +1012,25 @@ class AppController extends Controller
914 1012 /*
915 1013 * @todo EP 08/2017 Nouvelle organisation des ACL avec $easyACL
916 1014 */
917   - $action = $this->getActionPassed();
918   - if (in_array($action, array(
  1015 + //$action = $this->getActionPassed();
  1016 + if (in_array($this->action, array(
919 1017 'add',
920 1018 'edit',
921 1019 'view',
922 1020 'index'
923 1021 ))) {
924   - $hiddenFields = $this->getHiddenFieldsForAction($action);
  1022 + $hiddenFields = $this->getHiddenFieldsForAction($this->action);
925 1023 $this->set('hiddenFields', $hiddenFields);
926 1024 $this->myDebug(compact("hiddenFields"));
927   - if (in_array($action, array(
  1025 + if (in_array($this->action, array(
928 1026 'add',
929 1027 'edit'
930 1028 ))) {
931   - $mandatoryFields = $this->getMandatoryFieldsForAction($action);
  1029 + $mandatoryFields = $this->getMandatoryFieldsForAction($this->action);
932 1030 $this->set('mandatoryFields', $mandatoryFields);
933   - $readOnlyFields = $this->getReadOnlyFieldsForAction($action);
  1031 + $readOnlyFields = $this->getReadOnlyFieldsForAction($this->action);
934 1032 $this->set('readOnlyFields', $readOnlyFields);
935   - $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($action);
  1033 + $haveDefaultValueFields = $this->getDefaultValueFieldsForAction($this->action);
936 1034  
937 1035 // only for DEBUG :
938 1036 //$this->myDebug("mandat, ro, default fields=", $mandatoryFields, $readOnlyFields, $haveDefaultValueFields);
... ...
src/Controller/MaterielsController.php
... ... @@ -152,6 +152,7 @@ class MaterielsController extends AppController
152 152 {
153 153 $this->myDebug("step 0A (specific): MaterielsController.initialize()");
154 154 parent::initialize();
  155 +
155 156 // On autorise l'action add SANS authentification (unauthenticated)
156 157 //$this->Auth->allow(['add']);
157 158 }
... ... @@ -169,14 +170,11 @@ class MaterielsController extends AppController
169 170 public function beforeFilter(\Cake\Event\Event $event)
170 171 {
171 172 $this->myDebug("step 1A (specific): MaterielsController.beforeFilter()");
  173 + parent::beforeFilter($event);
172 174  
173   - // ICI CEST OK
174   - /*
175   - $toto="tititoto";
176   - $this->set(compact('toto'));
177   - */
  175 + // Si on veut autoriser des actions SANS connexion, suffit de décommenter cette ligne
  176 + //$this->LdapAuth->allow([ 'view', 'index' ]);
178 177  
179   - parent::beforeFilter($event);
180 178 }
181 179  
182 180  
... ... @@ -240,7 +238,7 @@ class MaterielsController extends AppController
240 238 }
241 239 */
242 240  
243   - }
  241 + } // beforeRender()
244 242  
245 243  
246 244  
... ... @@ -248,7 +246,7 @@ class MaterielsController extends AppController
248 246 /**
249 247 *
250 248 * //param $user
251   - * @param $userFromSession
  249 + * @param $user
252 250 * @return boolean Give authorization for materiels
253 251 *
254 252 * On définit ici les actions autorisées ou pas par ce contrôleur spécifique
... ... @@ -256,19 +254,25 @@ class MaterielsController extends AppController
256 254 * CAKEPHP function
257 255 *
258 256 */
259   - public function isAuthorized($userFromSession) {
  257 + //public function isAuthorized($userFromSession) {
  258 + public function isAuthorized($user) {
260 259 //if (parent::isAuthorized($userFromSession)) return TRUE;
261 260 $this->myDebug("step 2A (specific): MaterielsController.isAuthorized(user)");
262   - $this->myDebug("- user is:", $userFromSession);
  261 + $this->myDebug("- user is:", $user);
263 262 /* ICI C'EST OK
264 263 $toto="tititoto";
265 264 $this->set(compact('toto'));
266 265 */
267 266  
268   - $this->userFromSession = $userFromSession;
269   - $configuration = $this->confLabinvent;
  267 + /*
  268 + $prefix = $this->request->getParam('prefix');
  269 + $this->myDebug("- prefix is $prefix");
  270 + */
  271 +
  272 + $this->userFromSession = $user;
  273 + //$configuration = $this->confLabinvent;
270 274 // ex: 'uid'
271   - $this->userCname = $userFromSession[$configuration->ldap_authenticationType][0];
  275 + $this->userCname = $user[$this->confLabinvent->ldap_authenticationType][0];
272 276 /*
273 277 * $role = TableRegistry::get('Users')->find()
274 278 * ->where(['username' => $user[$configuration->authentificationType_ldap][0]])
... ... @@ -280,12 +284,15 @@ class MaterielsController extends AppController
280 284  
281 285 // $this->myDebug("role is ".$role);
282 286 // debug("role is ".$role);
  287 +
283 288 // BETTER:
284 289 // $action = $this->request->getAttribute('params')['action'];
285 290 // $action = $this->request->getParam('action');
286   - $action = $this->getActionPassed();
  291 + //$action = $this->getActionPassed();
  292 +
287 293 // $id = (int) $this->request->getParam('pass.0');
288   - $id = $this->getIdPassed();
  294 + //$id = $this->getIdPassed();
  295 + ///$this->action_id = $this->getIdPassed();
289 296 //debug($id);
290 297  
291 298 // ACTIONS QUI SONT TOUJOURS AUTORISÉES QUELQUE SOIT LE PROFIL
... ... @@ -307,11 +314,20 @@ class MaterielsController extends AppController
307 314 return $article->user_id === $user['id'];
308 315 */
309 316  
  317 + $id = $this->action_id;
  318 +
310 319 // On autorise ou pas l’action demandée :
311   - // - SUPERADMIN : par défaut il a tous les droits, non mais !
312   - // (sauf 'edit' si matos validé, pour faire comme pour admin)
313   - if ( $this->userRole=='Super Administrateur' && $action!='edit' ) return true;
314   - /* - Autres cas : on return isAuthorizedAction()
  320 + // - SUPERADMIN : par défaut il a TOUS les droits
  321 + // (sauf certaines actions afin de lui donner un comportement proche de ADMIN)
  322 + if ($this->USER_IS_SUPERADMIN) {
  323 + // edit ou add by copy => ssi CREATED
  324 + if ( $this->action =='edit' || ($this->action=='add' && $id>0) ) return $this->isCreated($id);
  325 + // archivage => admin only
  326 + //if ($this->action == 'statusArchived') return false;
  327 + // tout le reste => ok
  328 + return true;
  329 + }
  330 + /* - Autres users : on return isAuthorizedAction()
315 331 *
316 332 * C’est une fonction interne développée pour labinvent
317 333 * Elle return true ou false selon que l’action est autorisée ou pas.
... ... @@ -323,13 +339,16 @@ class MaterielsController extends AppController
323 339 * //return $this->isAuthorizedAction($this, $user, $role, $action, $id);
324 340 * Tout le reste en dessous de cette ligne devient inutile !!!
325 341 */
326   - $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $action, $id, $userFromSession));
  342 + $this->myDebug("isAuthorizedAction ? " . $this->isAuthorizedAction2($this, $this->userRole, $this->action, $id, $user));
  343 + return $this->isAuthorizedAction();
  344 + /*
327 345 return $this->isAuthorizedAction(
328 346 $this->userRole,
329   - $action, $id,
330   - $userFromSession,
  347 + $this->action, $id,
  348 + $user,
331 349 $this->userCname
332 350 );
  351 + */
333 352  
334 353 } // isAuthorized
335 354  
... ... @@ -340,7 +359,18 @@ class MaterielsController extends AppController
340 359 * Les 3 niveaux successifs parcourus par cakephp (isAuthorized() puis beforeRender() puis la VUE) font tous appels à cette MEME fonction
341 360 * On ne définit et modifie les droits qu'ici et nulle part ailleurs, surtout pas dans les vues !!!
342 361 */
343   - private function isAuthorizedAction($role, $action, $id, $user, $userCname) {
  362 + private function isAuthorizedAction($action = null) {
  363 + if (!$action) $action = $this->action;
  364 + //$id = $this->getIdPassed();
  365 + //debug("action $action, id $this->action_id");
  366 + //return $this->isAuthorizedActionFor($action, $this->getIdPassed(), $this->userRole, $this->userFromSession, $this->userCname);
  367 + return $this->isAuthorizedActionFor(
  368 + $action?$action:$this->action, $this->action_id,
  369 + $this->userRole,
  370 + $this->userFromSession, $this->userCname
  371 + );
  372 + }
  373 + private function isAuthorizedActionFor($action, $id, $role, $user, $userCname) {
344 374  
345 375 /*
346 376 * Structure mise en place:
... ... @@ -365,43 +395,82 @@ class MaterielsController extends AppController
365 395  
366 396 // (EP 17/5/19) CREATE (add) BY COPY (add/id)
367 397 case 'add':
  398 + //debug("this is"); debug($this);
368 399 //debug($id);
369 400 // add by COPY (il y a un id) => on traite
370 401 if ($id > 0) {
  402 +
371 403 // ON AUTORISE SEULEMENT LA COPIE D'UN MATOS "CREATED"
372 404 // not CREATED => pas le droit de copier un materiel pas CREATED
373 405 if (! $this->isCreated($id)) return FALSE;
374 406 // CREATED => ok, sous conditions
375   - else {
376   - //debug("copie created");
377   - //if ($this->isCreated($id) || $this->isValidated($id)) {
378   - /*
379   - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) {
380   - * return true;
381   - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
382   - * return true;
383   - * } else if ($this->userHasRoleAtLeast('Administration')) {
384   - * return true;
385   - * }
386   - */
387   - switch ($role) {
388   - case 'Utilisateur':
389   - //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]);
390   - return $this->isHis($id, $user);
391   - break;
392   - case 'Responsable':
393   - return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) );
394   - default: // All other roles (Admin and more) => OK
395   - return TRUE;
396   - break;
397   - }
398   - } // CREATED
  407 + //debug("copie created");
  408 + //if ($this->isCreated($id) || $this->isValidated($id)) {
  409 + /*
  410 + * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) {
  411 + * return true;
  412 + * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  413 + * return true;
  414 + * } else if ($this->userHasRoleAtLeast('Administration')) {
  415 + * return true;
  416 + * }
  417 + */
  418 + switch ($role) {
  419 + case 'Utilisateur':
  420 + //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]);
  421 + return $this->isHis($id, $user);
  422 + case 'Responsable':
  423 + return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) );
  424 + }
  425 + // All other roles (Admin and more) => OK
  426 + return TRUE;
399 427 } // ADD by COPIE
400 428 break; // ADD
401   -
  429 +
  430 + // DELETE
  431 + case 'delete':
  432 +
  433 + /*
  434 + * (EP) ACL:
  435 + * SSi materiel CREATED, autoriser :
  436 + * - user : si createur de la fiche ou owner du materiel
  437 + * - resp : si responsable du groupe thematique ou metier de ce materiel
  438 + * - admin et + : toujours
  439 + */
  440 + if ($this->isCreated($id)) {
  441 + /*
  442 + * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) {
  443 + * return true;
  444 + * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
  445 + * return true;
  446 + * } else if ($this->userHasRoleAtLeast('Administration')) {
  447 + * return true;
  448 + * }
  449 + */
  450 + switch ($role) {
  451 + case 'Utilisateur':
  452 + //return ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]));
  453 + return $this->isHis($id, $user);
  454 + break;
  455 + case 'Responsable':
  456 + return ($this->isRespGroup($id, $userCname));
  457 + break;
  458 + // All other roles : Admin and more
  459 + default:
  460 + return true;
  461 + break;
  462 + }
  463 + }
  464 + break;
  465 +
402 466 // UPDATE (edit)
403 467 // if ($action == 'edit') {
404 468 case 'edit':
  469 + /*
  470 + debug("entity is"); debug($this->entity);
  471 + $this->getEntity();
  472 + debug("entity is"); debug($this->entity);
  473 + */
405 474 // BETTER:
406 475 // $id = (int) $this->request->getAttribute('params')['pass'][0];
407 476 // /$id = (int) $this->request->getParam('pass.0');
... ... @@ -424,18 +493,19 @@ class MaterielsController extends AppController
424 493 */
425 494  
426 495 // (EP 23/5/19) NEW optimization
427   - $materiel = $this->Materiels->get($id, ['contain' => [
428   - 'SurCategories',
429   - 'Categories',
430   - 'SousCategories',
431   - 'GroupesThematiques',
432   - 'GroupesMetiers',
433   - 'Organismes',
434   - 'Sites',
435   - 'Documents',
436   - 'Emprunts',
437   - 'Suivis',
438   - 'Fournisseurs'
  496 + $materiel = $this->Materiels->get($id, [
  497 + 'contain' => [
  498 + 'SurCategories',
  499 + 'Categories',
  500 + 'SousCategories',
  501 + 'GroupesThematiques',
  502 + 'GroupesMetiers',
  503 + 'Organismes',
  504 + 'Sites',
  505 + 'Documents',
  506 + 'Emprunts',
  507 + 'Suivis',
  508 + 'Fournisseurs'
439 509 ]
440 510 ]);
441 511  
... ... @@ -458,82 +528,16 @@ class MaterielsController extends AppController
458 528 ($this->USER_IS_RESPONSABLE && $USER_IS_SAME_GROUP_AS_MATERIEL)
459 529 );
460 530 return $CAN_EDIT;
  531 + // edit
  532 +
461 533  
462   - // (EP 23/5/19) OLD METHOD
463   - /*
464   - // (EP 17/5/19) ON AUTORISE SEULEMENT LA MODIF D'UN MATOS CREATED
465   - // UN user Admin ou plus ne pourra le modifier qu'à condition de le "dé-valider" avant
466   - if ($this->isCreated($id)) {
467   - //if ($this->isCreated($id) || $this->isValidated($id)) {
468   - /STAR
469   - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) {
470   - * return true;
471   - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
472   - * return true;
473   - * } else if ($this->userHasRoleAtLeast('Administration')) {
474   - * return true;
475   - * }
476   - STAR/
477   - switch ($role) {
478   - case 'Utilisateur':
479   - //return $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]);
480   - return $this->isHis($id, $user);
481   - break;
482   - case 'Responsable':
483   - // return ($this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0]));
484   - //return ($this->isRespGroup($id, $userCname));
485   - //return ($this->isRespGroup($id, $userCname) || $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]));
486   - return ( $this->isHis($id, $user) || $this->isRespGroup($id, $userCname) );
487   - default: // All other roles (Admin and more) => OK
488   - return TRUE;
489   - break;
490   - }
491   - }
492   - /STAR
493   - (EP 17/5/19) : Ben non, pas le droit, faudra dé-valider avant, non mais !!!
494   - if ($this->userHasRoleAtLeast('Administration Plus')) {
495   - return true;
496   - }
497   - STAR/
498   - break; // EDIT
499   - */
500   -
501   - // DELETE
502   - case 'delete':
503   -
504   - /*
505   - * (EP) ACL:
506   - * SSi materiel CREATED, autoriser :
507   - * - user : si createur de la fiche ou owner du materiel
508   - * - resp : si responsable du groupe thematique ou metier de ce materiel
509   - * - admin et + : toujours
510   - */
511   - if ($this->isCreated($id)) {
512   - /*
513   - * if ($role == 'Utilisateur' && $this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0])) {
514   - * return true;
515   - * } else if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->authentificationType_ldap][0])) {
516   - * return true;
517   - * } else if ($this->userHasRoleAtLeast('Administration')) {
518   - * return true;
519   - * }
520   - */
521   - switch ($role) {
522   - case 'Utilisateur':
523   - //return ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]));
524   - return $this->isHis($id, $user);
525   - break;
526   - case 'Responsable':
527   - return ($this->isRespGroup($id, $userCname));
528   - break;
529   - // All other roles : Admin and more
530   - default:
531   - return true;
532   - break;
533   - }
534   - }
535   - break;
  534 + case 'export':
  535 + // if ($this->userHasRoleAtLeast('Responsable')) {
  536 + return $this->USER_IS_RESP_AT_LEAST();
536 537  
  538 + case 'getDateGarantie':
  539 + return true;
  540 +
537 541 case 'statusCreated': // de-validation d'un materiel (repasse à CREATED)
538 542 // /$id = (int) $this->request->getParam('pass.0');
539 543 // Admin + ok
... ... @@ -574,21 +578,17 @@ class MaterielsController extends AppController
574 578 break;
575 579  
576 580 case 'statusArchived':
  581 + return $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST();
577 582 // /$id = (int) $this->request->getAttribute('params')['pass'][0];
578 583 // if ($this->userHasRoleAtLeast('Administration')) {
579 584 // if ($role == 'Super Administrateur') {
  585 + /*
580 586 if ( $this->isToBeArchived($id) && $this->USER_IS_ADMIN_AT_LEAST() ) {
581 587 if ($this->USER_IS_SUPERADMIN()) return false;
582 588 return true;
583 589 }
584 590 break;
585   -
586   - case 'export':
587   - // if ($this->userHasRoleAtLeast('Responsable')) {
588   - if ($this->USER_IS_RESP_AT_LEAST()) {
589   - return true;
590   - }
591   - break;
  591 + */
592 592  
593 593 /*
594 594 * if (in_array($action, [
... ... @@ -603,11 +603,17 @@ class MaterielsController extends AppController
603 603 case 'setLabelIsPlaced':
604 604 case 'setLabelIsPlacedOrNotPlaced':
605 605 case 'setLabelIsNotPlaced':
606   - case 'printLabelRuban':
  606 + return $this->USER_IS_ADMIN_AT_LEAST();
  607 + /*
607 608 // if ($this->userHasRoleAtLeast('Administration')) {
608   - if ($this->USER_IS_ADMIN_AT_LEAST())
609   - return true;
  609 + if ($this->USER_IS_ADMIN_AT_LEAST()) return true;
610 610 break;
  611 + */
  612 +
  613 + case 'printLabelRuban':
  614 + $materiel = $this->Materiels->get($id);
  615 + $IS_VALIDATED = ($materiel->status == 'VALIDATED');
  616 + return $IS_VALIDATED && $this->confLabinvent->hasPrinter && $this->USER_IS_ADMIN_OR_MORE;
611 617  
612 618 /*
613 619 * // Autorisations par defaut:
... ... @@ -621,8 +627,10 @@ class MaterielsController extends AppController
621 627 // => DEFAULT PARENT RULE
622 628 // (on appelle la méthode isAuthorized() de AppController)
623 629 return parent::isAuthorized($user);
  630 +
624 631 } // isAuthorizedAction()
625 632  
  633 +
626 634 /*
627 635 * @todo A déplacer dans Model/Table/TableMateriels
628 636 * cf https://book.cakephp.org/3.0/fr/tutorials-and-examples/blog-auth-example/auth.html
... ... @@ -630,6 +638,9 @@ class MaterielsController extends AppController
630 638 // True if materiel with id $id is owned by $nomCreateur
631 639 public function isOwnedBy($id, $nomCreateur)
632 640 {
  641 + $entity = $this->getEntity($id);
  642 + return in_array($nomCreateur, [$entity->nom_createur, $entity->nom_responsable]);
  643 + /*
633 644 return ($this->Materiels->exists([
634 645 'id' => $id,
635 646 'nom_createur' => $nomCreateur
... ... @@ -637,6 +648,7 @@ class MaterielsController extends AppController
637 648 'id' => $id,
638 649 'nom_responsable' => $nomCreateur
639 650 ]));
  651 + */
640 652 }
641 653  
642 654 // True if materiel with id $id is owned by current user
... ... @@ -646,69 +658,69 @@ class MaterielsController extends AppController
646 658  
647 659 public function isRespGroup($id, $loginResponsable)
648 660 {
649   - $userFromTable = TableRegistry::get('Users')->find()
650   - ->where([
651   - 'username' => $loginResponsable
652   - ])
  661 + // Get user
  662 + $u = TableRegistry::getTableLocator()->get('Users')
  663 + ->find()
  664 + ->where(['username' => $loginResponsable])
653 665 ->first();
654   - $u = $userFromTable;
655 666  
656   - if ($u['groupes_metier_id'] !== null && $u['groupes_metier_id'] != TableRegistry::get('GroupesMetiers')->find()
657   - ->where([
658   - 'nom =' => 'N/A'
659   - ])
660   - ->first()['id']) {
661   - return ($this->Materiels->exists([
662   - 'id' => $id,
663   - 'groupes_metier_id' => $u['groupes_metier_id']
664   - ]));
665   - } else if ($u['groupe_thematique_id'] !== null && $u['groupe_thematique_id'] != TableRegistry::get('GroupesThematiques')->find()
666   - ->where([
667   - 'nom =' => 'N/A'
668   - ])
669   - ->first()['id']) {
670   - // BETTER:
671   - return ($this->Materiels->exists([
672   - 'id' => $id,
673   - 'groupes_thematique_id' => $u['groupe_thematique_id']
674   - ]));
675   - } else {
676   - return false;
677   - }
678   - }
679   -
680   - public function isCreated($id)
681   - {
682   - return $this->Materiels->exists([
683   - 'id' => $id,
684   - 'status' => 'CREATED'
685   - ]);
686   - }
687   -
688   - public function isValidated($id)
689   - {
690   - return $this->Materiels->exists([
691   - 'id' => $id,
692   - 'status' => 'VALIDATED'
693   - ]);
694   - }
695   -
696   - public function isToBeArchived($id)
697   - {
698   - return $this->Materiels->exists([
699   - 'id' => $id,
700   - 'status' => 'TOBEARCHIVED'
701   - ]);
702   - }
  667 + // Responsable groupe métier ?
  668 + $group = 'groupes_metier';
  669 + $group_fk = $group.'_id';
  670 + if (
  671 + $u[$group_fk] !== null
  672 + &&
  673 + $u[$group_fk] != TableRegistry::getTableLocator()->get('GroupesMetiers')
  674 + ->find()
  675 + ->where(['nom =' => 'N/A'])
  676 + ->first()['id']
  677 + ) return $this->getEntity($id)->$group_fk == $u[$group_fk];
  678 + /*
  679 + return $this->Materiels->exists([
  680 + 'id' => $id,
  681 + 'groupes_metier_id' => $u['groupes_metier_id']
  682 + ]);
  683 + */
  684 +
  685 + // Responsable groupe thématique ?
  686 + $group = 'groupe_thematique';
  687 + $group_fk = $group.'_id';
  688 + if (
  689 + $u[$group_fk] !== null
  690 + &&
  691 + $u[$group_fk] != TableRegistry::getTableLocator()->get('GroupesThematiques')
  692 + ->find()
  693 + ->where(['nom =' => 'N/A'])
  694 + ->first()['id']
  695 + ) return $this->getEntity($id)->$group_fk == $u[$group_fk];
  696 + /*
  697 + return $this->Materiels->exists([
  698 + 'id' => $id,
  699 + 'groupes_thematique_id' => $u['groupe_thematique_id']
  700 + ]);
  701 + */
  702 +
  703 + // sinon, pas responsable de groupe
  704 + return false;
  705 +
  706 + } // isRespGroup
  707 +
703 708  
704   - public function isArchived($id)
705   - {
  709 + public function hasStatus($id, $status) {
  710 + return $this->getEntity($id)->status == $status;
  711 + /*
706 712 return $this->Materiels->exists([
707 713 'id' => $id,
708   - 'status' => 'ARCHIVED'
  714 + 'status' => $status
709 715 ]);
  716 + */
710 717 }
  718 + public function isCreated($id) { return $this->hasStatus($id, 'CREATED'); }
  719 + public function isValidated($id) { return $this->hasStatus($id, 'VALIDATED'); }
  720 + public function isToBeArchived($id) { return $this->hasStatus($id, 'TOBEARCHIVED'); }
  721 + public function isArchived($id) { return $this->hasStatus($id, 'ARCHIVED'); }
711 722  
  723 +
712 724 /**
713 725 * Index method
714 726 *
... ... @@ -924,46 +936,31 @@ class MaterielsController extends AppController
924 936 $CAN_INVALIDATE = !$IS_CREATED && $CAN_VALIDATE_OR_INVALIDATE;
925 937 $CAN_TBA = $IS_VALIDATED && $CONTEXT1;
926 938 $CAN_ARCHIVE = $IS_TOBEARCHIVED && $this->USER_IS_ADMIN_OR_MORE;
927   - $this->set(compact('CAN_VALIDATE'));
928   - $this->set(compact('CAN_INVALIDATE'));
929   - $this->set(compact('CAN_TBA'));
930   - $this->set(compact('CAN_ARCHIVE'));
  939 + $this->set(compact('CAN_VALIDATE', 'CAN_INVALIDATE', 'CAN_TBA', 'CAN_ARCHIVE'));
931 940  
932 941 $CAN_ATTACH_A_DOC = $CONTEXT1;
933   - $this->set(compact('CAN_ATTACH_A_DOC'));
934   -
935 942 $CAN_MANAGE_SUIVIS = $CONTEXT1;
936   - $this->set(compact('CAN_MANAGE_SUIVIS'));
937   -
938 943 $CAN_MANAGE_EMPRUNTS = $CONTEXT1;
939   - $this->set(compact('CAN_MANAGE_EMPRUNTS'));
940   -
941 944 $CAN_MANAGE_FILES = $CONTEXT1;
942   - $this->set(compact('CAN_MANAGE_FILES'));
  945 + $this->set(compact('CAN_ATTACH_A_DOC', 'CAN_MANAGE_SUIVIS', 'CAN_MANAGE_EMPRUNTS', 'CAN_MANAGE_FILES'));
943 946  
944 947 // NEW
945   - //TODO: faire la meme chose pour tous les autres $CAN_
946   - $CAN_EDIT = $this->isAuthorizedAction($this->userRole, 'edit', $id, $this->userFromSession, $this->userCname);
  948 + //TODO: faire la meme chose pour tous les $CAN_*
  949 + //$CAN_EDIT = $this->isAuthorizedAction($this->userRole, 'edit', $id, $this->userFromSession, $this->userCname);
  950 + $CAN_EDIT = $this->isAuthorizedAction('edit');
947 951 // OLD
948 952 //$CAN_EDIT = $IS_CREATED && $CAN_ATTACH_A_DOC;
949   - $this->set(compact('CAN_EDIT'));
950   -
951 953 $CAN_COPY = $CAN_EDIT;
952   - $this->set(compact('CAN_COPY'));
953   -
954   - $configuration = $this->confLabinvent;
955   - $CAN_PRINT_LABEL = $IS_VALIDATED && $configuration->hasPrinter && $this->USER_IS_ADMIN_OR_MORE;
956   - $this->set(compact('CAN_PRINT_LABEL'));
957 954  
  955 + //$CAN_PRINT_LABEL = $IS_VALIDATED && $this->confLabinvent->hasPrinter && $this->USER_IS_ADMIN_OR_MORE;
  956 + //$CAN_PRINT_LABEL = $this->isAuthorizedAction($this->userRole, 'printLabelRuban', $id, $this->userFromSession, $this->userCname);
  957 + $CAN_PRINT_LABEL = $this->isAuthorizedAction('printLabelRuban');
958 958  
  959 + $this->set(compact('CAN_EDIT', 'CAN_COPY', 'CAN_PRINT_LABEL'));
959 960  
960 961 // $status = $this->allStatus[$materiel->status];
961 962 $status = self::allStatus[$materiel->status];
962   - $this->set('IS_CREATED', $IS_CREATED);
963   - $this->set('IS_VALIDATED', $IS_VALIDATED);
964   - $this->set('IS_TOBEARCHIVED', $IS_TOBEARCHIVED);
965   - $this->set('IS_ARCHIVED', $IS_ARCHIVED);
966   - $this->set('status', $status);
  963 + $this->set(compact('status', 'IS_CREATED', 'IS_VALIDATED', 'IS_TOBEARCHIVED', 'IS_ARCHIVED'));
967 964  
968 965 $sites = TableRegistry::getTableLocator()->get('Sites');
969 966 //$sites = TableLocator::get('Sites');
... ... @@ -1071,6 +1068,7 @@ class MaterielsController extends AppController
1071 1068 //$this->myDebug($materiel);
1072 1069 }
1073 1070  
  1071 +
1074 1072 /* SI POST
1075 1073 * Les données ont été saisies et postées
1076 1074 * On va donc les sauvegarder
... ... @@ -1227,7 +1225,7 @@ class MaterielsController extends AppController
1227 1225 'valueField' => 'nom',
1228 1226 'order' => 'Sites.nom'
1229 1227 ]);
1230   - $designation = $this->Materiels->find('list', [
  1228 + $designations = $this->Materiels->find('list', [
1231 1229 'keyField' => 'designation',
1232 1230 'valueField' => 'designation',
1233 1231 'conditions' => array(
... ... @@ -1440,7 +1438,7 @@ class MaterielsController extends AppController
1440 1438 'groupesThematiques', 'groupesMetiers',
1441 1439 'organismes', 'sites',
1442 1440 'domaineresp',
1443   - 'designation',
  1441 + //'designations',
1444 1442 'lieu_detail',
1445 1443 'fournisseurs',
1446 1444 //'utilisateurs',
... ... @@ -1454,6 +1452,7 @@ class MaterielsController extends AppController
1454 1452 'materiel',
1455 1453 ]);
1456 1454 */
  1455 +
1457 1456  
1458 1457 } //add_or_edit()
1459 1458  
... ...
src/Controller/PagesController.php
... ... @@ -78,44 +78,46 @@ class PagesController extends AppController
78 78 // (20200424 EP)
79 79 public function beforeFilter(\Cake\Event\Event $event) {
80 80 $this->myDebug("step 1A (specific): PagesController.beforeFilter()");
  81 + // On donne d'abord les autorisations par défaut de AppController
  82 + parent::beforeFilter($event);
81 83  
  84 + // Puis on ajoute les autorisations spécifiques
82 85 /*
83 86 $path = func_get_args();
84 87 pr($path);
85 88 $page = null;
86 89 if (! empty($path[0])) $page = $path[0];
87 90 */
88   - $page = $this->request->getParam('pass.0');
89   -
90   - // On autorise l'action display SANS connexion
91   - // mais seulement pour la page 'about'
92   - //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no";
93   - if ( $page == 'about' ) $this->LdapAuth->allow(['display']);
94   - //if ( in_array($page, ['about', 'tools']) ) $this->LdapAuth->allow(['display']);
  91 + $this->action = $this->getActionPassed();
  92 + if ($this->action == "display") {
  93 + $this->page = $this->request->getParam('pass.0');
  94 +
  95 + // On autorise l'action display SANS connexion
  96 + // mais seulement pour la page 'about'
  97 + //if (in_array($path[0], ['about', 'tools'])) echo "yes"; else echo "no";
  98 + if ( $this->page == 'about' ) $this->LdapAuth->allow(['display']);
  99 + //if ( in_array($page, ['about', 'tools']) ) $this->LdapAuth->allow(['display']);
  100 + }
95 101  
96   - // Pour le reste, on donne les droits par défaut de AppController
97   - parent::beforeFilter($event);
98 102 }
99 103  
100 104 public function isAuthorized($user) {
101 105 $this->myDebug("step 2A (specific): PagesController.isAuthorized(user)");
102 106 $this->myDebug("- user is:", $user);
103 107  
104   - $action = $this->getActionPassed();
105   -
106   - if ($action == 'display') {
  108 + if ($this->action == 'display') {
107 109  
108   - $page = $this->request->getParam('pass.0');
  110 + //$page = $this->request->getParam('pass.0');
109 111  
110 112 // Action display SANS nom de page => on redirige sur '/'
111 113 // (c'est à dire sur /pages/home, c'est à dire /pages/display/home)
112 114 // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/
113   - if (! $page) {
  115 + if (! $this->page) {
114 116 $this->redirect('/');
115 117 return false;
116 118 }
117 119  
118   - switch ($page) {
  120 + switch ($this->page) {
119 121  
120 122 // Page d'accueil autorisée à tous les profils (roles)
121 123 case 'home': return true;
... ... @@ -160,7 +162,7 @@ class PagesController extends AppController
160 162 // Action display SANS nom de page => on redirige sur '/'
161 163 // (c'est à dire sur /pages/home, c'est à dire /pages/display/home)
162 164 // cf config/routes.php qui définit l'action "display" par défaut pour tout ce qui commence par pages/
163   - $page = $this->request->getParam('pass.0');
  165 + ///$page = $this->request->getParam('pass.0');
164 166 /*
165 167 if (! $page) $this->redirect('/');
166 168 */
... ... @@ -177,7 +179,7 @@ class PagesController extends AppController
177 179 if (! empty($path[1])) $subpage = $path[1];
178 180 */
179 181 $this->myDebug("- page is:");
180   - $this->myDebug($page);
  182 + $this->myDebug($this->page);
181 183 $this->myDebug("- subpage is:");
182 184 $this->myDebug($subpage);
183 185  
... ... @@ -220,13 +222,14 @@ class PagesController extends AppController
220 222 */
221 223  
222 224 // Finalement, on affiche la $page demandée (avec render())
223   - $this->set(compact('page', 'subpage'));
  225 + $this->set('page', $this->page);
  226 + $this->set(compact('subpage'));
224 227 //debug(implode('/', $path));
225 228 //debug(implode('/', array($page,$subpage)));
226 229 try {
227 230 //$this->render(implode('/', $path));
228 231 //$this->render("$page/$subpage");
229   - $this->render($subpage ? "$page/$subpage" : $page);
  232 + $this->render($subpage ? $this->page.'/'.$subpage : $this->page);
230 233 //$this->render(implode('/', array($page,$subpage)));
231 234 } catch (MissingTemplateException $e) {
232 235 if (Configure::read('debug')) throw $e;
... ...
src/Controller/QrCodesController.php
... ... @@ -7,6 +7,15 @@ use \PHPQRCode\QRcode;
7 7 class QrCodesController extends AppController
8 8 {
9 9  
  10 + public function isAuthorized($user) {
  11 + return ($this->action == 'creer');
  12 + // Si aucune règle ci-dessus n'a return true (ou false)
  13 + // => DEFAULT PARENT RULE
  14 + // (on appelle la méthode isAuthorized() de AppController)
  15 + //return parent::isAuthorized($user);
  16 + } // isAuthorizedAction()
  17 +
  18 +
10 19 // @todo Autoriser "creer" dans isAuthorized de ce controleur, et non pas dans celui de AppController !!!
11 20 public function creer($message = null)
12 21 {
... ...
src/Controller/SuivisController.php
... ... @@ -29,15 +29,18 @@ class SuivisController extends AppController
29 29 * ->first()['role'];
30 30 * $action = $this->request->getAttribute('params')['action'];
31 31 */
  32 + /*
32 33 $action = $this->getActionPassed();
33 34 $role = $this->getUserRole($user);
  35 + */
34 36  
35 37 // if ($this->userHasRoleAtLeast('Administration'))
36   - if ($this->USER_IS_ADMIN_AT_LEAST())
37   - return true;
  38 + if ($this->USER_IS_ADMIN_AT_LEAST()) return true;
  39 +
  40 + if ($this->action == 'getNextDate') return true;
38 41  
39 42 // Pour un "utilisateur"
40   - if (in_array($action, [
  43 + if (in_array($this->action, [
41 44 'edit',
42 45 'delete'
43 46 ])) {
... ... @@ -45,9 +48,13 @@ class SuivisController extends AppController
45 48 $id = $this->getIdPassed();
46 49 if ($this->isOwnedBy($id, $user['sn'][0] . ' ' . $user['givenname'][0]))
47 50 return true;
48   - if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0]))
  51 +
  52 + //if ($role == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0]))
  53 + if ($this->userRole == 'Responsable' && $this->isRespGroup($id, $user[$configuration->ldap_authenticationType][0]))
49 54 return true;
50 55 }
  56 +
  57 + // par défaut :
51 58 return parent::isAuthorized($user);
52 59 }
53 60  
... ...
src/Controller/UsersController.php
... ... @@ -84,12 +84,14 @@ class UsersController extends AppController
84 84 return parent::isAuthorized($user);
85 85 }
86 86  
  87 + // ref: https://book.cakephp.org/4/fr/controllers/components/authentication.html#identifier-les-utilisateurs-et-les-connecter
87 88 public function login()
88 89 {
89 90 $this->myDebug("step 2: UsersController.login()");
90 91  
91 92 // Un utilisateur a essayé de se loguer
92 93 if ($this->request->is('post')) {
  94 + // Identification du user en utilisant les données POST
93 95 // sans LDAP
94 96 //$user = $this->Auth->identify();
95 97 // avec LDAP
... ... @@ -100,9 +102,10 @@ class UsersController extends AppController
100 102 // Le login a été accepté
101 103 //if ($user != FALSE) {
102 104 if ($user) {
  105 + // Sauvegarde le user dans la session
103 106 //$this->Auth->setUser($user);
104   - $this->LdapAuth->setUser($user);
105   - // On va maintenant à la page qui etait demandee
  107 + $this->LdapAuth->setUser($user);
  108 + // On va maintenant à la page qui etait demandée
106 109 //return $this->redirect($this->Auth->redirectUrl());
107 110 return $this->redirect($this->LdapAuth->redirectUrl());
108 111 }
... ...
src/Model/Entity/User.php
... ... @@ -50,7 +50,8 @@ class User extends Entity
50 50 protected function _setPassword($password)
51 51 {
52 52 //return (new DefaultPasswordHasher())->hash($password);
53   - if (strlen($password)) {
  53 + //if (strlen($password)) {
  54 + if (strlen($password)>0) {
54 55 $hasher = new DefaultPasswordHasher();
55 56 return $hasher->hash($password);
56 57 }
... ...
src/Model/Table/UsersTable.php
... ... @@ -131,6 +131,13 @@ class UsersTable extends AppTable
131 131  
132 132 function beforeSave($event, $entity, $options)
133 133 {
  134 + /*
  135 + $entity = $event->getData('entity');
  136 + if ($entity->isNew()) {
  137 + $hasher = new DefaultPasswordHasher();
  138 + ...
  139 + }
  140 + */
134 141 if (! empty($entity->get('newname')) && ! empty($entity->get('newgivenname'))) {
135 142 $entity->set('nom', $entity->get('newname') . ' ' . $entity->get('newgivenname'));
136 143 }
... ...
src/Template/Layout/default.ctp
... ... @@ -156,7 +156,10 @@ $this->append('script', $this->Html->script(['script', 'DatepickerConfig', 'onTa
156 156  
157 157 <!-- Message Flash éventuel -->
158 158 <?= $this->Flash->render() ?>
159   - <?= $this->Flash->render('auth') ?>
  159 + <!--
  160 + Avant 3.4.0, cette ligne sera également nécessaire
  161 + <= $this->Flash->render('auth') ?>
  162 + -->
160 163  
161 164 <!--
162 165 Contenu complet de la page web
... ...
src/Template/Materiels/add_edit.ctp
... ... @@ -74,7 +74,8 @@ $materiel = $entity; // @deprecated
74 74 $entity_name = 'matériel';
75 75  
76 76 $domaineresp = $domaineresp;
77   -$designation = $designation;
  77 +//$designations = $designations;
  78 +//foreach ($designations as $f) debug($f);
78 79 $fournisseurs = $fournisseurs;
79 80 //foreach ($fournisseurs as $l) debug($l);
80 81 //foreach ($fournisseurs as $k=>$v) debug("$k => $v");
... ... @@ -335,13 +336,29 @@ if (isset($cpMateriel)) {
335 336  
336 337 // - designation
337 338 echo $this->Form->control('designation', [
  339 + //'type' => 'text',
338 340 'label' => 'Désignation',
339   - //'default' => $Designation
  341 + //'default' => $Designation,
340 342 // ADD only
341   - 'default' => $materiel->designation,
  343 + //'default' => $materiel->designation,
  344 + //'default' => $designations,
  345 + //'default' => $designations->toArray(),
342 346 // EDIT only
343 347 'disabled' => $IS_ADD ? false : $isReadonlyField('designation', $myReadonlyFields)
344 348 ]);
  349 + /*
  350 + $value = $IS_EDIT ? array_shift($designation_edit) : '';
  351 + ?>
  352 + <div class="form-group text">
  353 + <label label class="control-label" for="designation">Désignation</label>
  354 + <!-- autocomplete="on" => ajoute les éléments saisis auparavant (depuis l'historique du navigateur) => pas bon -->
  355 + <input list="desig" id="designation" name="designation" value="<?=$value?>" type="text" placeholder="choisir/ajouter une désignation" autocomplete="off">
  356 + <datalist id="desig">
  357 + <?php foreach ($designations as $v) echo "<option value='$v'>"; ?>
  358 + </datalist>
  359 + </div>
  360 + <?php
  361 + */
345 362  
346 363 // - materiel HS ?
347 364 if ($IS_EDIT &&
... ... @@ -375,7 +392,7 @@ if (isset($cpMateriel)) {
375 392 'empty' => 'Choisir un domaine',
376 393 //'default' => $Sur_categ_id
377 394 // ADD only
378   - 'default' => $materiel->sur_categorie_id,
  395 + //'default' => $materiel->sur_categorie_id,
379 396 // EDIT only
380 397 'readonly' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields),
381 398 'disabled' => $IS_ADD ? false : $isReadonlyField('sur_categorie_id', $myReadonlyFields)
... ...
src/Template/Materiels/view.ctp
... ... @@ -70,6 +70,8 @@ $echoActionButton = $echoActionButton;
70 70 // Documents attachés photo
71 71 $photo_formats = ['png','jpg','jpeg'];
72 72  
  73 +
  74 +
73 75 /* (EP) moved to controller
74 76 function $echoActionButton($html, $icon_class, $title, $action, $id, $tip='', $controller='materiels', $mat=NULL, $photo=NULL) {
75 77 echo $html->link(
... ...
tests/TestCase/Controller/MaterielsControllerTest.php
... ... @@ -20,7 +20,8 @@ class MaterielsControllerTest extends General {
20 20 //class MaterielsControllerTest extends IntegrationTestCase {
21 21  
22 22 // Si DEBUG, affiche plus d'infos
23   - private $DEBUG=FALSE;
  23 + //private $DEBUG=false;
  24 + private $DEBUG=true;
24 25  
25 26 /**
26 27 * Fixtures
... ... @@ -142,11 +143,11 @@ class MaterielsControllerTest extends General {
142 143 $this->get('/materiels/index');
143 144 if (! $COPIED)
144 145 $this->assertResponseNotContains("Liste des matériels (".$nbmat.")", $role);
145   - else {
146   - $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role);
147   - if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement.");
148   - if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne.");
149   - }
  146 + else {
  147 + $this->assertResponseContains("Liste des matériels (".$nbmat.")", $role);
  148 + if (isset($designation)) $this->assertResponseContains($designation, "Le matériel ne s'ajoute pas correctement.");
  149 + if (isset($num_inventaire)) $this->assertResponseContains($num_inventaire, "La génération du n°de labo n'est pas bonne.");
  150 + }
150 151 }
151 152  
152 153  
... ... @@ -654,10 +655,15 @@ class MaterielsControllerTest extends General {
654 655 // On doit pouvoir accéder à la page une fois authentifié
655 656 $this->authAs($role);
656 657  
  658 + $do1=1;
  659 + $do2=1;
  660 + $do3=1;
  661 + $do4=1;
  662 +
657 663 // 1) RULE MATERIEL.COPY.1 :
658 664 // Copie d'un matos (CREATED) à l'IDENTIQUE (tel quel sans rien changer,
659 665 // sauf ce qui changera automatiquement: id, numlab)
660   - $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001');
  666 + if ($do1) $this->_testMatCopy(1, true, $role, 1, [], 'TEST-2014-0001');
661 667  
662 668 // 2) RULE MATERIEL.COPY.2 :
663 669 // Copie d'un matos (CREATED) en changeant quelques données
... ... @@ -676,17 +682,19 @@ class MaterielsControllerTest extends General {
676 682 //'email_responsable' => 'Jacques.Utilisateur@irap.omp.eu',
677 683 //'fournisseur_id' => 2
678 684 ];
679   - $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015');
  685 + if ($do2) $this->_testMatCopy(2, true, $role, 1, $modified_data, 'TEST-2016-0015');
680 686  
681 687 // 3) RULE MATERIEL.COPY.3 :
  688 + // Impossible de copier un matos de statut superieur à CREATED (même pas pour SUPERADMIN)
  689 + $do3 && $this->_testMatCopy(3, false, $role, 3);
682 690 // Impossible de copier un matos de statut superieur à CREATED (sauf pour SUPERADMIN)
683   - $this->_testMatCopy(3, $role=="SUPER", $role, 3);
  691 + //if ($do3) $this->_testMatCopy(3, $role=="SUPER", $role, 3);
684 692  
685 693 // 4) RULE MATERIEL.COPY.4 :
686 694 // Pour un USER: Impossible de copier un matos CREATED dont je ne suis pas propriétaire
687 695 // Pour les autres, c'est ok
688 696 //$this->_testMatCopy(4, !in_array($role, ["USER", "USER_from_ldap"]), $role, 2);
689   - $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2);
  697 + if ($do4) $this->_testMatCopy(4, !$this->USER_IS_USER(), $role, 2);
690 698  
691 699 }
692 700  
... ... @@ -714,7 +722,7 @@ class MaterielsControllerTest extends General {
714 722  
715 723 // APRES add
716 724 $this->_checkNbMaterielInIndexViewIs($COPIED, $role, $nbmat, $designation, $num_inventaire);
717   - /*
  725 +/*
718 726 $this->get('/materiels/index');
719 727 // VOIR LE HTML DE LA PAGE WEB
720 728 //var_dump($this->_getBodyAsString());
... ...