self::PROFILE_USER,
'Responsable' => self::PROFILE_RESPONSABLE,
'Administration' => self::PROFILE_ADMIN,
'Administration Plus' => self::PROFILE_ADMINPLUS,
'Super Administrateur' => self::PROFILE_SUPERADMIN
];
public static function getRoleLevel($role) {
//return $this->allProfiles[$role];
//debug("role is" .$role);
return self::PROFILES[$role];
}
/**
* 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' ]
]);
// On charge la configuration
$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->getAttribute('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;
}
public function userHasRole($expectedRole, $ORMORE=false) {
$configuration = $this->confLabinvent;
$role = TableRegistry::get('Users')->find()
->where(['username' => $this->LdapAuth->user($configuration->authentificationType_ldap)[0]])
//->where(['username' => $this->LdapAuth->user('cn')[0]])
->first()['role'];
if (! $ORMORE) return ($role == $expectedRole);
return ($this->getRoleLevel($role) >= $this->getRoleLevel($expectedRole));
/*
//$hasRole = false;
switch ($expectedRole) {
case 'Super Administrateur' :
return (in_array($role, ['Super Administrateur']));
break;
case 'Administration Plus' :
return (in_array($role, ['Administration Plus', 'Super Administrateur']));
break;
case 'Administration' :
return (in_array($role, ['Administration', 'Administration Plus', 'Super Administrateur' ]));
break;
case 'Responsable' :
return (in_array($role, ['Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']));
break;
case 'Utilisateur' :
return (in_array($role, ['Utilisateur', 'Responsable', 'Administration', 'Administration Plus', 'Super Administrateur']));
break;
}
return $false;
*/
}
public function userHasRoleAtLeast($expectedRole) {
return $this->userHasRole($expectedRole, true);
}
/**
* {@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 = $this->confLabinvent;
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->getAttribute('params')['action'], ['edit', 'add']))
$this->request->session()->write("retourForm1", true);
else if ($this->request->getAttribute('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);
$this->set('allProfiles', self::PROFILES);
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 = $this->confLabinvent;
$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"];
$profile = self::PROFILES["$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);
$dateProchainControleVerif = function($t) {
$time = Time::now(); // On récupère la date et l'heure actuelles
$today = new \DateTime((new date("$time->year-$time->month-$time->day"))->format('Y-m-d'));
$time1 = new time($t);
$dateTime1 = new \DateTime((new date("$time1->year-$time1->month-$time1->day"))->format('y-m-d'));
$interval = ($today->diff($dateTime1));
$strInterval = $interval->format('%a');
return (int) $strInterval;
};
$this->set('dateProchainControleVerif', $dateProchainControleVerif);
}
// "le materiel", "le suivi"...
protected function getArticle() { return "Le "; }
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 $_SESSION['Auth']['User']['sn'][0]
* prenom $_SESSION['Auth']['User']['givenname'][0]
* mail $_SESSION['Auth']['User']['mail'][0]
* login $_SESSION['Auth']['User']['xxx'][0] /!\ Ce champ est suceptible de changer de nom, dans les tests ce champ est ['cn'][0]
* mdp $_SESSION['Auth']['User']['userpassword'][0]
*/
$configuration = $this->confLabinvent;
$action = $this->request->getAttribute('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\".";
if ($materiel-> sur_categorie_id != "") $msg .= "\n\nDomaine : ". $materiel->description;
if ($materiel-> categorie_id != "") $msg .= "\n\nCatégorie : ". $materiel->description;
if ($materiel-> sous_categorie_id != "") $msg .= "\n\nSous-catégorie : ". $materiel->description;
if ($materiel->description != "") $msg .= "\n\nDescription :\n\n". $materiel->description;
break;
case 'statusCreated' :
$subject = "Dé-validation d'un matériel";
$msg = "$acteur a dé-validé 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.";
$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
$role = TableRegistry::get('Users')->find()->select('role')->where(['email =' => $mail])->first()['role'];
if ($action != 'statusValidated' && $materiel != null)
$message .= "\nVeuillez vérifier et compléter si besoin la fiche corespondante.";
// Génération du message "Vous recevez ce message en tant que $role"
// Si $role innexistant (lorsque c'est un mail de la liste entrée en configuration), le message est plutot "Vous recevez ce message car vous avez demandé à le recevoir. [...]"
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);
$email->transport('default')->from([$config->sender_mail => $etiquetteFrom[0]])
->to($mail)->subject("[LabInvent] " . $subject)->send($msg);
}
}
}
}