Skip to content
Extraits de code Groupes Projets
Valider 622f6c42 rédigé par esj's avatar esj
Parcourir les fichiers

Permettre les sessions meme en mode PHP_AUTH (donc en LDAP).

Ne pas imposer à la structure de données décrivant une session de contenir des informations redondantes: pour la connexion à l'espace privé seul l'id_auteur est vraiment nécessaire, il n'y a que pour le public que le reste l'est aussi. Les fichiers de sessions ne changent pas, mais il y a moins de présupposés sur les informations qu'ils rapportent, ça ménage d'autres stratégies d'implémzentation.
parent 22f186d5
Branches
Étiquettes
Aucune requête de fusion associée trouvée
......@@ -87,12 +87,11 @@ if ($logout_public) {
}
// tentative de logout
if ($logout) {
if ($auteur_session['login'] == $logout) {
if ($auteur_session['login'] == $logout) { // init verifier_visiteur
spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 6 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
if ($spip_session) {
$var_f = charger_fonction('session', 'inc');
$var_f($auteur_session['id_auteur']);
spip_setcookie('spip_session', $spip_session, time() - 3600 * 24);
}
if ($_SERVER['PHP_AUTH_USER']
......@@ -100,9 +99,9 @@ if ($logout) {
AND verifier_php_auth()) {
auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
}
unset ($auteur_session);
}
spip_log("logout: $logout");
spip_setcookie('spip_session', $spip_session, 0);
redirige_par_entete($url ? $url : generer_url_public('login'));
}
......@@ -131,6 +130,7 @@ if ($essai_login == "oui") {
// Essayer l'authentification par MySQL
$f = charger_fonction('auth_spip', 'inc', true);
if ($f) $row_auteur = $f($session_login, $session_password);
// Marche pas: essayer l'authentification par LDAP si present
if (!$row_auteur AND $GLOBALS['ldap_present']) {
$f = charger_fonction('auth_ldap', 'inc', true);
......@@ -157,10 +157,22 @@ if ($essai_login == "oui") {
if ($row_auteur['statut'] == '0minirezo')
$cookie_admin = "@".$session_login;
$var_f = charger_fonction('session', 'inc');
$cookie_session = $var_f($row_auteur);
if (!$_COOKIE['spip_session']) {
$var_f = charger_fonction('session', 'inc');
$cookie_session = $var_f($row_auteur);
}
if ($session_remember == 'oui')
spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
else
spip_setcookie('spip_session', $cookie_session);
$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
spip_query("UPDATE spip_auteurs SET prefs = " . spip_abstract_quote(serialize($prefs)) . " WHERE id_auteur = " . $row_auteur['id_auteur']);
}
}
}
// cookie d'admin ?
if ($cookie_admin == "non") {
......@@ -178,18 +190,6 @@ else if ($cookie_admin AND $spip_admin != $cookie_admin) {
spip_setcookie('spip_admin', $cookie_admin, time() + 3600 * 24 * 14);
}
// cookie de session ?
if ($cookie_session) {
if ($session_remember == 'oui')
spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
else
spip_setcookie('spip_session', $cookie_session);
$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
spip_query("UPDATE spip_auteurs SET prefs = " . spip_abstract_quote(serialize($prefs)) . " WHERE id_auteur = " . $row_auteur['id_auteur']);
}
// changement de langue espace public
if ($var_lang) {
......
......@@ -95,16 +95,25 @@ function verifier_php_auth() {
if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']
&& !$GLOBALS['ignore_auth_http']) {
$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($_SERVER['PHP_AUTH_USER']));
if (!$GLOBALS['db_ok'])
return false;
if (!$GLOBALS['db_ok']) return false;
$row = spip_fetch_array($result);
if (($row['source'] != 'ldap' OR !$GLOBALS['ldap_present'])
AND $row['pass'] != md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) {
return false;
} else {
if ($row AND $row['source'] != 'ldap') {
if ($row['pass'] != md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) {
$GLOBALS['auteur_session'] = $row;
$GLOBALS['auteur_session']['hash_env'] = hash_env();
return true;
} else return false;
} else {
if (!$row AND !$GLOBALS['ldap_present'])
return false;
else {
$f = charger_fonction('auth_ldap', 'inc', true);
if ($f) {
$GLOBALS['auteur_session'] = $f($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
return true;
}
}
}
}
}
......
......@@ -68,19 +68,16 @@ function acces_statut($id_auteur, $statut, $bio)
}
function inc_auth_dist() {
global $_GET, $_COOKIE, $_SERVER;
global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user;
global $connect_id_auteur, $connect_login;
global $prefs, $connect_id_auteur, $connect_login;
global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique;
global $auteur_session, $prefs;
//
// Initialiser variables (eviter hacks par URL)
//
$connect_login = '';
$connect_id_auteur = 0;
$connect_id_rubrique = array();
$auth_can_disconnect = false;
$connect_toutes_rubriques = false;
......@@ -88,87 +85,97 @@ function inc_auth_dist() {
//
// Recuperer les donnees d'identification
//
// Authentification session
if ($cookie_session = $_COOKIE['spip_session']) {
// Session valide en cours ?
if ($_COOKIE['spip_session']) {
$var_f = charger_fonction('session', 'inc');
if ($var_f()) {
if ($auteur_session['statut'] == '0minirezo'
OR $auteur_session['statut'] == '1comite') {
$connect_login = $auteur_session['login'];
$auth_can_disconnect = true;
}
}
}
// Peut-etre sommes-nous en auth http?
else if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']
&& !$ignore_auth_http) {
// Si le login existe dans la base, se loger
if (verifier_php_auth()) {
$connect_login = $_SERVER['PHP_AUTH_USER'];
if ($connect_id_auteur = $var_f()) {
$auth_can_disconnect = true;
$_SERVER['PHP_AUTH_PW'] = '';
}
// Sinon c'est un login d'intranet independant de spip, on ignore
}
// sinon, essayer auth http si significatif
// (ignorer les login d'intranet independants de spip)
if (!$ignore_auth_http AND !$connect_id_auteur) {
if ($_SERVER['PHP_AUTH_USER'] AND $_SERVER['PHP_AUTH_PW']) {
include_spip('inc/actions');
if (verifier_php_auth()) {
$connect_login = $_SERVER['PHP_AUTH_USER'];
$auth_can_disconnect = true;
$_SERVER['PHP_AUTH_PW'] = '';
}
} else if ($GLOBALS['_SERVER']['REMOTE_USER'])
// Authentification .htaccess old style, car .htaccess semble
// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
else if ($GLOBALS['_SERVER']['REMOTE_USER']
&& !$ignore_remote_user) {
$connect_login = $GLOBALS['_SERVER']['REMOTE_USER'];
}
$connect_login = $GLOBALS['_SERVER']['REMOTE_USER'];
}
$where = $connect_id_auteur ?
"id_auteur=$connect_id_auteur" :
(!$connect_login ? '' : "login=" . spip_abstract_quote($connect_login));
// pas authentifie par cookie ni rien: demander login / mdp
if (!$connect_login) {
return auth_arefaire();
}
//
// Trouver le login dans la table auteurs pour avoir les autres infos
//
if (!$where) return auth_arefaire();
// Trouver les autres infos dans la table auteurs.
$result = @spip_query("SELECT UNIX_TIMESTAMP(en_ligne) AS quand, id_auteur, pass, statut, bio, prefs FROM spip_auteurs WHERE login=" . spip_abstract_quote($connect_login) . " AND statut!='5poubelle'");
$result = @spip_query("SELECT *, UNIX_TIMESTAMP(en_ligne) AS quand FROM spip_auteurs WHERE $where AND statut!='5poubelle'");
if (!$row = spip_fetch_array($result)) {
auth_areconnecter($connect_login);
exit;
}
// Le tableau global auteur_session contient toutes les infos
// mais on duplique les plus utiles dans des variables simples
// Indiquer la connexion. A la minute pres ca suffit.
if ((time() - $row['quand']) >= 60) {
@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");
}
$connect_id_auteur = $row['id_auteur'];
$connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
if ($connect_statut == '0minirezo') auth_rubrique();
else if ($connect_statut != '1comite') return auth_arefaire();
$GLOBALS['auteur_session']['id_auteur'] = $connect_id_auteur = $row['id_auteur'];
$GLOBALS['auteur_session']['pass'] = $row['pass'] ? $row['pass'] : $connect_login;
$GLOBALS['auteur_session']['statut'] = $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
$prefs = unserialize($row['prefs']);
$connect_login = $row['login'];
if (!$row['pass']) $row['pass'] = $connect_login; // pour LDAP
$GLOBALS['auteur_session']['prefs'] = $prefs = unserialize($row['prefs']);
// Le tableau global auteur_session contient toutes les infos.
// Les plus utiles sont aussi dans les variables simples ci-dessus
if ($connect_statut == '6forum') return auth_arefaire();
if ($connect_statut == '0minirezo') auth_rubrique();
$GLOBALS['auteur_session'] = $row;
// rajouter les sessions meme en mode auth_http
// pour permettre les connexions multiples
if (!$_COOKIE['spip_session']) {
$var_f = charger_fonction('session', 'inc');
if ($session = $var_f($row))
spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14);
}
// ceci n'arrive qu'a la premiere connexion il me semble
// si oui ce serait mieux de le mettre a la creation de l'auteur
if (! isset($prefs['display'])) {
if (!$GLOBALS['set_disp'] = $GLOBALS['_COOKIE']['spip_display'])
$GLOBALS['set_disp'] = 2;
if (!$GLOBALS['set_couleur'] = $GLOBALS['_COOKIE']['spip_couleur'])
$GLOBALS['set_couleur'] = 6;
if (!$GLOBALS['set_options'] = $GLOBALS['_COOKIE']['spip_options'])
$GLOBALS['set_options'] = 'basiques';
}
if (! isset($prefs['display'])) auth_prefs();
// Indiquer la connexion. A la minute pres ca suffit.
if ((time() - $row['quand']) >= 60) {
@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");
}
// vide = pas de message d'erreur (cf exit(0) Unix)
return "";
}
function auth_prefs()
{
if (!$GLOBALS['set_disp'] = $GLOBALS['_COOKIE']['spip_display'])
$GLOBALS['set_disp'] = 2;
if (!$GLOBALS['set_couleur'] = $GLOBALS['_COOKIE']['spip_couleur'])
$GLOBALS['set_couleur'] = 6;
if (!$GLOBALS['set_options'] = $GLOBALS['_COOKIE']['spip_options'])
$GLOBALS['set_options'] = 'basiques';
}
// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
// C'est soit parce que le serveur MySQL ne repond pas,
// soit parce que la table des auteurs a changee (restauration etc)
......
......@@ -86,17 +86,19 @@ function supprimer_sessions($id_auteur) {
}
//
// Verifie et inclut une session.
// Verifie si le cookie spip_session indique une session valide.
// Si oui, la decrit dans le tableau $auteur_session et retourne id_auteur
// La rejoue si IP change puis accepte le changement si $change=true
//
function verifier_session($change=false) {
global $spip_session; // issu du cookie
global $auteur_session, $spip_session;
// Tester avec alea courant
// si pas de cookie, c'est fichu
if (!$spip_session) return false;
// Tester avec alea courant
$fichier_session = fichier_session($spip_session, $GLOBALS['meta']['alea_ephemere']);
if (@file_exists($fichier_session)) {
include($fichier_session);
......@@ -133,7 +135,7 @@ function verifier_session($change=false) {
spip_setcookie('spip_session', $cookie);
}
}
return true;
return $auteur_session['id_auteur'];
}
// Code a inserer par inc/presentation pour rejouer la session
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter