diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php index 72ebe1d389e12a390dd7f4ccd2ed4921f3a8ef2b..faf64d0fec99c8305161a9ff908f82a4cc8fb4ef 100644 --- a/ecrire/action/cookie.php +++ b/ecrire/action/cookie.php @@ -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) { diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php index 32f1ffc724aa59220b164241192db68e479739d0..3daec774ecd9de11885cbe9280de08ac5ba44ce4 100644 --- a/ecrire/inc/actions.php +++ b/ecrire/inc/actions.php @@ -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; + } + } } } } diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php index c08ce135bb0b805f6018ccde9453da512e86096a..e0fd0786e180bbba36f67530606a1f5edebc5af0 100644 --- a/ecrire/inc/auth.php +++ b/ecrire/inc/auth.php @@ -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) diff --git a/ecrire/inc/session.php b/ecrire/inc/session.php index 478fe8b2f0daca659ed07e9dc2a01de2f55efaf5..0652f942922cc473376439e839bd3f4518a8c7e2 100644 --- a/ecrire/inc/session.php +++ b/ecrire/inc/session.php @@ -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