servicesAutorises * (exemple: cel) * email (DÉPRÉCIÉ) : adresse à laquelle envoyer le rapport, par défaut webmestre@tela-botanica.org, * limité aux valeurs de la liste $this->servicesAutorises * (exemple: cel_remarques@tela-botanica.org) * lang : langage (un squelette correspondant doit exister) * (exemple: en) * * @author Mathias Chouet * @license GPL v3 * @license CECILL v2 * @version 0.1 * @copyright 2014, Tela Botanica (accueil@tela-botanica.org) */ class Remarques extends WidgetCommun { const DS = DIRECTORY_SEPARATOR; /** * service de destination par défaut, si un service ou une adresse non autorisés sont spécifiés, * ou si aucun service ni adresse n'est spécifié */ const SERVICE_PAR_DEFAUT = 'webmestre'; /** liste des adresses de destination autorisées (à régler dans la config) */ protected $servicesAutorises; protected $cheminLog; protected $pageSource; protected $serviceDestination; protected $emailDestination; protected $action; protected $langue; protected $langueDefaut; protected $description; protected $gravite; protected $navigateur; protected $systeme; protected $coordonnees; protected $token; public function __construct($config, $parametres) { parent::__construct($config, $parametres); $this->servicesAutorises = $this->config['remarques-services']; $this->pageSource = 'inconnue'; $this->serviceDestination = self::SERVICE_PAR_DEFAUT; $this->emailDestination = $this->servicesAutorises[self::SERVICE_PAR_DEFAUT]; $this->action = null; $this->description = null; $this->gravite = null; $this->navigateur = null; $this->systeme = null; $this->coordonnees = null; $this->jeton = null; $this->cheminLog = $this->config['remarques']['cheminFichierLog']; $this->langueDefaut = $this->config['remarques']['langueDefaut']; session_start(); if (!isset($_SESSION['jeton'])) { $_SESSION['jeton'] = bin2hex(openssl_random_pseudo_bytes(6)); } } /** * Méthode appelée par défaut pour charger ce widget */ public function executer() { $this->collecterParametres(); $squelette = dirname(__FILE__) . self::DS . 'squelettes' . self::DS . 'remarques_' . $this->langue . '.tpl.php'; if (! file_exists($squelette)) { $squelette = dirname(__FILE__) . self::DS . 'squelettes' . self::DS . 'remarques_' . $this->langueDefaut . '.tpl.php'; } $widget['donnees']['url_css'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/remarques/squelettes/css/defaut.css'); $widget['donnees']['url_js'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], 'modules/remarques/squelettes/js/defaut.js'); $widget['donnees']['service'] = $this->serviceDestination; $widget['donnees']['page'] = $this->pageSource; $widget['donnees']['envoye'] = false; $widget['donnees']['jeton'] = $_SESSION['jeton']; if ($this->action === 'envoyer' && $this->jeton === $_SESSION['jeton']) { $widget['donnees']['envoye'] = true; // 1) entrée dans le log try { $this->log(); } catch (Exception $e) { echo "Erreur lors de la création de l'entrée dans le fichier log
"; } // 2) email try { $this->email(); } catch (Exception $e) { echo "Erreur lors de l'envoi de l'email
"; } } $contenu = $this->traiterSquelettePhp($squelette, $widget['donnees']); $this->envoyer($contenu); } // paramètres du widget en GET et du formulaire en POST protected function collecterParametres() { if (isset($_GET['pageSource']) && $_GET['pageSource'] != '') { $this->pageSource = $_GET['pageSource']; } if (isset($_GET['lang']) && $_GET['lang'] != '') { $this->langue = $_GET['lang']; } else { $this->langue = $this->langueDefaut; } if (isset($_GET['service']) && in_array($_GET['service'], array_keys($this->servicesAutorises))) { $this->serviceDestination = $_GET['service']; $this->emailDestination = $this->servicesAutorises[$_GET['service']]; } else { // Rétrocompatibilité (déprécié) if (isset($_GET['email']) && in_array($_GET['email'], $this->servicesAutorises)) { $this->emailDestination = $_GET['email']; $this->serviceDestination = array_search($_GET['email'], $this->servicesAutorises); } } if (isset($_POST['action']) && $_POST['action'] != '') { $this->action = $_POST['action']; } // contenu du formulaire if (isset($_POST['description']) && $_POST['description'] != '') { $this->description = stripslashes($_POST['description']); } if (isset($_POST['gravite']) && $_POST['gravite'] != '') { $this->gravite = $_POST['gravite']; } if (isset($_POST['navigateur']) && $_POST['navigateur'] != '') { $this->navigateur = stripslashes($_POST['navigateur']); } if (isset($_POST['systeme']) && $_POST['systeme'] != '') { $this->systeme = stripslashes($_POST['systeme']); } if (isset($_POST['coordonnees']) && $_POST['coordonnees'] != '') { $this->coordonnees = stripslashes($_POST['coordonnees']); } $this->jeton = stripslashes($_POST['jeton'] ?? 'pasdejeton'); } // ajoute une entrée au log protected function log() { $contenu = ''. date("Y-m-d H:i:s") . "\n". "Pour: " . $this->serviceDestination . " <" . $this->emailDestination . ">\n". "Page: " . $this->pageSource . "\n". "User agent: " . $_SERVER['HTTP_USER_AGENT'] . "\n". "Contributeur: " . $this->coordonnees . "\n". "Gravité: " . $this->gravite . "\n". "Navigateur: " . $this->navigateur . "\n". "Système: " . $this->systeme . "\n". "Description:\n " . str_replace("\n", "\n ", $this->description). "\n\n-----------------------------------------------------------------------\n\n"; file_put_contents($this->cheminLog, $contenu, FILE_APPEND); } // envoie un email protected function email() { $contenu = ''. date("Y-m-d H:i:s") . "\n". "Pour: " . $this->serviceDestination . " <" . $this->emailDestination . ">\n". "Page: " . $this->pageSource . "\n". "User agent: " . $_SERVER['HTTP_USER_AGENT'] . "\n". "Contributeur: " . $this->coordonnees . "\n". "Gravité: " . $this->gravite . "\n". "Navigateur: " . $this->navigateur . "\n". "Système: " . $this->systeme . "\n". "Description:\n " . str_replace("\n", "\n ", $this->description); $entetes = 'Content-Type: text/plain; charset="utf-8" '. 'Content-Transfer-Encoding: 8bit'; $sujet = substr($this->description, 0, 25).'... '. '('.($this->coordonnees == '' ? 'inconnu' : $this->coordonnees).')'; // mode charlot - mais y a rien dans le framework pour faire mieux mail($this->emailDestination, $sujet, $contenu, $entetes); } } ?>