| Line 1... |
Line 1... |
| 1 |
<?php
|
1 |
<?php
|
| 2 |
/**
|
2 |
/**
|
| 3 |
* Service d'itentification d'un utilisateur.
|
3 |
* Service d'itentification d'un utilisateur.
|
| - |
|
4 |
* Modifié pour fonctionner avec le SSO.
|
| - |
|
5 |
*
|
| 4 |
* Encodage en entrée : utf8
|
6 |
* Encodage en entrée : utf8
|
| 5 |
* Encodage en sortie : utf8
|
7 |
* Encodage en sortie : utf8
|
| - |
|
8 |
*
|
| 6 |
* Cas d'utilisation :
|
9 |
* Cas d'utilisation :
|
| 7 |
* 1: Aucun login ni mot de passe transmis
|
10 |
* Le service reçoit un jeton SSO (ou pas) dans le header "Authorization", le fait
|
| 8 |
* 1: L'application retourne l'identifiant de session en cours
|
11 |
* vérifier par l'annuaire; s'il est valide, le décode puis retourne le profil utilisateur
|
| 9 |
* 2: Une identification est toujours active, cette identification est retournée
|
12 |
* associé; sinon retourne un profil anonyme.
|
| 10 |
*
|
13 |
*
|
| 11 |
* 2: Ce service recoit un login et un mot de passe
|
- |
|
| 12 |
* 1 : On tente d'identifier l'utilisateur
|
14 |
* 1: Aucun jeton ou jeton invalide transmis
|
| 13 |
* 2 : Si réussi, l'état passe à : connecté
|
- |
|
| 14 |
* 3 : sinon, l'état passe à : pas connecté
|
15 |
* 1: L'application retourne l'identifiant de session en cours (mode anonyme)
|
| 15 |
*
|
16 |
*
|
| 16 |
* 3: Ce service reçoit un identifiant (différent du login) et aucun mot de passe :
|
17 |
* 2: Jeton valide transmis
|
| 17 |
* 1 : Déconnexion
|
18 |
* 1 : Passe ou reste dans l'état "connecté"; le profil actif est retourné
|
| 18 |
*
|
19 |
*
|
| 19 |
* En résumé, utilisation des URLs :
|
20 |
* En résumé, utilisation des URLs :
|
| 20 |
* /CoelUtilisateur/ : retour identifiant de session si jamais connecté, sinon retour de l'id (+ login et mot de passe)
|
21 |
* /CoelUtilisateur/identite : retour identifiant de session si jamais connecté, sinon retour de l'id (+ login et mot de passe)
|
| 21 |
* /CoelUtilisateur/ * / * / : idem ci-dessus
|
- |
|
| 22 |
* /CoelUtilisateur/id : déconexion
|
- |
|
| 23 |
* /CoelUtilisateur/login/mot_de_passe : connexion
|
- |
|
| 24 |
*
|
22 |
*
|
| 25 |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
|
23 |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
|
| 26 |
* @author David DELON <david.delon@clapas.net>abstract
|
24 |
* @author David DELON <david.delon@clapas.net>
|
| - |
|
25 |
* @author Mathias CHOUET <mathias@tela-botanica.org>
|
| 27 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
26 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
| 28 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
27 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
| 29 |
* @version $Id$
|
28 |
* @version $Id$
|
| 30 |
* @copyright 2009
|
29 |
* @copyright 2009
|
| 31 |
*/
|
30 |
*/
|
| 32 |
class CoelUtilisateur extends Coel {
|
31 |
class CoelUtilisateur extends Coel {
|
| 33 |
|
32 |
|
| 34 |
private $licence_acceptee = false;
|
33 |
protected $licence_acceptee = false;
|
| 35 |
|
34 |
|
| - |
|
35 |
/**
|
| 36 |
// TODO : controle systematique... dans tous les services si connected : name cookie = name service
|
36 |
* Point d'entrée GET
|
| - |
|
37 |
*/
|
| 37 |
public function getRessource(){
|
38 |
public function getRessource() {
|
| - |
|
39 |
// par défaut, mode anonyme
|
| 38 |
$this->getElement(array('*','*'));
|
40 |
$infos = $this->getUtilisateurAnonyme();
|
| 39 |
}
|
- |
|
| 40 |
|
- |
|
| - |
|
41 |
// recherche d'un utilisateur identifié en fonction du jeton SSO
|
| 41 |
public function getElement($param){
|
42 |
$infosIdentifie = $this->getUtilisateurSSO();
|
| 42 |
$identification = false;
|
43 |
if ($infosIdentifie != null) {
|
| - |
|
44 |
//echo "Infos SSO : "; var_dump($infosIdentifie);
|
| 43 |
$info = array();
|
45 |
$infos = $infosIdentifie;
|
| 44 |
|
- |
|
| 45 |
// Si la licence n'a pas été accepté nous réinitialisons tout
|
46 |
// si la licence n'a pas été acceptée, au revoir les enfants
|
| 46 |
if (!isset($param[2]) && (!isset($_COOKIE['coel_licence']) || (isset($_COOKIE['coel_licence']) && $_COOKIE['coel_licence'] != 1))) {
|
47 |
// on envoie tout de même les infos à l'interface mais on déconnecte les services
|
| 47 |
$this->deconnecterUtilisateur();
|
48 |
$this->deconnecterUtilisateur();
|
| 48 |
}
|
49 |
}
|
| - |
|
50 |
// et vlan, passe-moi l'éponge
|
| - |
|
51 |
$this->envoyer($infos);
|
| - |
|
52 |
}
|
| 49 |
|
53 |
|
| - |
|
54 |
/**
|
| - |
|
55 |
* Renvoie un profil utilisateur CoeL anonyme
|
| - |
|
56 |
* (licence vide, id de session, non connecté)
|
| - |
|
57 |
*/
|
| - |
|
58 |
protected function getUtilisateurAnonyme() {
|
| - |
|
59 |
$info = array("", session_id(), false);
|
| - |
|
60 |
return $info;
|
| - |
|
61 |
}
|
| - |
|
62 |
|
| - |
|
63 |
/**
|
| - |
|
64 |
* Recherche un jeton SSO dans l'entête HTTP "Authorization", vérifie ce
|
| - |
|
65 |
* jeton auprès de l'annuaire et en cas de succès charge les informations
|
| 50 |
// S'il y a 3 paramètres, c'est qu'on cherche à mettre à jour la licence
|
66 |
* de l'utilisateur associé; si besoin, copie l'utilisateur dans la table
|
| - |
|
67 |
* Personnes de CoeL
|
| - |
|
68 |
*
|
| - |
|
69 |
* @return Array un profil utilisateur ou null
|
| - |
|
70 |
*/
|
| - |
|
71 |
protected function getUtilisateurSSO() {
|
| - |
|
72 |
$utilisateur = null;
|
| - |
|
73 |
// lecture du jeton
|
| - |
|
74 |
$jeton = $this->lireJetonEntete();
|
| - |
|
75 |
//echo "Jeton : "; var_dump($jeton);
|
| 51 |
if (isset($param[2])) {
|
76 |
if ($jeton != null) {
|
| - |
|
77 |
// validation par l'annuaire
|
| 52 |
$this->debug[] = "Licence acceptee";
|
78 |
$valide = $this->verifierJeton($jeton);
|
| 53 |
$this->licence_acceptee = true;
|
79 |
if ($valide === true) {
|
| - |
|
80 |
// décodage du courriel utilisateur depuis le jeton
|
| - |
|
81 |
$donneesJeton = $this->decoderJeton($jeton);
|
| - |
|
82 |
if ($donneesJeton != null && $donneesJeton["sub"] != "") {
|
| 54 |
// Mise à jour de la licence
|
83 |
// récupération de l'utilisateur
|
| - |
|
84 |
$courriel = $donneesJeton["sub"];
|
| - |
|
85 |
|
| - |
|
86 |
// lecture des infos dans l'annuaire (relou mais nécessaire pour la copie dans la table Personnes de CoeL)
|
| - |
|
87 |
$infosAnnuaire = $this->obtenirInfosAnnuaire($courriel);
|
| 55 |
if (!$this->accepterLicence($param[0])) {
|
88 |
$this->setInfosAnnuaire($infosAnnuaire);
|
| - |
|
89 |
//echo "Infos Annu: "; var_dump($infosAnnuaire);
|
| - |
|
90 |
|
| - |
|
91 |
// lecture de l'utilisateur connu (ou pas) par CoeL (table Personnes)
|
| - |
|
92 |
$utilisateur_existant = $this->chargerUtilisateur($courriel);
|
| - |
|
93 |
//echo "UTIL EXIST: "; var_dump($utilisateur_existant);
|
| - |
|
94 |
|
| - |
|
95 |
// Vérification de la nécessité de mettre à jour l'utilisateur COEL vis à vis de l'annuaire de Tela Botanica
|
| - |
|
96 |
if (!is_null($infosAnnuaire) && $this->avoirBesoinMiseAJour($utilisateur_existant)) {
|
| 56 |
$this->debug[] = "Erreur de mise à jour licence utilisateur";
|
97 |
$this->debug[] = "Besoin d'une mise à jour";
|
| 57 |
}
|
98 |
|
| - |
|
99 |
$presence_dans_coel = ($utilisateur_existant != false); // si on l'a trouvé juste au dessus
|
| 58 |
} else if (isset($param[1])) { // Non connecté : vérification
|
100 |
$this->debug[] = "Presence: $presence_dans_coel";
|
| - |
|
101 |
$mot_de_passe_sha1 = $infosAnnuaire['pass'];
|
| - |
|
102 |
//echo "MDP: " .$mot_de_passe_sha1;
|
| - |
|
103 |
|
| - |
|
104 |
if ($presence_dans_coel) {
|
| - |
|
105 |
// Nécessite de faire une mise à jour
|
| - |
|
106 |
$this->debug[] = "Mise à jour de l'utilisateur {$infosAnnuaire['id']}";
|
| 59 |
if (!$this->getUtilisateur()) { // Si non identifié
|
107 |
$this->mettreAJourUtilisateur($login, $mot_de_passe_sha1, $infosAnnuaire);
|
| - |
|
108 |
$utilisateur_existant['licence'] = (int) $this->recupererLicenceUtilisateur($infosAnnuaire['id']);
|
| 60 |
$id = null;
|
109 |
} else {
|
| - |
|
110 |
echo "Insertion";
|
| - |
|
111 |
// Nécessite d'ajouter le nouvel utilisateur
|
| 61 |
if ($param[0] == '*' && $param[1] == '*') { // Tentative d'identification depuis les cookies permanents
|
112 |
$this->debug[] = "Ajout d'une nouvel utilisateur";
|
| 62 |
if (isset($_COOKIE['coel_login']) && ($this->souvenirUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) {
|
113 |
$this->ajouterUtilisateurACoel($infosAnnuaire, $mot_de_passe_sha1);
|
| - |
|
114 |
// rechargement après l'avoir ajouté (un peu nul)
|
| 63 |
$id = $this->getUtilisateurId();
|
115 |
$utilisateur_existant = $this->chargerUtilisateur($courriel);
|
| 64 |
$identification = true;
|
116 |
}
|
| - |
|
117 |
|
| 65 |
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
|
118 |
$this->setUtilisateur($utilisateur_existant);
|
| 66 |
}
|
119 |
}
|
| 67 |
} else if ($this->connecterUtilisateur($param[0], $param[1], 1)) { // Tentative d'identification depuis les paramêtres passés dans l'url du service
|
- |
|
| - |
|
120 |
|
| 68 |
$id = $this->getUtilisateurId();
|
121 |
// stockage de l'utilisateur en session
|
| 69 |
$identification = true;
|
122 |
$this->setUtilisateur($utilisateur_existant);
|
| 70 |
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
|
- |
|
| 71 |
}
|
- |
|
| 72 |
|
123 |
|
| 73 |
// L'identification a échouée, nous retournons un session_id comme identifiant
|
- |
|
| 74 |
if (is_null($id)) {
|
- |
|
| 75 |
$id = session_id();
|
- |
|
| 76 |
$identification = false;
|
124 |
// renvoi des infos
|
| 77 |
$info = array($id, $identification);
|
125 |
$utilisateur = array($utilisateur_existant['licence'], $infosAnnuaire['id'], true, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
|
| 78 |
}
|
126 |
}
|
| 79 |
} else { // Déjà identifié
|
- |
|
| 80 |
$id = $this->getUtilisateurId();
|
- |
|
| 81 |
$identification = true;
|
- |
|
| 82 |
$info = array($id, $identification, $this->getUtilisateurNomComplet(), $this->getUtilisateurPrenom(), $this->getUtilisateurNom(), $this->getParametre());
|
- |
|
| 83 |
}
|
127 |
}
|
| 84 |
} else { // Déconnexion
|
- |
|
| 85 |
$this->deconnecterUtilisateur();
|
- |
|
| 86 |
$id = session_id();
|
- |
|
| 87 |
$identification = false;
|
- |
|
| 88 |
$info = array($id, $identification);
|
- |
|
| 89 |
}
|
128 |
}
|
| Line 90... |
Line -... |
| 90 |
|
- |
|
| 91 |
array_unshift($info, $this->getLicence());
|
- |
|
| 92 |
|
- |
|
| 93 |
// Envoie sur la sortie standard
|
- |
|
| 94 |
$this->envoyer($info);
|
- |
|
| 95 |
}
|
- |
|
| 96 |
|
- |
|
| 97 |
private function getUtilisateurId() {
|
- |
|
| 98 |
if ($utilisateur = $this->getUtilisateur()) {
|
129 |
|
| 99 |
return $utilisateur['id'];
|
- |
|
| 100 |
} else {
|
- |
|
| 101 |
return '';
|
- |
|
| 102 |
}
|
- |
|
| 103 |
}
|
- |
|
| 104 |
|
- |
|
| 105 |
private function getUtilisateurLogin() {
|
- |
|
| 106 |
if ($utilisateur = $this->getUtilisateur()) {
|
- |
|
| 107 |
return $utilisateur['login'];
|
- |
|
| 108 |
} else {
|
- |
|
| 109 |
return '';
|
- |
|
| 110 |
}
|
- |
|
| 111 |
}
|
- |
|
| 112 |
|
- |
|
| 113 |
private function getUtilisateurNomComplet() {
|
- |
|
| 114 |
if ($utilisateur = $this->getUtilisateur()) {
|
- |
|
| 115 |
return $utilisateur['nom_complet'];
|
- |
|
| 116 |
} else {
|
- |
|
| 117 |
return '';
|
- |
|
| 118 |
}
|
- |
|
| 119 |
}
|
- |
|
| 120 |
|
- |
|
| 121 |
private function getUtilisateurPrenom() {
|
- |
|
| 122 |
if ($utilisateur = $this->getUtilisateur()) {
|
- |
|
| 123 |
return $utilisateur['prenom'];
|
- |
|
| 124 |
} else {
|
- |
|
| 125 |
return '';
|
- |
|
| 126 |
}
|
- |
|
| 127 |
}
|
- |
|
| 128 |
|
- |
|
| 129 |
private function getUtilisateurNom() {
|
- |
|
| 130 |
if ($utilisateur = $this->getUtilisateur()) {
|
- |
|
| 131 |
return $utilisateur['nom'];
|
- |
|
| 132 |
} else {
|
- |
|
| 133 |
return '';
|
- |
|
| 134 |
}
|
- |
|
| 135 |
}
|
- |
|
| 136 |
|
- |
|
| 137 |
private function getParametre() {
|
- |
|
| 138 |
if ($utilisateur = $this->getUtilisateur()) {
|
- |
|
| 139 |
return $utilisateur['parametre'];
|
- |
|
| 140 |
} else {
|
- |
|
| 141 |
return '';
|
- |
|
| 142 |
}
|
- |
|
| 143 |
}
|
- |
|
| 144 |
|
- |
|
| 145 |
private function getLicence() {
|
- |
|
| 146 |
if (!empty($_SESSION['coel_utilisateur'])) {
|
- |
|
| 147 |
return (string) $_SESSION['coel_utilisateur']['licence'];
|
- |
|
| 148 |
} else {
|
- |
|
| 149 |
return '';
|
- |
|
| 150 |
}
|
- |
|
| 151 |
}
|
- |
|
| 152 |
|
- |
|
| 153 |
private function getInfosAnnuaire() {
|
- |
|
| 154 |
if (!empty($_SESSION['coel_infosAnnuaire'])) {
|
- |
|
| 155 |
return $_SESSION['coel_infosAnnuaire'];
|
- |
|
| 156 |
} else {
|
- |
|
| 157 |
return '';
|
- |
|
| 158 |
}
|
130 |
return $utilisateur;
|
| Line 159... |
Line 131... |
| 159 |
}
|
131 |
}
|
| 160 |
|
132 |
|
| 161 |
private function deconnecterUtilisateur() {
|
133 |
protected function deconnecterUtilisateur() {
|
| 162 |
$_SESSION['coel_utilisateur'] = '';
|
- |
|
| 163 |
$_SESSION['coel_infosAnnuaire'] = '';
|
- |
|
| 164 |
$this->supprimerCookie('coel_login');
|
- |
|
| 165 |
$this->supprimerCookie('coel_mot_de_passe');
|
- |
|
| 166 |
$this->supprimerCookie('coel_licence');
|
- |
|
| 167 |
$this->supprimerCookie('coel_permanence');
|
- |
|
| 168 |
}
|
- |
|
| 169 |
|
- |
|
| 170 |
private function connecterUtilisateur($login, $mot_de_passe, $permanence = 1) {
|
- |
|
| 171 |
// Dans tous les cas, on récupère les informations de l'utilisateur présentes dans l'annuaire de Tela Botanica
|
- |
|
| 172 |
$infosAnnuaire = $this->obtenirInfosAnnuaire($login);
|
- |
|
| 173 |
$this->setInfosAnnuaire($infosAnnuaire);
|
- |
|
| 174 |
|
- |
|
| 175 |
if ($mot_de_passe == 'debug' && $utilisateur_existant = $this->chargerUtilisateur($login)) {
|
- |
|
| 176 |
$this->setUtilisateur($utilisateur_existant, $permanence);
|
- |
|
| 177 |
return true;
|
- |
|
| 178 |
} else {
|
- |
|
| 179 |
$mot_de_passe_sha1 = sha1($mot_de_passe);
|
- |
|
| 180 |
$mot_de_passe_md5 = md5($mot_de_passe);
|
- |
|
| 181 |
if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_sha1)) {
|
- |
|
| 182 |
// OK, nous poursuivons
|
- |
|
| 183 |
} else if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_md5)) {
|
- |
|
| 184 |
// Mise à jour du mot de passe md5 en sha1
|
- |
|
| 185 |
$this->mettreAJourMotDePasse($login, $mot_de_passe_md5, $mot_de_passe_sha1);
|
- |
|
| 186 |
$utilisateur_existant['mot_de_passe'] = $mot_de_passe_sha1;
|
- |
|
| 187 |
}
|
- |
|
| 188 |
|
- |
|
| 189 |
// Vérification de la nécessité de mettre à jour l'utilisateur du COEL vis à vis de l'annuaire de Tela Botanica
|
- |
|
| 190 |
if (!is_null($infosAnnuaire) && $this->avoirBesoinMiseAJour($utilisateur_existant)) {
|
- |
|
| 191 |
$this->debug[] = "Besoin d'une mise à jour";
|
- |
|
| 192 |
// Vérifions que la personne s'est bien identifiée
|
- |
|
| 193 |
if ($infosAnnuaire['mot_de_passe'] == $mot_de_passe_md5) {
|
- |
|
| 194 |
$this->debug[] = "Identification correcte avec md5";
|
- |
|
| 195 |
$utilisateur_existant = $this->getInfoAnnuaireCoelDepuisInfoAnnuaireDistant($mot_de_passe_sha1, $infosAnnuaire);
|
- |
|
| 196 |
|
- |
|
| 197 |
$presence_dans_coel = $this->verifierPresenceUtilisateur($infosAnnuaire['id']);
|
- |
|
| 198 |
$this->debug[] = "Presence:$presence_dans_coel";
|
- |
|
| 199 |
if ($presence_dans_coel) {
|
- |
|
| 200 |
// Nécessite de faire une mise à jour
|
- |
|
| 201 |
$this->debug[] = "Mise à jour de l'utilisateur {$infosAnnuaire['id']}";
|
- |
|
| 202 |
$this->mettreAJourUtilisateur($login, $mot_de_passe_sha1, $infosAnnuaire);
|
- |
|
| 203 |
$utilisateur_existant['licence'] = (int) $this->recupererLicenceUtilisateur($infosAnnuaire['id']);
|
- |
|
| 204 |
} else {
|
- |
|
| 205 |
// Nécessite d'ajouter le nouvel utilisateur
|
- |
|
| 206 |
$this->debug[] = "Ajout d'une nouvel utilisateur";
|
- |
|
| 207 |
$this->ajouterUtilisateurACoel($infosAnnuaire, $mot_de_passe_sha1);
|
- |
|
| 208 |
}
|
- |
|
| 209 |
|
- |
|
| 210 |
$this->setUtilisateur($utilisateur_existant, $permanence);
|
- |
|
| 211 |
} else {
|
- |
|
| 212 |
$this->debug[] = "Identification INCORRECTE avec md5";
|
- |
|
| 213 |
return false;
|
- |
|
| 214 |
}
|
- |
|
| 215 |
} else if ($utilisateur_existant != false) {
|
- |
|
| 216 |
// L'utilisateur est toutefois présent dans l'annuaire de COEL, est correctement identifié et n'a pas besoin de mise à jour
|
- |
|
| 217 |
$this->setUtilisateur($utilisateur_existant, $permanence);
|
- |
|
| 218 |
} else {
|
- |
|
| 219 |
// L'utilisateur n'existe ni dans l'annuaire de Tela Botanica ni dans celui de COEL
|
- |
|
| 220 |
return false;
|
- |
|
| 221 |
}
|
- |
|
| 222 |
|
- |
|
| 223 |
// L'utilisateur a t il accepté la licence? Nécessaire pour être connecté!
|
- |
|
| 224 |
if ($utilisateur_existant['licence'] == 1) {
|
- |
|
| 225 |
return true;
|
- |
|
| 226 |
} else {
|
- |
|
| 227 |
return false;
|
- |
|
| 228 |
}
|
134 |
$_SESSION['coel_utilisateur'] = '';
|
| 229 |
}
|
135 |
$_SESSION['coel_infosAnnuaire'] = '';
|
| - |
|
136 |
}
|
| - |
|
137 |
|
| - |
|
138 |
/**
|
| - |
|
139 |
* Retourne true si le compte utilisateur a été modifié dans l'annuaire, et que les
|
| 230 |
}
|
140 |
* modifications ont besoin d'être répercutées dans la table Personnes de Coel
|
| 231 |
|
141 |
*/
|
| 232 |
private function avoirBesoinMiseAJour($info_annuaire_coel) {
|
142 |
protected function avoirBesoinMiseAJour($info_annuaire_coel) {
|
| 233 |
$necessite_maj = false;
|
143 |
$necessite_maj = false;
|
| 234 |
if ($info_annuaire_coel == false) {
|
144 |
if ($info_annuaire_coel == false) {
|
| 235 |
// Le login et/ou le mot de passe a pu changer
|
145 |
// Le login et/ou le mot de passe a pu changer
|
| Line 241... |
Line 151... |
| 241 |
}
|
151 |
}
|
| 242 |
}
|
152 |
}
|
| 243 |
return $necessite_maj;
|
153 |
return $necessite_maj;
|
| 244 |
}
|
154 |
}
|
| Line 245... |
Line 155... |
| 245 |
|
155 |
|
| 246 |
private function comparerInfosAnnuairesDistantEtCoel($annuaire_distant, $annuaire_coel) {
|
156 |
protected function comparerInfosAnnuairesDistantEtCoel($annuaire_distant, $annuaire_coel) {
|
| 247 |
$identique = true;
|
157 |
$identique = true;
|
| 248 |
$tableau_annuaire_distant = array('nom' => $annuaire_distant['nom'],
|
158 |
$tableau_annuaire_distant = array('nom' => $annuaire_distant['nom'],
|
| 249 |
'prenom' => $annuaire_distant['prenom'],
|
159 |
'prenom' => $annuaire_distant['prenom'],
|
| 250 |
'ville' => $annuaire_distant['ville'],
|
160 |
'ville' => $annuaire_distant['ville'],
|
| Line 259... |
Line 169... |
| 259 |
break;
|
169 |
break;
|
| 260 |
}
|
170 |
}
|
| 261 |
}
|
171 |
}
|
| 262 |
return $identique;
|
172 |
return $identique;
|
| 263 |
}
|
173 |
}
|
| 264 |
|
174 |
|
| - |
|
175 |
/**
|
| 265 |
private function getInfoAnnuaireCoelDepuisInfoAnnuaireDistant($mot_de_passe_sha1, $infos) {
|
176 |
* Vérifie si un utilisateur est présent dans la table Personnes de CoeL
|
| 266 |
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
|
- |
|
| 267 |
$utilisateur_existant = array('id' => $infos['id'], 'login' => $infos['courriel'],
|
- |
|
| 268 |
'mot_de_passe' => $mot_de_passe_sha1,
|
- |
|
| 269 |
'nom_complet' => $cp_fmt_nom_complet, 'nom' => $infos['nom'], 'prenom' => $infos['prenom'],
|
- |
|
| 270 |
'parametre' => '', 'licence' => '0');
|
- |
|
| 271 |
return $utilisateur_existant;
|
- |
|
| 272 |
}
|
177 |
*/
|
| 273 |
|
- |
|
| 274 |
private function verifierPresenceUtilisateur($id) {
|
178 |
protected function verifierPresenceUtilisateur($id) {
|
| 275 |
$present = false;
|
179 |
$present = false;
|
| 276 |
$requete = 'SELECT COUNT(cp_id_personne) AS nbre '.
|
180 |
$requete = 'SELECT COUNT(cp_id_personne) AS nbre '.
|
| 277 |
'FROM coel_personne '.
|
181 |
'FROM coel_personne '.
|
| 278 |
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
|
182 |
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
|
| 279 |
" AND cp_ce_annuaire = cp_id_personne ";
|
183 |
" AND cp_ce_annuaire = cp_id_personne ";
|
| Line 291... |
Line 195... |
| 291 |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
|
195 |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
|
| 292 |
}
|
196 |
}
|
| Line 293... |
Line 197... |
| 293 |
|
197 |
|
| 294 |
return $present;
|
198 |
return $present;
|
| 295 |
}
|
199 |
}
|
| - |
|
200 |
|
| - |
|
201 |
/**
|
| - |
|
202 |
* Renvoie l'état d'acceptation de la licence pour un utilisateur donné :
|
| - |
|
203 |
* 0 (non acceptée) ou 1 (acceptée)
|
| 296 |
|
204 |
*/
|
| 297 |
private function recupererLicenceUtilisateur($id) {
|
205 |
protected function recupererLicenceUtilisateur($id) {
|
| 298 |
$requete = 'SELECT cp_mark_licence '.
|
206 |
$requete = 'SELECT cp_mark_licence '.
|
| 299 |
'FROM coel_personne '.
|
207 |
'FROM coel_personne '.
|
| 300 |
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
|
208 |
"WHERE cp_ce_annuaire = {$this->bdd->quote($id)} ".
|
| 301 |
" AND cp_ce_annuaire = cp_id_personne ";
|
209 |
" AND cp_ce_annuaire = cp_id_personne ";
|
| Line 309... |
Line 217... |
| 309 |
}
|
217 |
}
|
| 310 |
} catch (PDOException $e) {
|
218 |
} catch (PDOException $e) {
|
| 311 |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
|
219 |
$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());
|
| 312 |
}
|
220 |
}
|
| 313 |
}
|
221 |
}
|
| 314 |
|
222 |
|
| 315 |
private function mettreAJourMotDePasse($login, $mot_de_passe_md5, $mot_de_passe_sha1) {
|
- |
|
| 316 |
try {
|
- |
|
| 317 |
$requete = 'UPDATE coel_personne '.
|
- |
|
| 318 |
"SET cp_mot_de_passe = '$mot_de_passe_sha1' ".
|
- |
|
| 319 |
"WHERE cp_login = '$login' ".
|
- |
|
| 320 |
" AND cp_mot_de_passe = '$mot_de_passe_md5' ";
|
- |
|
| 321 |
// Ajout des données
|
- |
|
| 322 |
$resultat = $this->bdd->exec($requete);
|
- |
|
| 323 |
if ($resultat === false) {
|
- |
|
| 324 |
$this->messages[] = "Le mot de passe de l'utilisateur n'a pas été mis à jour car la requête a échouée.";
|
- |
|
| 325 |
}
|
223 |
/**
|
| 326 |
} catch (PDOException $e) {
|
- |
|
| 327 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
224 |
* Met à jour les données de l'utilisateur dans la table CoeL Personnes
|
| 328 |
}
|
225 |
*/
|
| 329 |
}
|
- |
|
| 330 |
|
- |
|
| 331 |
private function mettreAJourUtilisateur($login, $mot_de_passe_sha1, $infos) {
|
226 |
protected function mettreAJourUtilisateur($login, $mot_de_passe_sha1, $infos) {
|
| 332 |
try {
|
227 |
try {
|
| 333 |
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
|
228 |
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
|
| 334 |
$requete = 'UPDATE coel_personne '.
|
229 |
$requete = 'UPDATE coel_personne '.
|
| 335 |
"SET cp_id_personne = '{$infos['id']}', ".
|
230 |
"SET cp_id_personne = '{$infos['id']}', ".
|
| 336 |
" cp_fmt_nom_complet = '$cp_fmt_nom_complet', cp_prenom = '{$infos['prenom']}', cp_nom = '{$infos['nom']}', ".
|
231 |
" cp_fmt_nom_complet = '$cp_fmt_nom_complet', cp_prenom = '{$infos['prenom']}', cp_nom = '{$infos['nom']}', ".
|
| Line 346... |
Line 241... |
| 346 |
}
|
241 |
}
|
| 347 |
} catch (PDOException $e) {
|
242 |
} catch (PDOException $e) {
|
| 348 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
243 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
| 349 |
}
|
244 |
}
|
| 350 |
}
|
245 |
}
|
| 351 |
|
246 |
|
| - |
|
247 |
/**
|
| - |
|
248 |
* Ajoute une copie de l'utilisateur dans la table CoeL Personnes
|
| - |
|
249 |
*/
|
| 352 |
private function ajouterUtilisateurACoel($infos, $mot_de_passe_sha1) {
|
250 |
protected function ajouterUtilisateurACoel($infos, $mot_de_passe_sha1) {
|
| 353 |
try {
|
251 |
try {
|
| 354 |
// Construction de la requête d'ajout
|
252 |
// Construction de la requête d'ajout
|
| 355 |
// Notes : pour rester compatibles avec l'annuaire de Tela, les utilisateurs sont ajoutés directement avec l'id
|
253 |
// Notes : pour rester compatibles avec l'annuaire de Tela, les utilisateurs sont ajoutés directement avec l'id
|
| 356 |
// de l'annuaire Tela. Dans CoelPersonne, les personnes qui ne sont pas utilisateur sont ajoutés avec un id supérieur à 100 000
|
254 |
// de l'annuaire Tela. Dans CoelPersonne, les personnes qui ne sont pas utilisateur sont ajoutés avec un id supérieur à 100 000
|
| 357 |
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
|
255 |
$cp_fmt_nom_complet = $infos['prenom'].' '.$infos['nom'];
|
| Line 372... |
Line 270... |
| 372 |
}
|
270 |
}
|
| 373 |
} catch (PDOException $e) {
|
271 |
} catch (PDOException $e) {
|
| 374 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
272 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
| 375 |
}
|
273 |
}
|
| 376 |
}
|
274 |
}
|
| 377 |
|
- |
|
| 378 |
private function souvenirUtilisateur($login, $mot_de_passe_sha1) {
|
- |
|
| 379 |
if ($login == '' && $mot_de_passe_sha1 == '') {
|
- |
|
| 380 |
return false;
|
- |
|
| 381 |
} else if ($utilisateur_existant = $this->chargerUtilisateur($login, $mot_de_passe_sha1)) {
|
- |
|
| 382 |
if ($utilisateur_existant['mot_de_passe'] == $mot_de_passe_sha1) {
|
- |
|
| 383 |
$this->setUtilisateur($utilisateur_existant, $_COOKIE['coel_permanence']);
|
- |
|
| 384 |
return true;
|
- |
|
| 385 |
} else {
|
- |
|
| 386 |
return false;
|
- |
|
| 387 |
}
|
- |
|
| 388 |
}
|
- |
|
| 389 |
}
|
- |
|
| Line -... |
Line 275... |
| - |
|
275 |
|
| - |
|
276 |
/**
|
| - |
|
277 |
* Appelle l'annuaire pour connaître tous les détails de l'utilisateur de courriel $login
|
| 390 |
|
278 |
*/
|
| 391 |
private function obtenirInfosAnnuaire($login) {
|
279 |
protected function obtenirInfosAnnuaire($login) {
|
| 392 |
$url_annuaire = $this->config['coel']['urlAnnuaire'];
|
280 |
$url_annuaire = $this->config['coel']['urlAnnuaire'];
|
| 393 |
$login_annuaire = $this->config['coel']['loginAnnuaire'];
|
281 |
$login_annuaire = $this->config['coel']['loginAnnuaire'];
|
| Line 394... |
Line 282... |
| 394 |
$mdp_annuaire = $this->config['coel']['mdpAnnuaire'];
|
282 |
$mdp_annuaire = $this->config['coel']['mdpAnnuaire'];
|
| Line 412... |
Line 300... |
| 412 |
}
|
300 |
}
|
| 413 |
}
|
301 |
}
|
| 414 |
return $tableau_annuaire;
|
302 |
return $tableau_annuaire;
|
| 415 |
}
|
303 |
}
|
| Line -... |
Line 304... |
| - |
|
304 |
|
| 416 |
|
305 |
/**
|
| 417 |
private function setInfosAnnuaire($infosAnnuaire) {
|
- |
|
| 418 |
$_SESSION['coel_infosAnnuaire'] = $infosAnnuaire;
|
306 |
* Enregistre le fait que la personne de login $login a accepté la licence de CoeL
|
| 419 |
}
|
- |
|
| 420 |
|
307 |
*/
|
| 421 |
private function accepterLicence($login) {
|
308 |
protected function accepterLicence($login) {
|
| 422 |
$sortie = false;
|
309 |
$sortie = false;
|
| 423 |
try {
|
310 |
try {
|
| 424 |
$requete = 'UPDATE coel_personne '.
|
311 |
$requete = 'UPDATE coel_personne '.
|
| 425 |
'SET cp_mark_licence = 1 '.
|
312 |
'SET cp_mark_licence = 1 '.
|
| 426 |
"WHERE cp_login = {$this->bdd->quote($login)} ";
|
313 |
"WHERE cp_login = {$this->bdd->quote($login)} ";
|
| 427 |
$resultat = $this->bdd->exec($requete);
|
314 |
$resultat = $this->bdd->exec($requete);
|
| 428 |
if ($resultat === false) {
|
315 |
if ($resultat === false) {
|
| 429 |
$this->debug[] = "La table Personne n'a pas été mise à jour car la requête a échouée.";
|
316 |
$this->debug[] = "La table Personne n'a pas été mise à jour car la requête a échoué";
|
| 430 |
} else {
|
317 |
} else {
|
| 431 |
$this->debug[] = "Création du cookie licence.";
|
318 |
$this->debug[] = "Création du cookie licence.";
|
| - |
|
319 |
$_SESSION['coel_utilisateur']['licence'] = '1';
|
| 432 |
$_SESSION['coel_utilisateur']['licence'] = '1';
|
320 |
// @TODO CHANGER
|
| 433 |
$this->setCookiePersistant('coel_licence', '1');
|
321 |
$this->setCookiePersistant('coel_licence', '1');
|
| 434 |
$sortie = true;
|
322 |
$sortie = true;
|
| 435 |
}
|
323 |
}
|
| 436 |
} catch (PDOException $e) {
|
324 |
} catch (PDOException $e) {
|
| 437 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
325 |
$messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);
|
| 438 |
}
|
326 |
}
|
| 439 |
return $sortie;
|
327 |
return $sortie;
|
| - |
|
328 |
}
|
| - |
|
329 |
|
| - |
|
330 |
/**
|
| - |
|
331 |
* Essaye de trouver un jeton JWT non vide dans l'entête HTTP "Authorization"
|
| - |
|
332 |
*
|
| - |
|
333 |
* @return String un jeton JWT ou null
|
| - |
|
334 |
*/
|
| - |
|
335 |
protected function lireJetonEntete() {
|
| - |
|
336 |
$jwt = null;
|
| - |
|
337 |
$headers = apache_request_headers();
|
| - |
|
338 |
if (isset($headers["Authorization"]) && ($headers["Authorization"] != "")) {
|
| - |
|
339 |
$jwt = $headers["Authorization"];
|
| - |
|
340 |
}
|
| - |
|
341 |
return $jwt;
|
| - |
|
342 |
}
|
| - |
|
343 |
|
| - |
|
344 |
/**
|
| - |
|
345 |
* Vérifie un jeton auprès de l'annuaire
|
| - |
|
346 |
*
|
| - |
|
347 |
* @param String $jeton un jeton JWT
|
| - |
|
348 |
* @return true si le jeton est vérifié, false sinon
|
| - |
|
349 |
*/
|
| - |
|
350 |
protected function verifierJeton($jeton) {
|
| - |
|
351 |
$urlServiceVerification =$this->config['coel']['urlServiceBaseAuth'] . "verifierjeton";
|
| - |
|
352 |
$urlServiceVerification .= "?token=" . $jeton;
|
| - |
|
353 |
|
| - |
|
354 |
// file_get_contents râle si le certificat HTTPS est auto-signé
|
| - |
|
355 |
//$retour = file_get_contents($urlServiceVerification);
|
| - |
|
356 |
|
| - |
|
357 |
// curl avec les options suivantes ignore le pb de certificat (pour tester en local)
|
| - |
|
358 |
$ch = curl_init();
|
| - |
|
359 |
$timeout = 5;
|
| - |
|
360 |
curl_setopt($ch, CURLOPT_URL, $urlServiceVerification);
|
| - |
|
361 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
| - |
|
362 |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
| - |
|
363 |
// équivalent de "-k"
|
| - |
|
364 |
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
| - |
|
365 |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
| - |
|
366 |
$data = curl_exec($ch);
|
| - |
|
367 |
curl_close($ch);
|
| - |
|
368 |
$retour = $data;
|
| - |
|
369 |
|
| - |
|
370 |
$retour = json_decode($retour, true);
|
| - |
|
371 |
|
| - |
|
372 |
return ($retour === true);
|
| - |
|
373 |
}
|
| - |
|
374 |
|
| - |
|
375 |
/**
|
| - |
|
376 |
* Décode un jeton JWT (SSO) précédemment validé et retourne les infos
|
| - |
|
377 |
* qu'il contient (payload / claims)
|
| - |
|
378 |
* @param String $jeton un jeton JWT précédemment validé
|
| - |
|
379 |
*/
|
| - |
|
380 |
protected function decoderJeton($jeton) {
|
| - |
|
381 |
$parts = explode('.', $jeton);
|
| - |
|
382 |
$payload = $parts[1];
|
| - |
|
383 |
$payload = base64_decode($payload);
|
| - |
|
384 |
$payload = json_decode($payload, true);
|
| - |
|
385 |
|
| - |
|
386 |
return $payload;
|
| - |
|
387 |
}
|
| - |
|
388 |
|
| - |
|
389 |
// accesseurs à deux ronds
|
| - |
|
390 |
protected function getUtilisateurId() {
|
| - |
|
391 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
392 |
return $utilisateur['id'];
|
| - |
|
393 |
} else {
|
| - |
|
394 |
return '';
|
| - |
|
395 |
}
|
| - |
|
396 |
}
|
| - |
|
397 |
protected function getUtilisateurLogin() {
|
| - |
|
398 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
399 |
return $utilisateur['login'];
|
| - |
|
400 |
} else {
|
| - |
|
401 |
return '';
|
| - |
|
402 |
}
|
| - |
|
403 |
}
|
| - |
|
404 |
protected function getUtilisateurNomComplet() {
|
| - |
|
405 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
406 |
return $utilisateur['nom_complet'];
|
| - |
|
407 |
} else {
|
| - |
|
408 |
return '';
|
| - |
|
409 |
}
|
| - |
|
410 |
}
|
| - |
|
411 |
protected function getUtilisateurPrenom() {
|
| - |
|
412 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
413 |
return $utilisateur['prenom'];
|
| - |
|
414 |
} else {
|
| - |
|
415 |
return '';
|
| - |
|
416 |
}
|
| - |
|
417 |
}
|
| - |
|
418 |
protected function getUtilisateurNom() {
|
| - |
|
419 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
420 |
return $utilisateur['nom'];
|
| - |
|
421 |
} else {
|
| - |
|
422 |
return '';
|
| - |
|
423 |
}
|
| - |
|
424 |
}
|
| - |
|
425 |
protected function getParametre() {
|
| - |
|
426 |
if ($utilisateur = $this->getUtilisateur()) {
|
| - |
|
427 |
return $utilisateur['parametre'];
|
| - |
|
428 |
} else {
|
| - |
|
429 |
return '';
|
| - |
|
430 |
}
|
| - |
|
431 |
}
|
| - |
|
432 |
protected function getLicence() {
|
| - |
|
433 |
if (!empty($_SESSION['coel_utilisateur'])) {
|
| - |
|
434 |
return (string) $_SESSION['coel_utilisateur']['licence'];
|
| - |
|
435 |
} else {
|
| - |
|
436 |
return '';
|
| - |
|
437 |
}
|
| - |
|
438 |
}
|
| - |
|
439 |
protected function getInfosAnnuaire() {
|
| - |
|
440 |
if (!empty($_SESSION['coel_infosAnnuaire'])) {
|
| - |
|
441 |
return $_SESSION['coel_infosAnnuaire'];
|
| - |
|
442 |
} else {
|
| - |
|
443 |
return '';
|
| - |
|
444 |
}
|
| - |
|
445 |
}
|
| - |
|
446 |
protected function setInfosAnnuaire($infosAnnuaire) {
|
| - |
|
447 |
$_SESSION['coel_infosAnnuaire'] = $infosAnnuaire;
|
| - |
|
448 |
}
|
| - |
|
449 |
}
|
| - |
|
450 |
|
| - |
|
451 |
/**
|
| - |
|
452 |
* Compatibilité avec nginx - merci http://php.net/manual/fr/function.getallheaders.php
|
| - |
|
453 |
*/
|
| - |
|
454 |
if (! function_exists('apache_request_headers')) {
|
| - |
|
455 |
function apache_request_headers() {
|
| - |
|
456 |
$headers = '';
|
| - |
|
457 |
foreach ($_SERVER as $name => $value) {
|
| - |
|
458 |
if (substr($name, 0, 5) == 'HTTP_') {
|
| - |
|
459 |
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
|
| - |
|
460 |
}
|
| - |
|
461 |
}
|
| - |
|
462 |
return $headers;
|
| 440 |
}
|
463 |
}
|
| 441 |
}
|
464 |
}
|
| 442 |
?>
|
465 |
?>
|