diff --git a/.gitattributes b/.gitattributes index 3ed0203ee095d7ea6339a4888eb9b438535a68e0..4dcb4a70a9ec1df95243a08d80bb260d593fbc4f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -723,6 +723,7 @@ prive/javascript/jquery.cookie.js -text prive/javascript/jquery.form.js -text prive/javascript/jquery.ifixpng.js -text prive/javascript/jquery.js -text +prive/javascript/login.js -text prive/javascript/multilang.js -text prive/javascript/pause.js -text prive/minipres.css -text diff --git a/prive/formulaires/login.html b/prive/formulaires/login.html index 8704f45c2dade9901abc2382ba8eea72a55a3d4b..78410ca6060d18775280bff83d59e1339ca06265 100644 --- a/prive/formulaires/login.html +++ b/prive/formulaires/login.html @@ -58,79 +58,18 @@ </div> [(#REM) javascript qui gere la securite du login en evitant de faire circuler le pass en clair] <script type="text/javascript" src="#EVAL{_DIR_JAVASCRIPT}md5.js"></script> -<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/ +<script type="text/javascript" src="#EVAL{_DIR_JAVASCRIPT}login.js"></script> +<script type='text/javascript'> var alea_actuel='#ENV{_alea_actuel}'; var alea_futur='#ENV{_alea_futur}'; var login='#ENV{var_login,''}'; +var page_auteur = '#URL_PAGE{informer_auteur}'; var informe_auteur_en_cours = false; var attente_informe = 0; -function affiche_login_secure() { - if (alea_actuel) - jQuery('#pass_securise').show(); - else - jQuery('#pass_securise').hide(); -} -function informe_auteur(c){ - informe_auteur_en_cours = false; - eval('c = '+c); // JSON - if (c) { - alea_actuel = c.alea_actuel; - alea_futur = c.alea_futur; - // indiquer le cnx si on n'y a pas touche - jQuery('input#session_remember:not(.modifie)') - .attr('checked',(c.cnx=='1')?'checked':''); - } else { - alea_actuel = ''; - } - if (c.logo) - jQuery('#spip_logo_auteur').html(c.logo); - else - jQuery('#spip_logo_auteur').html(''); - affiche_login_secure(); -} -function calcule_md5_pass(pass){ - if (alea_actuel) { - jQuery('input[@name=password]').attr('value',''); - jQuery('input[@name=session_password_md5]').attr('value',calcMD5(alea_actuel + pass)); - jQuery('input[@name=next_session_password_md5]').attr('value',calcMD5(alea_futur + pass)); - } -} -function actualise_auteur(){ - if (login != jQuery('#var_login').attr('value')) { - informe_auteur_en_cours = true; - login = jQuery('#var_login').attr('value'); - var currentTime = new Date();// on passe la date en var pour empecher la mise en cache de cette requete (bug avec FF3 & IE7) - jQuery.get('#URL_PAGE{informer_auteur}',{var_login:login,var_compteur:currentTime.getTime()},informe_auteur); - } -} + jQuery('#password') .after("<em id='pass_securise'><img src='#EVAL{_DIR_IMG_PACK}securise.gif' width='16' height='16' alt='<:login_securise:>' title='<:login_securise:>' \/><\/em>"); affiche_login_secure(); - jQuery('#var_login').change(actualise_auteur); - -jQuery('form#formulaire_login').submit(function(){ - actualise_auteur(); - pass = jQuery('input[@name=password]').attr('value'); - // ne pas laisser le pass d'un auteur "auth=spip" circuler en clair - if (pass) { - // si l'information est en cours, retenter sa chance - // pas plus de 5 fois (si profondeur_url fausse, la requete d'information echoue et ne repond jamais) - if (informe_auteur_en_cours && (attente_informe<5)) { - attente_informe++; - jQuery('form#formulaire_login').animeajax().find('p.boutons input').before(attente_informe); // montrer qu'il se passe quelque chose - setTimeout(function(){ - jQuery('form#formulaire_login').submit(); - }, 1000); - return false; - } - - // Si on a l'alea, on peut lancer le submit apres avoir hashe le pass - if (alea_actuel) { - calcule_md5_pass(pass); - } - // sinon c'est que l'auteur n'existe pas - // OU qu'il sera accepte par LDAP ou autre auth - } -}); -/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script> \ No newline at end of file +jQuery('form#formulaire_login').submit(login_submit); +</script> diff --git a/prive/formulaires/login.php b/prive/formulaires/login.php index dc5438c04b7fd1d47a90b23d4e58d737e3284512..bd8dc88cd066f5eb7e26e2c5d705ef2c22157f3a 100644 --- a/prive/formulaires/login.php +++ b/prive/formulaires/login.php @@ -30,7 +30,23 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null) $login = $regs[1]; } - $valeurs = informer_login($login); + $row = informer_login($login); + + // Construire l'environnement du squelette + // Ne pas proposer de "rester connecte quelques jours" + // si la duree de l'alea est inferieure a 12 h (valeur par defaut) + + $valeurs = array( + 'var_login' => $login, + 'editable' => !$row, + 'cnx' => $row['cnx'], + 'auth_http' => login_auth_http(), + 'rester_connecte' => ((_RENOUVELLE_ALEA < 12*3600)? '' : ' '), + '_logo' => $row['logo'], + '_alea_actuel' => isset($row['alea_actuel'])?$row['alea_actuel']:'', + '_alea_futur' => isset($row['alea_futur'])?$row['alea_futur']:'', + '_hidden' => '<input type="hidden" name="session_password_md5" value="" /><input type="hidden" name="next_session_password_md5" value="" />' + ); if ($erreur OR !$GLOBALS['visiteur_session']['id_auteur']) $valeurs['editable'] = true; @@ -63,42 +79,29 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null) return $valeurs; } -// Construire l'environnement du squelette +// Cette fonction sert a 2 squelettes: login et informer_auteur +// Ce dernier transmet le tableau ci-dessous a la fonction JS informer_auteur +// Il est invoque par la fonction JS actualise_auteur via la globale JS +// page_auteur=#URL_PAGE{informer_auteur} dans le squelette login +// N'y aurait-il pas plus simple ? // http://doc.spip.org/@informer_login function informer_login($login){ - $row = $logo = $cnx = ''; - if ($login) { - $row = retrouver_login($login); - // desactiver le hash md5 si pas auteur spip ? - if ($row) { - if ($row['source']!=='spip'){ - $row['alea_actuel']=''; - $row['alea_futur']=''; - } - $prefs = unserialize($row['prefs']); - $cnx = ($prefs['cnx'] == 'perma') ? '1' : '0'; - unset($row['prefs']); - unset($row['source']); - $logo = recuperer_fond('formulaires/inc-logo_auteur', $row); - verifier_visiteur(); - } + if (!$login) return array(); + $row = retrouver_login($login); + if (!$row) return array(); + // desactiver le hash md5 si pas auteur spip ? + if ($row['source']!=='spip'){ + $row['alea_actuel']= ''; + $row['alea_futur']= ''; } - - // Ne pas proposer de "rester connecte quelques jours" - // si la duree de l'alea est inferieure a 12 h (valeur par defaut) - - return array( - 'var_login' => $login, - 'editable' => !$row, - 'cnx' => $cnx, - 'auth_http' => login_auth_http(), - 'rester_connecte' => ((_RENOUVELLE_ALEA < 12*3600)? '' : ' '), - '_logo' => $logo, - '_alea_actuel' => isset($row['alea_actuel'])?$row['alea_actuel']:'', - '_alea_futur' => isset($row['alea_futur'])?$row['alea_futur']:'', - '_hidden' => '<input type="hidden" name="session_password_md5" value="" /><input type="hidden" name="next_session_password_md5" value="" />' - ); + $prefs = unserialize($row['prefs']); + $row['cnx'] = ($prefs['cnx'] == 'perma') ? '1' : '0'; + $row['logo'] = recuperer_fond('formulaires/inc-logo_auteur', $row); + unset($row['prefs']); + unset($row['source']); + verifier_visiteur(); + return $row; } // Gerer le cas ou un utilisateur ne souhaite pas de cookie @@ -239,6 +242,10 @@ function retrouver_login($login) "pass<>'' OR source<>'spip') AND (" . "login=$l)")) return $r; + // Si pas d'auteur avec ce login + // regarder s'il a saisi son nom ou son mail. + // Ne pas fusionner avec la requete precedente + // car un nom peut etre homonyme d'un autre login else return sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source,login', 'spip_auteurs', "statut<>'5poubelle' AND (" . "pass<>'' OR source<>'spip') AND (" . diff --git a/prive/javascript/login.js b/prive/javascript/login.js new file mode 100644 index 0000000000000000000000000000000000000000..cb8502b7e292d489257b565ee98dcea4c52e12cf --- /dev/null +++ b/prive/javascript/login.js @@ -0,0 +1,67 @@ +function affiche_login_secure() { + if (alea_actuel) + jQuery('#pass_securise').show(); + else + jQuery('#pass_securise').hide(); +} + +function informe_auteur(c){ + informe_auteur_en_cours = false; + eval('c = '+c); // JSON envoye par informer_auteur.html + if (c) { + alea_actuel = c.alea_actuel; + alea_futur = c.alea_futur; + // indiquer le cnx si on n'y a pas touche + jQuery('input#session_remember:not(.modifie)') + .attr('checked',(c.cnx=='1')?'checked':''); + } else { + alea_actuel = ''; + } + if (c.logo) + jQuery('#spip_logo_auteur').html(c.logo); + else + jQuery('#spip_logo_auteur').html(''); + affiche_login_secure(); +} + +function calcule_md5_pass(pass){ + if (alea_actuel) { + jQuery('input[@name=password]').attr('value',''); + jQuery('input[@name=session_password_md5]').attr('value',calcMD5(alea_actuel + pass)); + jQuery('input[@name=next_session_password_md5]').attr('value',calcMD5(alea_futur + pass)); + } +} + +function actualise_auteur(){ + if (login != jQuery('#var_login').attr('value')) { + informe_auteur_en_cours = true; + login = jQuery('#var_login').attr('value'); + var currentTime = new Date();// on passe la date en var pour empecher la mise en cache de cette requete (bug avec FF3 & IE7) + jQuery.get(page_auteur, {var_login:login,var_compteur:currentTime.getTime()},informe_auteur); + } +} + +function login_submit(){ + actualise_auteur(); + pass = jQuery('input[@name=password]').attr('value'); + // ne pas laisser le pass d'un auteur "auth=spip" circuler en clair + if (pass) { + // si l'information est en cours, retenter sa chance + // pas plus de 5 fois (si profondeur_url fausse, la requete d'information echoue et ne repond jamais) + if (informe_auteur_en_cours && (attente_informe<5)) { + attente_informe++; + jQuery('form#formulaire_login').animeajax().find('p.boutons input').before(attente_informe); // montrer qu'il se passe quelque chose + setTimeout(function(){ + jQuery('form#formulaire_login').submit(); + }, 1000); + return false; + } + + // Si on a l'alea, on peut lancer le submit apres avoir hashe le pass + if (alea_actuel) { + calcule_md5_pass(pass); + } + // sinon c'est que l'auteur n'existe pas + // OU qu'il sera accepte par LDAP ou autre auth + } +}