| Line 13... |
Line 13... |
| 13 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
13 |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
|
| 14 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
14 |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
|
| 15 |
* @copyright 1999-2015 Tela Botanica <accueil@tela-botanica.org>
|
15 |
* @copyright 1999-2015 Tela Botanica <accueil@tela-botanica.org>
|
| 16 |
*/
|
16 |
*/
|
| 17 |
class GestionUtilisateur extends Cel {
|
17 |
class GestionUtilisateur extends Cel {
|
| 18 |
|
18 |
|
| 19 |
public function obtenirIdentiteConnectee() {
|
19 |
public function obtenirIdentiteConnectee() {
|
| 20 |
$login_utilisateur = $this->getLoginUtilisateurVerifie();
|
20 |
$login_utilisateur = $this->getLoginUtilisateurVerifie();
|
| 21 |
if ($login_utilisateur) {
|
21 |
if ($login_utilisateur) {
|
| 22 |
$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);
|
22 |
$utilisateur = $this->chargerInfosUtilisateur($login_utilisateur);
|
| 23 |
$utilisateur['connecte'] = true;
|
23 |
$utilisateur['connecte'] = true;
|
| 24 |
} else {
|
24 |
} else {
|
| 25 |
$utilisateur = $this->getUtilisateurAnonyme();
|
25 |
$utilisateur = $this->getUtilisateurAnonyme();
|
| 26 |
}
|
26 |
}
|
| 27 |
return $utilisateur;
|
27 |
return $utilisateur;
|
| 28 |
}
|
28 |
}
|
| 29 |
|
29 |
|
| 30 |
public function obtenirUtilisateurSiExiste($login_utilisateur) {
|
30 |
public function obtenirUtilisateurSiExiste($login_utilisateur) {
|
| 31 |
$utilisateur = $this->getUtilisateurAnonyme();
|
31 |
$utilisateur = $this->getUtilisateurAnonyme();
|
| 32 |
if ($utilisateur_existe = $this->chargerInfosUtilisateur($login_utilisateur)) {
|
32 |
if ($utilisateur_existe = $this->chargerInfosUtilisateur($login_utilisateur)) {
|
| 33 |
$utilisateur = $utilisateur_existe;
|
33 |
$utilisateur = $utilisateur_existe;
|
| 34 |
$utilisateur['connecte'] = true;
|
34 |
$utilisateur['connecte'] = true;
|
| 35 |
}
|
35 |
}
|
| 36 |
return $utilisateur;
|
36 |
return $utilisateur;
|
| 37 |
}
|
37 |
}
|
| 38 |
|
38 |
|
| 39 |
private function chargerInfosUtilisateur($login) {
|
39 |
private function chargerInfosUtilisateur($login) {
|
| 40 |
$requete = 'SELECT * '.
|
40 |
$requete = 'SELECT * '.
|
| 41 |
'FROM cel_utilisateurs AS cu '.
|
41 |
'FROM cel_utilisateurs AS cu '.
|
| 42 |
'WHERE courriel = '.Cel::db()->proteger($login).' '.
|
42 |
'WHERE courriel = '.Cel::db()->proteger($login).' '.
|
| 43 |
' -- '.__FILE__.':'.__LINE__;
|
43 |
' -- '.__FILE__.':'.__LINE__;
|
| 44 |
$resultats = Cel::db()->requeter($requete);
|
44 |
$resultats = Cel::db()->requeter($requete);
|
| 45 |
|
45 |
|
| 46 |
$retour = false;
|
46 |
$retour = false;
|
| 47 |
if (is_array($resultats) && count($resultats) > 0) {
|
47 |
if (is_array($resultats) && count($resultats) > 0) {
|
| 48 |
$retour = $resultats[0];
|
48 |
$retour = $resultats[0];
|
| 49 |
}
|
49 |
}
|
| 50 |
if (is_array($retour) && ($retour['date_premiere_utilisation'] == NULL || $retour['date_premiere_utilisation'] == '0000-00-00 00:00:00')) {
|
50 |
if (is_array($retour) && ($retour['date_premiere_utilisation'] == NULL || $retour['date_premiere_utilisation'] == '0000-00-00 00:00:00')) {
|
| 51 |
$this->initialiserInfosUtilisateur($retour['id_utilisateur']);
|
51 |
$this->initialiserInfosUtilisateur($retour['id_utilisateur']);
|
| 52 |
$this->affecterDonneesWidgetSaisie($login, $retour);
|
52 |
$this->affecterDonneesWidgetSaisie($login, $retour);
|
| 53 |
}
|
53 |
}
|
| 54 |
// booleanisation des valeurs
|
54 |
// booleanisation des valeurs
|
| 55 |
$retour['admin'] = ($retour['admin'] == 1);
|
55 |
$retour['admin'] = ($retour['admin'] == 1);
|
| 56 |
$retour['licence_acceptee'] = ($retour['licence_acceptee'] == 1);
|
56 |
$retour['licence_acceptee'] = (isset($retour['licence_acceptee']) && ($retour['licence_acceptee'] == 1));
|
| 57 |
|
57 |
|
| 58 |
return $retour;
|
58 |
return $retour;
|
| 59 |
}
|
59 |
}
|
| 60 |
|
60 |
|
| 61 |
private function utilisateurEstAutorise($id_utilisateur) {
|
61 |
private function utilisateurEstAutorise($id_utilisateur) {
|
| 62 |
$autorise = false;
|
62 |
$autorise = false;
|
| - |
|
63 |
$token = $this->getToken();
|
| - |
|
64 |
// TODO: tester si le jeton contient réelement quelque chose ?
|
| - |
|
65 |
if($token) {
|
| - |
|
66 |
// On demande à l'annuaire si le jeton est bien valide
|
| - |
|
67 |
$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);
|
| - |
|
68 |
$token_decode = $this->decoderToken($token);
|
| - |
|
69 |
|
| - |
|
70 |
// Si l'utilisateur du token est bien le même que celui sur lequel on veut agir : OK
|
| - |
|
71 |
if($token_decode['id'] == $id_utilisateur) {
|
| - |
|
72 |
$autorise = true;
|
| - |
|
73 |
} else {
|
| - |
|
74 |
// Sinon on vérifie que l'utilisateur est admin
|
| - |
|
75 |
$requete = "SELECT admin FROM cel_utilisateurs WHERE id_utilisateur = ".Cel::db()->proteger($token_decode['id']);
|
| - |
|
76 |
$resultat = Cel::db()->requeter($requete);
|
| - |
|
77 |
|
| - |
|
78 |
$admin = false;
|
| - |
|
79 |
if ($resultat && count($resultat) > 0) {
|
| - |
|
80 |
$autorise = ($resultat[0]['admin'] == 1);
|
| - |
|
81 |
}
|
| - |
|
82 |
}
|
| - |
|
83 |
} else {
|
| - |
|
84 |
// pas de token, on vérifie bien qu'il s'agit d'une session temporaire
|
| - |
|
85 |
$autorise = ($id_utilisateur == session_id());
|
| - |
|
86 |
}
|
| - |
|
87 |
return $autorise;
|
| - |
|
88 |
}
|
| - |
|
89 |
|
| - |
|
90 |
// renvoie false ou bien le login utilisateur actuel
|
| - |
|
91 |
private function getLoginUtilisateurVerifie() {
|
| 63 |
$token = $this->getToken();
|
92 |
$token = $this->getToken();
|
| 64 |
// TODO: tester si le jeton contient réelement quelque chose ?
|
- |
|
| 65 |
if($token) {
|
- |
|
| 66 |
// On demande à l'annuaire si le jeton est bien valide
|
- |
|
| 67 |
$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);
|
- |
|
| 68 |
$token_decode = $this->decoderToken($token);
|
- |
|
| 69 |
|
- |
|
| 70 |
// Si l'utilisateur du token est bien le même que celui sur lequel on veut agir : OK
|
- |
|
| 71 |
if($token_decode['id'] == $id_utilisateur) {
|
- |
|
| 72 |
$autorise = true;
|
- |
|
| 73 |
} else {
|
- |
|
| 74 |
// Sinon on vérifie que l'utilisateur est admin
|
- |
|
| 75 |
$requete = "SELECT admin FROM cel_utilisateurs WHERE id_utilisateur = ".Cel::db()->proteger($token_decode['id']);
|
- |
|
| 76 |
$resultat = Cel::db()->requeter($requete);
|
- |
|
| 77 |
|
- |
|
| 78 |
$admin = false;
|
- |
|
| 79 |
if ($resultat && count($resultat) > 0) {
|
- |
|
| 80 |
$autorise = ($resultat[0]['admin'] == 1);
|
- |
|
| 81 |
}
|
- |
|
| 82 |
}
|
- |
|
| 83 |
} else {
|
- |
|
| 84 |
// pas de token, on vérifie bien qu'il s'agit d'une session temporaire
|
- |
|
| 85 |
$autorise = ($id_utilisateur == session_id());
|
- |
|
| 86 |
}
|
- |
|
| 87 |
return $autorise;
|
- |
|
| 88 |
}
|
- |
|
| 89 |
|
- |
|
| 90 |
// renvoie false ou bien le login utilisateur actuel
|
- |
|
| 91 |
private function getLoginUtilisateurVerifie() {
|
- |
|
| 92 |
$token = $this->getToken();
|
- |
|
| 93 |
$login = false;
|
93 |
$login = false;
|
| 94 |
if($token) {
|
94 |
if($token) {
|
| 95 |
// On demande à l'annuaire si le jeton est bien valide
|
95 |
// On demande à l'annuaire si le jeton est bien valide
|
| 96 |
$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);
|
96 |
$valide = file_get_contents($this->config['identification']['sso_url'].'/verifierjeton?token='.$token);
|
| 97 |
$login = ($valide === "true") ? $this->obtenirLoginParToken($token) : false;
|
97 |
$login = ($valide === "true") ? $this->obtenirLoginParToken($token) : false;
|
| 98 |
}
|
98 |
}
|
| 99 |
|
99 |
|
| 100 |
return $login;
|
100 |
return $login;
|
| 101 |
}
|
101 |
}
|
| 102 |
|
102 |
|
| 103 |
private function decoderToken($token) {
|
103 |
private function decoderToken($token) {
|
| 104 |
$token_parts = explode('.', $token);
|
104 |
$token_parts = explode('.', $token);
|
| 105 |
return json_decode(base64_decode($token_parts[1]), true);
|
105 |
return json_decode(base64_decode($token_parts[1]), true);
|
| 106 |
}
|
106 |
}
|
| 107 |
|
107 |
|
| 108 |
private function obtenirLoginParToken($token) {
|
108 |
private function obtenirLoginParToken($token) {
|
| 109 |
$token_decode = $this->decoderToken($token);
|
109 |
$token_decode = $this->decoderToken($token);
|
| 110 |
return $token_decode['sub'];
|
110 |
return $token_decode['sub'];
|
| 111 |
}
|
111 |
}
|
| 112 |
|
112 |
|
| 113 |
private function getToken() {
|
113 |
private function getToken() {
|
| 114 |
// Premier essai, dans le header
|
114 |
// Premier essai, dans le header
|
| 115 |
$headers = apache_request_headers();
|
115 |
$headers = apache_request_headers();
|
| 116 |
$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
|
116 |
$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
|
| 117 |
|
117 |
|
| 118 |
// Sinon dans $_REQUEST ?
|
118 |
// Sinon dans $_REQUEST ?
|
| 119 |
if($token == null) {
|
119 |
if($token == null) {
|
| 120 |
$token = !empty($_REQUEST['Authorization']) ? $_REQUEST['Authorization'] : null;
|
120 |
$token = !empty($_REQUEST['Authorization']) ? $_REQUEST['Authorization'] : null;
|
| 121 |
}
|
121 |
}
|
| 122 |
|
122 |
|
| 123 |
return $token;
|
123 |
return $token;
|
| 124 |
}
|
124 |
}
|
| 125 |
|
125 |
|
| 126 |
private function getUtilisateurAnonyme() {
|
126 |
private function getUtilisateurAnonyme() {
|
| 127 |
return array('connecte' => false,
|
127 |
return array('connecte' => false,
|
| 128 |
'id_utilisateur' => session_id(),
|
128 |
'id_utilisateur' => session_id(),
|
| 129 |
'courriel' => '',
|
129 |
'courriel' => '',
|
| 130 |
'mot_de_passe' => '',
|
130 |
'mot_de_passe' => '',
|
| 131 |
'nom' => '',
|
131 |
'nom' => '',
|
| 132 |
'prenom' => '',
|
132 |
'prenom' => '',
|
| 133 |
'licence_acceptee' => false,
|
133 |
'licence_acceptee' => false,
|
| 134 |
'preferences_utilisateur' => '',
|
134 |
'preferences_utilisateur' => '',
|
| 135 |
'admin' => false
|
135 |
'admin' => false
|
| 136 |
);
|
136 |
);
|
| 137 |
}
|
137 |
}
|
| 138 |
|
138 |
|
| 139 |
private function initialiserInfosUtilisateur($id_utilisateur) {
|
139 |
private function initialiserInfosUtilisateur($id_utilisateur) {
|
| 140 |
$requete = 'INSERT INTO cel_utilisateurs_infos '.
|
140 |
$requete = 'INSERT INTO cel_utilisateurs_infos '.
|
| 141 |
'(id_utilisateur, admin, licence_acceptee, preferences, date_premiere_utilisation ) '.
|
141 |
'(id_utilisateur, admin, licence_acceptee, preferences, date_premiere_utilisation ) '.
|
| 142 |
'VALUES '.
|
142 |
'VALUES '.
|
| 143 |
'('.Cel::db()->proteger($id_utilisateur).", '0', '0', NULL, NOW()) ".
|
143 |
'('.Cel::db()->proteger($id_utilisateur).", '0', '0', NULL, NOW()) ".
|
| 144 |
'ON DUPLICATE KEY UPDATE date_premiere_utilisation = NOW() '.
|
144 |
'ON DUPLICATE KEY UPDATE date_premiere_utilisation = NOW() '.
|
| 145 |
' -- '.__FILE__.':'.__LINE__;
|
145 |
' -- '.__FILE__.':'.__LINE__;
|
| 146 |
Cel::db()->executer($requete);
|
146 |
Cel::db()->executer($requete);
|
| 147 |
}
|
147 |
}
|
| 148 |
|
148 |
|
| 149 |
/**
|
149 |
/**
|
| 150 |
* Lors de la première connection au cel d'un utilisateur, affecte à son compte ses observations saisies
|
150 |
* Lors de la première connection au cel d'un utilisateur, affecte à son compte ses observations saisies
|
| 151 |
* dans les widgets de saisie, où seul son mail avait été conservé en attendant
|
151 |
* dans les widgets de saisie, où seul son mail avait été conservé en attendant
|
| 152 |
* Enter description here ...
|
152 |
* Enter description here ...
|
| 153 |
* @param string $mail_utilisateur
|
153 |
* @param string $mail_utilisateur
|
| 154 |
* @param array $infos_utilisateur
|
154 |
* @param array $infos_utilisateur
|
| 155 |
*/
|
155 |
*/
|
| 156 |
private function affecterDonneesWidgetSaisie($mail_utilisateur, $infos_utilisateur) {
|
156 |
private function affecterDonneesWidgetSaisie($mail_utilisateur, $infos_utilisateur) {
|
| 157 |
//TODO tout ceci pourrait être simplifié sans avoir besoin d'instancier quoi que ce soit
|
157 |
//TODO tout ceci pourrait être simplifié sans avoir besoin d'instancier quoi que ce soit
|
| 158 |
$gestion_obs = new GestionObservation($this->config);
|
158 |
$gestion_obs = new GestionObservation($this->config);
|
| 159 |
$gestion_img = new GestionImage($this->config);
|
159 |
$gestion_img = new GestionImage($this->config);
|
| 160 |
|
160 |
|
| 161 |
$gestion_obs->migrerObservationsMailVersId($mail_utilisateur, $infos_utilisateur);
|
161 |
$gestion_obs->migrerObservationsMailVersId($mail_utilisateur, $infos_utilisateur);
|
| 162 |
$gestion_img->migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur);
|
162 |
$gestion_img->migrerImagesMailVersId($mail_utilisateur, $infos_utilisateur);
|
| 163 |
GestionMotsClesChemin::migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur);
|
163 |
GestionMotsClesChemin::migrerMotsClesMailVersId($mail_utilisateur, $infos_utilisateur);
|
| 164 |
}
|
164 |
}
|
| 165 |
}
|
165 |
}
|
| Line 166... |
Line 166... |
| 166 |
|
166 |
|
| 167 |
/**
|
167 |
/**
|