/branches/v1.4-baleine/jrest/services/IdUtilisateur.php |
---|
New file |
0,0 → 1,27 |
<?php |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package annuaire |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/annuaire/ |
*/ |
Class IdUtilisateur extends JRestService { |
public function getElement($uid){ |
$mail_utilisateur = $uid[0]; |
$id_annuaire = Config::get('annuaire_defaut'); |
$controleur = new AnnuaireControleur(); |
$id = $controleur->ObtenirIdParMail($id_annuaire,$mail_utilisateur); |
$this->envoyer($id); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/Gestion.php |
---|
New file |
0,0 → 1,54 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class Gestion extends JRestService { |
public function getElement($uid){ |
$id_utilisateur = $uid[0]; |
$mail_utilisateur = $uid[1]; |
if (isset($uid[2])) { |
$id_annuaire = $uid[2]; |
} else { |
$id_annuaire = Config::get('annuaire_defaut'); |
} |
$controleur = new LettreControleur(); |
$est_abonne = $controleur->estAbonneLettreActualite($id_annuaire, $id_utilisateur); |
$resume['titre'] = 'Lettre d\'actualité'; |
if ($est_abonne == '1') { |
$message = "Vous êtes abonné à la lettre d'actualité"; |
$intitule_lien = 'Se desinscrire'; |
} else { |
$message = "Vous n'êtes pas abonné à la lettre d'actualité"; |
$intitule_lien = "S'inscrire"; |
} |
$base_url_application = $controleur->getUrlBaseComplete(); |
$cible_lien_desinscrire = $base_url_application.'/jrest/GestionLettreActu/'.$id_utilisateur.DS.$mail_utilisateur.DS.$id_annuaire; |
$cible_lien = $base_url_application.'/jrest/GestionLettreActu/'.$id_utilisateur.DS.$mail_utilisateur.DS.$id_annuaire; |
$resume_item = array( |
'element' => $message, |
'intitule_lien' => $intitule_lien, |
'lien_desinscrire' => $cible_lien_desinscrire, |
'lien' => $cible_lien); |
$resume['elements'][] = $resume_item; |
$this->envoyer($resume); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/TestLoginMdp.php |
---|
New file |
0,0 → 1,36 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class TestLoginMdp extends JRestService { |
public function getElement($uid){ |
if (!isset($uid[0]) || $uid[0] == '' || !isset($uid[1]) || $uid[1] == '') { |
$this->envoyer(false); |
return; |
} |
$mail_utilisateur = $uid[0]; |
$pass = $uid[1]; |
// TODO vérifier que le mot de passe est crypté ! |
$id_annuaire = Config::get('annuaire_defaut'); |
$controleur = new AnnuaireControleur(); |
$id_match_pass = $controleur->comparerIdentifiantMotDePasse($id_annuaire,$mail_utilisateur, $pass, true, true); |
$this->envoyer($id_match_pass); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/Utilisateur.php |
---|
New file |
0,0 → 1,506 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service retournant les prénoms et nom d'un utilisateur en fonction de son courriel. |
* UNe liste de courriel peut être passé dans la ressource. |
* Exemple : |
* /utilisateur/Prenom-nom-par-courriel/jpm@tela-botanica.org,aurelien@tela-botanica.org |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class Utilisateur extends JRestService { |
private $donnees = null; |
private $idAnnuaire = null; |
private $utilisateurId = null; |
private $metadonneeModele = null; |
private $annuaireModele = null; |
private $messagerieModele = null; |
const FORMAT_JSON = "json"; |
const FORMAT_XML = "xml"; |
const FORMAT_LDEHYDE = "méthanal"; // hihi hoho |
public function __construct($config, $demarrer_session = true) { |
parent::__construct($config, $demarrer_session); |
$this->idAnnuaire = Config::get('annuaire_defaut'); |
} |
/*+----------------------------------------------------------------------------------------------------+*/ |
// GET : consultation |
public function getElement($ressources){ |
$this->ressources = $ressources; |
$infos = null; |
if (isset($this->ressources[0])) { |
if (preg_match('/^[0-9]+$/', $this->ressources[0])) { |
// ATTENTION : Ces web services ne doivent être accessible que depuis des applis installées sur nos serveurs |
// pour les communications inter-serveurs. |
$this->controlerIpAutorisees(); |
$infos = $this->getInfosParId($this->ressources[0]); |
} else { |
$methode_demande = array_shift($this->ressources); |
$methode = $this->traiterNomMethodeGet($methode_demande); |
if (method_exists($this, $methode)) { |
$infos = $this->$methode($this->ressources[0]); |
} else { |
$this->messages[] = "Ce type de ressource '$methode_demande' n'est pas disponible pour la requete GET."; |
} |
} |
} else { |
$this->messages[] = "Le premier paramètre du chemin du service doit correspondre au type de ressource demandée."; |
} |
// possibilité d'envoyer en plusieurs formats @TODO faire ça plus proprement |
$format = self::FORMAT_JSON; |
$dernierIndex = count($this->ressources) - 1; |
if ($dernierIndex >= 0) { |
$dernierParametre = $this->ressources[$dernierIndex]; |
if (in_array($dernierParametre, array(self::FORMAT_JSON, self::FORMAT_XML))) { |
$format = $dernierParametre; |
} |
} |
if (!is_null($infos)) { |
switch ($format) { |
case self::FORMAT_XML : |
$this->envoyerXml($infos); |
break; |
case self::FORMAT_JSON : |
default : |
$this->envoyerJson($infos); |
} |
} else { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyerTxt($info); |
} |
} |
public function getIdentiteConnectee() { |
if (isset($_COOKIE[$this->config['database_ident']['nom_cookie_persistant']])) { |
$cookie = $_COOKIE[$this->config['database_ident']['nom_cookie_persistant']]; |
// le cookie de papyrus contient un md5 concaténé à l'email utilisateur |
$courriel = substr($cookie , 32, strlen($cookie)); |
$id_utilisateur = $this->getAnnuaire()->obtenirIdParMail($this->idAnnuaire, $courriel); |
$infos = $this->getAnnuaire()->obtenirInfosUtilisateurParId($this->idAnnuaire, $id_utilisateur); |
$infos = array_pop($infos); |
$infos['pseudoUtilise'] = $this->obtenirPseudoUtilise($id_utilisateur); |
$infos['pseudo'] = $this->obtenirPseudo($id_utilisateur); |
$infos['intitule'] = $this->formaterIntitule($infos); |
$infos['nomWiki'] = $this->formaterNomWiki($infos); |
header("content-type: application/json"); |
echo json_encode($infos); |
} else { |
echo json_encode(array()); |
} |
exit; |
} |
private function formaterNomWiki($infos) { |
$prenom = ucfirst(strtolower($this->supprimerAccents($infos['prenom']))); |
$nom = ucfirst(strtolower($this->supprimerAccents($infos['nom']))); |
return $prenom.$nom; |
} |
function supprimerAccents($str, $charset='utf-8') { |
$str = htmlentities($str, ENT_NOQUOTES, $charset); |
$str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); |
$str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ' |
$str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères |
return $str; |
} |
/** |
* Permet d'obtenir des infos pour un ou plusieurs ids utilisateurs indiqué(s) dans la ressource. |
* RESSOURCE : /infos-par-ids/#id[,#id]* |
* PARAMÈTRES : forceArrayOfArrays - si true, retourne un tableau associatif même s'il n'y a qu'un |
* résultat (casse la rétrocompatibilté) |
* RÉPONSE : Tableau possédant un courriel de la ressource en clé et en valeur : |
* - id : identifiant numérique de l'utilisateur |
* - pseudoUtilise : indique si on doit utiliser le pseudo à la place de Prénom NOM |
* - pseudo : pseudo de l'utilisateur. |
* - intitule : l'intitulé à affiche (choix auto entre "pseudo" et "prénom nom") |
* - prenom : prénom |
* - nom : nom de famille. |
* - courriel : courriel |
*/ |
public function getInfosParIds($ids_utilisateurs, $forceArrayOfArrays = false) { |
$ids_utilisateurs = explode(',', $ids_utilisateurs); |
if (count($ids_utilisateurs) == 1) { |
// s'il n'y en a qu'un on ne passe pas un array |
$ids_utilisateurs = array_shift($ids_utilisateurs); |
} |
$infos = $this->getAnnuaire()->obtenirInfosUtilisateurParId($this->idAnnuaire, $ids_utilisateurs); |
foreach ($infos as $i => $info) { |
$infos[$i]['pseudoUtilise'] = $this->obtenirPseudoUtilise($info['id']); |
$infos[$i]['pseudo'] = $this->obtenirPseudo($info['id']); |
$infos[$i]['intitule'] = $this->formaterIntitule($infos[$i]); |
} |
// retrocompatibilité |
if (count($infos) == 1 && (! $forceArrayOfArrays)) { |
$infos = array_shift($infos); |
} |
return $infos; |
} |
/** |
* Méthode rétrocompatible : appelle getInfosParIds et s'il n'y a qu'un résultat, |
* ne retourne pas un tableau associatif mais un tableau simple |
* @return array |
*/ |
public function getInfosParId($ids_utilisateurs) { |
return $this->getInfosParIds($ids_utilisateurs, true); |
} |
/** |
* Permet d'obtenir les prénoms et noms des courriels des utilisateurs indiqués dans la ressource. |
* RESSOURCE : /utilisateur/prenom-nom-par-courriel/[courriel,courriel,...] |
* PARAMÈTRES : $courriels des adresses courriel séparées par des virgules; si != null, sera utilisé à la place de la ressource d'URL |
* RÉPONSE : Tableau possédant un courriel de la ressource en clé et en valeur : |
* - id : identifiant numérique de l'utilisateur |
* - prenom : prénom |
* - nom : nom de famille. |
*/ |
public function getPrenomNomParCourriel($courriels) { |
$courriels = explode(',', $courriels); |
$infos = $this->getAnnuaire()->obtenirPrenomNomParCourriel($this->idAnnuaire, $courriels); |
return $infos; |
} |
/** |
* Permet d'obtenir les identités des utilisateurs indiqués dans la ressource. |
* RESSOURCE : /utilisateur/identite-par-courriel/[courriel,courriel,...] |
* PARAMÈTRES : $courriels des adresses courriel séparées par des virgules; si != null, sera utilisé à la place de la ressource d'URL |
* RÉPONSE : Tableau possédant un courriel de la ressource en clé et en valeur : |
* - id : identifiant numérique de l'utilisateur |
* - pseudoUtilise : indique si on doit utiliser le pseudo à la place de Prénom NOM |
* - pseudo : pseudo de l'utilisateur. |
* - prenom : prénom |
* - nom : nom de famille. |
*/ |
public function getIdentiteParCourriel($courriels) { |
$infos_utilisateurs = array(); |
$utilisateurs = $this->getPrenomNomParCourriel($courriels); |
foreach ($utilisateurs as $courriel => $utilisateur) { |
$id = $utilisateur['id']; |
$utilisateur['pseudo'] = $this->obtenirPseudo($id); |
$utilisateur['pseudoUtilise'] = $this->obtenirPseudoUtilise($id); |
$utilisateur['intitule'] = $this->formaterIntitule($utilisateur); |
$courriel = strtolower($courriel); |
$infos_utilisateurs[$courriel] = $utilisateur; |
} |
return $infos_utilisateurs; |
} |
/** |
* Même principe que getIdentiteParCourriel() mais pour un seul courriel, et renvoie plus d'infos : |
* RESSOURCE : /utilisateur/identite-complete-par-courriel/courriel[/format] |
* PARAMÈTRES : format : "json" (par défaut) ou "xml" (pour |
* rétrocompatibilité avec le service eFlore_chatin/annuaire_tela/xxx/courriel) |
* RÉPONSE : Tableau possédant un courriel de la ressource en clé et en valeur : |
* - id : identifiant numérique de l'utilisateur |
* - pseudoUtilise : indique si on doit utiliser le pseudo à la place de Prénom NOM |
* - pseudo : pseudo de l'utilisateur. |
* - prenom : prénom |
* - nom : nom de famille. |
* - mot_de_passe : le mot de passe haché (15% de matières grasses, peut contenir des traces de soja) |
* - fonction |
* - titre |
* - site_web |
* - adresse01 |
* - adresse02 |
* - code_postal |
* - ville |
* - departement |
* - region |
* - pays |
* - date_inscription |
*/ |
public function getIdentiteCompleteParCourriel() { |
$this->authentificationHttpSimple(); |
$infos_utilisateurs = array(); |
$courriel = $this->ressources[0]; |
$utilisateur = $this->getAnnuaire()->obtenirMaximumInfosParCourriel($this->idAnnuaire, $courriel); |
$id = $utilisateur['id']; |
$utilisateur['pseudo'] = $this->obtenirPseudo($id); |
$utilisateur['pseudoUtilise'] = $this->obtenirPseudoUtilise($id); |
$utilisateur['intitule'] = $this->formaterIntitule($utilisateur); |
// ouksépabo |
$this->baliseMaitresse = "personne"; |
return $utilisateur; |
} |
private function getAnnuaire() { |
if (!isset($this->annuaireModele)) { |
$this->annuaireModele = new AnnuaireModele(); |
} |
return $this->annuaireModele; |
} |
private function getMeta() { |
if (!isset($this->metadonneeModele)) { |
$this->metadonneeModele = new MetadonneeModele(); |
} |
return $this->metadonneeModele; |
} |
private function obtenirPseudo($id_utilisateur) { |
$pseudo = ''; |
$id_champ_pseudo = $this->getMeta()->renvoyerIdChampMetadonneeParAbreviation($this->idAnnuaire, 'pseudo'); |
if ($this->getMeta()->valeurExiste($id_champ_pseudo, $id_utilisateur)) { |
$pseudo = $this->getMeta()->obtenirValeurMetadonnee($id_champ_pseudo, $id_utilisateur); |
} |
return $pseudo; |
} |
private function obtenirPseudoUtilise($id_utilisateur) { |
$pseudo_utilise = false; |
$id_champ_utilise_pseudo = $this->getMeta()->renvoyerIdChampMetadonneeParAbreviation($this->idAnnuaire, 'utilise_pseudo'); |
if ($this->getMeta()->valeurExiste($id_champ_utilise_pseudo, $id_utilisateur)) { |
$booleen = $this->getMeta()->obtenirValeurMetadonnee($id_champ_utilise_pseudo, $id_utilisateur); |
$pseudo_utilise = ($booleen == 0) ? false : true; |
} |
return $pseudo_utilise; |
} |
private function formaterIntitule($utilisateur) { |
$intitule = ''; |
if ($utilisateur['pseudoUtilise'] && trim($utilisateur['pseudo']) != '') { |
$intitule = $utilisateur['pseudo']; |
} else { |
$intitule = $utilisateur['prenom'].' '.$utilisateur['nom']; |
} |
return $intitule; |
} |
/** |
* Retourne la date de dernière modification du profil, piochée dans |
* annu_triples |
* |
* @param numeric $id identifiant de l'utilisateur |
* @param boolean $timestamp si true, fournira un timestamp Unix; si |
* false, une date GMT sous forme de string |
* @return mixed une date (string ou timestamp), ou null si la date |
* n'a pas été trouvée dans les "triples" de l'annuaire |
*/ |
public function getDateDerniereModifProfil($id, $timestamp=false) { |
$date = $this->getAnnuaire()->obtenirDateDerniereModificationProfil($this->idAnnuaire, $id); |
if (($timestamp === true) && ($date !== null)) { |
// normalement, strtotime accepte le format "yyyy-mm-dd hh:ii:ss" |
$date = strtotime($date); |
} |
return $date; |
} |
/*+----------------------------------------------------------------------------------------------------+*/ |
// POST : mise à jour |
public function updateElement($ressources, $donnees) { |
$this->ressources = $ressources; |
$this->donnees = $donnees; |
$this->idAnnuaire = Config::get('annuaire_defaut'); |
$infos = null; |
if (isset($this->ressources[0])) { |
$this->utilisateurId = array_shift($this->ressources); |
if (isset($this->ressources[0])) { |
$methode_demande = array_shift($this->ressources); |
$methode = $this->traiterNomMethodePost($methode_demande); |
if (method_exists($this, $methode)) { |
$infos = $this->$methode(); |
} else { |
$this->messages[] = "Ce type de ressource '$methode_demande' n'est pas disponible pour la requete POST."; |
} |
} else { |
$this->messages[] = "La seconde ressource du service pour les requêtes POST doit correspondre au type de ressource demandée."; |
} |
} else { |
$this->messages[] = "La première ressource du service pour les requêtes POST doit être l'identifiant de l'utilisateur."; |
} |
if (!is_null($infos)) { |
$this->envoyerJson($infos); |
} else { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyerTxt($info); |
} |
} |
/** |
* Permet d'envoyer un message à un utilisateur. |
* RESSOURCE : /utilisateur/[id]/message |
* POST : |
* - sujet : contient le sujet du message à envoyer. |
* - message : contient le contenu du message à envoyer. |
* - message_txt : (optionnel) si format HTML, peut contenir le contenu du message au format texte comme alternative au HTML à envoyer. |
* Sinon le texte est extrait du HTML (attention à la mise en page!). |
* - utilisateur_courriel : contient le courriel de l'utilisateur qui envoie le message (Il doit être |
* inscrit dans l'annuaire par défaut de Tela Botanica). |
* - copies : peut contenir une liste de courriels séparés par des virguels auxquels une copie du |
* message sera envoyée. |
* - format (optionnel) : text ou html |
* RÉPONSE : |
* - message : contient le message d'information concernant l'envoie. |
*/ |
private function updateMessage() { |
$destinataireId = $this->utilisateurId;//$this->donnees['destinataire_id']; |
$sujet = stripslashes($this->donnees['sujet']); |
$contenu = stripslashes($this->donnees['message']); |
$contenuTxt = (isset($this->donnees['message_txt'])) ? $this->donnees['message_txt'] : null; |
$envoyeur = $this->donnees['utilisateur_courriel']; |
$adresse_reponse = (isset($this->donnees['reponse_courriel']) ? $this->donnees['reponse_courriel'] : $this->donnees['utilisateur_courriel']); |
$copies = array_key_exists('copies', $this->donnees) ? explode(',', $this->donnees['copies']) : null; |
$format = isset($this->donnees['format']) ? $this->donnees['format'] : 'text'; |
$info = null; |
if ($this->estAutoriseMessagerie($envoyeur) || $this->getAnnuaire()->utilisateurExisteParMail($this->idAnnuaire, $envoyeur)) { |
// il est possible de passer directement un email ou bien un id utilisateur |
if(filter_var($destinataireId, FILTER_VALIDATE_EMAIL)) { |
$destinataire = $destinataireId; |
} else { |
$destinataire = $this->getAnnuaire()->obtenirMailParId($this->idAnnuaire, $destinataireId); |
} |
if ($destinataire) { |
if ($format == 'html') { |
if (isset($contenuTxt)) { |
$envoie = $this->getMessagerie() |
->envoyerMail($envoyeur, $destinataire, $sujet, $contenu, $contenuTxt, $adresse_reponse); |
} else { |
$envoie = $this->getMessagerie() |
->envoyerMail($envoyeur, $destinataire, $sujet, $contenu, '', $adresse_reponse); |
} |
} else { |
$envoie = $this->getMessagerie()->envoyerMailText($envoyeur, $destinataire, $sujet, $contenu, '', $adresse_reponse); |
} |
if ($envoie) { |
$info['message'] = "Votre message a bien été envoyé."; |
foreach ($copies as $copie) { |
$sujet = '[COPIE] '.$sujet; |
$contenu = "Message original envoyé par $envoyeur pour $destinataire.\n--\n".$contenu; |
$this->getMessagerie()->envoyerMailText($envoyeur, $copie, $sujet, $contenu, '', $adresse_reponse); |
} |
} else { |
$info['message'] = "Le message n'a pas pu être envoyé."; |
} |
} else { |
$info['message'] = "Aucun courriel ne correspond à l'id du destinataire."; |
} |
} else { |
$info['message'] = "Vous n'êtes pas inscrit à Tela Botanica avec le courriel : $envoyeur.\n". |
"Veuillez saisir votre courriel d'inscription ou vous inscrire à Tela Botanica."; |
} |
return $info; |
} |
private function getMessagerie() { |
if (!isset($this->messagerieModele)) { |
$this->messagerieModele = new MessageControleur(); |
} |
return $this->messagerieModele; |
} |
/*+----------------------------------------------------------------------------------------------------+*/ |
// PUT : ajout |
public function createElement($donnees) { |
$this->donnees = $donnees; |
$this->idAnnuaire = Config::get('annuaire_defaut'); |
$infos = null; |
if (isset($this->donnees['methode'])) { |
$methode_demande = $this->donnees['methode']; |
$methode = $this->traiterNomMethodePut($methode_demande); |
if (method_exists($this, $methode)) { |
$infos = $this->$methode(); |
} else { |
$this->messages[] = "Ce type de méthode '$methode_demande' n'est pas disponible pour la requete PUT."; |
} |
} else { |
$this->messages[] = "Ce service n'est pas implémanté."; |
} |
if (!is_null($infos)) { |
$this->envoyerJson($infos); |
} else { |
$info = 'Un problème est survenu : '.print_r($this->messages, true); |
$this->envoyerTxt($info); |
} |
} |
/** |
* Permet d'identifier un utilisateur. |
* RESSOURCE : /utilisateur |
* POST : |
* - methode = 'connexion' : methode doit valoir 'connexion' pour connecter l'utilisateur. |
* - courriel : contient le courriel de l'utilisateur . |
* - mdp : le mot de passe de l'utilisateur. |
* - persistance : true si on veut laisser l'utilisateur connecté au delà de la session sinon false |
* RÉPONSE : |
* - identifie : indiquer si l'utilisateur a été identifié (true) ou pas (false) |
* - message : contient un message d'information complémentaire de l'état. |
*/ |
private function createConnexion() { |
$courriel = stripslashes($this->donnees['courriel']); |
$mdp = stripslashes($this->donnees['mdp']); |
$persistance = (stripslashes($this->donnees['persistance']) == 'true') ? true : false; |
$infos = null; |
$infos['persistance'] = $persistance; |
if ($this->verifierAcces($courriel, $mdp)) { |
$infos['identifie'] = true; |
$infos['message'] = "Bienvenu."; |
$dureeCookie = 0; |
if ($persistance === true) { |
$dureeCookie = time()+3600*24*30; |
$this->creerCookiePersistant($dureeCookie, $courriel, $mdp); |
} |
$this->creerCookieUtilisateur($dureeCookie, $courriel); |
$infos['message'] = $_COOKIE; |
} else { |
$infos['identifie'] = false; |
$infos['message'] = "Le courriel ou le mot de passe saisi est incorrect."; |
} |
return $infos; |
} |
/*+----------------------------------------------------------------------------------------------------+*/ |
// DELETE : suppression |
/** |
* Permet de déconnecter un utilisateur |
* RESSOURCE : /utilisateur |
* DELETE |
*/ |
public function deleteElement($uid) { |
if($uid[0] == 'deconnexion') { |
$this->supprimerCookieUtilisateur(); |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/UtilisateurExiste.php |
---|
New file |
0,0 → 1,27 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service vérifiant que l'utilisateur dont le courriel est passé en paramètre existe dans l'annuaire. |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class UtilisateurExiste extends JRestService { |
public function getElement($uid){ |
$mail_utilisateur = $uid[0]; |
$id_annuaire = Config::get('annuaire_defaut'); |
$controleur = new AnnuaireControleur(); |
$existe = $controleur->UtilisateurExiste($id_annuaire,$mail_utilisateur, true); |
$this->envoyer($existe); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/NbInscrits.php |
---|
New file |
0,0 → 1,51 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class NbInscrits extends JRestService { |
public function getRessource() { |
$this->getElement(array()); |
} |
public function getElement($uid){ |
$id_annuaire = Config::get('annuaire_defaut'); |
if (isset($uid[0])) { |
$id_annuaire = $uid[0]; |
} |
$json = true; |
if (isset($uid[1]) && $uid[1] == 'html') { |
$json = false; |
} |
$controleur = new AnnuaireControleur(); |
$valeurs = $controleur->chargerNombreAnnuaireListeInscrits($id_annuaire); |
if (!$json) { |
$valeurs = |
'<html>'."\n". |
' </head>'."\n". |
' <meta content="text/html; charset='.Config::get('sortie_encodage').'" http-equiv="Content-Type">'."\n". |
' </head>'."\n". |
' <body>'."\n". |
' <div id="contenu">'.$valeurs.'</div>'."\n". |
' </body>'."\n". |
'</html>'; |
} |
$this->envoyer($valeurs, 'text/html', Config::get('sortie_encodage'), $json); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/MiniLienProfil.php |
---|
New file |
0,0 → 1,46 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service renvoyant un lien vers le profil d'un utilisateur sous la forme de son nom' |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class MiniLienProfil extends JRestService { |
public function getRessource(){ |
if(!isset($_COOKIE['pap-annuaire_tela-utilisateur']) && isset($_COOKIE['pap-annuaire_tela-memo'])) { |
$_COOKIE['pap-annuaire_tela-utilisateur'] = $_COOKIE['pap-annuaire_tela-memo']; |
} |
if (isset($_COOKIE['pap-annuaire_tela-utilisateur'])) { |
$username = $_COOKIE['pap-annuaire_tela-utilisateur']; |
// le cookie de papyrus contient un md5 concaténé à l'email utilisateur |
$username = substr($username , 32, strlen($username)); |
$controleur = new AnnuaireControleur(); |
$valeurs = $controleur->obtenirInfosUtilisateur('1', $username, true); |
$nom_affiche_lien = $valeurs['fullname']; |
$tableau_nom_prenom = split(" ", $nom_affiche_lien, 2); |
if(strlen($nom_affiche_lien) > 20) { |
$nom_affiche_lien = substr($nom_affiche_lien,0,20).'...'; |
} |
$lien = 'Bienvenue <a href="http://www.tela-botanica.org/page:mon_inscription_au_reseau"> '.ucwords(strtolower($nom_affiche_lien)).'</a>'; |
echo json_encode($lien); |
} else { |
$lien = ''; |
echo json_encode($lien); |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/ModificationsRss.php |
---|
New file |
0,0 → 1,28 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class ModificationsRss extends JRestService { |
public function getElement($uid){ |
$id_annuaire = (isset($uid[0])) ? $uid[0] : Config::get('annuaire_defaut'); |
$this->authentifier(); |
$controleur = new RSSControleur(); |
$modifications = $controleur->obtenirDernieresModificationsProfil($id_annuaire); |
$this->envoyer($modifications, 'text/xml',Config::get('sortie_encodage'), false); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/Auth.php |
---|
New file |
0,0 → 1,619 |
<?php |
// composer |
require_once '../vendor/autoload.php'; |
/** |
* Tentative de service d'authentification / SSO bien organisé |
* @author mathias |
* © Tela Botanica 2015 |
* |
* @TODO se baser sur autre chose que JRest qui est obsolète |
*/ |
class Auth extends JRestService { |
/** Clef utilisée pour signer les jetons JWT */ |
private $clef; |
/** Si true, refusera une connexion non-HTTPS */ |
protected $forcerSSL = true; |
/** Durée en secondes du jeton (doit être faible en l'absence de mécanisme d'invalidation) */ |
protected $dureeJeton = 900; |
/** Durée en secondes du cookie */ |
protected $dureeCookie = 31536000; // 3600 * 24 * 365 |
/** Nom du cookie */ |
protected $nomCookie = "this_is_not_a_good_cookie_name"; |
public function __construct($config, $demarrer_session = true) { |
parent::__construct($config, $demarrer_session); |
$this->clef = file_get_contents("clef-auth.ini"); |
if (strlen($this->clef) < 16) { |
throw new Exception("Clef trop courte - placez une clef d'au moins 16 caractères dans configurations/clef-auth.ini"); |
} |
$this->forcerSSL = ($this->config['auth']['forcer_ssl'] == "1"); |
$this->dureeJeton = $this->config['auth']['duree_jeton']; |
$this->dureeCookie = $this->config['auth']['duree_cookie']; |
$this->nomCookie = $this->config['auth']['nom_cookie']; |
} |
/** |
* Notice d'utilisation succincte |
* @TODO essayer de choisir entre anglais et français |
*/ |
protected function infosService() { |
$uri = $this->config['settings']['baseAlternativeURL']; |
if ($uri == '') { |
$uri = $this->config['settings']['baseURL']; |
} |
$uri = $uri . "auth/"; |
$infos = array( |
'service' => 'TelaBotanica/annuaire/auth', |
'methodes' => array( |
'connexion' => array( |
"uri" => $uri . "connexion", |
"parametres" => array( |
"login" => "adresse email (ex: name@domain.com)", |
"password" => "mot de passe" |
), |
"alias" => $uri . "login", |
"description" => "connexion avec login et mot de passe; renvoie un jeton et un cookie " . $this->nomCookie |
), |
'deconnexion' => array( |
"uri" => $uri . "deconnexion", |
"parametres" => null, |
"alias" => $uri . "logout", |
"description" => "déconnexion; renvoie un jeton null et supprime le cookie " . $this->nomCookie |
), |
'identite' => array( |
"uri" => $uri . "identite", |
"parametres" => array( |
"token" => "jeton JWT (facultatif)", |
), |
"alias" => array( |
$uri . "identity", |
$uri . "rafraichir", |
$uri . "refresh" |
), |
"description" => "confirme l'authentification et la session; rafraîchit le jeton fourni (dans le cookie " . $this->nomCookie . " ou en paramètre)" |
), |
'verifierjeton' => array( |
"uri" => $uri . "identite", |
"parametres" => array( |
"token" => "jeton JWT", |
), |
"alias" => $uri . "verifytoken", |
"description" => "retourne true si le jeton fourni en paramètre est valide, une erreur sinon" |
) |
) |
); |
$this->envoyerJson($infos); |
} |
/** |
* Lorsqu'appelé sans éléments d'URL (service:annuaire:auth); |
* les paramètres GET sont ignorés |
*/ |
public function getRessource() { |
//echo "get ressource\n"; |
$this->infosService(); |
} |
/** |
* Lorsqu'appelé avec des éléments d'URL (service:annuaire:auth/machin/chose); |
* les paramètres GET sont ignorés |
* |
* @param array $ressources les éléments d'URL |
*/ |
public function getElement($ressources) { |
// Achtétépéèch portouguech lolch |
$this->verifierSSL(); |
//echo "get element\n"; |
//var_dump($ressources); |
// le premier paramètre d'URL définit la méthode (non-magique) |
if (count($ressources) > 0) { |
switch ($ressources[0]) { |
case 'login': |
case 'connexion': |
$this->connexion($ressources); |
break; |
case 'logout': |
case 'deconnexion': |
$this->deconnexion(); |
break; |
case 'identity': |
case 'identite': |
case 'rafraichir': |
case 'refresh': |
$this->identite(); |
break; |
case 'verifytoken': |
case 'verifierjeton': |
$this->verifierJeton(); |
break; |
case 'info': |
default: |
$this->infosService(); |
} |
} |
} |
/** |
* Lors d'un POST avec au moins une donnée dans le body (data); |
* les paramètres GET sont ignorés |
* @TODO faire un point d'entrée POST qui renvoie vers les méthodes GET |
* |
* @param array $ressources les éléments d'URL |
* @param array $pairs les paramètres POST |
*/ |
public function updateElement($ressources, $pairs) { |
//echo "update element\n"; |
//var_dump($ressources); |
//var_dump($pairs); |
$this->nonImplemente(); |
} |
/** |
* Lors d'un PUT (les éléments d'URL sont ignorés) ou d'un POST avec au moins |
* un élément d'URL; dans tous les cas les paramètres GET sont ignorés |
* |
* @param array $pairs les paramètres POST |
*/ |
public function createElement($pairs) { |
//echo "create element\n"; |
//var_dump($pairs); |
$this->nonImplemente(); |
} |
/** |
* Lors d'un DELETE avec au moins un élément d'URL |
* @TODO utiliser pour invalider un jeton (nécessite stockage) |
* |
* @param array $ressources les éléments d'URL |
*/ |
public function deleteElement($ressources) { |
//echo "delete element\n"; |
//var_dump($ressources); |
$this->nonImplemente(); |
} |
/** |
* Vérifie l'identité d'un utilisateur à partir de son courriel et son |
* mot de passe ou d'un cookie; lui accorde un jeton et un cookie si |
* tout va bien, sinon renvoie une erreur |
* |
* @param array $ressources non utilisé |
*/ |
protected function connexion($ressources) { |
$login = $this->getParam('login'); |
$password = $this->getParam('password', null); |
if ($login == '' || $password == '') { |
$this->erreur("parameters <login> and <password> required"); |
} |
// vérification login / password |
$acces = $this->verifierAcces($login, $password); |
if ($acces === false) { |
$this->erreur("authentication failed", 401); |
} |
// infos utilisateur |
$util = new Utilisateur($this->config); |
$infos = $util->getIdentiteParCourriel($login); |
if (count($infos) == 0 || empty($infos[$login])) { |
$this->erreur("could not get user info"); |
} |
// date de dernière modification du profil |
$dateDerniereModif = $util->getDateDerniereModifProfil($infos[$login]['id'], true); |
$infos[$login]['dateDerniereModif'] = $dateDerniereModif; |
// création du jeton |
$jwt = $this->creerjeton($login, $infos[$login]); |
// création du cookie |
$this->creerCookie($jwt); |
// envoi |
$this->envoyerJson(array( |
"session" => true, |
"token" => $jwt, |
"duration" => intval($this->dureeJeton), |
"token_id" => $this->nomCookie, |
"last_modif" => $infos[$login]['dateDerniereModif'] |
)); |
} |
/** |
* Détruit le cookie et renvoie un jeton vide ou NULL - le client |
* devrait toujours remplacer son jeton par celui renvoyé par les |
* méthodes de l'annuaire |
*/ |
protected function deconnexion() { |
// suppression du cookie |
$this->detruireCookie(); |
// envoi d'un jeton null |
$jwt = null; |
$this->envoyerJson(array( |
"session" => false, |
"token" => $jwt, |
"token_id" => $this->nomCookie |
)); |
} |
/** |
* Renvoie un jeton rafraîchi (durée de validité augmentée de $this->dureeJeton |
* si l'utilisateur est reconnu comme détenteur d'une session active (cookie valide, |
* header HTTP "Authorization" ou jeton valide); renvoie une erreur si le cookie |
* et/ou le jeton sont expirés; |
* cela permet en théorie de forger des cookies avec des jetons expirés pour se les |
* faire rafraîchir franduleusement, mais le canal HTTPS fait qu'un client ne peut |
* être en possession que de ses propres jetons... au pire on peut se faire prolonger |
* à l'infini même si on n'est plus inscrit à l'annuaire... @TODO faire mieux un jour |
* Priorité : cookie > headers > paramètre "token" @TODO vérifier cette stratégie |
*/ |
protected function identite() { |
$cookieAvecJetonValide = false; |
$jetonRetour = null; |
$erreur = ''; |
// lire cookie |
if (isset($_COOKIE[$this->nomCookie])) { |
$jwt = $_COOKIE[$this->nomCookie]; |
try { |
// rafraîchir jeton quelque soit son état - "true" permet |
// d'ignorer les ExpiredException (on rafraîchit le jeton |
// expiré car le cookie est encore valide) |
$jetonRetour = $this->rafraichirJeton($jwt, true); |
// on ne tentera pas de lire un jeton fourni en paramètre |
$cookieAvecJetonValide = true; |
} catch (Exception $e) { |
// si le rafraîchissement a échoué (jeton invalide - hors expiration - ou vide) |
// on ne fait rien et on tente la suite (jeton fourni hors cookie ?) |
$erreur = "invalid token in cookie"; |
} |
} |
// si le cookie n'existait pas ou ne contenait pas un jeton |
if (! $cookieAvecJetonValide) { |
// lire jeton depuis header ou paramètre |
$jwt = $this->lireJetonDansHeader(); |
if ($jwt == null) { |
// dernière chance |
$jwt = $this->getParam('token'); |
} |
// toutes les possibilités ont été essayées |
if ($jwt != null) { |
try { |
// rafraîchir jeton si non expiré |
$jetonRetour = $this->rafraichirJeton($jwt); |
} catch (Exception $e) { |
// si le rafraîchissement a échoué (jeton invalide, expiré ou vide) |
$erreur = "invalid or expired token in header or parameter"; |
} |
} else { |
// pas de jeton valide passé en paramètre |
$erreur = ($erreur == "" ? "no token or cookie" : "invalid token in cookie / invalid or expired token in header or parameter"); |
} |
} |
// renvoi jeton |
if ($jetonRetour === null) { |
$this->erreur($erreur); |
} else { |
$this->envoyerJson(array( |
"session" => true, |
"token" => $jetonRetour, |
"duration" => intval($this->dureeJeton), |
"token_id" => $this->nomCookie |
)); |
} |
} |
/** |
* Vérifie si un jeton est valide; retourne true si oui, une erreur avec |
* des détails si non |
*/ |
protected function verifierJeton() { |
// vérifie que le jeton provient bien d'ici, |
// et qu'il est encore valide (date) |
$jwt = $this->getParam('token'); |
if ($jwt == '') { |
$this->erreur("parameter <token> required"); |
} |
try { |
$jeton = JWT::decode($jwt, $this->clef, array('HS256')); |
$jeton = (array) $jeton; |
} catch (Exception $e) { |
$this->erreur($e->getMessage()); |
exit; |
} |
//print_r($jeton); |
$this->envoyerJson(true); |
} |
/** |
* Reçoit un jeton JWT, et s'il est non-vide ("sub" != null), lui redonne |
* une période de validité de $this->dureeJeton; si $ignorerExpiration |
* vaut true, rafraîchira le jeton même s'il a expiré |
* (attention à ne pas appeler cette méthode n'importe comment !); |
* jette une exception si le jeton est vide, mal signé ou autre erreur, |
* ou s'il a expiré et que $ignorerExpiration est différent de true |
* |
* @param string $jwt le jeton JWT |
* @return string le jeton rafraîchi |
*/ |
protected function rafraichirJeton($jwt, $ignorerExpiration=false) /* throws Exception */ { |
$infos = array(); |
// vérification avec lib JWT |
try { |
$infos = JWT::decode($jwt, $this->clef, array('HS256')); |
$infos = (array) $infos; |
} catch (ExpiredException $e) { |
if ($ignorerExpiration === true) { |
// on se fiche qu'il soit expiré |
// décodage d'un jeton expiré |
// @WARNING considère que la lib JWT jette ExpiredException en dernier (vrai 12/05/2015), |
// ce qui signifie que la signature et le domaine sont tout de même valides - à surveiller ! |
$infos = $this->decoderJetonExpireManuellement($jwt); |
} else { |
// on renvoie l'exception plus haut |
throw $e; |
} |
} |
// vérification des infos |
if (empty($infos['sub'])) { |
// jeton vide (wtf?) |
echo " #Jeton vide"; |
throw new Exception("empty token (no <sub>)"); |
} |
// rafraîchissement |
$infos['exp'] = time() + $this->dureeJeton; |
$jwtSortie = JWT::encode($infos, $this->clef); |
return $jwtSortie; |
} |
/** |
* Décode manuellement un jeton JWT, SANS VÉRIFIER SA SIGNATURE OU |
* SON DOMAINE ! @WARNING ne pas utiliser hors du cas d'un jeton |
* correct (vérifié avec la lib JWT) mais expiré ! |
* |
* @param string $jwt un jeton vérifié comme valide, mais expiré |
*/ |
protected function decoderJetonExpireManuellement($jwt) { |
$parts = explode('.', $jwt); |
$payload = $parts[1]; |
$payload = base64_decode($payload); |
$payload = json_decode($payload, true); |
return $payload; |
} |
/** |
* Crée un jeton JWT signé avec la clef |
* |
* @param mixed $sub subject: l'id utilisateur du détenteur du jeton si authentifié, null sinon |
* @param string $exp la date d'expiration du jeton, par défaut la date actuelle plus $this->dureeJeton |
* @param array $donnees les données à ajouter au jeton (infos utilisateur) |
* |
* @return string un jeton JWT signé |
*/ |
protected function creerJeton($sub, $donnees=array(), $exp=null) { |
if ($exp === null) { |
$exp = time() + $this->dureeJeton; |
} |
$jeton = array( |
"iss" => "https://www.tela-botanica.org", |
"token_id" => $this->nomCookie, |
//"aud" => "http://example.com", |
"sub" => $sub, |
"iat" => time(), |
"exp" => $exp, |
//"nbf" => time() + 60, |
"scopes" => array("tela-botanica.org") |
); |
if (! empty($donnees)) { |
$jeton = array_merge($jeton, $donnees); |
} |
$jwt = JWT::encode($jeton, $this->clef); |
return $jwt; |
} |
/** |
* Essaye de trouver un jeton JWT non vide dans l'entête HTTP $nomHeader (par |
* défaut "Authorization") |
* |
* @param string $nomHeader nom de l'entête dans lequel chercher le jeton |
* @return String un jeton JWT ou null |
*/ |
protected function lireJetonDansHeader($nomHeader="Authorization") { |
$jwt = null; |
$headers = apache_request_headers(); |
if (isset($headers[$nomHeader]) && ($headers[$nomHeader] != "")) { |
$jwt = $headers[$nomHeader]; |
} |
return $jwt; |
} |
/** |
* Crée un cookie de durée $this->dureeCookie, nommé $this->nomCookie et |
* contenant $valeur |
* |
* @param string $valeur le contenu du cookie (de préférence un jeton JWT) |
*/ |
protected function creerCookie($valeur) { |
setcookie($this->nomCookie, $valeur, time() + $this->dureeCookie, '/', null, true); |
} |
/** |
* Renvoie le cookie avec une valeur vide et une date d'expiration dans le |
* passé, afin que le navigateur le détruise au prochain appel |
* @TODO envisager l'envoi d'un jeton vide plutôt que la suppression du cookie |
* |
* @param string $valeur la valeur du cookie, par défaut "" |
*/ |
protected function detruireCookie() { |
setcookie($this->nomCookie, "", -1, '/', null, true); |
} |
// ---------------- Méthodes à génériciser ci-dessous ---------------------------------- |
/** |
* Message succinct pour méthodes / actions non implémentées |
*/ |
protected function nonImplemente() { |
$this->erreur("not implemented"); |
} |
/** |
* Si $this->forcerSSL vaut true, envoie une erreur et termine le programme si SSL n'est pas utilisé |
*/ |
protected function verifierSSL() { |
if ($this->forcerSSL === true) { |
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'off') { |
$this->erreur("HTTPS required"); |
exit; |
} |
} |
} |
protected function getParamChain($names) { |
if (! is_array($names)) { |
// Hou ? (cri de chouette solitaire) |
} |
} |
/** |
* Capture un paramètre de requête ($_REQUEST) |
* |
* @param string $name nom du paramètre à capturer |
* @param string $default valeur par défaut si le paramètre n'est pas défini (ou vide, voir ci-dessous) |
* @param bool $traiterVideCommeDefaut si le paramètre est défini mais vide (''), le considèrera comme non défini |
* |
* @return string la valeur du paramètre si défini, sinon la valeur par défaut |
*/ |
protected function getParam($name, $default=null, $traiterVideCommeDefaut=false) { |
$ret = $default; |
if (isset($_REQUEST[$name])) { |
if ($traiterVideCommeDefaut === false || $_REQUEST[$name] !== '') { |
$ret = $_REQUEST[$name]; |
} |
} |
return $ret; |
} |
/** |
* Capture un paramètre GET |
* |
* @param string $name nom du paramètre GET à capturer |
* @param string $default valeur par défaut si le paramètre n'est pas défini (ou vide, voir ci-dessous) |
* @param bool $traiterVideCommeDefaut si le paramètre est défini mais vide (''), le considèrera comme non défini |
* |
* @return string la valeur du paramètre si défini, sinon la valeur par défaut |
*/ |
protected function getGetParam($name, $default=null, $traiterVideCommeDefaut=false) { |
$ret = $default; |
if (isset($_GET[$name])) { |
if ($traiterVideCommeDefaut === false || $_GET[$name] !== '') { |
$ret = $_GET[$name]; |
} |
} |
return $ret; |
} |
/** |
* Capture un paramètre POST |
* |
* @param string $name nom du paramètre POST à capturer |
* @param string $default valeur par défaut si le paramètre n'est pas défini (ou vide, voir ci-dessous) |
* @param bool $traiterVideCommeDefaut si le paramètre est défini mais vide (''), le considèrera comme non défini |
* |
* @return string la valeur du paramètre si défini, sinon la valeur par défaut |
*/ |
protected function getPostParam($name, $default=null, $traiterVideCommeDefaut=false) { |
$ret = $default; |
if (isset($_POST[$name])) { |
if ($traiterVideCommeDefaut === false || $_POST[$name] !== '') { |
$ret = $_POST[$name]; |
} |
} |
return $ret; |
} |
/** |
* Envoie une erreur HTTP $code (400 par défaut) avec les données $data en JSON |
* |
* @param mixed $data données JSON de l'erreur - généralement array("error" => "raison de l'erreur") - si |
* seule une chaîne est transmise, sera convertie en array("error" => $data) |
* @param number $code code HTTP de l'erreur, par défaut 400 (bad request) |
* @param boolean $exit si true (par défaut), termine le script après avoir envoyé l'erreur |
*/ |
protected function erreur($data, $code=400, $exit=true) { |
if (! is_array($data)) { |
$data = array( |
"error" => $data |
); |
} |
http_response_code($code); |
$this->envoyerJson($data); |
if ($exit === true) { |
exit; |
} |
} |
} |
/** |
* Mode moderne pour PHP < 5.4 |
*/ |
if (!function_exists('http_response_code')) { |
function http_response_code($code = NULL) { |
if ($code !== NULL) { |
switch ($code) { |
case 100: $text = 'Continue'; break; |
case 101: $text = 'Switching Protocols'; break; |
case 200: $text = 'OK'; break; |
case 201: $text = 'Created'; break; |
case 202: $text = 'Accepted'; break; |
case 203: $text = 'Non-Authoritative Information'; break; |
case 204: $text = 'No Content'; break; |
case 205: $text = 'Reset Content'; break; |
case 206: $text = 'Partial Content'; break; |
case 300: $text = 'Multiple Choices'; break; |
case 301: $text = 'Moved Permanently'; break; |
case 302: $text = 'Moved Temporarily'; break; |
case 303: $text = 'See Other'; break; |
case 304: $text = 'Not Modified'; break; |
case 305: $text = 'Use Proxy'; break; |
case 400: $text = 'Bad Request'; break; |
case 401: $text = 'Unauthorized'; break; |
case 402: $text = 'Payment Required'; break; |
case 403: $text = 'Forbidden'; break; |
case 404: $text = 'Not Found'; break; |
case 405: $text = 'Method Not Allowed'; break; |
case 406: $text = 'Not Acceptable'; break; |
case 407: $text = 'Proxy Authentication Required'; break; |
case 408: $text = 'Request Time-out'; break; |
case 409: $text = 'Conflict'; break; |
case 410: $text = 'Gone'; break; |
case 411: $text = 'Length Required'; break; |
case 412: $text = 'Precondition Failed'; break; |
case 413: $text = 'Request Entity Too Large'; break; |
case 414: $text = 'Request-URI Too Large'; break; |
case 415: $text = 'Unsupported Media Type'; break; |
case 500: $text = 'Internal Server Error'; break; |
case 501: $text = 'Not Implemented'; break; |
case 502: $text = 'Bad Gateway'; break; |
case 503: $text = 'Service Unavailable'; break; |
case 504: $text = 'Gateway Time-out'; break; |
case 505: $text = 'HTTP Version not supported'; break; |
case 666: $text = 'Couscous overheat'; break; |
default: |
exit('Unknown http status code "' . htmlentities($code) . '"'); |
break; |
} |
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0'); |
header($protocol . ' ' . $code . ' ' . $text); |
$GLOBALS['http_response_code'] = $code; |
} else { |
$code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200); |
} |
return $code; |
} |
} |
/branches/v1.4-baleine/jrest/services/ExecuteurLien.php |
---|
New file |
0,0 → 1,46 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class ExecuteurLien extends JRestService { |
public function getElement($uid){ |
if (isset($uid[0])) { |
$lien_code = $uid[0]; |
$lien = base64_decode(str_replace('_', '/', $lien_code)); |
} else { |
return; |
} |
if (!isset($uid[1])) { |
$retour_ajax = true; |
} else { |
$adresse_retour = base64_decode(str_replace('_', '/', $uid[1])); |
} |
$requete = file_get_contents($lien); |
if ($retour_ajax) { |
if ($requete) { |
$resultat = 'ok'; |
} else { |
$resultat = false; |
} |
$this->envoyer($resultat); |
} else { |
header('Location: http://'.$adresse_retour); |
exit; |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/TelaUtilisateurs.php |
---|
New file |
0,0 → 1,41 |
<?php |
/** |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Grégoire Duché <jpm@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright 2009 |
*/ |
class TelaUtilisateurs extends JRestService { |
/** |
* Méthode appelée quand aucun paramêtre n'est passée dans l'url et avec une requête de type GET. |
*/ |
public function getRessource() { |
$this->getElement(array()); |
} |
public function getElement($params = array()) { |
$id_annuaire = Config::get('annuaire_defaut'); |
if(isset($uid[0])) { |
$id_annuaire = $uid[0]; |
} |
$controleur = new AnnuaireControleur(); |
$nb_inscrits = $controleur->chargerNombreAnnuaireListeInscrits($id_annuaire); |
$info[] = $nb_inscrits; |
//TODO externaliser ceci |
$en_ligne = file_get_contents('/home/telabotap/www/nb_sessions_active.json'); |
$info[] = json_decode($en_ligne); |
$this->envoyer($info); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/EnvoiMessage.php |
---|
New file |
0,0 → 1,55 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service d'envoie de courriel. |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class EnvoiMessage extends JRestService { |
public function getElement($uid){ |
$identificateur = new IdentificationControleur(); |
$login = $identificateur->obtenirLoginUtilisateurParCookie(); |
$identification = $login; |
if (!$identification || trim($identification) == '') { |
print 'false'; |
} else { |
$id_annuaire = Config::get('annuaire_defaut'); |
$contenu_message = $_GET['contenu_message']; |
$sujet_message = $_GET['sujet_message']; |
$destinataire = $_GET['destinataire']; |
$redirect = $_GET['redirect']; |
$messagerie = new MessageControleur(); |
// Remplacement les identifiants par leurs destinataires |
$destinataire_mail = $messagerie->obtenirMailParTableauId($id_annuaire, array($destinataire)); |
if (empty($destinataire_mail)) { |
print 'false'; |
} else { |
$destinataire_mail = $destinataire_mail[0]; |
$retour = $messagerie->envoyerMail($identification, $destinataire_mail, $sujet_message, $contenu_message); |
if ($retour) { |
if ($redirect != null && $redirect != '') { |
header('Location: '.'http://'.$redirect); |
exit; |
} else { |
print 'OK'; |
} |
} else { |
print 'false'; |
} |
} |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/GestionLettreActu.php |
---|
New file |
0,0 → 1,35 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service de gestion de la lettre d'actualité |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class GestionLettreActu extends JRestService { |
public function getElement($uid){ |
// TODO : rajouter controle d'accès ! |
$id_utilisateur = $uid[0]; |
$mail_utilisateur = $uid[1]; |
if (isset($uid[2])) { |
$id_annuaire = $uid[2]; |
} else { |
$id_annuaire = Config::get('annuaire_defaut'); |
} |
$controleur = new LettreControleur(); |
$est_abonne = $controleur->estAbonneLettreActualite($id_annuaire,$id_utilisateur); |
$changement = $controleur->abonnerDesabonnerLettreActualite($id_annuaire, $id_utilisateur, !$est_abonne); |
echo 'OK'; |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/StatistiquesAnnuaire.php |
---|
New file |
0,0 → 1,58 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class StatistiquesAnnuaire extends JRestService { |
public function getElement($uid){ |
if (!isset($uid[0])) { |
$id_annuaire = $uid[0]; |
} else { |
$id_annuaire = Config::get('annuaire_defaut'); |
} |
if (isset($uid[1])) { |
$type_stat = $uid[1]; |
} else { |
$type_stat = ''; |
} |
$controleur = new StatistiqueControleur(); |
switch($type_stat) { |
case 'annee' : |
$annee = isset($uid[2]) ? $uid[2] : null; |
$graph = $controleur->obtenirStatistiquesPourAnnee($id_annuaire, $annee); |
break; |
case 'annees' : |
$graph = $controleur->obtenirStatistiquesParAnnees($id_annuaire); |
break; |
case 'continents' : |
$graph = $controleur->obtenirStatistiquesInscritsParContinents($id_annuaire); |
break; |
case 'europe' : |
$graph = $controleur->obtenirStatistiquesInscritsEurope($id_annuaire); |
break; |
case 'modification' : |
$graph = $controleur->obtenirStatistiquesModificationsProfil($id_annuaire); |
break; |
default: |
$graph = $controleur->obtenirStatistiquesParCritere($id_annuaire,$type_stat, ''); |
} |
// Envoi d'une image png |
header("Content-type: image/png charset=utf-8\n\n"); |
imagepng($graph); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/services/InscritsRss.php |
---|
New file |
0,0 → 1,32 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Service |
* |
* @category php 5.2 |
* @package Annuaire::Services |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version $Id$ |
*/ |
class InscritsRss extends JRestService { |
public function getElement($uid){ |
$mail_utilisateur = $uid[0]; |
$admin = (isset($uid[1])) ? $uid[1] : false; |
$id_annuaire = Config::get('annuaire_defaut'); |
if ($admin) { |
$this->authentifier(); |
} |
$controleur = new RSSControleur(); |
$inscrits = $controleur->obtenirDerniersInscritsRSS($id_annuaire, $admin); |
$this->envoyer($inscrits, 'text/xml',Config::get('sortie_encodage'), false); |
} |
} |
?> |