Subversion Repositories eFlore/Applications.cel

Rev

Rev 2122 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2122 Rev 2143
Line 1... Line 1...
1
<?php
1
<?php
2
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel //
-
 
3
 
-
 
4
/**
2
/**
5
 * Classe mère abstraite contenant les méthodes génériques des services.
3
 * Classe mère abstraite contenant les méthodes génériques des services.
6
 * Encodage en entrée : utf8
4
 * Encodage en entrée : utf8
7
 * Encodage en sortie : utf8
5
 * Encodage en sortie : utf8
8
 *
6
 *
9
 * @author Jean-Pascal MILCENT <jpm@clapas.org>
7
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @author Aurélien Peronnet <aurelien@tela-botanica.org>
8
 * @author Aurélien Peronnet <aurelien@tela-botanica.org>
11
 * @author Raphaël Droz <raphael@tela-botanica.org>
9
 * @author Raphaël Droz <raphael@tela-botanica.org>
12
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
13
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
14
 * @version $Id$
-
 
15
 * @copyright © 2012, 2013 Tela Botanica
12
 * @copyright © 2006-2014 Tela Botanica
16
 */
13
 */
17
require_once('Bdd2.php');
14
require_once('Bdd2.php');
Line 18... Line 15...
18
 
15
 
19
abstract class Cel {
16
abstract class Cel {
Line 44... Line 41...
44
	static $referentiels_valides = array('bdtfx', 'bdtxa', 'isfan', 'bdtao');
41
	static $referentiels_valides = array('bdtfx', 'bdtxa', 'isfan', 'bdtao');
45
	static $default_referentiel = 'bdtfx';
42
	static $default_referentiel = 'bdtfx';
46
	static $fallback_referentiel = 'autre';
43
	static $fallback_referentiel = 'autre';
Line 47... Line 44...
47
 
44
 
48
	public function __construct($config) {
-
 
49
 
45
	public function __construct($config) {
50
		@session_start();
46
		@session_start();
51
		// Tableau contenant la config de Jrest
47
		// Tableau contenant la config de Jrest
Line 52... Line 48...
52
		$this->config = $config;
48
		$this->config = $config;
Line 71... Line 67...
71
	protected function connecterPDO($config, $base = 'database_cel') {
67
	protected function connecterPDO($config, $base = 'database_cel') {
72
		return new Bdd2($config, $base);
68
		return new Bdd2($config, $base);
73
	}
69
	}
Line 74... Line 70...
74
 
70
 
-
 
71
	public static function db() {
75
	public static function db() {
72
		if (! self::$bdd) {
-
 
73
			die('ERREUR: aucune base de données de disponible.');
76
		if(! self::$bdd) die('ERR: no DB available');
74
		}
77
		return self::$bdd;
75
		return self::$bdd;
Line 78... Line 76...
78
	}
76
	}
79
 
77
 
-
 
78
	// TODO: delete wrappers, en attendant que $this->bdd soit remplacé par Cel::db() partout.
80
	// TODO: delete wrappers, en attendant que $this->bdd soit remplacé par Cel::db() partout.
79
	public function __get($prop) {
-
 
80
		$retour = $this->$prop;
-
 
81
		if ($prop == 'bdd') {
81
	public function __get($prop) {
82
			$retour = self::$bdd;
82
		if($prop == 'bdd') return self::$bdd;
83
		}
Line 83... Line 84...
83
		return $this->$prop;
84
		return $retour;
84
	}
85
	}
85
 
86
 
Line 155... Line 156...
155
	}
156
	}
Line 156... Line 157...
156
 
157
 
157
	//+----------------------------------------------------------------------------------------------------------------+
158
	//+----------------------------------------------------------------------------------------------------------------+
Line -... Line 159...
-
 
159
	// GESTION de l'ENVOI au NAVIGATEUR
-
 
160
 
-
 
161
	protected function envoyerMessageErreur($code, $msg) {
-
 
162
		http_response_code($code);
-
 
163
		header("Content-Type: text/plain; charset=utf-8");
-
 
164
		die($msg);
158
	// GESTION de l'ENVOI au NAVIGATEUR
165
	}
159
 
166
 
160
	protected function envoyerJson($donnees, $encodage = 'utf-8') {
167
	protected function envoyerJson($donnees, $encodage = 'utf-8') {
161
		$encodage_json = true;
168
		$encodage_json = true;
Line 173... Line 180...
173
	}
180
	}
Line 174... Line 181...
174
 
181
 
175
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) {
182
	protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) {
176
		// Traitements des messages d'erreurs et données
183
		// Traitements des messages d'erreurs et données
177
		if (count($this->messages) != 0) {
184
		if (count($this->messages) != 0) {
178
			header('HTTP/1.1 500 Internal Server Error');
185
			http_response_code(500);// Internal Server Error
179
			$mime = 'application/json';
186
			$mime = 'application/json';
180
			$json = true;
187
			$json = true;
181
			$sortie = $this->messages;
188
			$sortie = $this->messages;
182
		} else {
189
		} else {
Line 217... Line 224...
217
		}
224
		}
218
		print $contenu;
225
		print $contenu;
219
	}
226
	}
Line 220... Line 227...
220
 
227
 
221
	static function envoyerAuth($message_accueil, $message_echec) {
228
	static function envoyerAuth($message_accueil, $message_echec) {
222
		header('HTTP/1.0 401 Unauthorized');
229
		http_response_code(401);// Unauthorized
223
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
230
		header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"');
224
		header('Content-type: text/plain; charset=UTF-8');
231
		header('Content-type: text/plain; charset=UTF-8');
225
		print $message_echec;
232
		print $message_echec;
226
		exit;
233
		exit;
Line 279... Line 286...
279
			}
286
			}
280
		}
287
		}
281
	}
288
	}
Line 282... Line 289...
282
 
289
 
283
	public function controleAppelIpAutorisee() {
290
	public function controleAppelIpAutorisee() {
284
		$ips_autorisees = explode(',', @$this->config['jrest_admin']['ip_autorisees']);
291
		$ipsAutorisees = explode(',', $this->config['jrest_admin']['ip_autorisees']);
-
 
292
		$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
285
		if(!in_array($_SERVER['REMOTE_ADDR'], $ips_autorisees) && $_SERVER['REMOTE_ADDR'] != $_SERVER['SERVER_ADDR']) {
293
		$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP);
286
			header('HTTP/1.0 401 Unauthorized');
294
		if (!in_array($remoteIp, $ipsAutorisees) || $remoteIp != $serverIp) {
-
 
295
			$msg = "Accès interdit. \n".
-
 
296
				"Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n";
287
			exit('Accès interdit');
297
			$this->envoyerMessageErreur(401, $msg);
288
		}
298
		}
289
		return true;
299
		return true;
Line 290... Line 300...
290
	}
300
	}
291
 
301
 
292
	public function logger($index,$chaine = 'err') {
302
	public function logger($index,$chaine = 'err') {
293
		if(!class_exists('Log')) {
303
		if (!class_exists('Log')) {
294
			Log::getInstance();
-
 
295
		}
304
			Log::getInstance();
296
 
305
		}
297
		Log::setCheminLog($this->config['log']['cheminlog']);
306
		Log::setCheminLog($this->config['log']['cheminlog']);
298
		Log::setTimeZone($this->config['log']['timezone']);
-
 
299
		Log::setTailleMax($this->config['log']['taillemax']);
307
		Log::setTimeZone($this->config['log']['timezone']);
300
 
308
		Log::setTailleMax($this->config['log']['taillemax']);
Line 301... Line 309...
301
		Log::ajouterEntree($index,$chaine);
309
		Log::ajouterEntree($index,$chaine);
302
	}
310
	}
Line 341... Line 349...
341
		// parmi les admins ?
349
		// parmi les admins ?
342
		return in_array($courriel, explode(',', $this->config['jrest_admin']['admin']));
350
		return in_array($courriel, explode(',', $this->config['jrest_admin']['admin']));
343
	}
351
	}
Line 344... Line 352...
344
 
352
 
345
	public function getInfosComplementairesUtilisateur($id_utilisateur) {
353
	public function getInfosComplementairesUtilisateur($id_utilisateur) {
346
        $defaut_infos = array('prenom' => '', 'nom' => '', 'courriel' => '');
354
		$infos = array('prenom' => '', 'nom' => '', 'courriel' => '');
347
		if(! is_numeric($id_utilisateur)) return $defaut_infos;
-
 
348
 
355
		if (is_numeric($id_utilisateur)) {
349
        $resultat_infos_utilisateur = Cel::db()->requeter(
356
			$idUtilisateurP = Cel::db()->proteger($id_utilisateur);
-
 
357
			$requete = 'SELECT prenom, nom, courriel '.
350
            'SELECT prenom, nom, courriel FROM cel_utilisateurs'
358
				'FROM cel_utilisateurs '.
-
 
359
				"WHERE id_utilisateur = $idUtilisateurP ".
-
 
360
				' -- ' . __FILE__ . ':' . __LINE__;
Line 351... Line 361...
351
            . ' WHERE id_utilisateur = '.Cel::db()->proteger($id_utilisateur));
361
			$resultat = Cel::db()->requeter($requete);
352
 
362
 
-
 
363
			if ($resultat && count($resultat)) {
-
 
364
				$infos = $resultat[0];
-
 
365
			}
353
        if($resultat_infos_utilisateur && count($resultat_infos_utilisateur)) return $resultat_infos_utilisateur[0];
366
		}
Line 354... Line 367...
354
		return $defaut_infos; // autrement, info par défaut
367
		return $infos;
-
 
368
	}
Line 355... Line 369...
355
	}
369
 
356
 
-
 
357
	public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
370
	public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) {
-
 
371
		$infos = array('prenom' => '', 'nom' => '', 'courriel' => $mail_utilisateur);
358
 
372
 
-
 
373
		$mailUtilisateurP = Cel::db()->proteger($mail_utilisateur);
Line 359... Line 374...
359
		$infos_utilisateur = array('prenom' => '', 'nom' => '', 'courriel' => $mail_utilisateur);
374
		$requete = 'SELECT id_utilisateur as id, prenom, nom '.
Line 360... Line 375...
360
 
375
			'FROM cel_utilisateurs '.
361
		$requete_infos_utilisateur = 'SELECT id_utilisateur as id, prenom, nom FROM cel_utilisateurs '.
376
			"WHERE courriel = $mailUtilisateurP ".
362
									 'WHERE courriel = '.Cel::db()->proteger($mail_utilisateur);
377
			' -- ' . __FILE__ . ':' . __LINE__;
Line 363... Line 378...
363
 
378
 
-
 
379
		$resultat = Cel::db()->requeter($requete);
-
 
380
 
-
 
381
		if ($resultat && is_array($resultat) && count($resultat) > 0) {
-
 
382
			$infos = $resultat;
-
 
383
		}
-
 
384
 
-
 
385
		return $infos;
-
 
386
	}
364
		$resultat_infos_utilisateur = Cel::db()->requeter($requete_infos_utilisateur);
387
 
Line 365... Line 388...
365
 
388
	protected function controlerAccessibiliteWs() {
366
		if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) {
389
		if (self::ARRET_SERVICE) {
Line 367... Line 390...
367
			$infos_utilisateur = $resultat_infos_utilisateur;
390
			$msg = "Les services du CEL sont temporairement désactivées.";
368
		}
-
 
369
 
-
 
370
		return $infos_utilisateur;
391
			$this->envoyerMessageErreur(503, $msg);
371
	}
392
		}
372
 
393
		return true;
373
	//+----------------------------------------------------------------------------------------------------------------+
-
 
374
	// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES
394
	}
375
 
395
 
376
	protected function denullifierTableauValeurCel(&$tableau) {
396
	//+----------------------------------------------------------------------------------------------------------------+
377
 
397
	// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES
378
		// Denullifiage
-
 
379
		foreach($tableau as $k=>$v) {
398
 
380
			if (($v=="null") || ($v=="000null")) {
399
	protected function denullifierTableauValeurCel(&$tableau) {
Line 381... Line 400...
381
				$row[$k]="";
400
		foreach ($tableau as $k => $v) {
382
			}
401
			if (($v == 'null') || ($v == '000null')) {
Line 401... Line 420...
401
	 *
420
	 *
402
	 * @param array $courriels un tableau de courriels pour lesquels il faut rechercher les infos d'identité
421
	 * @param array $courriels un tableau de courriels pour lesquels il faut rechercher les infos d'identité
403
	 */
422
	 */
404
	protected function creerAuteurs(Array $courriels) {
423
	protected function creerAuteurs(Array $courriels) {
405
		$auteurs = array();
424
		$auteurs = array();
406
		if ($identites = $this->recupererUtilisateursIdentite($courriels)) {
425
		$identites = $this->recupererUtilisateursIdentite($courriels);
-
 
426
		if ($identites) {
407
			foreach ($identites as $courriel => $infos) {
427
			foreach ($identites as $courriel => $infos) {
408
				$auteurs[$courriel] = $infos['intitule'];
428
				$auteurs[$courriel] = $infos['intitule'];
409
			}
429
			}
410
		}
430
		}
411
		return $auteurs;
431
		return $auteurs;
Line 473... Line 493...
473
		}
493
		}
474
		return $donnees;
494
		return $donnees;
475
	}
495
	}
Line 476... Line 496...
476
 
496
 
477
	protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){
497
	protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){
478
       $val = explode(' ', $date_heure_mysql);
498
		$val = explode(' ', $date_heure_mysql);
479
       $date = explode('-', $val[0]);
499
		$date = explode('-', $val[0]);
480
       $heure = explode(':', $val[1]);
500
		$heure = explode(':', $val[1]);
481
       return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
501
		return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]);
Line 482... Line 502...
482
	}
502
	}
483
 
503
 
484
	protected function etreNull($valeur) {
504
	protected function etreNull($valeur) {
Line 497... Line 517...
497
		}
517
		}
498
		return $date_formatee;
518
		return $date_formatee;
499
	}
519
	}
Line 500... Line 520...
500
 
520
 
501
	protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
-
 
502
 
521
	protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) {
503
		$code_departement = '';
522
		$code_departement = '';
504
		if($this->estUnCodeInseeDepartement($code_zone_geo)) {
523
		if($this->estUnCodeInseeDepartement($code_zone_geo)) {
505
			$code_departement = substr(ltrim($code_zone_geo,'INSEE-C:'),0,2);
524
			$code_departement = substr(ltrim($code_zone_geo,'INSEE-C:'),0,2);
506
		}
-
 
507
 
525
		}
508
		return $code_departement;
526
		return $code_departement;
Line 509... Line 527...
509
	}
527
	}
510
 
528
 
511
	protected function estUnCodeInseeDepartement($code_a_tester) {
529
	protected function estUnCodeInseeDepartement($code_a_tester) {
Line 512... Line 530...
512
		return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester);
530
		return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester);
513
	}
-
 
514
 
531
	}
515
	protected function convertirCodeZoneGeoVersCodeInsee($code_zone_geo) {
532
 
516
 
533
	protected function convertirCodeZoneGeoVersCodeInsee($code_zone_geo) {
517
		$code_departement = '';
534
		$code_departement = '';
518
		if($this->estUnCodeInseeDepartement($code_zone_geo)) {
-
 
519
			$code_departement = ltrim($code_zone_geo,'INSEE-C:');
535
		if($this->estUnCodeInseeDepartement($code_zone_geo)) {
520
		}
536
			$code_departement = ltrim($code_zone_geo,'INSEE-C:');
Line 521... Line 537...
521
 
537
		}
522
		return $code_departement;
538
		return $code_departement;
-
 
539
	}
-
 
540
 
-
 
541
	static function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $code_insee) {
523
	}
542
		$nomCommuneP = Cel::db()->proteger($nom_commune);
524
 
543
		$codeInseeP = Cel::db()->proteger("INSEE-C:$code_insee%");
525
	static function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $code_insee) {
544
		$requete = 'SELECT id_zone_geo '.
526
		$resultat = Cel::db()->requeter(sprintf(
545
			'FROM cel_zones_geo '.
-
 
546
			"WHERE nom LIKE $nomCommuneP AND id_zone_geo LIKE $codeInseeP ".
527
            'SELECT id_zone_geo FROM cel_zones_geo WHERE nom LIKE %s AND id_zone_geo LIKE %s',
547
			' -- ' . __FILE__ . ':' . __LINE__;
528
            Cel::db()->proteger($nom_commune),
548
		$resultat = Cel::db()->requeter($requete);
-
 
549
 
-
 
550
		$infos = $code_insee; // Par défaut retourne l'original
529
            Cel::db()->proteger("INSEE-C:" . $code_insee . '%')));
551
		if ($resultat && count($resultat)) {
Line 530... Line 552...
530
 
552
			$infos = $resultat[0]['id_zone_geo'];
531
		if($resultat && count($resultat)) return $resultat[0]['id_zone_geo'];
553
		}
532
		return $code_insee; // autrement retourne l'original
554
		return $infos;
Line 554... Line 576...
554
				$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ;
576
				$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ;
Line 555... Line 577...
555
 
577
 
556
				$requete = 'SELECT cmc_mot_cle as mot_cle '.
578
				$requete = 'SELECT cmc_mot_cle as mot_cle '.
557
					"FROM $table ".
579
					"FROM $table ".
558
					"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ".
580
					"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ".
-
 
581
					"AND cmc_id_proprietaire = $utilisateur_id ".
Line 559... Line 582...
559
					"AND cmc_id_proprietaire = $utilisateur_id ";
582
					' -- ' . __FILE__ . ':' . __LINE__;
560
 
583
 
561
				$elements = Cel::db()->executerRequete($requete);
584
				$elements = Cel::db()->requeter($requete);
562
				if (is_array($elements)) {
585
				if (is_array($elements)) {
563
					foreach ($elements as $mot) {
586
					foreach ($elements as $mot) {
564
						$mots[] = $mot['mot_cle'];
587
						$mots[] = $mot['mot_cle'];
Line 679... Line 702...
679
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
702
		$contenu = str_replace('<?=', '<?php echo ',  $contenu);
680
		// Ajout systématique d'un point virgule avant la fermeture php
703
		// Ajout systématique d'un point virgule avant la fermeture php
681
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
704
		$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu);
682
		return $contenu;
705
		return $contenu;
683
	}
706
	}
684
}
707
}
685
708