Subversion Repositories Applications.referentiel

Rev

Rev 295 | Rev 312 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6 jpm 1
<?php
2
// declare(encoding='UTF-8');
3
/**
4
 * Classe Controleur générale partagée par les différents modules de l'application.
5
 *
6
 * @package		Referentiel
7
 * @category	Php5.2
8
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
9
 * @copyright	2010 Tela-Botanica
10
 * @license		http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
 * @license		http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
12
 * @version		SVN: $Id$
13
 */
14
abstract class AppliControleur extends Controleur {
15
 
16
	const RENDU_TETE = 'tete';
17
	const RENDU_CORPS = 'corps';
18
	const RENDU_PIED = 'pied';
37 jpm 19
	const RENDU_NAVIGATION = 'navigation';
20
	const RENDU_MENU = 'menu';
6 jpm 21
 
22
	// FIXME : voir s'il est plus intéressant d'utiliser une méthode dans les classes filles
23
	protected $url = null;
26 jpm 24
	private $parametres = array();
46 jpm 25
	protected $manuel = null;
26 jpm 26
	private $sortie = array();
27
	private $messages = null;
6 jpm 28
 
26 jpm 29
	//+----------------------------------------------------------------------------------------------------------------+
30
	// Constructeur
31
 
6 jpm 32
	public function __construct()  {
33
		$registre = Registre::getInstance();
34
		$this->parametres = $registre->get('parametres');
35
		$this->url = $this->parametres['url'];
46 jpm 36
		// Chargement des infos du manuel technique des référentiels
203 delphine 37
		$this->manuel = parse_ini_file(Config::get('chemin_appli').DS.'..'.DS.'configurations'.DS.Config::get('manuel'));
6 jpm 38
		parent::__construct();
39
	}
40
 
26 jpm 41
	//+----------------------------------------------------------------------------------------------------------------+
42
	// Accesseurs
43
 
6 jpm 44
	/**
26 jpm 45
	 * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application.
46
	 */
47
	public function getSortie() {
48
		return $this->sortie;
49
	}
50
 
51
	/**
6 jpm 52
	 * Attribue à la bonne position de sortie un contenu.
53
	 */
54
	protected function setSortie($position, $contenu, $fusionner = false) {
55
		if ($this->verifierExistencePosition($position)) {
56
			if ($fusionner) {
57
				$this->sortie[$position] .= $contenu;
58
			} else {
59
				$this->sortie[$position] = $contenu;
60
			}
61
		}
62
	}
63
 
64
	/**
26 jpm 65
	 * Retourne le tableau des messages
66
	 */
67
	protected function getMessages() {
68
		return $this->messages;
69
	}
70
	/**
71
	 * Ajoute un message
72
	 */
73
	protected function addMessage($message) {
74
		if ('' != $message) {
75
			$this->messages[] = $message;
76
		}
77
	}
78
 
79
 
80
	//+----------------------------------------------------------------------------------------------------------------+
81
	// Méthodes
82
 
83
	/**
6 jpm 84
	 * Vérifie l'existence de la position indiquée pour son utilisation dans le tableau de sortie.
85
	 * @param string la position à tester.
86
	 * @return bool true si la position est valide, sinon false.
87
	 */
88
	private function verifierExistencePosition($position) {
89
		$existe = true;
90
		if ($position != self::RENDU_TETE &&
91
			$position != self::RENDU_CORPS &&
37 jpm 92
			$position != self::RENDU_PIED &&
93
			$position != self::RENDU_NAVIGATION &&
94
			$position != self::RENDU_MENU) {
6 jpm 95
			trigger_error("La position '$position' n'est pas une valeur prédéfinie.", E_USER_WARNING);
96
			$existe = false;
97
		}
98
		return $existe;
99
	}
100
 
101
	/**
102
	 * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie.
103
	 */
104
	protected function executerAction($ClasseModule, $action) {
105
		$module = new $ClasseModule();
106
		$module->$action();
107
		$this->fusionnerSortie($module->getSortie());
70 delphine 108
	}
109
 
134 delphine 110
	protected function executerActionReferentiel($ClasseModule, $action, $referentiel, $afficheMoteur = null) {
70 delphine 111
		$module = new $ClasseModule();
134 delphine 112
		$module->$action($referentiel, $afficheMoteur);
70 delphine 113
		$this->fusionnerSortie($module->getSortie());
6 jpm 114
 
115
	}
116
 
117
	/**
118
	 * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre.
119
	 * @param array le tableau à fusionner
120
	 */
121
	private function fusionnerSortie($sortie) {
122
		$this->sortie = array_merge($this->sortie, $sortie);
123
	}
124
 
125
	protected function postraiterDonnees(&$tableau) {
126
		if (count($tableau) > 0) {
127
			foreach ($tableau as $cle => &$valeur) {
128
				if ($valeur == '') {
129
					$valeur = '&nbsp;';
130
				} else if (is_string($valeur)) {
33 jpm 131
					$valeur = $this->remplacerEsperluette($valeur);
6 jpm 132
				} else if (is_array($valeur)) {
133
					$this->postraiterDonnees($valeur);
134
				}
135
			}
136
		}
137
	}
33 jpm 138
 
139
	protected function traiterEsperluette(&$tableau) {
140
		if (count($tableau) > 0) {
141
			foreach ($tableau as $cle => &$valeur) {
142
				if (is_string($valeur)) {
143
					$valeur = $this->remplacerEsperluette($valeur);
144
				} else if (is_array($valeur)) {
145
					$this->traiterEsperluette($valeur);
146
				}
147
			}
148
		}
149
	}
150
 
57 jpm 151
	protected function remplacerEsperluette($txt) {
33 jpm 152
		$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9a-f]+);)/i', '&amp;', $txt, -1);
153
		return $txt;
154
	}
45 jpm 155
 
57 jpm 156
	protected function supprimerSlash($doc) {
157
		if (is_string($doc)) {
158
			$doc = stripslashes($doc);
58 jpm 159
		} else if (is_array($doc) && count($doc) > 0) {
160
			foreach ($doc as $cle => $valeur) {
161
				$doc[$cle] = $this->supprimerSlash($valeur);
57 jpm 162
			}
163
		}
164
		return $doc;
165
	}
166
 
45 jpm 167
	protected function initialiserModulePrincipal() {
168
		$_SESSION['module_principal'] = null;
169
	}
170
 
171
	protected function definirCommeModulePrincipal($module_nom) {
172
		$_SESSION['module_principal'] = $module_nom;
173
	}
174
 
175
	private function getModulePrincipalCourant() {
176
		return $_SESSION['module_principal'];
177
	}
178
 
37 jpm 179
	/**
180
	 * Construction du menu et stockage dans le conteneur de sortie RENDU_MENU.
181
	 *
182
	 * @param string $referentiel code du référentiel.
183
	 */
184
	protected function construireMenu($referentiel) {
185
		$menu['nom'] = 'Accueil';
47 jpm 186
		$menu['url'] = $this->obtenirUrlMenuAccueil();
271 delphine 187
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Accueil') ? 'actif' : 'inactif');
188
		$menu['title'] = "Liste des référentiels consultables.";
37 jpm 189
		$donnees['menus'][] = $menu;
271 delphine 190
		$menu['nom'] = 'Consultation';
191
		$menu['url'] = $this->obtenirUrlMenuConsultation($referentiel);
192
		$menu['activite'] = ((preg_match('/^(?:Consultation|Recherche|FicheTaxon)$/', $this->getModulePrincipalCourant())) ? 'actif' : 'inactif');
193
		$menu['title'] = "Interroger la base en cours de travail.";
194
		$donnees['menus'][] = $menu;
300 aurelien 195
		$menu['nom'] = 'Arbre taxo';
295 aurelien 196
		$menu['url'] = $this->obtenirUrlMenuArbre($referentiel);
197
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Arbre') ? 'actif' : 'inactif');
198
		$menu['title'] = "Consulter l'aborescence du référentiel";
199
		$donnees['menus'][] = $menu;
37 jpm 200
		$menu['nom'] = 'Tests';
201
		$menu['url'] = $this->obtenirUrlMenuTest($referentiel);
271 delphine 202
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Test') ? 'actif' : 'inactif securise');
203
		$menu['title'] = "Réservé aux coordinateurs. Contrôler les données saisies.";
37 jpm 204
		$donnees['menus'][] = $menu;
205
		$menu['nom'] = 'Versionnage';
206
		$menu['url'] = $this->obtenirUrlMenuVersionnage($referentiel);
271 delphine 207
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Versionnage') ? 'actif' : 'inactif securise');
272 delphine 208
		$menu['title'] = "Réservé aux coordinateurs. Générer une version de la base.";
37 jpm 209
		$donnees['menus'][] = $menu;
276 aurelien 210
		$menu['nom'] = 'Informations et téléchargements';
271 delphine 211
		$menu['url'] = $this->obtenirUrlMenuInformations($referentiel);
212
		$menu['activite'] = (($this->getModulePrincipalCourant() == 'Informations') ? 'actif' : 'inactif');
276 aurelien 213
		$menu['title'] = "Informations sur le projet et téléchargements.";
37 jpm 214
		$donnees['menus'][] = $menu;
215
		$this->setSortie(self::RENDU_MENU, $this->getVue('menu', $donnees), false);
216
	}
217
	/**
218
	 * Construction du fil d'ariane et stockage dans le conteneur de sortie RENDU_NAVIGATION.
219
	 *
220
	 * @param $referentiel code du référentiel
221
	 * @param $id_traitement id du traitement
222
	 * @param $id_resultat id du résultat
223
	 */
224
	protected function construireFilAriane($referentiel = null, $id_traitement = null, $id_resultat = null) {
225
		$entree['nom'] = 'Accueil';
226
		$entree['url'] = $this->obtenirUrlMenuAccueil();
227
		$donnees['entrees'][] = $entree;
228
 
229
		if (isset($referentiel)) {
271 delphine 230
			$entree['nom'] = 'Informations '.strtoupper($referentiel);
37 jpm 231
			$entree['url'] = $this->obtenirUrlDetailReferentiel($referentiel);
232
			$donnees['entrees'][] = $entree;
233
 
45 jpm 234
			$module_principal = $this->getModulePrincipalCourant();
235
			if (isset($module_principal)) {
236
				$entree['nom'] = $module_principal;
237
				$entree['url'] = $this->obtenirUrlMenu($module_principal, $referentiel);
37 jpm 238
				$donnees['entrees'][] = $entree;
239
			}
240
 
241
			if (isset($id_traitement)) {
242
				$entree['nom'] = "Traitement #$id_traitement";
243
				$entree['url'] = $this->obtenirUrlFicheTraitement($referentiel, $id_traitement);
244
				$donnees['entrees'][] = $entree;
245
			}
246
 
247
			if (isset($id_resultat)) {
248
				$entree['nom'] = "Résultat #$id_resultat";
249
				$entree['url'] = $this->obtenirUrlFicheResultat($referentiel, $id_resultat);
250
				$donnees['entrees'][] = $entree;
251
			}
252
		}
253
 
254
		$this->setSortie(self::RENDU_NAVIGATION, $this->getVue('fil_ariane', $donnees), false);
255
	}
33 jpm 256
 
37 jpm 257
	protected function obtenirUrlDetailReferentiel($referentiel) {
258
		$this->url->setRequete(false);
271 delphine 259
		$this->url->setVariableRequete('module', 'Informations');
37 jpm 260
		$this->url->setVariableRequete('ref', $referentiel);
261
		$url = $this->url->getURL();
262
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
263
		return $url;
264
	}
265
 
271 delphine 266
	protected function obtenirUrlMenuInformations($referentiel) {
267
		return $this->obtenirUrlMenu('Informations', $referentiel);
268
	}
269
 
37 jpm 270
	protected function obtenirUrlMenuAccueil() {
271
		return $this->obtenirUrlMenu('Accueil');
272
	}
273
 
274
	protected function obtenirUrlMenuTest($referentiel) {
275
		return $this->obtenirUrlMenu('Test', $referentiel);
276
	}
277
 
278
	protected function obtenirUrlMenuVersionnage($referentiel) {
279
		return $this->obtenirUrlMenu('Versionnage', $referentiel);
280
	}
281
 
46 jpm 282
	protected function obtenirUrlDemandeVersionnage($referentiel) {
283
		$this->url->setRequete(false);
284
		$this->url->setVariableRequete('module', 'Versionnage');
285
		$this->url->setVariableRequete('action', 'demanderTraitement');
286
		$this->url->setVariableRequete('ref', $referentiel);
287
		$url = $this->url->getURL();
288
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref'));
289
		return $url;
290
	}
291
 
37 jpm 292
	protected function obtenirUrlMenuConsultation($referentiel) {
293
		return $this->obtenirUrlMenu('Consultation', $referentiel);
294
	}
295
 
295 aurelien 296
	protected function obtenirUrlMenuArbre($referentiel) {
297
		return $this->obtenirUrlMenu('Arbre', $referentiel);
298
	}
299
 
300 aurelien 300
	protected function obtenirUrlMenuBranche($referentiel, $num_nom) {
301
		$this->url->setRequete(false);
302
		$this->url->setVariableRequete('module', 'Arbre');
303
		$this->url->setVariableRequete('action', 'afficherBranche');
304
		$this->url->setVariableRequete('ref', $referentiel);
305
		$this->url->setVariableRequete('num_nom', $num_nom);
306
		$url = $this->url->getURL();
307
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref', 'num_nom'));
308
		return $url;
309
	}
310
 
311
	protected function obtenirUrlMenuBrancheSynonyme($referentiel, $num_nom) {
312
		$this->url->setRequete(false);
313
		$this->url->setVariableRequete('module', 'Arbre');
314
		$this->url->setVariableRequete('action', 'afficherBrancheSynonyme');
315
		$this->url->setVariableRequete('ref', $referentiel);
316
		$this->url->setVariableRequete('num_nom', $num_nom);
317
		$url = $this->url->getURL();
318
		$this->url->unsetVariablesRequete(array('module', 'action', 'ref', 'num_nom'));
319
		return $url;
320
	}
321
 
37 jpm 322
	private function obtenirUrlMenu($menu, $referentiel = null) {
323
		$this->url->setRequete(false);
324
		$this->url->setVariableRequete('module', $menu);
325
		if (isset($referentiel)) {
326
			$this->url->setVariableRequete('ref', $referentiel);
327
		}
328
		$url = $this->url->getURL();
329
		$this->url->unsetVariablesRequete(array('module', 'ref'));
330
		return $url;
331
	}
332
 
333
	protected function obtenirUrlFicheTraitement($referentiel, $id_traitement) {
334
		$this->url->setRequete(false);
335
		$this->url->setVariableRequete('module', 'Traitement');
336
		$this->url->setVariableRequete('id-t', $id_traitement);
337
		$this->url->setVariableRequete('ref', $referentiel);
338
		$url = $this->url->getURL();
339
		$this->url->unsetVariablesRequete(array('module', 'id-t', 'ref'));
340
		return $url;
341
	}
342
 
343
	protected function obtenirUrlFicheResultat($referentiel, $id_resultat) {
344
		$this->url->setRequete(false);
345
		$this->url->setVariableRequete('module', 'Resultat');
346
		$this->url->setVariableRequete('id-r', $id_resultat);
347
		$this->url->setVariableRequete('ref', $referentiel);
348
		$url = $this->url->getURL();
349
		$this->url->unsetVariablesRequete(array('module', 'id-r', 'ref'));
350
		return $url;
351
	}
39 jpm 352
 
77 delphine 353
	protected function obtenirUrlRecherche($referentiel = null, $txt = null) {
70 delphine 354
		$this->url->setRequete(false);
77 delphine 355
		if (!is_null($referentiel)) {
356
			$this->url->setVariableRequete('ref', $referentiel);
357
		}
70 delphine 358
		$this->url->setVariableRequete('module', 'Recherche');
359
		$this->url->setVariableRequete('action', 'rechercher');
360
		if (!is_null($txt)) {
361
			$this->url->setVariableRequete('recherche', $txt);
362
		}
363
		$url = $this->url->getURL();
364
		$this->url->unsetVariablesRequete(array('ref', 'module', 'action', 'recherche'));
365
		return $url;
366
	}
103 jpm 367
	protected function obtenirUrlFicheTaxon($referentiel, $num_nom = null) {
77 delphine 368
		$this->url->setRequete(false);
369
		$this->url->setVariableRequete('ref', $referentiel);
370
		$this->url->setVariableRequete('module', 'FicheTaxon');
371
		if (!is_null($num_nom)) {
372
			$this->url->setVariableRequete('num_nom', $num_nom);
373
		}
374
		$url = clone $this->url;
375
		$this->url->unsetVariablesRequete(array('module', 'id'));
376
		return $url->getURL();
377
	}
70 delphine 378
 
39 jpm 379
	/**
380
	 * Lance l'ajout d'un traitement
381
	 */
382
	protected function ajouterTraitement($referentiel_code, $script_nom) {
51 jpm 383
		$this->ajouterTraitementParametre($referentiel_code, null, $script_nom);
384
	}
385
 
386
	/**
387
	 * Lance l'ajout d'un traitement
388
	 */
389
	protected function ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom) {
39 jpm 390
		if (is_null($referentiel_code)) {
156 jpm 391
			$this->addMessage("Aucun code de projet de référentiel n'est indiqué (Ex. bdtfx).");
39 jpm 392
		} else {
46 jpm 393
			$traitements_a_supprimer = null;
39 jpm 394
			$traitementDao = new TraitementDao();
395
			$resultat_traitement_en_attente = $traitementDao->getTraitementsEnAttente($referentiel_code, $script_nom);
396
			if ($resultat_traitement_en_attente) {
46 jpm 397
				foreach ($resultat_traitement_en_attente as $traitement) {
398
					$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['meta_date_creation'], date ("Y-m-d H:i:s"));
399
					Debug::printr("Différence attente : $difference > ".Config::get('ddv_traitement_attente'));
400
					if ($difference > Config::get('ddv_traitement_attente')) {
401
						$traitements_a_supprimer[] = $traitement['id_traitement'];
402
						$this->addMessage("Le traitement #{$traitement['id_traitement']} était en attente depuis plus de 5mn, il a été supprimé.");
403
					} else {
404
						$this->addMessage("Un traitement est déjà en attente...");
405
					}
406
				}
39 jpm 407
			} else {
408
				$resultat_traitement_en_cours = $traitementDao->getTraitementsEnCours($referentiel_code, $script_nom);
409
				if ($resultat_traitement_en_cours) {
46 jpm 410
					foreach ($resultat_traitement_en_cours as $traitement) {
411
						$difference = $this->differenceEnSecondeEntreDeuxDates($traitement['date_debut'], date ("Y-m-d H:i:s"));
412
						Debug::printr("Différence en cours : $difference > ".Config::get('ddv_traitement_en_cours'));
413
						if ($difference > Config::get('ddv_traitement_en_cours')) {
414
							$traitements_a_supprimer[] = $traitement['id_traitement'];
415
							$this->addMessage("Le traitement #{$traitement['id_traitement']} était en cours depuis plus de 5mn, il a été supprimé.");
416
						} else {
417
							$this->addMessage("Un traitement est déjà en cours...");
418
						}
419
					}
39 jpm 420
				} else {
51 jpm 421
					$resultat = $traitementDao->ajouterTraitementParametre($referentiel_code, $parametres_serialises, $script_nom);
39 jpm 422
					if ($resultat != false) {
423
						$this->addMessage("Le traitement #'$resultat' a été ajouté.");
424
						$this->lancerScript($referentiel_code, $script_nom);
425
					} else {
426
						$this->addMessage("Un problème est survenu lors de la tentative d'ajout du traitement.");
427
					}
428
				}
429
			}
46 jpm 430
			// Suppression des traitements posant problème
431
			if (count($traitements_a_supprimer) > 0) {
432
				$traitementDao->supprimer($traitements_a_supprimer);
433
			}
39 jpm 434
		}
435
	}
436
 
46 jpm 437
	private function differenceEnSecondeEntreDeuxDates($date_01, $date_02) {
438
		if (floatval(phpversion()) >= 5.3 ) {
439
			$d1 = new DateTime($date_01);
440
			$d2 = new DateTime($date_02);
441
			$difference_absolue = true;
442
			$diff = $d1->diff($d2, $difference_absolue);
443
			$nbre_secondes = $diff->format('s');
444
		} else {
445
			$nbre_secondes = abs(round((strtotime($date_01) - strtotime($date_02))));
446
		}
447
		return $nbre_secondes;
448
	}
449
 
39 jpm 450
	/**
451
	 * Lance le script d'execution des traitements
452
	 */
453
	protected function lancerScript($referentiel_code, $script_nom) {
454
		$php = Config::get('chemin_bin_php');
455
		$exe = Config::get('chemin_script');
456
		$action = 'tout';
457
		$log = Config::get('chemin_script_log');
46 jpm 458
		$limite_memoire = Config::get('script_limite_memoire');
459
		$commande = "$php -d memory_limit=$limite_memoire -f $exe $script_nom -p $referentiel_code -a $action > $log &";
39 jpm 460
 
461
		if ($this->verifierSafeModeOff() === false) {
462
			$e = "Le safe_mode est actif sur ce serveur.";
463
		} else if ($this->verifierAccesFonctionExec() === false) {
464
			$e = "La fonction 'exec()' fait partie des fonctions désactivées sur ce serveur (voir disable_functions).";
465
		} else {
466
			$this->addMessage("Lancement du script effectuant les traitements.");
467
			exec($commande);
468
		}
469
 
470
		// Affichage des message de paramêtrage du serveur si nécessaire
471
		if (Config::get('script_messages') == true) {
472
			$message_erreur_tpl = "%s\n.".
473
				"Il est nécessaire de configurer le lancement du script via une tache dans le cron.\n".
474
				"La commande à lancer est : <code>$commande</code>";
475
			$this->addMessage(sprintf($message_erreur_tpl, $e));
476
		}
477
	}
478
 
479
	private function verifierSafeModeOff() {
480
		return ('1' == ini_get('safe_mode')) ? false : true;
481
	}
482
 
483
	private function verifierAccesFonctionExec() {
484
		$disabled = explode(', ', ini_get('disable_functions'));
485
		return !in_array('exec', $disabled);
486
	}
120 jpm 487
 
488
	//+----------------------------------------------------------------------------------------------------------------+
276 aurelien 489
	// GESTION DES FICHIERS A TELECHARGER
490
 
491
	/**
492
	* Crée la liste d'url des fichiers à télécharger pour un traitement donné
493
	* @param Array $infos_traitement tableau contenant les informations du traitement
494
	*
495
	* @return Array un tableau contenant la liste des urls des fichiers à télécharger
496
	*/
497
	protected function obtenirUrlsZipPourTraitement($infos_traitement) {
498
		$urls_zip = null;
499
		if (isset($infos_traitement['script']) && $infos_traitement['script'] == 'versionnage') {
500
			$meta = unserialize($infos_traitement['script_parametres']);
501
			$projet = strtolower($infos_traitement['referentiel_code']);
502
			$version = str_replace('.', '_', $meta['version']);
503
			$fichier_zip_bdnt = $projet.'_v'.$version.'.zip';
504
			$url_zip_bdnt = sprintf(Config::get('url_zip_tpl'), $fichier_zip_bdnt);
505
			if ($this->testerUrl($url_zip_bdnt)) {
506
				$urls_zip[$fichier_zip_bdnt] = $url_zip_bdnt;
507
			}
508
 
509
			$fichier_zip_partiel_ancien = $projet.'_v'.$version.'_partiel.zip';
510
			$url_zip_partiel_ancienne = sprintf(Config::get('url_zip_tpl'), $fichier_zip_partiel_ancien);
511
			$fichier_zip_partiel = $projet.'_v'.$version.$this->manuel['suffixe_partiel'].'.zip';
512
			$url_zip_partiel = sprintf(Config::get('url_zip_tpl'), $fichier_zip_partiel);
513
			if ($this->testerUrl($url_zip_partiel)) {
514
				$urls_zip[$fichier_zip_partiel] = $url_zip_partiel;
515
			} else if ($this->testerUrl($url_zip_partiel_ancienne)) {
516
				$urls_zip[$fichier_zip_partiel_ancien] = $url_zip_partiel_ancienne;
517
			}
518
 
519
		}
520
		return $urls_zip;
521
	}
522
 
523
	/**
524
	* Teste une url donnée, en tentant de l'ouvrir et de la fermer
525
	*
526
	* @return boolean un booléen indiquant le succès ou non de l'opération
527
	*/
528
	protected function testerUrl($url) {
529
		//TODO: voir si on peut inclure cette fonction dans le framework
530
		ini_set('allow_url_fopen', '1');
531
		return (@fclose(@fopen($url, 'r'))) ? true : false;
532
	}
533
 
534
	//+----------------------------------------------------------------------------------------------------------------+
120 jpm 535
	// GESTION DU CLIENT REST
536
 
537
	protected function getRestClient() {
538
		if (! isset($this->restClient)) {
539
			$this->restClient = new RestClient();
540
		}
541
		return $this->restClient;
542
	}
543
 
544
	//+----------------------------------------------------------------------------------------------------------------+
545
	// GESTION DE L'IDENTIFICATION
546
 
547
	protected function getAuthIdentifiant() {
548
		$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null;
549
		return $id;
550
	}
551
 
552
	protected function getAuthMotDePasse() {
553
		$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null;
554
		return $mdp;
555
	}
556
 
557
	public function authentifierCoordinateur() {
558
		$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica.";
559
		$message_echec = "Accès limité aux coordinateurs du projet.\n".
560
			"Votre tentative d'identification a échoué.\n".
561
			"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme coordinateur.";
562
		return $this->authentifier($message_accueil, $message_echec);
563
	}
564
 
565
	private function authentifier($message_accueil, $message_echec) {
566
		$id = $this->getAuthIdentifiant();
567
		if (!isset($id)) {
568
			$this->envoyerAuth($message_accueil, $message_echec);
569
		} else {
570
			$autorisation = $this->etreCoordinateurAutorise();
571
			if ($autorisation == false) {
572
				$this->envoyerAuth($message_accueil, $message_echec);
573
			}
574
		}
575
		return true;
576
	}
577
 
578
	public function etreCoordinateurAutorise($identifiant) {
579
		$identifiant = $this->getAuthIdentifiant();
580
		$mdp = md5($this->getAuthMotDePasse());
581
		$url = sprintf(Config::get('authentification.serviceUrlTpl'), $identifiant, $mdp);
582
		$json = $this->getRestClient()->envoyerRequeteConsultation($url);
583
		$existe = json_decode($json);
584
		$admin = $this->etreCoordinateur($identifiant) ? true : false;
585
		$autorisation = ($existe && $admin) ? true : false;
586
		return $autorisation;
587
	}
588
 
589
	public function etreCoordinateur($courriel) {
590
		$coordinateurs = Config::get('authentification.coordinateurs');
591
		$courriels_autorises = explode(',', $coordinateurs);
592
 
593
		$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ;
594
		return $autorisation;
595
	}
596
 
597
	private function envoyerAuth($message_accueil, $message_echec) {
598
		header('HTTP/1.0 401 Unauthorized');
599
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
600
		header('Content-type: text/plain; charset=UTF-8');
601
		print $message_echec;
602
		exit(0);
603
	}
6 jpm 604
}