/branches/v1.4-baleine/jrest/jrest.ini.defaut.php |
---|
New file |
0,0 → 1,59 |
;<?/* |
[settings] |
baseURL = "/reseau/annuaire/jrest/" |
; URL de base relative alternative de JREST (pour les raccourcis par exemple) |
baseAlternativeURL = "/service:annuaire:" |
; Default |
[appli] |
phptype = mysql |
username = |
password = |
hostspec = localhost |
database = tb_v4 |
; Infos pour Google Analytics |
[google] |
email_google = accueil@tela-botanica.org |
password_google = "" |
id_site_google = 16474 |
; Identification |
[database_ident] |
phptype = mysql |
username = |
password = |
hostspec = localhost |
database = tb_v4 |
annuaire = annuaire_tela |
ann_id = U_MAIL |
ann_pwd = U_PASSWD |
pass_crypt_funct = md5 |
nom_cookie_persistant="pap-annuaire_tela-memo" |
nom_cookie_utilisateur="pap-annuaire_tela-utilisateur" |
;MESSAGERIE |
[messagerie] |
utilisateurs_autorises = identiplante@tela-botanica.org,annuaire@tela-botanica.org |
; LOGS |
[log] |
cheminlog = "/tmp" |
timezone = "Europe/Paris" |
taillemax = 100000 |
; ADMIN |
[jrest_admin] |
admin = aurelien@tela-botanica.org,david.delon@clapas.net,jpm@tela-botanica.org,marie@tela-botanica.org |
; Liste des ips (nom de domaine) autorisés à accéder aux services |
ip_autorisees = "127.0.0.1, 193.54.123.169, 193.54.123.216, 162.38.234.6" |
; AUTH (SSO) |
[auth] |
; si true, refusera toute connexion non-HTTPS |
forcer_ssl = true |
nom_cookie = tb_auth |
duree_cookie = 31536000 |
duree_jeton = 900 |
;*/?> |
/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); |
} |
} |
?> |
/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/robots.txt |
---|
New file |
0,0 → 1,2 |
User-agent: * |
Disallow: / |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/branches/v1.4-baleine/jrest/.htaccess |
---|
New file |
0,0 → 1,6 |
RewriteEngine On |
RewriteCond %{REQUEST_FILENAME} !-d |
RewriteCond %{REQUEST_FILENAME} !-f |
RewriteRule ^.*$ index.php/ |
# Composer et la lib JWT nécessitent PHP 5.3 minimum |
AddHandler application/x-httpd-php-55 .php |
/branches/v1.4-baleine/jrest/bibliotheque/Log.php |
---|
New file |
0,0 → 1,195 |
<?php |
//declare(encoding='UTF-8'); |
/** |
* Classe permettant de logger des messages dans les fichier situés dans le dossier de log |
* |
* PHP Version 5 |
* |
* @category PHP |
* @package Framework |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/framework/ |
*/ |
class Log { |
/** |
* Tableau associatif stockant les descripteurs de fichiers |
*/ |
private static $fichiersLog = array(); |
/** |
* Chemin de base du dossier log de l'application |
*/ |
private static $cheminLogs = ''; |
/** |
* Booleen indiquant si l'on peut correctement écrire dans les fichiers de logs |
*/ |
private static $droitLogger = true; |
/** |
* Zone horaire (pour éviter des avertissements dans les dates) |
*/ |
private static $timeZone = ''; |
/** |
* Taille maximum d'un fichier de log avant que celui ne soit archivé (en octets) |
*/ |
private static $tailleMax = 10000; |
/** |
* séparateur de chemin |
*/ |
private static $sd = DIRECTORY_SEPARATOR; |
/** |
* Extension des fichiers de log |
*/ |
private static $ext = '.log'; |
/** |
* La classe registre se contient elle-même, (pour le pattern singleton) |
*/ |
private static $log; |
/** |
* Constructeur par défaut, privé, car on accède à la classe par le getInstance |
*/ |
private function __construct() { |
self::$sd = $sd; |
// gestion de la timezone pour éviter des erreurs |
if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get")) { |
date_default_timezone_set(self::$timeZone); |
} |
if(!is_dir(self::$cheminLogs) || !is_writable(self::$cheminLogs)) { |
self::desactiverEcriture(); |
} |
} |
public static function setCheminLog($nouveauCheminLogs) { |
self::$cheminLogs = $nouveauCheminLogs; |
} |
public static function getCheminLog() { |
return self::$cheminLogs; |
} |
public static function setTimeZone($NouvelleTimeZone) { |
self::$timeZone = $NouvelleTimeZone; |
} |
public static function setTailleMax($nouvelleTailleMax) { |
self::$tailleMax = $nouvelleTailleMax; |
} |
/** |
* Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être |
* utilisée pour récupérer l'objet Registre |
* @return Log le gestionnaire de log en cours |
*/ |
public static function getInstance() { |
if (self::$log instanceof Log) { |
return self::$log; |
} |
self::$log = new Log(); |
return self::$log; |
} |
/** |
* Ajoute une entrée au log spécifié par le paramètre $nomFichier |
* @param string $nomFichier le nom du fichier dans lequel écrire |
*/ |
public static function ajouterEntree($nomFichier,$entree,$mode='a+') { |
if(self::$droitLogger) { |
$date = "\n"."\n".date('d m Y H:i')."\n" ; |
// si le fichier est déjà dans le tableau et qu'on peut y écrire |
if(self::verifierOuvrirFichier($nomFichier,$mode)) { |
// on y écrit le message de log |
fwrite(self::$fichiersLog[$nomFichier],$date.$entree); |
// on vérifie si le fichier ne dépasse pas la taille maximale |
self::verifierTailleFichierOuArchiver($nomFichier); |
} else { |
// sinon on interdit l'écriture |
self::desactiverEcriture($nomFichier); |
} |
} |
} |
/** |
* Vide un fichier log indiqué |
* @param string $nomFichier le nom du fichier à vider |
*/ |
public static function viderLog($nomFichier) { |
ajouterEntree($nomFichier,'','w'); |
} |
/** |
* Vérifie la présence d'un fichier dans le tableau, ses droits d'écriture, |
* l'ouvre si nécessaire |
* @param string $nomFichier le nom du fichier dont on doit vérifier la présence |
* @return boolean true si le fichier est ouvert ou maintenant accessible, false sinon |
*/ |
public static function verifierOuvrirFichier($nomFichier,$mode) { |
// le fichier est il déjà ouvert ? |
if(in_array($nomFichier,self::$fichiersLog)) { |
// si oui peut on y écrire ? |
if(is_writable(self::$cheminLogs.$nomFichier.self::$ext)) { |
// si oui on renvoie le descripteur |
return true; |
} |
return false; |
} else { |
// sinon on l'ouvre |
$fp = @fopen(self::$cheminLogs.$nomFichier.self::$ext,$mode); |
// si l'ouverture a réussi et si le fichier a les droits d'écriture |
if($fp && is_writable(self::$cheminLogs.$nomFichier.self::$ext)) { |
// si oui on renvoie le descripteur qu'on ajoute au tableau |
self::$fichiersLog[$nomFichier] = $fp; |
return true; |
} |
return false; |
} |
} |
/** |
* Vérifie la taille d'un fichier donné et si celle ci est trop importante |
* archive le fichier de log |
* @param string $nomFichier nom du fichier à vérifier |
*/ |
private static function verifierTailleFichierOuArchiver($nomFichier) { |
if(filesize(self::$cheminLogs.$nomFichier.self::$ext) > self::$tailleMax) { |
rename(self::$cheminLogs.$nomFichier.self::$ext,self::$cheminLogs.$nomFichier.date('d_m_Y_H:i').self::$ext); |
self::ajouterEntree($nomFichier,''); |
} |
} |
/** |
* Désactive l'écriture du log et envoie un message au gestionnaire d'erreurs |
* @param string $nomFichier le nom du fichier qui a causé l'erreur |
*/ |
private static function desactiverEcriture($nomFichier = '') { |
self::$droitLogger = false; |
if($nomFichier != '') { |
$fichierDossier = 'fichier '.$nomFichier ; |
} else { |
$fichierDossier = 'dossier des logs'; |
} |
} |
/** |
* destructeur de classe, ferme les descripteurs ouverts |
*/ |
public function __destruct() { |
foreach(self::$fichiersLog as $nomFichier => $fp) { |
fclose($fp); |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/bibliotheque/JRestService.php |
---|
New file |
0,0 → 1,505 |
<?php |
/** |
* Classe mère abstraite contenant les méthodes génériques des services. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Jean-Pascal MILCENT <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 |
*/ |
abstract class JRestService { |
public $config; |
protected $bdd; |
protected $ressources; |
protected $log = array(); |
protected $messages = array(); |
protected $debug = array(); |
protected $distinct = false; |
protected $orderby = null; |
protected $formatRetour = 'objet'; |
protected $start = 0; |
protected $limit = 150; |
/** pour l'envoi de XML : éventuelle balise dans laquelle placer tout le contenu */ |
protected $baliseMaitresse; |
public function __construct($config, $demarrer_session = true) { |
// Tableau contenant la config de Jrest |
$this->config = $config; |
// Connection à la base de données |
$this->bdd = $this->connecterPDO($this->config, 'appli'); |
// Nettoyage du $_GET (sécurité) |
if (isset($_GET)) { |
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour'); |
foreach ($get_params as $get) { |
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
if (isset($_GET[$get])) { |
$_GET[$get] = str_replace($verifier, '', $_GET[$get]); |
if ($_GET[$get] != '') { |
$this->$get = $_GET[$get]; |
} |
} else { |
$_GET[$get] = null; |
} |
} |
} |
} |
/** |
* Méthode appelée quand aucun paramètre n'est passé dans l'url et avec une requête de type GET. |
*/ |
public function getRessource() { |
$this->getElement(array()); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de l'ENVOI au NAVIGATEUR pas la PEINE de CRIER |
protected function envoyerJson($donnees, $encodage = 'utf-8') { |
$contenu = json_encode($donnees); |
$this->envoyer($contenu, 'application/json', $encodage, false); |
} |
/** à l'arrache pour rétrocompatibilité avec le service "annuaire_tela" de eFlore_chatin */ |
protected function envoyerXml($donnees, $encodage = 'utf-8') { |
$xml = '<?xml version="1.0" encoding="' . strtoupper($encodage) . '"?>'; |
if ($this->baliseMaitresse) { |
$xml .= '<' . $this->baliseMaitresse . '>'; |
} |
$xml .= $this->genererXmlAPartirDeTableau($donnees); |
if ($this->baliseMaitresse) { |
$xml .= '</' . $this->baliseMaitresse . '>'; |
} |
$this->envoyer($xml, 'application/xml', $encodage, false); |
} |
/** |
* Génère un XML minimaliste à partir d'un tableau associatif |
* Note : gère mal les indices numériques |
* @TODO utiliser une vraie lib |
*/ |
protected function genererXmlAPartirDeTableau($tableau) { |
$xml = ''; |
foreach ($tableau as $balise => $donnee) { |
$xml .= '<' . $balise . '>'; |
if (is_array($donnee)) { |
// récurer, balayer, que ce soit toujours pimpant |
$xml .= $this->genererXmlAPartirDeTableau($donnee); |
} else { |
$xml .= $donnee; |
} |
$xml .= '</' . $balise . '>'; |
} |
return $xml; |
} |
protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') { |
$contenu = "var $variable = ".json_encode($donnees); |
$this->envoyer($contenu, 'text/html', $encodage, false); |
} |
protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') { |
$contenu = $_GET['callback'].'('.json_encode($donnees).');'; |
$this->envoyer($contenu, 'text/html', $encodage, false); |
} |
protected function envoyerTxt($donnees, $encodage = 'utf-8') { |
$this->envoyer($contenu, 'text/html', $encodage, false); |
} |
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = true) { |
// Traitements des messages d'erreurs et données |
if (count($this->messages) != 0) { |
header('HTTP/1.1 500 Internal Server Error'); |
$mime = 'text/html'; |
$encodage = 'utf-8'; |
$json = true; |
$sortie = $this->messages; |
} else { |
$sortie = $donnees; |
if (is_null($donnees)) { |
$sortie = 'OK'; |
} |
} |
// Gestion de l'envoie du déboguage |
$this->envoyerDebogage(); |
// Encodage au format et JSON et envoie sur la sortie standard |
$contenu = $json ? json_encode($sortie) : $sortie; |
$this->envoyerContenu($encodage, $mime, $contenu); |
} |
private function envoyerDebogage() { |
if (!is_array($this->debug)) { |
$this->debug[] = $this->debug; |
} |
if (count($this->debug) != 0) { |
foreach ($this->debug as $cle => $val) { |
if (is_array($val)) { |
$this->debug[$cle] = print_r($val, true); |
} |
} |
header('X-DebugJrest-Data:'.json_encode($this->debug)); |
} |
} |
private function envoyerContenu($encodage, $mime, $contenu) { |
if (!is_null($mime) && !is_null($encodage)) { |
header("Content-Type: $mime; charset=$encodage"); |
} else if (!is_null($mime) && is_null($encodage)) { |
header("Content-Type: $mime"); |
} |
print $contenu; |
} |
private function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
} |
protected function envoyerMessageErreur($msg, $code) { |
$textHttp = $this->getCodeHttpText($code); |
header("HTTP/1.0 $code $textHttp"); |
header("Content-Type: text/plain; charset=utf-8"); |
die($msg); |
} |
private function getCodeHttpText($code) { |
$text = ''; |
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; |
default: |
exit('Unknown http status code "' . htmlentities($code) . '"'); |
break; |
} |
return $text; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de la BASE de DONNÉES |
private function connecterPDO($config, $base = 'database') { |
$cfg = $config[$base]; |
// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place. |
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec']; |
try { |
// Création de la connexion en UTF-8 à la BDD |
$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'")); |
} catch (PDOException $e) { |
echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage(); |
} |
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché) |
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
return $PDO; |
} |
protected function getTxt($id) { |
$sortie = ''; |
switch ($id) { |
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break; |
default : $sortie = $id; |
} |
return $sortie; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// TRAITEMENT des URLs et des PARAMÊTRES |
protected function traiterNomMethodeGet($nom) { |
$methode = 'get'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
protected function traiterNomMethodePost($nom) { |
$methode = 'update'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
protected function traiterNomMethodePut($nom) { |
$methode = 'create'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
protected function traiterParametresUrl($params_attendu, $params, $pourBDD = true) { |
$sortie = array(); |
foreach ($params_attendu as $num => $nom) { |
if (isset($params[$num]) && $params[$num] != '*') { |
if ($pourBDD) { |
$params[$num] = $this->bdd->quote($params[$num]); |
} |
$sortie[$nom] = $params[$num]; |
} |
} |
return $sortie; |
} |
protected function traiterParametresPost($params) { |
$sortie = array(); |
foreach ($params as $cle => $valeur) { |
$sortie[$cle] = $this->bdd->quote($valeur); |
} |
return $sortie; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE L'IDENTIFICATION |
public function controlerIpAutorisees() { |
$ipsAutorisees = $this->config['jrest_admin']['ip_autorisees']; |
$remoteIp = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP); |
$serverIp = filter_input(INPUT_SERVER, 'SERVER_ADDR', FILTER_VALIDATE_IP); |
if (in_array($remoteIp, $ipsAutorisees) == false) { |
if ($remoteIp != $serverIp) {// ATTENTION : maintenir ce test à l'intérieur du précédent |
$message = "Accès interdit. \n". |
"Vous n'êtes pas autorisé à accéder à ce service depuis '$remoteIp' !\n"; |
$this->envoyerMessageErreur($message, 401); |
} |
} |
return true; |
} |
protected function getIdentification(&$params) { |
// Initialisation des variables |
$utilisateur = array(0, session_id()); |
// L'id utilisateur est soit passé par le POST soit dans l'url |
if (is_array($params) && isset($params['cmhl_ce_modifier_par'])) { |
$utilisateur[0] = $params['cmhl_ce_modifier_par']; |
unset($params['cmhl_ce_modifier_par']); |
} else if (is_string($params)) { |
$utilisateur[0] = $params; |
} |
return $utilisateur; |
} |
protected function etreAutorise($id_utilisateur) { |
$autorisation = false; |
if (($_SESSION['coel_utilisateur'] != '') && $_SESSION['coel_utilisateur']['id'] != $id_utilisateur) { |
$this->messages[] = 'Accès interdit.'; |
} else if ($_SESSION['coel_utilisateur'] == '') { |
$this->messages[] = 'Veuillez vous identifiez pour accéder à cette fonction.'; |
} else { |
$autorisation = true; |
} |
return $autorisation; |
} |
// WTF coel en dur ?? |
private function gererIdentificationPermanente() { |
// Pour maintenir l'utilisateur tjrs réellement identifié nous sommes obligé de recréer une SESSION et de le recharger depuis la bdd |
if ($this->getUtilisateur() == '' |
&& isset($_COOKIE['coel_login']) |
&& ($utilisateur = $this->chargerUtilisateur($_COOKIE['coel_login'], $_COOKIE['coel_mot_de_passe']))) { |
$this->setUtilisateur($utilisateur, $_COOKIE['coel_permanence']); |
} |
} |
// WTF coel en dur ?? |
protected function getUtilisateur() { |
return (isset($_SESSION['coel_utilisateur']) ? $_SESSION['coel_utilisateur'] : ''); |
} |
protected function authentifier() { |
if (!isset($_SERVER['PHP_AUTH_USER'])) { |
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"'); |
header('HTTP/1.0 401 Unauthorized'); |
header('Content-type: text/html; charset=UTF-8'); |
echo 'Accès interdit'; |
exit; |
} else { |
if ($this->verifierAcces()) { |
return ; |
} else { |
header('WWW-Authenticate: Basic realm="www.tela-botanica.org"'); |
header('HTTP/1.0 401 Unauthorized'); |
header('Content-type: text/html; charset=UTF-8'); |
echo 'Accès interdit'; |
exit ; |
} |
} |
} |
protected function verifierAcces($id = null, $mdp = null) { |
$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id; |
$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp; |
$requete = 'SELECT '.$this->config['database_ident']['ann_id'].' AS courriel '. |
'FROM '.$this->config['database_ident']['database'].'.'.$this->config['database_ident']['annuaire'].' '. |
'WHERE '.$this->config['database_ident']['ann_id'].' = '.$this->bdd->quote($id).' '. |
' AND '.$this->config['database_ident']['ann_pwd'].' = '.$this->config['database_ident']['pass_crypt_funct'].'('.$this->bdd->quote($mdp).')' ; |
$resultat = $this->bdd->query($requete)->fetch(); |
$identifie = false; |
if (isset($resultat['courriel'])) { |
$identifie = true; |
} |
return $identifie; |
} |
/** |
* Envoie une demande d'authentification HTTP puis compare le couple |
* login / mot de passe envoyé par l'utilisateur, à ceux définis dans |
* la config (section database_ident). |
* En cas d'erreur, sort du programme avec un entête HTTP 401 |
* @TODO redondant avec les trucs du dessus :'( |
*/ |
protected function authentificationHttpSimple() { |
$autorise = true; |
// contrôle d'accès |
$nomUtil = $_SERVER['PHP_AUTH_USER']; |
$mdp = $_SERVER['PHP_AUTH_PW']; |
$autorise = (($nomUtil == $this->config['database_ident']['username']) && ($mdp == $this->config['database_ident']['password'])); |
// entêtes HTTP |
if (! $autorise) { |
header('WWW-Authenticate: Basic realm="Annuaire de Tela Botanica"'); |
header('HTTP/1.0 401 Unauthorized'); |
echo 'Veuillez vous authentifier pour utiliser ce service'; |
exit; |
} |
} |
protected function creerCookiePersistant($duree = null, $id = null, $mdp = null) { |
$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id; |
$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp; |
$duree = (int) is_null($duree) ? time()+3600*24*30 : $duree; |
$nomCookie = $this->config['database_ident']['nom_cookie_persistant']; |
$valeurCookie = md5($mdp).$id; |
setcookie($nomCookie, $valeurCookie, $duree, '/'); |
} |
protected function creerCookieUtilisateur($duree = null, $id = null, $mdp = null) { |
$id = is_null($id) ? $_SERVER['PHP_AUTH_USER'] : $id; |
$mdp = is_null($mdp) ? $_SERVER['PHP_AUTH_PW'] : $mdp; |
$duree = (int) is_null($duree) ? 0 : $duree; |
$nomCookie = $this->config['database_ident']['nom_cookie_utilisateur']; |
$valeurCookie = md5($mdp).$id; |
setcookie($nomCookie, $valeurCookie, $duree, '/'); |
} |
protected function supprimerCookieUtilisateur() { |
session_destroy(); |
setcookie($this->config['database_ident']['nom_cookie_utilisateur'], "", time()-7200, "/"); |
setcookie($this->config['database_ident']['nom_cookie_persistant'], "", time()-7200, "/"); |
} |
protected function estAutoriseMessagerie($adresse) { |
$utilisateurs_messagerie = explode(',', $this->config['messagerie']['utilisateurs_autorises']); |
return in_array($adresse, $utilisateurs_messagerie); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES SQUELETTES PHP |
/** |
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données, |
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés. |
* |
* @param String $fichier le chemin du fichier du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette. |
* |
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat. |
*/ |
public static function traiterSquelettePhp($fichier, Array $donnees = array()) { |
$sortie = false; |
if (file_exists($fichier)) { |
// Extraction des variables du tableau de données |
extract($donnees); |
// Démarage de la bufferisation de sortie |
ob_start(); |
// Si les tags courts sont activés |
if ((bool) @ini_get('short_open_tag') === true) { |
// Simple inclusion du squelette |
include $fichier; |
} else { |
// Sinon, remplacement des tags courts par la syntaxe classique avec echo |
$html_et_code_php = self::traiterTagsCourts($fichier); |
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval |
$html_et_code_php = '?>'.$html_et_code_php; |
// Interprétation du html et du php dans le buffer |
echo eval($html_et_code_php); |
} |
// Récupèration du contenu du buffer |
$sortie = ob_get_contents(); |
// Suppression du buffer |
@ob_end_clean(); |
} else { |
$msg = "Le fichier du squelette '$fichier' n'existe pas."; |
trigger_error($msg, E_USER_WARNING); |
} |
// Retourne le contenu |
return $sortie; |
} |
/** |
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo. |
* |
* @param String $chemin_squelette le chemin du fichier du squelette |
* |
* @return string le contenu du fichier du squelette php avec les tags courts remplacés. |
*/ |
private static function traiterTagsCourts($chemin_squelette) { |
$contenu = file_get_contents($chemin_squelette); |
// Remplacement de tags courts par un tag long avec echo |
$contenu = str_replace('<?=', '<?php echo ', $contenu); |
// Ajout systématique d'un point virgule avant la fermeture php |
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu); |
return $contenu; |
} |
} |
?> |
/branches/v1.4-baleine/jrest/bibliotheque/GoogleAnalyticsAPI.php |
---|
New file |
0,0 → 1,294 |
<?php |
if(isset($_GET['source'])) { |
highlight_file(__FILE__); |
die; |
} |
/* |
* |
* This script is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
* GNU General public License for more details. |
* |
* This copyright notice MUST APPEAR in all copies of the script! |
* |
* @author CERDAN Yohann <cerdanyohann@yahoo.fr> |
* @copyright (c) 2009 CERDAN Yohann, All rights reserved |
* @ version 12:38 04/08/2009 |
*/ |
class GoogleAnalyticsAPI |
{ |
/** Google account login (email) **/ |
private $login; |
/** Google account password **/ |
private $password; |
/** Google analytics website ID (avalaible on your google analytics account url) **/ |
private $ids; |
/** The login token to the google analytics service **/ |
private $loginToken; |
/** The XML response send by the service **/ |
private $response; |
/** Begin date of the displaying datas **/ |
private $date_begin; |
/** End date of the displaying datas **/ |
private $date_end; |
/** Sort the results **/ |
private $sort; |
/** The param to sort (metrics or dimensions) **/ |
private $sort_param; |
/** |
* Class constructor |
* |
* @param string $login the login (email) |
* @param string $password the password |
* @param string $ids the IDs of the website (find it in the google analytics gui) |
* @param string $date_begin the begin date |
* @param string $date_end the end date |
* |
* @return void |
*/ |
public function __construct($login,$password,$ids,$date_begin,$date_end = null) |
{ |
$this->login = $login; |
$this->password = $password; |
$this->ids = $ids; |
$this->date_begin = $date_begin; |
if (!$date_end) { |
$this->date_end = $date_begin; |
} else { |
$this->date_end = $date_end; |
} |
$this->sort = "-"; |
$this->sort_param = "metrics"; |
// Authentication |
$this->login(); |
} |
/** |
* Set the result's sort by metrics |
* |
* @param boolean $sort asc or desc sort |
* |
* @return void |
*/ |
public function setSortByMetrics ($sort) |
{ |
if ($sort==true) { |
$this->sort = ""; |
} else { |
$this->sort = "-"; |
} |
$this->sort_param = 'metrics'; |
} |
/** |
* Set the result's sort by dimensions |
* |
* @param boolean $sort asc or desc sort |
* |
* @return void |
*/ |
public function setSortByDimensions ($sort) |
{ |
if ($sort==true) { |
$this->sort = ""; |
} else { |
$this->sort = "-"; |
} |
$this->sort_param = 'dimensions'; |
} |
/** |
* Set the IDs of the website |
* |
* @param string $ids the IDs of the website (find it in the google analytics gui) |
* |
* @return void |
*/ |
public function setIds($ids) |
{ |
$this->ids = $ids; |
} |
/** |
* Set the date of the export |
* |
* @param string $date_begin the begin date |
* @param string $date_end the end date |
* |
* @return void |
*/ |
public function setDate ($date_begin,$date_end = null) |
{ |
$this->date_begin = $date_begin; |
if (!$date_end) { |
$this->date_end = $date_begin; |
} else { |
$this->date_end = $date_end; |
} |
} |
/** |
* Login to the google server |
* See : http://google-data-api.blogspot.com/2008/05/clientlogin-with-php-curl.html |
* |
* @return void |
*/ |
private function login() |
{ |
$ch = curl_init(); |
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); |
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); |
$data = array('accountType' => 'GOOGLE', |
'Email' => $this->login, |
'Passwd' => $this->password, |
'source'=>'php_curl_analytics', |
'service'=>'analytics'); |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); |
curl_setopt($ch, CURLOPT_POST, true); |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); |
$hasil = curl_exec($ch); |
curl_close($ch); |
// Get the login token |
// SID=DQA...oUE |
// LSID=DQA...bbo |
// Auth=DQA...Sxq |
if (preg_match('/Auth=(.*)$/',$hasil,$matches)>0) { |
$this->loginToken = $matches[1]; |
} else { |
trigger_error('Authentication problem',E_USER_WARNING); |
return null; |
} |
} |
/** |
* Get URL content using cURL. |
* |
* @param string $url the url |
* |
* @return string the html code |
*/ |
function getContent ($url) |
{ |
if (!extension_loaded('curl')) { |
throw new Exception('curl extension is not available'); |
} |
$ch = curl_init($url); |
$header[] = 'Authorization: GoogleLogin auth=' . $this->loginToken; |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); |
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
curl_setopt($ch, CURLOPT_HEADER, false); |
$this->response = curl_exec($ch); |
$infos = curl_getinfo($ch); |
curl_close($ch); |
return $infos['http_code']; |
} |
/** |
* Get the google analytics datas by dimensions and metrics |
* See : http://code.google.com/intl/fr/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html |
* |
* @param string $metrics the metrics |
* @param string $dimensions the dimensions |
* |
* @return array |
*/ |
public function getDimensionByMetric($metrics, $dimensions) |
{ |
$url = "https://www.google.com/analytics/feeds/data?ids=ga:" . $this->ids . "&metrics=ga:" . $metrics . "&dimensions=ga:" . $dimensions . "&start-date=" . $this->date_begin . "&end-date=" . $this->date_end ."&sort=" . $this->sort . "ga:"; |
if ($this->sort_param=='metrics') { // sort by metrics |
$url .= $metrics; |
} |
if ($this->sort_param=='dimensions') { // sort by dimensions |
$url .= $dimensions; |
} |
if($this->getContent($url) == 200) { |
$XML_object = simplexml_load_string($this->response); |
$labels_array = array(); |
$datas_array = array(); |
foreach($XML_object->entry as $m) { |
$dxp = $m->children('http://schemas.google.com/analytics/2009'); |
$metric_att = $dxp->metric->attributes(); |
$dimension_att = $dxp->dimension->attributes(); |
$labels_array []= $dimension_att['value'] . ' (' . $metric_att['value'] . ')'; |
$datas_array []= (string)$metric_att['value']; |
} |
return array('labels' => $labels_array, 'datas' => $datas_array); |
} else { |
return null; |
} |
} |
/** |
* Get the google analytics datas by metrics |
* See : http://code.google.com/intl/fr/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html |
* |
* @param string $metrics the metrics |
* @param string $uri the url of the website page (ex : /myurl/) |
* |
* @return array |
*/ |
public function getMetric($metric,$uri=null) |
{ |
$url = "https://www.google.com/analytics/feeds/data?ids=ga:" . $this->ids . "&metrics=ga:" . $metric . "&start-date=" . $this->date_begin . "&end-date=" . $this->date_end; |
if ($uri) { |
$url .= "&dimensions=ga:pagePath&filters=ga:pagePath%3D%3D" . $uri; |
} |
if($this->getContent($url) == 200) { |
$XML_object = simplexml_load_string($this->response); |
$dxp = $XML_object->entry->children('http://schemas.google.com/analytics/2009'); |
if (@count($dxp)>0) { |
$metric_att = $dxp->metric->attributes(); |
} |
return $metric_att['value'] ? (string)$metric_att['value'] : 0; |
} else { |
return null; |
} |
} |
} |
?> |
/branches/v1.4-baleine/jrest/bibliotheque |
---|
New file |
Property changes: |
Added: svn:ignore |
+MiniRest.php |
/branches/v1.4-baleine/jrest/JRest.php |
---|
New file |
0,0 → 1,307 |
<?php |
// In : utf8 url_encoded (get et post) |
// Out : utf8 |
// TODO : gerer les retours : dans ce controleur : code retour et envoi ... |
class JRest { |
/** Parsed configuration file */ |
private $config; |
/** The HTTP request method used. */ |
private $method = 'GET'; |
/** The HTTP request data sent (if any). */ |
private $requestData = NULL; |
/** Array of strings to convert into the HTTP response. */ |
private $output = array(); |
/** Nom resource. */ |
private $resource = NULL; |
/** Identifiant unique resource. */ |
private $uid = NULL; |
/** |
* Constructor. Parses the configuration file "JRest.ini", grabs any request data sent, records the HTTP |
* request method used and parses the request URL to find out the requested resource |
* @param str iniFile Configuration file to use |
*/ |
public function JRest($iniFile = 'jrest.ini.php') { |
$this->config = parse_ini_file($iniFile, TRUE); |
if (isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && isset($_SERVER['QUERY_STRING'])) { |
if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) { |
$this->requestData = ''; |
$httpContent = fopen('php://input', 'r'); |
while ($data = fread($httpContent, 1024)) { |
$this->requestData .= $data; |
} |
fclose($httpContent); |
} |
if (strlen($_SERVER['QUERY_STRING']) == 0) { |
$len = strlen($_SERVER['REQUEST_URI']); |
} else { |
$len = -(strlen($_SERVER['QUERY_STRING']) + 1); |
} |
$urlString = ''; |
if (substr_count($_SERVER['REQUEST_URI'], $this->config['settings']['baseURL']) > 0) { |
$urlString = substr($_SERVER['REQUEST_URI'], strlen($this->config['settings']['baseURL']), $len); |
} else if (substr_count($_SERVER['REQUEST_URI'], $this->config['settings']['baseAlternativeURL']) > 0) { |
$urlString = substr($_SERVER['REQUEST_URI'], strlen($this->config['settings']['baseAlternativeURL']), $len); |
} |
$urlParts = explode('/', $urlString); |
if (isset($urlParts[0])) $this->resource = $urlParts[0]; |
if (count($urlParts) > 1 && $urlParts[1] != '') { |
array_shift($urlParts); |
foreach ($urlParts as $uid) { |
if ($uid != '') { |
$this->uid[] = urldecode($uid); |
} |
} |
} |
$this->method = $_SERVER['REQUEST_METHOD']; |
} else { |
trigger_error('I require the server variables REQUEST_URI, REQUEST_METHOD and QUERY_STRING to work.', E_USER_ERROR); |
} |
} |
/** |
* Execute the request. |
*/ |
function exec() { |
switch ($this->method) { |
case 'GET': |
$this->get(); |
break; |
case 'POST': |
$this->post(); |
break; |
case 'DELETE': |
$this->delete(); |
break; |
case 'PUT': |
$this->add(); |
break; |
} |
} |
/** |
* Execute a GET request. A GET request fetches a list of resource when no resource name is given, a list of element |
* when a resource name is given, or a resource element when a resource and resource unique identifier are given. It does not change the |
* database contents. |
*/ |
private function get() { |
if ($this->resource) { |
$resource_file = 'services/'.ucfirst($this->resource).'.php'; |
$resource_class = ucfirst($this->resource); |
if (file_exists($resource_file)) { |
include_once $resource_file; |
if (class_exists($resource_class)) { |
$service = new $resource_class($this->config); |
if ($this->uid) { // get a resource element |
if (method_exists($service, 'getElement')) { |
$service->getElement($this->uid); |
} |
} elseif (method_exists($service, 'getRessource')) { // get all elements of a ressource |
$service->getRessource(); |
} |
} |
} |
} else { // get resources |
// include set.jrest.php, instanticiation et appel |
} |
} |
private function post() { |
$pairs = array(); |
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST) |
if ($this->requestData) { |
$pairs = $this->parseRequestData(); |
} |
// Ajout des informations concernant l'upload de fichier passées dans la variable $_FILE |
if(isset($_FILES)) { |
foreach ($_FILES as $v) { |
$pairs[$v['name']] = $v; |
} |
// Ne pas effacer cette ligne ! Elle est indispensable pour les services du Carnet en ligne |
// qui n'utilisent que le tableau pairs dans les posts |
$pairs = array_merge($pairs, $_POST); |
} |
// gestion du contenu du post |
if(isset($_POST)) |
{ |
// Safari ne sait pas envoyer des DELETE avec gwt... |
// Nous utilisons le parametre "action" passé dans le POST qui doit contenir DELETE pour lancer la supression |
if ($pairs['action'] == 'DELETE') { |
$this->delete(); |
return; |
} |
if (count($pairs) != 0) { |
if ($this->uid) { // get a resource element |
$resource_file = 'services/'.ucfirst($this->resource).'.php'; |
$resource_class = ucfirst($this->resource); |
if (file_exists($resource_file)) { |
include_once $resource_file; |
if (class_exists($resource_class)) { |
$service = new $resource_class($this->config); |
if (method_exists($service,'updateElement')) { // Update element |
// TODO : a voir le retour ... |
if ($service->updateElement($this->uid, $pairs)) { |
$this->created(); |
} |
} |
} |
} |
} else { // get all elements of a ressource |
$this->add($pairs); |
} |
} else { |
$this->lengthRequired(); |
} |
} |
} |
private function delete() { |
$resource_file = 'services/'.ucfirst($this->resource).'.php'; |
$resource_class = ucfirst($this->resource); |
if (file_exists($resource_file)) { |
include_once $resource_file; |
if (class_exists($resource_class)) { |
$service = new $resource_class($this->config); |
if ($this->uid) { // get a resource element |
if (method_exists($service, 'deleteElement')) { // Delete element |
if ($service->deleteElement($this->uid)) { |
$this->noContent(); |
} |
} |
} |
} |
} |
} |
private function add($pairs = null) { |
if (is_null($pairs)) { |
$pairs = array(); |
// Récupération des paramètres passés dans le contenu de la requête HTTP (= POST) |
// FIXME : vérifier que l'on récupère bien les données passées par PUT |
if ($this->requestData) { |
$pairs = $this->parseRequestData(); |
} |
} |
if (count($pairs) != 0) { |
$resource_file = 'services/'.ucfirst($this->resource).'.php'; |
$resource_class = ucfirst($this->resource); |
if (file_exists($resource_file)) { |
include_once $resource_file; |
if (class_exists($resource_class)) { |
$service = new $resource_class($this->config); |
if (method_exists($service,'createElement')) { // Create a new element |
if ($service->createElement($pairs)) { |
$this->created(); |
} |
} |
} |
} |
} else { |
$this->lengthRequired(); |
} |
} |
/** |
* Parse the HTTP request data. |
* @return str[] Array of name value pairs |
*/ |
private function parseRequestData() { |
$values = array(); |
$pairs = explode('&', $this->requestData); |
foreach ($pairs as $pair) { |
$parts = explode('=', $pair); |
if (isset($parts[0]) && isset($parts[1])) { |
$parts[1] = rtrim(urldecode($parts[1])); |
$values[$parts[0]] = $parts[1]; |
} |
} |
return $values; |
} |
/** |
* Send a HTTP 201 response header. |
*/ |
private function created($url = FALSE) { |
header('HTTP/1.0 201 Created'); |
if ($url) { |
header('Location: '.$url); |
} |
} |
/** |
* Send a HTTP 204 response header. |
*/ |
private function noContent() { |
header('HTTP/1.0 204 No Content'); |
} |
/** |
* Send a HTTP 400 response header. |
*/ |
private function badRequest() { |
header('HTTP/1.0 400 Bad Request'); |
} |
/** |
* Send a HTTP 401 response header. |
*/ |
private function unauthorized($realm = 'JRest') { |
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) { |
header('WWW-Authenticate: Basic realm="'.$realm.'"'); |
} |
header('HTTP/1.0 401 Unauthorized'); |
} |
/** |
* Send a HTTP 404 response header. |
*/ |
private function notFound() { |
header('HTTP/1.0 404 Not Found'); |
} |
/** |
* Send a HTTP 405 response header. |
*/ |
private function methodNotAllowed($allowed = 'GET, HEAD') { |
header('HTTP/1.0 405 Method Not Allowed'); |
header('Allow: '.$allowed); |
} |
/** |
* Send a HTTP 406 response header. |
*/ |
private function notAcceptable() { |
header('HTTP/1.0 406 Not Acceptable'); |
echo join(', ', array_keys($this->config['renderers'])); |
} |
/** |
* Send a HTTP 411 response header. |
*/ |
private function lengthRequired() { |
header('HTTP/1.0 411 Length Required'); |
} |
/** |
* Send a HTTP 500 response header. |
*/ |
private function internalServerError() { |
header('HTTP/1.0 500 Internal Server Error'); |
} |
} |
?> |
/branches/v1.4-baleine/jrest/clef-auth.defaut.ini |
---|
New file |
0,0 → 1,0 |
)À3 RÈNJppÀ(=Va30iX'RÙ'A"'*x "cr"çà808Zre"3 |
/branches/v1.4-baleine/jrest/index.php |
---|
New file |
0,0 → 1,31 |
<?php |
/** |
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code. |
* |
* Cette fonction est appelée par php5 quand il trouve une instanciation de classe dans le code. |
* |
*@param string le nom de la classe appelée. |
*@return void le fichier contenant la classe doit être inclu par la fonction. |
*/ |
function __autoloadJRest($classe) |
{ |
if (class_exists($classe)) { |
return null; |
} |
$chemins = array('', 'services/', 'bibliotheque/'); |
foreach ($chemins as $chemin) { |
$chemin = $chemin.$classe.'.php'; |
if (file_exists($chemin)) { |
require_once $chemin; |
} |
} |
} |
spl_autoload_register('__autoloadJRest'); |
require_once('../initialisation.php'); |
$jRest = new JRest(); |
$jRest->exec(); |
?> |
/branches/v1.4-baleine/jrest/. |
---|
New file |
Property changes: |
Added: svn:ignore |
+jrest.ini.php |
+clef-auth.ini |