Subversion Repositories Applications.wikini

Compare Revisions

No changes between revisions

Ignore whitespace Rev 62 → Rev 63

/trunk/tools/login/libs/squelettephp.class.php
New file
0,0 → 1,48
<?php
// Auteur d'origine : Brian Lozier
// Source : http://www.massassi.com/php/articles/template_engines/
 
class SquelettePhp {
private $vars; // Contient toutes les variables à insérer dans le squelette
 
/**
* Constructeur
*
* @param $fichier string le nom du fichier de template à charger.
*/
public function __construct($fichier_tpl = null)
{
$this->fichier = $fichier_tpl;
}
 
/**
* Ajout une variable pour le squelette.
*/
public function set($nom, $valeur = null)
{
if (is_null($valeur) && is_array($nom)) {
$this->vars = $nom;
} else if ($valeur instanceof SquelettePhp) {
$this->vars[$nom] = $valeur->analyser();
} else {
$this->vars[$nom] = $valeur;
}
}
 
/**
* Ouvre, parse, and retourne le squelette.
*
* @param $fichier string le nom du fichier squelette.
*/
public function analyser($fichier = null)
{
if(!$fichier) $fichier = $this->fichier;
extract($this->vars); // Extrait les variables et les ajoutes à l'espace de noms local
ob_start(); // Démarre le buffer
include($fichier); // Inclusion du fichier
$contenu = ob_get_contents(); // Récupérer le contenu du buffer
ob_end_clean(); // Arrête et détruit le buffer
return $contenu; // Retourne le contenu
}
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/tools/login/libs/identificationsso.class.php
New file
0,0 → 1,180
<?php
class identificationSso {
 
private $wiki = null;
private $config = null;
 
private $cookie_tentative_identification = "";
private $delai_tentative_identification = 60;
 
public function __construct($wiki) {
$this->wiki = $wiki;
$this->config = $wiki->config;
$this->cookie_tentative_identification = 'wikini_sso_tentative_identification';
}
 
function getToken() {
// Premier essai, dans le header
$headers = @apache_request_headers();
$token = !empty($headers['Authorization']) ? $headers['Authorization'] : null;
 
// Sinon dans $_REQUEST ?
if($token == null) {
$token = !empty($_REQUEST['Authorization']) ? $_REQUEST['Authorization'] : null;
}
// Sinon dans $_COOKIE ?
if($token == null) {
$token = !empty($_COOKIE['tb_auth']) ? $_COOKIE['tb_auth'] : null;
}
 
return $token;
}
 
function decoderToken($token) {
$token_parts = explode('.', $token);
return json_decode(base64_decode($token_parts[1]), true);
}
 
function getPage() {
return !empty($this->wiki->page) ? $this->wiki->page['tag'] : 'PagePrincipale';
}
 
// http://stackoverflow.com/questions/1251582/beautiful-way-to-remove-get-variables-with-php?lq=1
function supprimerUrlVar($url, $var) {
return rtrim(preg_replace('/([?&])'.$var.'=[^&]+(&|$)/','$1',$url), '&?');
}
 
function getInfosCookie() {
$infos = null;
if(!empty($_COOKIE[$this->cookie_tentative_identification])) {
$infos = json_decode($_COOKIE[$this->cookie_tentative_identification], true);
}
return $infos;
}
 
function setInfosCookie($infos) {
$infos['expire'] = !empty($infos['expire']) ? $infos['expire'] : 0;
setcookie($this->cookie_tentative_identification, json_encode($infos), $infos['expire'], $this->wiki->CookiePath);
}
 
function verifierEtInsererUtilisateurParJeton($jeton_rafraichi) {
if(!empty($jeton_rafraichi['session']) && $jeton_rafraichi['session'] == true) {
$token_decode = $this->decoderToken($jeton_rafraichi['token']);
$nom_wiki = $token_decode['nomWiki'];
$courriel = $token_decode['sub'];
$utilisateur_wiki_existe = $this->wiki->LoadAll("SELECT * FROM ".$this->wiki->config["table_prefix"]."users ".
"WHERE ".
"name = '".mysql_escape_string($nom_wiki)."' OR ".
"email = '".mysql_escape_string($courriel)."'");
// pas inscrit ? on l'ajout à la base de données
if(empty($utilisateur_wiki_existe)) {
// mot de passe généré à l'arrache, le mieux serait de trouver celui de tela encodé
// mais en gérant bien le sso on peut s'en passer car l'utilisateur ne devrait jamais avoir
// à s'identifier par le wiki
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pass = substr(str_shuffle(str_repeat($pool, 16)), 0, 16);
$this->wiki->Query("insert into ".$this->wiki->config["table_prefix"]."users set ".
"signuptime = now(), ".
"name = '".mysql_escape_string($token_decode['nomWiki'])."', ".
"email = '".mysql_escape_string($token_decode['sub'])."', ".
"password = md5('".mysql_escape_string($pass)."')");
} else {
// Un utilisateur peut déjà s'être inscrit sur le wiki avec un autre nom que son pseudo
$nom_wiki = $utilisateur_wiki_existe[0]['name'];
// s'il existe un enregistrement avec ce mail et un autre avec ce nomWiki on garde celui qui correspond au bon courriel
foreach($utilisateur_wiki_existe as $utilisateur_wiki) {
if($utilisateur_wiki['email'] == $courriel) {
$nom_wiki = $utilisateur_wiki['name'];
}
}
}
}
 
return $nom_wiki;
}
 
function recupererIdentiteConnectee() {
$infos_cookie = $this->getInfosCookie();
if($infos_cookie == null || $infos_cookie['tentative_identification'] == false) {
// peut importe si l'annuaire répond oui ou non, on a fait une tentative d'identification
// et si on a trouvé quelqu'un on ne réésaiera pas jusqu'à la fermeture du navigateur
$infos_cookie = array('tentative_identification' => true, 'expire' => 0);
$this->setInfosCookie($infos_cookie);
 
$annuaire_url = $this->wiki->config['sso_url'].'identite';
// Attention si le paramètre wiki de l'url est vide, la redirection de retour pose des problèmes
$url = $annuaire_url.'?redirect_url='.urlencode($this->wiki->config['base_url'].$this->getPage());
 
header('Location: '.$url);
exit;
} else {
$token = $this->getToken();
 
if($token != null) {
// On demande à l'annuaire si le jeton est bien valide
$jeton_rafraichi = json_decode(file_get_contents($this->wiki->config['sso_url'].'rafraichir?token='.$token), true);
$nom_wiki = $this->verifierEtInsererUtilisateurParJeton($jeton_rafraichi);
$token_decode = $this->decoderToken($jeton_rafraichi['token']);
 
// dans le pire des cas, si on se déconnecte dans une autre application, on sera déconnecté
// lorsque le jeton expirera
$infos_cookie = array('tentative_identification' => true, 'expire' => time()+$jeton_rafraichi['duration']);
$this->setInfosCookie($infos_cookie);
 
$this->wiki->SetUser($this->wiki->LoadUser($nom_wiki));
} else {
// personne n'a été trouvé ? on remplace le cookie par un de durée plus courte
// pour rééssayer dans delai_tentative_identification si on en a pas déjà un
if($infos_cookie['expire'] == 0) {
$infos_cookie['expire'] = time()+$this->delai_tentative_identification;
$this->setInfosCookie($infos_cookie);
}
}
}
}
 
 
function connecterUtilisateur($login, $pass, $url_redirect = null) {
if(strpos($login, '@') === false) {
$utilisateur_wiki = $this->wiki->LoadSingle("SELECT email FROM ".$this->wiki->config["table_prefix"]."users ".
"WHERE name = '".mysql_escape_string($login)."'");
 
$login = !empty($utilisateur_wiki) ? $utilisateur_wiki['email'] : $login;
// TODO: si le courriel a changé dans l'annuaire, on devrait mettre à jour les informations
// si on a utilisé le nom wiki pour s'identifier mais le flow du programme rend cela complexe
}
 
$url_redirect = ($url_redirect == null) ? $this->wiki->config['base_url'].'PagePrincipale' : $url_redirect;
 
// le cookie de tentative d'identification est remis à zéro pour qu'au rechargement de la page il vérifie l'identité
// connectée du nouvel utilisateur
$infos_cookie = array('tentative_identification' => false, 'expire' => 0);
$this->setInfosCookie($infos_cookie);
// On demande à l'annuaire si l'utilisateur est bien valide
$annuaire_url = $this->wiki->config['sso_url'].'connexion?login='.$login.'&password='.$pass;
$url = $annuaire_url.'&redirect_url='.urlencode($url_redirect);
 
header('Location: '.$url);
exit;
}
 
function deconnecterUtilisateur($url_redirect = null) {
$url_redirect = ($url_redirect == null) ? $this->wiki->config['base_url'].'PagePrincipale' : $url_redirect;
// Suppression d'un eventuel jeton contenu dans l'url
$url_redirect = $this->supprimerUrlVar($url_redirect, 'Authorization');
$infos_cookie = array('tentative_identification' => false, 'expire' => 0);
$this->setInfosCookie($infos_cookie);
// On demande à l'annuaire si l'utilisateur est bien valide
$annuaire_url = $this->wiki->config['sso_url'].'deconnexion';
$url = $annuaire_url.'?redirect_url='.urlencode($url_redirect);
header('Location: '.$url);
exit;
}
}
?>
Property changes:
Added: svn:executable
+*
\ No newline at end of property