Subversion Repositories eFlore/Applications.eflore-consultation

Compare Revisions

Ignore whitespace Rev 1506 → Rev 1507

/trunk/configurations/config.defaut.ini
113,11 → 113,9
benchmark_chrono = false
 
; +------------------------------------------------------------------------------------------------------+
; Cookies
cookies.duree = "php:3600*24*365"
cookies.utilisateur="pap-annuaire_tela-utilisateur"
cookies.utilisateurPersistant="pap-annuaire_tela-memo"
cookies.niveau="eflore.niveau"
; Authentification
auth.nomCookieSSO = "tb_auth"
auth.baseUrlConnexionSite = "http://www.tela-botanica.org/wp-login.php"
 
; +------------------------------------------------------------------------------------------------------+
; Paramètres spécifiques à l'application
/trunk/modules/popup_contact/presentations/scripts/identification.js
1,96 → 1,7
$(document).ready(function() {
$("#connexion").on('click', connecter);
// redirection vers l'URL de login du site, qui ramènera ensuite à la page
// d'origine
var url = $("#url_connexion_site").data('url');
console.log('url: ' + url);
document.location.href = url;
});
 
function connecter() {
var erreurMsg = "";
var urlWs = URL_WS_UTILISATEUR;
var courriel = $("#courriel").val();
var mdp = $("#mdp").val();
var persistance = $('#persistance').is(':checked');
var donnees = {'methode':'connexion', 'courriel':courriel, 'mdp':mdp, 'persistance':persistance};
$.ajax({
type : "PUT",
cache : false,
url : urlWs,
data : donnees,
beforeSend : nettoyerMsg,
success : function(data) {
if (data.identifie) {
rechargerPage();
} else {
afficherErreur(data.message);
}
},
error : function(jqXHR, textStatus, errorThrown) {
erreurMsg += "Erreur Ajax :\ntype : "+textStatus+' '+errorThrown+"\n";
erreurMsg += extraireInfosReponse(jqXHR);
afficherErreur('Une erreur est survenue lors de la connexion.');
if (DEBUG) {
console.log('Erreur : '+erreurMsg);
}
},
complete : function(jqXHR, textStatus) {
var debugMsg = extraireEnteteDebug(jqXHR);
if (DEBUG) {
console.log('Débogage : '+debugMsg);
}
}
});
return false;
}
 
function nettoyerMsg() {
$(".msg").remove();
}
 
function rechargerPage() {
window.location.reload();
}
 
function extraireInfosReponse(jqXHR) {
var erreurMsg = '';
try {
reponse = jQuery.parseJSON(jqXHR.responseText);
if (reponse != null) {
$.each(reponse, function (cle, valeur) {
erreurMsg += valeur + "\n";
});
}
} catch(e) {
erreurMsg += "L'erreur n'était pas en JSON.";
}
return erreurMsg;
}
 
function extraireEnteteDebug(jqXHR) {
var debugMsg = '';
if (jqXHR.getResponseHeader("X-DebugJrest-Data") != '') {
debugInfos = jQuery.parseJSON(jqXHR.getResponseHeader("X-DebugJrest-Data"));
if (debugInfos != null) {
$.each(debugInfos, function (cle, valeur) {
debugMsg += valeur + "\n";
});
}
}
return debugMsg;
}
 
function afficherErreur(msg) {
afficherTxt(msg, 'attention');
}
 
function afficherInfo(msg) {
afficherTxt(msg, 'information');
}
 
function afficherMsg(msg) {
afficherTxt(msg);
}
 
function afficherTxt(msg, type) {
type = type ? ' '+type : '';
nettoyerMsg();
$("#zone-dialogue").append('<pre class="msg'+type+'">'+msg+'</pre>');
}
/trunk/modules/popup_contact/presentations/scripts/contact.js
47,7 → 47,11
nettoyerMsg();
},
success : function(data) {
afficherInfo(data.message);
if (data.message) {
afficherInfo(data.message);
} else {
afficherInfo(data);
}
},
error : function(jqXHR, textStatus, errorThrown) {
erreurMsg += "Erreur Ajax :\ntype : "+textStatus+' '+errorThrown+"\n";
70,9 → 74,9
}
if (erreurMsg != '') {
afficherMsg('Une erreur est survenue lors de la transmission de votre message.'+'<br />'+
'Vous pouvez signaler le disfonctionnement à <a href="'+
'Vous pouvez signaler le dysfonctionnement à <a href="'+
'mailto:cel@tela-botanica.org'+'?'+
'subject=Disfonctionnement du formulaire de contact'+
'subject=Dysfonctionnement du formulaire de contact'+
"&body="+erreurMsg+"\nDébogage :\n"+debugMsg+
'">eflore_remarques@tela-botanica.org</a>.');
}
/trunk/modules/popup_contact/presentations/styles/identification.css
3,4 → 3,4
/* Balises */
input[type="checkbox"]{
margin:2px 5px;
}
}
/trunk/modules/popup_contact/squelettes/form_identification.tpl.html
2,21 → 2,9
<div id="zone-dialogue">
<p class="msg attention">
Vous n'êtes pas identifié sur le site de Tela Botanica.<br />
Veuillez vous identifier afin d'accéder au formulaire de contact.
Veuillez cliquer sur le lien ci-dessous pour vous identifier afin d'accéder au formulaire de contact.
</p>
</div>
<form id="form-connexion" action="<?= $urlPopUp ?>" method="post">
<h3>Identifiez vous</h3>
<label for="courriel">Courriel : </label>
<input type="text" id="courriel" name="courriel" maxlength="80" value="" />
<label for="mdp">Mot de passe : </label>
<input type="password" id="mdp" name="mdp" maxlength="80" value="" />
<p>
<input type="submit" id="connexion" class="gauche btn" name="connexion" value="Connexion" />
<input id="persistance" class="gauche" name="persistance" type="checkbox" value="o" />
<label for="persistance">Rester connecté</label>
</p>
</form>
 
<div id="url_connexion_site" data-url="<?php echo $urlPopUp; ?>"></div>
</div>
/trunk/modules/popup_contact/PopupContact.php
22,6 → 22,7
private $id_image = '';
private $urlWsCelTpl = '';
private $urlWsAnnuaireUtilisateurTpl = '';
protected $urlConnexionSite = '';
 
public function initialiser() {
$this->capturerParametres();
31,6 → 32,7
$this->appUrls = $this->conteneur->getAppUrls();
$this->urlWsAnnuaireUtilisateurTpl = $this->conteneur->getParametre('baseUrlServicesAnnuaireTpl');
$this->urlWsCelTpl = $this->conteneur->getParametre('baseUrlServicesCelTpl');
$this->urlConnexionSite = $this->conteneur->getParametre('auth.baseUrlConnexionSite');
}
 
private function capturerParametres() {
37,8 → 39,8
if (isset($_GET['id_destinataire'])) {
$this->id_destinataire = $_GET['id_destinataire'];
}
if (isset($_GET['id_img'])) {
$this->id_image = $_GET['id_img'];
if (isset($_GET['id_img'])) {
$this->id_image = $_GET['id_img'];
}
}
 
47,7 → 49,7
}
 
public function executerForm() {
if ($this->utilisateur->etreIdentifie()) {
if ($this->utilisateur->estIdentifie()) {
$this->afficherFormContact();
} else {
$this->afficherFormIdentification();
60,36 → 62,36
$entete['formType'] = 'contact';
$entete['urlWsMessageCel'] = sprintf($this->urlWsCelTpl, 'celMessage/image');
$entete['urlWsUtilisateur'] = sprintf($this->urlWsAnnuaireUtilisateurTpl, 'utilisateur');
$this->setSortie(self::ENTETE, $this->getVue('contact_entete', $entete));
 
$infos = array();
// cas d'une obs saisie par une personne non inscrite
// le message doit être envoyé au cel qui fournira le courriel de l'auteur
if(trim($this->id_destinataire) == "") {
if(trim($this->id_destinataire) == "" || trim($this->id_destinataire) == "null") {
$infos['idDestinataire'] = $this->id_image;
$infos['typeEnvoi'] = 'non-inscrit';
} else {
$infos['idDestinataire'] = $this->id_destinataire;
$infos['typeEnvoi'] = 'inscrit';
}
}
$infos['idImage'] = $this->id_image;
$infos['utilisateurCourriel'] = $this->utilisateur->getCourriel();
$infos['utilisateurCourriel'] = $this->utilisateur->getCourriel();
$infos['urlPopUp'] = $this->appUrls->obtenirUrlPopUpContact($this->id_destinataire, $this->id_image);
 
 
$this->imagesApi->setProjet('cel');
// prêt à passer à API_DEL
// TODO: voir pourquoi la forme service:del:images/#id_image ne fonctionne pas
// et s'il est vraiment utile d'appeler DEL ici
$imageInfos = $this->imagesApi->setApi(Eflore::API_EFLORE)->getInfosImageParIdImage($this->id_image);
$idObs = $imageInfos['observation.id'];
$nomSci = $imageInfos['determination.nom_sci'];
$date = $imageInfos['date'];
$lieu = $imageInfos['station.libelle'];
 
$infos['sujet'] = "Observation #$idObs de $nomSci";
$infos['message'] = "\n\n\n\n\n\n\n\n--\nConcerne l'observation de $nomSci du $date au lieu $lieu";
 
// et s'il est vraiment utile d'appeler DEL ici
$imageInfos = $this->imagesApi->setApi(Eflore::API_EFLORE)->getInfosImageParIdImage($this->id_image);
$idObs = $imageInfos['observation.id'];
$nomSci = $imageInfos['determination.nom_sci'];
$date = $imageInfos['date'];
$lieu = $imageInfos['station.libelle'];
 
$infos['sujet'] = "Observation #$idObs de $nomSci";
$infos['message'] = "\n\n\n\n\n\n\n\n--\nConcerne l'observation de $nomSci du $date au lieu $lieu";
 
$this->setSortie(self::RENDU_CORPS, $this->getVue('form_contact', $infos));
}
 
97,12 → 99,21
$this->setSortie(self::META_TITRE, 'Identification');
$entete = array();
$entete['formType'] = 'identification';
$entete['urlWsUtilisateur'] = sprintf($this->urlWsAnnuaireUtilisateurTpl, 'utilisateur');
$entete['urlWsUtilisateur'] = sprintf($this->urlWsAnnuaireUtilisateurTpl, 'utilisateur');
$this->setSortie(self::ENTETE, $this->getVue('contact_entete', $entete));
 
 
$infos = array();
$infos['urlPopUp'] = $this->appUrls->obtenirUrlPopUpContact($this->id_destinataire, $this->id_image);
$currentUrl = ((@$_SERVER["HTTPS"] == "on") ? "https://" : "http://")
. $_SERVER["SERVER_NAME"]
. $_SERVER['REQUEST_URI'];
 
var_dump($currentUrl); echo "<br/>";
var_dump(urlencode($currentUrl)); echo "<br/>";
 
$infos['urlPopUp'] = $this->urlConnexionSite . '?redirect_to=' . urlencode($currentUrl);
$this->setSortie(self::RENDU_CORPS, $this->getVue('form_identification', $infos));
$this->setSortie(self::RENDU_CORPS, $this->getVue('form_identification', $infos));
}
}
?>
/trunk/bibliotheque/Utilisateur.php
1,92 → 1,83
<?php
 
/**
* Donne l'utilisateur en cours s'il est connecté, en lisant le cookie SSO
*
* Pour l'instant, utilisé uniquement dans popup_contact
*/
class Utilisateur {
 
const NIVEAU_DEBUTANT = 1;
const NIVEAU_INTERMEDIAIRE = 2;
const NIVEAU_EXPERT = 3;
protected $nomCookieSSO = '';
//protected $urlServiceAnnuaire = '';
protected $urlConnexionSite = '';
protected $identifie = false;
protected $courriel = null;
 
private $dureeSauvegarde = null;
private $nomCookieUtilisateur = '';
private $nomCookieUtilisateurPersistant = '';
private $nomCookieNiveau = '';
private $niveauDefaut = '';
private $urlWsAnnuaire = '';
private $restClient = null;
 
private $niveau = null;
private $identifie = false;
private $courriel = null;
private $md5Mdp = null;
 
public function __construct(Conteneur $conteneur) {
$this->dureeSauvegarde = $conteneur->getParametre('cookies.duree');
$this->nomCookieUtilisateur = $conteneur->getParametre('cookies.utilisateur');
$this->nomCookieUtilisateurPersistant = $conteneur->getParametre('cookies.utilisateurPersistant');
$this->nomCookieNiveau = $conteneur->getParametre('cookies.niveau');
$this->niveauDefaut = $conteneur->getParametre('utilisateur.niveau.defaut');
$this->urlWsAnnuaire = $conteneur->getParametre('baseUrlServicesAnnuaireTpl');
$this->restClient = $conteneur->getRestClient();
$this->analyserCookies();
$this->nomCookieSSO = $conteneur->getParametre('auth.nomCookieSSO');
//$this->urlServiceAnnuaire = $conteneur->getParametre('baseUrlServicesAnnuaireTpl');
$this->urlConnexionSite = $conteneur->getParametre('auth.baseUrlConnexionSite');
$this->lireCookieSSO();
}
 
public function getCourriel() {
return $this->courriel;
/**
* Retourne l'adresse email de l'utilisateur actuellement identifié
*/
public function getCourriel() {
return $this->courriel;
}
 
public function getNiveau() {
return $this->niveau;
/**
* Retourne true si l'utilisateur est en possession d'un cookie qui
* l'identifie
*/
public function estIdentifie() {
return $this->identifie;
}
 
public function sauver() {
setcookie($this->nomCookieNiveau, time()+$this->dureeSauvegarde, '/');
/**
* Retourne l'URL de connexion au SSO
*/
public function getUrlConnexion() {
return $this->urlConnexionSite;
}
 
public function etreIdentifie() {
$this->analyserCookies();
return $this->identifie;
protected function lireCookieSSO() {
if (isset($_COOKIE[$this->nomCookieSSO])) {
$jeton = $_COOKIE[$this->nomCookieSSO];
// On ne valide pas le jeton car il vient directement du cookie
// (supposé être sur HTTPS uniquement)
$jetonDecode = $this->decoderJeton($jeton);
//var_dump($jetonDecode); echo "<br><br>";
if ($jetonDecode && ! empty($jetonDecode['sub'])) {
$this->courriel = $jetonDecode['sub'];
$this->identifie = true;
}
}
}
 
public function connecter($courriel, $mdp, $persistance = false) {
$url = sprintf($this->urlWsAnnuaire, 'utilisateur');
$donnees['methode'] = 'connexion';
$donnees['courriel'] = $courriel;
$donnees['mdp'] = $mdp;
$donnees['persistance'] = $persistance;
/**
* Décode un jeton SSO et retourne son contenu
*/
protected function decoderJeton($jeton) {
$parts = explode('.', $jeton);
$payload = $parts[1];
$payload = $this->urlsafeB64Decode($payload);
$payload = json_decode($payload, true);
 
$json = $this->restClient->ajouter($url, $donnees);
$forceTableauAssociatif = true;
$resultat = json_decode($json, $forceTableauAssociatif);
return $resultat['identifie'];
}
return $payload;
}
 
private function analyserCookies() {
$this->analyserCookiesIdentite();
$this->analyserCookiesNiveau();
}
/**
* Décode le base64 de manière "urlsafe" (copié de la lib JWT)
*/
protected function urlsafeB64Decode($input) {
$remainder = strlen($input) % 4;
if ($remainder) {
$padlen = 4 - $remainder;
$input .= str_repeat('=', $padlen);
}
return base64_decode(strtr($input, '-_', '+/'));
}
 
private function analyserCookiesIdentite() {
if ($this->identifie == false) {
if (isset($_COOKIE[$this->nomCookieUtilisateurPersistant])) {
$idTela = $_COOKIE[$this->nomCookieUtilisateurPersistant];
$this->extraireMdpEtCourriel($idTela);
} else if (isset($_COOKIE[$this->nomCookieUtilisateur])) {
$idTela = $_COOKIE[$this->nomCookieUtilisateur];
$this->extraireMdpEtCourriel($idTela);
}
}
}
 
private function extraireMdpEtCourriel($idTela) {
$this->md5Mdp = substr($idTela, 0, 32);
$this->courriel = substr($idTela, 32);
$this->identifie = true;
}
 
private function analyserCookiesNiveau() {
$this->niveau = $this->niveauDefaut;
if (isset($_COOKIE[$this->nomCookieNiveau])) {
$this->niveau = $_COOKIE[$this->nomCookieNiveau];
}
}
}
?>