self::PROFILE_USER, 'Responsable' => self::PROFILE_RESPONSABLE, 'Administration' => self::PROFILE_ADMIN, 'Administration Plus' => self::PROFILE_ADMINPLUS, 'Super Administrateur' => self::PROFILE_SUPERADMIN ]; /** * Initialization hook method. * Use this method to add common initialization code like loading components. * e.g. `$this->loadComponent('Security');` * * @return void */ public function initialize() { parent::initialize(); $this->loadComponent('RequestHandler'); $this->loadComponent('Flash'); $this->loadComponent('LdapAuth', [ 'authorize' => [ 'Controller' ], 'loginRedirect' => [ 'controller' => 'Pages', 'action' => 'home' ], 'logoutRedirect' => [ 'controller' => 'Pages', 'action' => 'home' ] ]); $this->confLabinvent = TableRegistry::get('Configurations')->find()->where([ 'id =' => 1 ])->first(); } /** * * @param $user Give * authorization in general * @return boolean */ public function isAuthorized($user) { $configuration = $this->confLabinvent; $role = TableRegistry::get('Users')->find()->where([ 'username' => $user[$configuration->authentificationType_ldap][0] ])->first()['role']; $action = $this->request->params['action']; // error_log($action); // ACL : Super-Admin peut accéder à chaque action if ($role == 'Super Administrateur') return true; // ACL : Pour tout le monde if (in_array($action, [ 'index', 'view', 'add', 'find', 'creer', 'getNextDate', 'getDateGarantie' ])) return true; // ACL : Par défaut refuser return false; } function userHasRole($roleDefine) { $configuration = TableRegistry::get('Configurations')->find()->where([ 'id =' => 1 ])->first(); $role = TableRegistry::get('Users')->find()->where([ 'username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0] ])->first()['role']; $isAuthorized = false; switch ($roleDefine) { case 'Super Administrateur' : if (in_array($role, [ 'Super Administrateur' ])) $isAuthorized = true; break; case 'Administration Plus' : if (in_array($role, [ 'Administration Plus', 'Super Administrateur' ])) $isAuthorized = true; break; case 'Administration' : if (in_array($role, [ 'Administration', 'Administration Plus', 'Super Administrateur' ])) $isAuthorized = true; break; case 'Responsable' : if (in_array($role, [ 'Responsable', 'Administration', 'Administration Plus', 'Super Administrateur' ])) $isAuthorized = true; break; case 'Utilisateur' : if (in_array($role, [ 'Utilisateur', 'Responsable', 'Administration', 'Administration Plus', 'Super Administrateur' ])) $isAuthorized = true; break; } return $isAuthorized; } /** * * {@inheritdoc} * * @see \Cake\Controller\Controller::beforeFilter() */ public function beforeFilter(Event $event) { // !!! Ne jamais autoriser l'action 'login', sinon cela va créer des problèmes sur le fonctionnement normal de AuthComponent (cf doc) !!! $configuration = TableRegistry::get('Configurations')->find()->where([ 'id =' => 1 ])->first(); if ($configuration->mode_install) { $this->LdapAuth->allow([ 'display', 'add', 'edit', 'installOff' ]); } else { $this->LdapAuth->allow([ 'display' ]); } $this->LdapAuth->config('authError', "Désolé, vous n'êtes pas autorisé à accéder à cette zone."); } public function afterFilter(Event $event) { if (in_array($this->request->params['action'], [ 'edit', 'add' ])) { $this->request->session()->write("retourForm1", true); } else if ($this->request->params['action'] != 'creer') { $this->request->session()->write("retourForm1", false); } } /** * Before render callback. * * @param \Cake\Event\Event $event * The beforeRender event. * @return void */ public function beforeRender(Event $event) { $this->set('PROFILE_USER', self::PROFILE_USER); $this->set('PROFILE_ADMIN', self::PROFILE_ADMIN); $this->set('PROFILE_RESPONSABLE', self::PROFILE_RESPONSABLE); $this->set('PROFILE_ADMINPLUS', self::PROFILE_ADMINPLUS); $this->set('PROFILE_SUPERADMIN', self::PROFILE_SUPERADMIN); $this->set('allProfiles', $this->allProfiles); if (! array_key_exists('_serialize', $this->viewVars) && in_array($this->response->type(), [ 'application/json', 'application/xml' ])) { $this->set('_serialize', true); } $this->set('username', $this->LdapAuth->user('sn')[0] . ' ' . $this->LdapAuth->user('givenname')[0]); $configuration = TableRegistry::get('Configurations')->find()->where([ 'id =' => 1 ])->first(); $this->set('configuration', $configuration); $this->request->session()->write("authType", $configuration->authentificationType_ldap); $user = TableRegistry::get('Users')->find()->where([ 'username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0] ])->first(); $role = $user['role']; if ($role == null) $role = 'Utilisateur'; $this->set('role', $role); $profile = $this->allProfiles["$role"]; $this->set('profile', $profile); $USER_IS_UTILISATEUR = ($profile == self::PROFILE_USER); $USER_IS_RESPONSABLE = ($profile == self::PROFILE_RESPONSABLE); $USER_IS_ADMIN = ($profile == self::PROFILE_ADMIN); $USER_IS_ADMINPLUS = ($profile == self::PROFILE_ADMINPLUS); $USER_IS_SUPERADMIN = ($profile == self::PROFILE_SUPERADMIN); $USER_IS_RESPONSABLE_OR_MORE = ($profile >= self::PROFILE_RESPONSABLE); $USER_IS_ADMIN_OR_MORE = ($profile >= self::PROFILE_ADMIN); $USER_IS_ADMINPLUS_OR_MORE = ($profile >= self::PROFILE_ADMINPLUS); $this->set('USER_IS_UTILISATEUR', $USER_IS_UTILISATEUR); $this->set('USER_IS_RESPONSABLE', $USER_IS_RESPONSABLE); $this->set('USER_IS_ADMIN', $USER_IS_ADMIN); $this->set('USER_IS_ADMINPLUS', $USER_IS_ADMINPLUS); $this->set('USER_IS_SUPERADMIN', $USER_IS_SUPERADMIN); $this->set('USER_IS_RESPONSABLE_OR_MORE', $USER_IS_RESPONSABLE_OR_MORE); $this->set('USER_IS_ADMIN_OR_MORE', $USER_IS_ADMIN_OR_MORE); $this->set('USER_IS_ADMINPLUS_OR_MORE', $USER_IS_ADMINPLUS_OR_MORE); $this->set('userConnected', $user); $this->set('idGmNa', TableRegistry::get('GroupesMetiers')->find()->where([ 'nom =' => 'N/A' ])->first()['id']); $this->set('idGtNa', TableRegistry::get('GroupesThematiques')->find()->where([ 'nom =' => 'N/A' ])->first()['id']); $displayElement = function ($nom, $valeur, $params = "") { $balise = ($params != "") ? '' : ''; // Ca c'est parce que sinon y'a au moins deux tests qui passent pas, a cause de l'espace dans la balise ... if ($valeur != "") echo '' . $nom . ' ' . $balise . $valeur . ''; }; $this->set('displayElement', $displayElement); } // "le materiel", "le suivi"... protected function getArticle() { return "Le "; } /** * * @param string $subject * @param string $message * @param string[] $to */ // public function sendEmailTo($subject, $message, $to = null) { // $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); // if ($to != null && !$configuration->test) { // for($i = 0; $i < sizeof($to); $i++) { // if (filter_var($to[$i], FILTER_VALIDATE_EMAIL)) { // $email = new Email(); // $etiquetteFrom = explode("@", $configuration->sender_mail); // if($configuration->envoi_mail_management_dev) { // $email->transport('dev') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($to[$i]) // ->subject("[LabInvent] ".$subject) // ->send($message); // } else { // $email->transport('default') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($to[$i]) // ->subject("[LabInvent] ".$subject) // ->send($message); // } // } // } // } // } // /** // * Envoi d'un email à la gestion (et aux devs) pour prévenir qu'un matériel a été créé ou modifié // * (cf howto dans http://book.cakephp.org/2.0/fr/core-utility-libraries/email.html) // * @param string $subject // * @param string $message // */ // public function sendEmailToManagementWith($subject, $message) { // $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); // for($i = 1; $i < 11; $i++) { // $t = 'emailGuest'.$i; // $to = $configuration->$t; // if ($to != null && !$configuration->test) { // if (filter_var($to, FILTER_VALIDATE_EMAIL)) { // $email = new Email(); // $etiquetteFrom = explode("@", $configuration->sender_mail); // if($configuration->envoi_mail_management_dev) { // $email->transport('dev') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($to) // ->subject("[LabInvent] ".$subject) // ->send($message); // } else { // $email->transport('default') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($to) // ->subject("[LabInvent] ".$subject) // ->send($message); // } // } // } // } // } // public function sendEmailToManagement($idObj = null) { // $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); // $userAuth = $this->LdapAuth->user($configuration->authentificationType_ldap)[0]; // $controller = substr($this->request->params['controller'], 0, -1); // materiel // $action = $this->request->params['action']; // add or edit or delete or ... // $userName = $this->LdapAuth->user('sn')[0].' '.$this->LdapAuth->user('givenname')[0]; // $userEmail = $this->LdapAuth->user('mail')[0]; // $role = TableRegistry::get('Users')->find()->where(['username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0]])->first()['role']; // if($role == null) $role = 'Utilisateur'; // $modelName = $this->modelClass; // 'Materiels' // $id = $idObj; // switch ($action) { // case 'add': // $actionFrench = ['Création d\'un ', 'été créé']; // break; // case 'edit': // $actionFrench = ['Modification d\'un ', 'été modifié']; // break; // case 'delete': // $actionFrench = ['Suppression d\'un ', 'été supprimé']; // break; // case 'statusValidated': // $actionFrench = ['Validation d\'un ', 'été validé']; // break; // case 'statusToBeArchived': // $actionFrench = ['Demande Archivage d\'un ', 'été demandé pour archivage']; // break; // case 'statusArchived': // $actionFrench = ['Archivage d\'un ', 'été archivé']; // break; // case 'setLabelIsPlaced': // $actionFrench = ['Etiquette posé sur un ', 'reçu une étiquette']; // break; // default: // $actionFrench = [$action.' d\'un ', 'été '.$action]; // break; // } // $doneBy = $userName." (".$userEmail.", login=".$userAuth.", profil=".$role.")."; // $subject = $actionFrench[0].$controller; // if($id != null) { // $entityName = TableRegistry::get($modelName)->find('all')->where(['id =' => $id])->first(); // if($modelName == 'Materiels') { // $entityName = $entityName['designation']; // } // else if ($modelName == 'Suivis' || $modelName == 'Emprunts') { // $entityName = $entityName['id']; // } // else { // $entityName = $entityName['nom']; // } // } // else { // $entityName = NULL; // } // $message = $this->getArticle().$controller." ".$entityName." (id=".$id.") a ".$actionFrench[1]." par ".$doneBy; // $this->sendEmailToManagementWith($subject, $message); // } // /** // * Envoi d'un email au propriétaire pour prévenir qu'un matériel a été créé // * @param string $subject // * @param string $message // */ // public function sendEmailToCreate($idObj = null) { // $id = $idObj; // $configuration = TableRegistry::get('Configurations')->find()->where(['id =' => 1])->first(); // $materiel = TableRegistry::get('Materiels')->find()->where(['id =' => $id])->first(); // $createurName = $this->LdapAuth->user('sn')[0].' '.$this->LdapAuth->user('givenname')[0]; // $createurEmail = $this->LdapAuth->user('mail')[0]; // $toEmail = $materiel->email_responsable; // $role = TableRegistry::get('Users')->find()->where(['username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0]])->first()['role']; // if($role == null) $role = 'Utilisateur'; // $subject = 'Ajout d\'un matériel'; // $message = $createurName.' (email = '.$createurEmail.', role = '.$role.') a ajouté le matériel "'.$materiel->designation.'" ('.$materiel->numero_laboratoire.') et vous a nommé propriétaire de ce matériel.'; // if ($toEmail != null && !$configuration->test) { // if (filter_var($toEmail, FILTER_VALIDATE_EMAIL)) { // $email = new Email(); // $etiquetteFrom = explode("@", $configuration->sender_mail); // if($configuration->envoi_mail_management_dev) { // $email->transport('dev') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($toEmail) // ->subject("[LabInvent] ".$subject) // ->send($message); // } else { // $email->transport('default') // ->from([$configuration->sender_mail => $etiquetteFrom[0]]) // ->to($toEmail) // ->subject("[LabInvent] ".$subject) // ->send($message); // } // } // } // } static function isLabinventDebugMode() { return TableRegistry::get('Configurations')->find()->where([ 'id =' => 1 ])->first()->mode_debug; } function myDebug($arg, $stop = false) { if ($this->isLabinventDebugMode()) { Configure::write('debug', true); debug($arg); if ($stop) exit(); } } /** * Envoi un mail avec un sujet, contenant un message à destination d'une liste de mails, selon l'action effectuée. * * @param $obj : * Matériel concerné * @param $subject : * Sujet du message à envoyer. Si $subject n'est pas renseigné, un sujet par défaut sera généré. * @param $msg : * Message à envoyer. Si $msg n'est pas renseigné, un message par défaut sera généré. */ public function sendEmail($obj, $subject = null, $msg = null) { /* * $_SESSION['Auth']['User'] pour retrouver TOUTES les infos de la session courante (tout est du string) : * nom['sn'][0] * prenom['givenname'][0] * mail['mail'][0] * login['xxx'][0] /!\ Ce champ est suceptible de changer de nom, dans les tests ce champ est ['cn'][0] * mdp['userpassword'][0] */ $configuration = $this->confLabinvent; $action = $this->request->params['action']; // add or edit or delete or ... // Si les deux cases "Activer l'envoi des mails.." sont décochée, on se fatigue pas à exécuter la fonction if (! $configuration->envoi_mail && ! $configuration->envoi_mail_guests) return null; $materiel = $obj; $mailList = array(); // On détermine le message et le sujet du mail en fonction de l'action effectuee $acteur = $_SESSION['Auth']['User']['givenname'][0] . ' ' . $_SESSION['Auth']['User']['sn'][0]; if ($materiel != null) { $nom_materiel = $materiel->designation; if ($subject == null && $msg == null) { Switch ($action) { case 'add' : $subject = "Ajout d'un matériel"; $msg = "$acteur a ajouté le matériel $nom_materiel"; break; case 'edit' : $subject = "Modification d'un matériel"; $msg = "$acteur a modifié le matériel $nom_materiel"; break; case 'delete' : $subject = "Suppression d'un matériel"; $msg = "$acteur a supprimé le matériel $nom_materiel"; break; case 'statusValidated' : $subject = "Validation d'un matériel"; $msg = "$acteur a validé le matériel $nom_materiel"; break; case 'statusToBeArchived' : $subject = "Demande d'archivage d'un matériel"; $msg = "$acteur a demandé l'archivage du matériel $nom_materiel"; break; case 'statusArchived' : $subject = "Archivage d'un matériel"; $msg = "$acteur a archivé le matériel $nom_materiel"; break; case 'setLabelIsPlaced' : $subject = "Etiquette posée sur un matériel"; $msg = "Etiquette posée sur le matériel $nom_materiel"; break; case 'printLabelRuban' : $subject = "Etiquette imprimée"; $msg = "L'étiquette concerant votre matériel $nom_materiel a été imprimée. Veuillez vérifier et compléter si besoin la fiche corespondante."; $mailList[0] = $materiel->email_responsable; default : $subject = "Action \"$action\" sur un matériel"; $msg = "$acteur a effectué l'action \"$action\" sur le matériel $nom_materiel"; break; } } // Et maintenant on construit la liste de mails ... // Si l'envoi général est activé (et que l'action ne correspond pas à 'printLabelRuban'): if ($configuration->envoi_mail && $action != 'printLabelRuban') { // mail owner $mailList[0] = $materiel->email_responsable; // mail resp $mailsRespMetier = null; $mailsRespMetier = null; if ($materiel->groupes_metier_id != null && $materiel->groupes_metier_id != 1) // Le ..!= 1 c'est parce que le groupe métier/thématique d'id 1 correspond au groupe N/A, soit aucun groupe $mailsRespMetier = TableRegistry::get('Users')->find()->select('email')->where([ 'role =' => 'Responsable', 'groupes_metier_id =' => $materiel->groupes_metier_id ])->toArray(); if ($mailsRespMetier != null && $mailsRespMetier != null) { $mailResp = array_unique(array_merge($mailsRespMetier, $mailRespThematique)); for ($i = 0; $i < sizeof($mailsResp); $i ++) { $mailList[sizeof($mailList)] = $mailsResp[$i]['email']; } } // mail admin de reference (ici appele gestionnaire) -> Partie administration // Cela a été mis en commentaire car de toute façon l'utilisateur va voir un administratif pour faire valider sa fiche, // Pas la peine de spam l'administration de mails non plus hein ! /* * if ($action != 'statusValidated' && $action != 'statusArchived') { * $mailsAdmin = TableRegistry::get('Users')->find() * ->select('email') * ->where([ * 'role =' => 'Administration' * ]) * ->toArray(); * for ($i = 0; $i < sizeof($mailsAdmin); $i ++) { * $mailList[sizeof($mailList)] = $mailsAdmin[$i]['email']; * } * } */ } } // Si l'envoi à la liste spécifiée est activé (et que l'action ne correspond pas à 'printLabelRuban'): if ($configuration->envoi_mail_guests && $action != 'printLabelRuban') { // mail aux adresses specifiees dans la config for ($i = 0; $i < 11; $i ++) { if ($configuration['emailGuest' . $i]) $mailList[sizeof($mailList)] = $configuration['emailGuest' . $i]; // Le if vérifie que la ligne soit pas null } } // On dedoublonne la liste des mails, c'pas tres cool de se faire spam 2-3 fois pour la meme action sur le meme materiel, non mais ! $List = array_unique($mailList); // ... Pour envoyer les mails aux personnes concernees foreach ($List as $mail) { // On envoi des mails à toute la liste, sauf pour "l'acteur", il sait ce qu'il a fait, pas besoin de le spam non plus hein if ($mail != $_SESSION['Auth']['User']['mail'][0]) { $message = $msg; // Sisi, cette variable $message est utile, m'enfin vous pouvez toujours essayer de la supprimer ..... Et pensez à regarder le contenu de vos mails !!! Sinon ca fait une tumeur if ($action != 'statusValidated' && $materiel != null) $message .= " Veuillez vérifier et compléter si besoin la fiche corespondante."; $role = TableRegistry::get('Users')->find()->select('role')->where([ 'email =' => $mail ])->first()['role']; if ($role) $role = 'en tant que ' . $role; else $role = 'car vous avez demandé à le recevoir. Pour faire retirer votre mail de la liste, veuillez contacter un SuperAdmin'; $message .= "\n\n" . 'Vous recevez ce message ' . $role; $this->sendEmailTo("$subject", $message, $mail, $configuration); } } return $List; } // Fonction d'envoi de mails private function sendEmailTo($subject, $msg, $mail, $config) { if ($mail != null && ! $config->test) { if (filter_var($mail, FILTER_VALIDATE_EMAIL)) { $email = new Email(); $etiquetteFrom = explode("@", $config->sender_mail); // if($config->envoi_mail) { // <-- Si la case "Envoi des mails de management en local " est cochée // $email->transport('dev') // ->from([$config->sender_mail => $etiquetteFrom[0]]) // ->to($mail) // ->subject("[LabInvent] ".$subject) // ->send($msg); // } else { // <-- Si la case n'est pas cochée $email->transport('default')->from([ $config->sender_mail => $etiquetteFrom[0] ])->to($mail)->subject("[LabInvent] " . $subject)->send($msg); // } } } } }