Gestion des membres : extension SPIP

Gestion des membres : extension SPIPprojet pour l'ADER
v 1.0 (béta)
Julien Thomas
Une présentation rapide
Dans le cadre de ma thèse, je fais partie de l'association ADER (Association des doctorants de TELECOM Bretagne, http://www.telecom-bretagne.eu, Rennes) : http://ader.rennes.enst-bretagne.fr/. Dans le cadre de cet association, je m'occupe principalement des comptes rendus et publicités externes, étant donné que je suis le secrétaire général.
Le projet de gestion des anciens
Bon, c'est pas tout, mais il n'y a pas d'informatique là dedans :d
Donc l'idée du projet de gestion des anciens membres m'a paru intéressant, et me voici chargé du projet !
Pour les membres de l'association (authentification spip du site de l'ADER obligatoire), le projet en version béta est accessible à l'adresse http://ader.rennes.enst-bretagne.fr/bd_anciens/
Voici quelques images décrivant le projet. Mais je compte faire une présentation sur mon site de développemennt http://julienthomas.no-ip.fr/~publi/ ultérieurement. C'est à dire quand il sera plus avancé et que j'aurai le temps :d
- Une fiche d'un membre -
- la liste des membres -
Extension SPIP
Bien entendu, comme le titre l'évoque, il va y avoir du spip (http://www.spip.net/) Je ne m'attarde pas sur SPIP car je ne le connais pas trop et l'extension était nécessaire vu l'authentification mise en place sur le site associé :d Théoriquement, cela devrait être un simple .htaccess mais pourquoi faire simple quand on peut faire compliqué :d
Donc : comment faire pour gérer une authentification faite sous spip dans un autre projet ?
Voici le code (je le détaillerai plus sur mon site de développement, plus tard, là encore)
define("_DIR_SESSIONS", "<REPERTOIRE_SPIP>/tmp/sessions/");
define("_DIR_TMP", "/<REPERTOIRE_SPIP>/tmp/");
require_once("includes/include.php");
/*
* fonctions définies dans lesmodules de SPIP
*/
//
// Permet de tester la validité du cookie SPIP
//
function fichier_session($id_session, $alea) {
if (ereg("^([0-9]+_)", $id_session, $regs))
$id_auteur = $regs[1];
$repertoire = _DIR_SESSIONS;
if(!@file_exists($repertoire)) {
$repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
$repertoire = sous_repertoire(_DIR_TMP, $repertoire);
}
return $repertoire . 'session_'.$id_auteur.md5($id_session.' '.$alea). '.php';
}
//
// informations utilisateurs
//
function lire_php_auth($user, $pw) {
$row = mysql_query("SELECT * FROM spip_auteurs WHERE login='" .($user)."'");
$row = mysql_fetch_array($row);
return ($row['pass'] == md5($row['alea_actuel'] . $pw)) ? $row : false;
}
//
// la fonction de test
//
function verifier_php_auth() {
// si session php ... (pas testé)
if (@$_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']) {
if ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
return true;
}
}
//si cookie SPIP (mon cas)
if (isset($_COOKIE['spip_session'])) {
$row = mysql_query("SELECT valeur FROM spip_meta WHERE nom='alea_ephemere'");
$row = mysql_fetch_array($row);
$fichier_session = fichier_session($_COOKIE['spip_session'], $row ["valeur"], true);
if($fichier_session AND @file_exists($fichier_session)) return true;
}
return false;
}
//
// fonction annexe nécessarie
//
function sous_repertoire($base, $subdir='', $nobase = false) {
$base = str_replace("//", "/", $base);
if (preg_match(',[/_]$,', $base)) $base = substr($base,0,-1);
if (!strlen($subdir)) {
$n = strrpos($base, "/");
if ($n === false) return $nobase ? '' : ($base .'/');
$subdir = substr($base, $n+1);
$base = substr($base, 0, $n+1);
} else {
$base .= '/';
$subdir = str_replace("/", "", "$subdir");
}
$baseaff = $nobase ? '' : $base;
if (@file_exists("$base${subdir}.plat"))
return "$baseaff${subdir}_";;
$path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'
if (file_exists("$path/.ok"))
return "$baseaff$subdir/";
@mkdir($path, _SPIP_CHMOD);
@chmod($path, _SPIP_CHMOD);
$ok = false;
if ($test = @fopen("$path/dir_test.php", "w")) {
@fputs($test, '<'.'?php $ok = true; ?'.'>');
@fclose($test);
@include("$path/dir_test.php");
@unlink("$path/dir_test.php");
}
if ($ok) {
@touch ("$path/.ok");
spip_log("creation $base$subdir/");
return "$baseaff$subdir/";
}
$f = @fopen("$base${subdir}.plat", "w");
if ($f)
fclose($f);
else {
spip_log("echec creation $base${subdir}");
if (!_DIR_RESTREINT)
$base = preg_replace(',^' . _DIR_RACINE .',', '',$base);
if ($test) $base .= $subdir;
include_spip('inc/headers');
redirige_par_entete(generer_url_action('test_dirs',"test_dir=$base",true));
}
spip_log("faux sous-repertoire $base${subdir}");
return "$baseaff${subdir}";
}
//
// et le test de sécurité
//
$rep = verifier_php_auth();
if($rep == false) die(<MESSAGE_DERREUR>);
define("_DIR_TMP", "/<REPERTOIRE_SPIP>/tmp/");
require_once("includes/include.php");
/*
* fonctions définies dans lesmodules de SPIP
*/
//
// Permet de tester la validité du cookie SPIP
//
function fichier_session($id_session, $alea) {
if (ereg("^([0-9]+_)", $id_session, $regs))
$id_auteur = $regs[1];
$repertoire = _DIR_SESSIONS;
if(!@file_exists($repertoire)) {
$repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
$repertoire = sous_repertoire(_DIR_TMP, $repertoire);
}
return $repertoire . 'session_'.$id_auteur.md5($id_session.' '.$alea). '.php';
}
//
// informations utilisateurs
//
function lire_php_auth($user, $pw) {
$row = mysql_query("SELECT * FROM spip_auteurs WHERE login='" .($user)."'");
$row = mysql_fetch_array($row);
return ($row['pass'] == md5($row['alea_actuel'] . $pw)) ? $row : false;
}
//
// la fonction de test
//
function verifier_php_auth() {
// si session php ... (pas testé)
if (@$_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']) {
if ($r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) {
return true;
}
}
//si cookie SPIP (mon cas)
if (isset($_COOKIE['spip_session'])) {
$row = mysql_query("SELECT valeur FROM spip_meta WHERE nom='alea_ephemere'");
$row = mysql_fetch_array($row);
$fichier_session = fichier_session($_COOKIE['spip_session'], $row ["valeur"], true);
if($fichier_session AND @file_exists($fichier_session)) return true;
}
return false;
}
//
// fonction annexe nécessarie
//
function sous_repertoire($base, $subdir='', $nobase = false) {
$base = str_replace("//", "/", $base);
if (preg_match(',[/_]$,', $base)) $base = substr($base,0,-1);
if (!strlen($subdir)) {
$n = strrpos($base, "/");
if ($n === false) return $nobase ? '' : ($base .'/');
$subdir = substr($base, $n+1);
$base = substr($base, 0, $n+1);
} else {
$base .= '/';
$subdir = str_replace("/", "", "$subdir");
}
$baseaff = $nobase ? '' : $base;
if (@file_exists("$base${subdir}.plat"))
return "$baseaff${subdir}_";;
$path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf'
if (file_exists("$path/.ok"))
return "$baseaff$subdir/";
@mkdir($path, _SPIP_CHMOD);
@chmod($path, _SPIP_CHMOD);
$ok = false;
if ($test = @fopen("$path/dir_test.php", "w")) {
@fputs($test, '<'.'?php $ok = true; ?'.'>');
@fclose($test);
@include("$path/dir_test.php");
@unlink("$path/dir_test.php");
}
if ($ok) {
@touch ("$path/.ok");
spip_log("creation $base$subdir/");
return "$baseaff$subdir/";
}
$f = @fopen("$base${subdir}.plat", "w");
if ($f)
fclose($f);
else {
spip_log("echec creation $base${subdir}");
if (!_DIR_RESTREINT)
$base = preg_replace(',^' . _DIR_RACINE .',', '',$base);
if ($test) $base .= $subdir;
include_spip('inc/headers');
redirige_par_entete(generer_url_action('test_dirs',"test_dir=$base",true));
}
spip_log("faux sous-repertoire $base${subdir}");
return "$baseaff${subdir}";
}
//
// et le test de sécurité
//
$rep = verifier_php_auth();
if($rep == false) die(<MESSAGE_DERREUR>);
Récupération du projet
Quand celui-ci sera plus complet, je compte le mettre en téléchargement (sur mon site de développement ?). mais vous pouvez aussi me contacter pour plus d'informations ou si vous voulez participer (dans ce cas, cela deviendra peut-être un projet sourceforge).
Publicité