Etendre les sessions SPIP sans toucher à son coeur
Par fpl le lundi 27 novembre 2006, 07:28 - Général - Lien permanent

Je livre en l'état un script PHP (à personnaliser) afin d'enrichir les sessions du CMS SPIP. Il est initialement développé pour le site de l'association World Wide STRI. La démarche suivie est un peu bidouille au premier abord mais présente l'intérêt d'être assez indépendant de la version de SPIP (testé en 1.9.1 mais devrait fonctionner sur des version plus anciennes). Ce script doit être inclus dans chaque page des squelettes.
auteur_session_enhance.php
<?php
//
// Script qui ajoute des parametres dans la session de spip au premier appel
// Auteur : Frederic PLE (frederic _POINT_ ple _AT_ gmail _POINT_ com)
//
$DEBUG=false;
if ($DEBUG) $logf=fopen($_SERVER['DOCUMENT_ROOT'].'/ecrire/data/enhance_session.log','a');
function printlog ($texte) {
global $logf;
global $auteur_session;
fwrite($logf,date('Ymd-Hjs')." [".$auteur_session['login']."] [".$_SERVER['REMOTE_ADDR']."] $texte
");
}
//print_r($auteur_session);
if (isset($auteur_session['id_diplome'])) {
if ($DEBUG) printlog("OK session deja etandue");
return("OK session deja etandue"); // Session deja etenduee
}
if (!isset($auteur_session['login'])) {
if ($DEBUG) printlog("KO session pas authentifiee");
return("KO session pas authentifiee"); // Session pas encore authentifiee
}
// Recherche le fichier de session
$sessions_dir=$_SERVER['DOCUMENT_ROOT'].'/ecrire/data';
$sessions_mine='session_'.$auteur_session['id_auteur'].'_';
$sessions_mine_length=strlen($sessions_mine);
$hash_env=md5($GLOBALS['ip'].$_SERVER['HTTP_USER_AGENT']);
$dir=opendir($sessions_dir);
$session_file=false;
while ($file=readdir($dir)) {
if (strncmp($file,$sessions_mine,$sessions_mine_length)==0) {
// Fichier de session appartenant a l'utilisateur
$sf=file($sessions_dir.'/'.$file);
for($i=0;$i<count($sf);$i++) $sf[$i]=trim($sf[$i]);
if (in_array("\$GLOBALS['auteur_session']['hash_env'] = '".$hash_env."';",$sf)) {
$session_file=$sessions_dir.'/'.$file;
break;
}
}
}
if (!$session_file) {
if ($DEBUG) printlog("KO pas de fichier de session trouve pour la session");
return("KO pas de fichier de session trouve pour la session"); // Fichier de session non trouve
} else if ($DEBUG) printlog("OK fichier de session : $session_file");
array_pop($sf);
// Extension
// Code à personnaliser
include('sql.php.inc');
$request_value="SELECT * FROM ma_table WHERE id='".$auteur_session['login']."';";
$res=mysql_query($request_value);
if (!$res) {
if ($DEBUG) printlog("KO Erreur mysql_query ".mysql_error());
return("KO Erreur mysql_query ".mysql_error());
}
$u=mysql_fetch_array($res,MYSQL_ASSOC);
mysql_free_result($res);
foreach(array_keys($u) as $champ) {
$GLOBALS['auteur_session'][$champ]=$u[$champ];
$sf[]="\$GLOBALS['auteur_session']['".$champ."'] = '".$u[$champ]."';";
}
unset($u);
// Fin du code à personnaliser
// Fin
$sf[]="?>";
$fp=fopen($session_file,'w');
if ($fp) {
foreach($sf as $ligne) fwrite($fp,$ligne."
");
fclose ($fp);
if ($DEBUG) printlog("OK Session etendue");
return("OK Session etendue");
} else {
if ($DEBUG) printlog("KO Erreur de modification de $session_file");
return("KO Erreur de modification de $session_file"); // Impossible d'ecrire dans le fichier de session
}
?>
sql.php.inc
Ce script permet d'utiliser la chaîne de connexion SQL de SPIP sans pour autant l'implémenter à plusieurs endroits
<?php
//
// Script qui se connecte à la base de donnees a partir de la conf de spip
// Auteur : Frederic PLE (frederic _POINT_ ple _AT_ gmail _POINT_ com)
//
$spipfile=$_SERVER['DOCUMENT_ROOT'].'/ecrire/inc_connect.php';
$spip=file($spipfile);
foreach($spip as $l) if (strncmp($l,'spip_connect_db',12)==0) break;
list($host,$user,$pass,$db)=explode(' ',preg_replace('/^[^\']+\'([^\']*)\',\'([^\']*)\',\'([^\']*)\',\'([^\']*)\',\'([^\']*)\'.*$/','$1 $3 $4 $5',$l));
$db=rtrim($db);
if (!mysql_connect($host,$user,$pass)) { echo mysql_error(); exit() ;}
if (!mysql_select_db($db)) { echo mysql_error(); exit() ;}
?>




Commentaires