diff --git a/.gitattributes b/.gitattributes index 35798078b5ea6775649f3079d9b97191d1811da3..be29d9ee580f39a1de0812f28dfa63fb114d91bd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,6 +17,7 @@ dist/formulaires/editer_rubrique.php -text dist/formulaires/editer_site.html -text dist/formulaires/editer_site.php -text dist/formulaires/editer_site_fonctions.php -text +dist/formulaires/login.php -text dist/formulaires/login_forum_abo.html -text dist/formulaires/logo_auteur.html -text dist/formulaires/oubli/charger.php -text @@ -222,6 +223,7 @@ dist/images/sans-heure.gif -text dist/images/searching.gif -text dist/images/secteur-12.gif -text dist/images/secteur-24.gif -text +dist/images/securise.gif -text dist/images/set-ecran-etroit.png -text dist/images/set-ecran.png -text dist/images/site-24.gif -text @@ -663,6 +665,7 @@ ecrire/inc/gadgets.php -text ecrire/inc/grouper_mots.php -text ecrire/inc/headers.php -text ecrire/inc/iconifier.php -text +ecrire/inc/identifier_login.php -text ecrire/inc/import_0_0.php -text ecrire/inc/import_1_2.php -text ecrire/inc/import_1_3.php -text diff --git a/dist/formulaires/login.html b/dist/formulaires/login.html index fa1be3cc471a3fcc6d94d7fa285aacbd3d75668c..54bd096fb3a607add07490507ace452fc8778842 100644 --- a/dist/formulaires/login.html +++ b/dist/formulaires/login.html @@ -1,81 +1,43 @@ +#CACHE{0} #HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"} #HTTP_HEADER{"Pragma: no-cache"} -[(#ENV{echec_cookie}) -<fieldset class="reponse_formulaire"> -<legend><:avis_erreur_cookie:></legend> -<p><:login_cookie_oblige:></p> -<p><:login_cookie_accepte:></p> -</fieldset>] - -[(#ENV{echec_visiteur}) -<fieldset class="reponse_formulaire"> -<legend><:avis_erreur_visiteur:></legend> -<p><:texte_erreur_visiteur:></p> -</fieldset>] - - <script type="text/javascript" src="#EVAL{_DIR_JAVASCRIPT}md5.js"> </script> - <form id="login[_(#ENV{login})]" - action="[(#ENV{action2})]" - method="post"[(#ENV{source}|=={spip}|?{' ',''}) - onsubmit='if (this.session_password.value) { - this.session_password_md5.value = calcMD5("[(#ENV{alea_actuel})]" + this.session_password.value); - this.next_session_password_md5.value = calcMD5("[(#ENV{alea_futur})]" + this.session_password.value); - this.session_password.value = ""; - return true; - }']> - <fieldset> - <legend><:form_forum_identifiants:></legend> - [<p class="reponse_formulaire">(#ENV*{erreur})</p>] - - <span id="spip_logo_auteur">[(#INCLURE{fond=formulaires/logo_auteur}{id_auteur}|inserer_attribut{alt,#ENV{login_alt}})]</span> - - [<p><label for="var_login"><:login_login2:></label>(#ENV{login}|?{'',' '})<br /> - <input type="text" class="forml" id="var_login" name="var_login" value="" size="40" /></p>] - -[ - - -<input type="hidden" name="session_login_hidden" value="(#ENV{login})" /> -<p id='login_securise' style='display: none;'><:login_login:> <strong>[(#ENV{login_alt})]</strong><br />[<a href='[(#ENV{action2} - |parametre_url{cookie_admin,non} - |parametre_url{url,#ENV*{url}} - |parametre_url{retour,#ENV*{self}})]'><:login_autre_identifiant:></a>]</p> -<script type="text/javascript"><!-- -if (l=document.getElementById('login_securise')) l.style.display=''; -//--></script> -<noscript> - <div id='login_non_securise'> - <p class="reponse_formulaire"><:login_non_securise:> <a href="[(#ENV{action})]"><:login_recharger:></a>.</p> - <p><label for="session_login"><:login_login2:></label><br /> - <input type="text" class="forml" name="session_login" id="session_login"[ value="(#ENV{login})"] size="40" /></p> - </div> -</noscript> -] - [(#ENV{login}|?{'',' '})<div id='pass_ajax' style='display: none;'>] - <p><label[ for="var_login_(#ENV{login})"]><:login_pass2:></label><br /> - <input type="password" class="forml" name="session_password"[ id="var_login_(#ENV{login})"] value="" size="20" /><br /> - [<a href="#URL_PAGE{spip_pass}" target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=330'); return false;"><:login_motpasseoublie:></a>] - </p> - -[(#ENV{rester_connecte}) - <p><input type="checkbox" name="session_remember" id="session_remember[_(#ENV{login})]" value="oui"[(#ENV*{prefs}|filtre_rester_connecte)checked="checked"] - class="intact" onchange="this.className='';" /> - <label for="session_remember[_(#ENV{login})]"><:login_rester_identifie:></label></p> -] - [(#ENV{login}|?{'',' '})</div>] - <input type="hidden" name="session_password_md5" value="" /> - <input type="hidden" name="next_session_password_md5" value="" /> - <input type="hidden" name="essai_login" value="oui" /> - <input type="hidden" name="url" value="[(#ENV{url})]" /> - <input type="hidden" name="url_echec" value="[(#SELF)]" /> - <p class="spip_bouton"><input type="submit" value="<:bouton_valider:>" /></p> - </fieldset> +<div class='formulaire_spip formulaire_login formfx'> + <br class='spacer' /> + [<p class="formulaire_message">(#ENV**{_deja_loge})</p>] + [<p class="formulaire_message">(#ENV**{message_ok})</p>] + [<p class='formulaire_erreur'>(#ENV**{message_erreur})</p>] + [(#ENV{editable}) + <form id='formulaire_login' method='post' action='#ENV{action}' enctype='multipart/form-data'> + [(#REM) declarer les hidden qui declencheront le service du formulaire + parametre : url d'action ] + #ACTION_FORMULAIRE{#ENV{action}} + <fieldset><legend><:form_forum_identifiants:></legend> + <span id="spip_logo_auteur">#ENV*{_logo,''}</span> + <ol class="formfx"> + <li class="editer_login obligatoire"> + <label for="var_login"><:login_login2:></label> + <input class='text' type='text' name='var_login' id='var_login' class='forml' value="[(#ENV**{var_login})]" size='40' /> + [<span class='erreur'>(#ENV**{erreurs}|table_valeur{var_login})</span>] + </li> + <li class="editer_password obligatoire"> + <label for="password"><:login_pass2:></label> + <input class='password' type='password' name='password' id='password' value="" size='40' /> + <em id='pass_securise'[(#ENV{_alea_actuel}|?{'',' '})style='display:none;']><img src='#EVAL{_DIR_IMG_PACK}securise.gif' width='16' height='16' alt='<:login_securise:>' /></em> + [<span class='erreur'>(#ENV**{erreurs}|table_valeur{password})</span>] + <span class='details'>[<a href="#URL_PAGE{spip_pass}" target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=330'); return false;"><:login_motpasseoublie:></a>]</span> + </li> + [(#ENV{rester_connecte}) + <li><input class='checkbox' type="checkbox" name="session_remember" id="session_remember" value="oui" [(#ENV**{cnx}|?{' '})checked="checked"] + class="intact" onchange="this.className='';" /> + <label class='nofx' for="session_remember"><:login_rester_identifie:></label></li> + ] + </ol> + <p class="spip_bouton"><input type="submit" value="<:bouton_valider:>" /></p> + </fieldset> </form> - -<script type="text/javascript"><!-- -if (l=document.getElementById('var_login[_(#ENV{login})]')) l.focus(); ---></script>[ + ] + [(#REM) en cas d'absence de cookie, on represente le formulaire alternatif <form action="(#ENV{auth_http})" method="get">[ (#ENV{auth_http}|form_hidden) ] @@ -87,44 +49,48 @@ if (l=document.getElementById('var_login[_(#ENV{login})]')) l.focus(); <p class="spip_bouton"><input type="submit" value="<:login_sans_cookiie:>"/></p></div> </fieldset> </form> -] -[(#ENV{login}|?{'',' '}) + ] +</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'> -var alea_actuel; -var alea_futur; -var login; +var alea_actuel='#ENV{_alea_actuel,''}'; +var alea_futur='#ENV{_alea_futur,''}'; +var login='#ENV{var_login,''}'; var informe_auteur_en_cours = false; function informe_auteur(c){ eval('c = '+c); // JSON if (c) { alea_actuel = c.alea_actuel; alea_futur = c.alea_futur; - $('input#session_login_hidden').attr('value',c.login); + jQuery('input#session_login_hidden').attr('value',c.login); // indiquer le cnx si on n'y a pas touche - $('input#session_remember.intact') + jQuery('input#session_remember.intact') .attr('checked',c.cnx=='1'?'checked':''); - $('#spip_logo_auteur').html(c.logo); + jQuery('#spip_logo_auteur').html(c.logo); + jQuery('#pass_securise').show(); } else { - $('#spip_logo_auteur').html(''); + jQuery('#spip_logo_auteur').html(''); } informe_auteur_en_cours = false; } function calcule_md5_pass(pass){ - $('input\u005b@name=session_password\u005d').attr('value',''); - $('form#login').attr('action','#ENV{pose_cookie}'); - $('input\u005b@name=session_password_md5\u005d').attr('value',calcMD5(alea_actuel + pass)); - $('input\u005b@name=next_session_password_md5\u005d').attr('value',calcMD5(alea_futur + 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)); + } } -$('form#login #pass_ajax').show().after('<input type="hidden" name="session_login_hidden" id="session_login_hidden" value="" />'); -$('#var_login').blur(function(){ - if (login!=$(this).attr('value')) { - login = $(this).attr('value'); +function actualise_auteur(){ + if (login!=jQuery('#var_login').attr('value')) { + login = jQuery('#var_login').attr('value'); informe_auteur_en_cours = true; - $.get('#URL_ACTION{informer_auteur}',{var_login:$(this).attr('value')},informe_auteur); + $.get('#URL_ACTION{informer_auteur}',{var_login:login},informe_auteur); } -}); -$('form#login').submit(function(){ - pass = $('input\u005b@name=session_password\u005d').attr('value'); +} +jQuery('#var_login').change(function(){actualise_auteur();}); +jQuery('form#formulaire_login').submit(function(){ + pass = jQuery('input[@name=password]').attr('value'); // ne jamais laisser le pass circuler en clair if (pass) { if (alea_actuel) @@ -136,26 +102,23 @@ $('form#login').submit(function(){ // si l'information est en cours, retenter sa chance if (informe_auteur_en_cours) { - setTimeout(function(){$('form#login').submit();},300); + setTimeout(function(){jQuery('form#formulaire_login').submit();},300); return false; } // sinon lancer une demande informe_auteur_en_cours = true; - $.get('#URL_ACTION{informer_auteur}',{var_login:$('#var_login').attr('value')},function(c) { + $.get('#URL_ACTION{informer_auteur}',{var_login:jQuery('#var_login').attr('value')},function(c) { informe_auteur(c); // le formulaire sera soumis apres reception des info auteur - $('form#login').submit(); + jQuery('form#formulaire_login').submit(); }); // ou dans un delai maxi de 5s (pour eviter le blocage a cette etape) - // mais sans le pass, ce qui fait retomber sur le scenario de repli du login en 2 passes setTimeout(function(){ - $('input\u005b@name=session_password\u005d').attr('value',''); - $('form#login').submit(); - },3000); + jQuery('form#formulaire_login').submit(); + },5000); return false; } } }); -</script> -] +</script> \ No newline at end of file diff --git a/dist/formulaires/login.php b/dist/formulaires/login.php new file mode 100644 index 0000000000000000000000000000000000000000..d4df85c76fdde5246b203226578e356da12f3b65 --- /dev/null +++ b/dist/formulaires/login.php @@ -0,0 +1,220 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2008 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; #securite + +include_spip('base/abstract_sql'); +spip_connect(); + +function formulaires_login_charger_dist($cible="",$login="",$prive=null){ + $auteur = array(); + $login = $login ? $login : _request('var_login'); + if (is_null($prive)){ + $parse = parse_url($cible); + $prive = strncmp(substr($parse['path'],-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0; + } + + // Le login est memorise dans le cookie d'admin eventuel + if (!$login) { + if (isset($_COOKIE['spip_admin']) && preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs)) + $login = $regs[1]; + } + else if ($login == '-1'){ + $login = ''; + } + if ($login){ + include_spip('inc/identifier_login'); + $auteur = informer_login($login); + } + // Ne pas proposer de "rester connecte quelques jours" + // si la duree de l'alea est inferieure a 12 h (valeur par defaut) + $rester_connecte = (_RENOUVELLE_ALEA < 12*3600) ? '' : ' '; + $valeurs = array( + #'auth_http' => $auth_http, + 'var_login' => $login, + 'rester_connecte' => $rester_connecte, + '_logo' => isset($auteur['logo'])?$auteur['logo']:'', + 'cnx' => isset($auteur['cnx'])?$auteur['cnx']:'', + '_alea_actuel' => isset($auteur['alea_actuel'])?$auteur['alea_actuel']:'', + '_alea_futur' => isset($auteur['alea_futur'])?$auteur['alea_futur']:'', + ); + $valeurs['_hidden'] = + '<input type="hidden" name="session_password_md5" value="" />' + . '<input type="hidden" name="next_session_password_md5" value="" />' + . '<input type="hidden" name="session_login_hidden" id="session_login_hidden" value="" />'; + + // Si on est connecte, envoyer vers la destination + // si on en a le droit, et sauf si on y est deja + verifier_visiteur(); + $editable = false; + if (_request('var_erreur') OR !isset($GLOBALS['visiteur_session']['id_auteur'])) + $editable = true; + + if ($prive) { + include_spip('inc/autoriser'); + $loge = autoriser('ecrire'); + } else { + $loge = ($visiteur_session['auth'] != ''); + } + if ($loge) { + // on est a destination ? + if ($cible == self()) + $editable = false; + else { + // sinon on y va + include_spip('inc/headers'); + $valeurs['_deja_loge'] = + "<a href='$cible'>" . _T('login_par_ici') . "</a>" + . redirige_formulaire($cible) + ; + } + } + + return array($editable,$valeurs); +} + +function formulaires_login_verifier_dist($cible="",$login="",$prive=null){ + global $ignore_auth_http; + if (is_null($prive)){ + $parse = parse_url($cible); + $prive = strncmp(substr($parse['path'],-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0; + } + $erreurs = array(); + $session_login = _request('var_login'); + $session_password = _request('password'); + $session_md5pass = _request('session_password_md5'); + $session_md5next = _request('next_session_password_md5'); + + // en cas d'echec de cookie, inc_auth a renvoye vers le script de + // pose de cookie ; s'il n'est pas la, c'est echec cookie + // s'il est la, c'est probablement un bookmark sur bonjour=oui, + // et pas un echec cookie. + /*if (_request('var_echec_cookie')) + $echec_cookie = ($_COOKIE['spip_session'] != 'test_echec_cookie'); + else $echec_cookie = '';*/ + + if ($echec_cookie){ + $erreurs['message_erreur'] = "echec cookie "; + /* + [(#ENV{echec_cookie}) +<fieldset class="reponse_formulaire"> +<legend><:avis_erreur_cookie:></legend> +<p><:login_cookie_oblige:></p> +<p><:login_cookie_accepte:></p> +</fieldset>]*/ + } + + #$pose_cookie = generer_url_action('cookie',"",false,true); + $auth_http = ''; + if ($echec_cookie AND !$ignore_auth_http) { + if (($GLOBALS['flag_sapi_name'] + AND preg_match(",apache,i", @php_sapi_name())) + OR preg_match(",^Apache.* PHP,", $_SERVER['SERVER_SOFTWARE'])) + $auth_http = $pose_cookie; + } + // Attention dans le cas 'intranet' la proposition de se loger + // par auth_http peut conduire a l'echec. + if (isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW'])) + $auth_http = ''; + + if ($session_login) { + $row = sql_fetsel('*', 'spip_auteurs', "login=" . sql_quote($session_login)); + // Retrouver ceux qui signent de leur nom ou email + if (!$row AND !spip_connect_ldap()) { + $row = sql_fetsel('*', 'spip_auteurs', "(nom = " . sql_quote($session_login) . " OR email = " . sql_quote($session_login) . ") AND login<>'' AND statut<>'5poubelle'"); + if ($row) { + $login_alt = $session_login; # afficher ce qu'on a tape + $session_login = $row['login']; + } + } + + if ((!$row AND !spip_connect_ldap()) OR + ($row['statut'] == '5poubelle') OR + (($row['source'] == 'spip') AND $row['pass'] == '')) { + $erreurs['message_erreur'] = _T('login_identifiant_inconnu', + array('login' => htmlspecialchars($session_login))); + $row = array(); + $session_login = ''; + include_spip('inc/cookie'); + spip_setcookie("spip_admin", "", time() - 3600); + } else { + // on laisse le menu decider de la langue + unset($row['lang']); + } + $identifier_login = charger_fonction('identifier_login','inc'); + if (!$identifier_login($session_login,$session_password,$session_md5pass,$session_md5next)){ + $erreurs['password'] = _T('login_erreur_pass'); + } + else { + # login ok + # verifier si on a pas affaire a un visiteur qui essaye de se loge sur ecrire/ + if ($prive) { + include_spip('inc/autoriser'); + verifier_visiteur(); + if (!autoriser('ecrire')){ + $erreurs['message_erreur'] = "<h1>"._T('avis_erreur_visiteur')."</h1>" + . "<p>"._T('texte_erreur_visiteur')."</p>" + . "<p class='retour'>[<a href='".generer_url_action('logout','logout=prive&url='.urlencode(self()))."'>"._T('icone_deconnecter')."</a>]</p>"; + } + } + } + } else { + # pas de login saisi ! + $erreurs['message_erreur'] = _T('login_identifiant_inconnu', + array('login' => htmlspecialchars($login))); + } + + return $erreurs; +} + +function formulaires_login_traiter_dist($cible="",$login="",$prive=null){ + if (is_null($prive)){ + $parse = parse_url($cible); + $prive = strncmp(substr($parse['path'],-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0; + } + $message = ''; + $auth = charger_fonction('auth','inc'); + $auth(); + + // Si on se connecte dans l'espace prive, + // ajouter "bonjour" (repere a peu pres les cookies desactives) + if ($prive) + $cible = parametre_url($cible, 'bonjour', 'oui', '&'); + + if ($cible) { + $cible = parametre_url($cible, 'var_login', '', '&'); + } + /* cible est fourni par la balise si on veut vraiment etre redirige + else { + if ($cible = parametre_url($action,'url')) + $cible = $cible; + else $cible = generer_url_ecrire(); + }*/ + + + // Si on est connecte, envoyer vers la destination + if ($cible + AND ($cible!=self())) { + if (!headers_sent() AND !$_GET['var_mode']) { + include_spip('inc/headers'); + $message .= redirige_formulaire($cible); + } else { + $message .= "<a href='$cible'>" . + _T('login_par_ici') . + "</a>"; + } + } + return $message; +} + + +?> diff --git a/dist/images/securise.gif b/dist/images/securise.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b549bb08d3b0c4559354e3ef891662ce8c4b91b Binary files /dev/null and b/dist/images/securise.gif differ diff --git a/dist/login.html b/dist/login.html index 31f85f95f17b3204b49ff75a262884fc604487ae..6ccac56b0884364b0926708d0098bf79d0f61fd5 100644 --- a/dist/login.html +++ b/dist/login.html @@ -1,3 +1,5 @@ +#CACHE{0} +#FILTRE{compacte_head} [(#REM) Eviter les boutons d'admin sur la page de login ] @@ -11,26 +13,35 @@ <meta name="generator" content="SPIP[ (#SPIP_VERSION)]" /> [<link rel="shortcut icon" href="(#CHEMIN{favicon.ico})" />] <link rel="stylesheet" href="[(#CHEMIN{spip_style.css}|direction_css)]" type="text/css" /> +<link rel="stylesheet" href="[(#CHEMIN{formfx.css}|direction_css)]" type="text/css" /> <link rel="stylesheet" href="[(#CHEMIN{minipres.css}|direction_css)]" type="text/css" /> <style type="text/css"> <!-- body.page_login { text-align: center; font: 1em Verdana, Tahoma, Geneva, Helvetica, sans-serif; } #minipres { width: 30em; } - .formulaire_spip { text-align: #LANG_LEFT; font-size: 0.8em; } - .formulaire_spip fieldset {border: 1px solid #BABDB6; padding:10px;font-size: 1em;} + .formulaire_login { text-align: #LANG_LEFT; font-size: 0.8em; } + .formulaire_login fieldset {border: 1px solid #BABDB6; padding:10px;font-size: 1em;} .formulaire_menu_lang { float: #LANG_RIGHT; } .formulaire_menu_lang label { display: none; } .formulaire_login { clear: both; } + .formulaire_login fieldset li label, + .formulaire_login fieldset li .erreur, + .formulaire_login fieldset li .details {display:block;width:auto;} + .formulaire_login fieldset li label.nofx {display:inline;} + .formulaire_login fieldset li input.text, + .formulaire_login fieldset li input.password {width:20em;} .spip_logos { float: right; padding-left: 10px; } .forml,input { font-size: 1.0em; } + #var_lang_ecrire {font-size:0.8em;} p .forml { width: 20em; font-family: inherit; } .spip_bouton input { float: #LANG_RIGHT; } .reponse_formulaire { font-weight: bold; color: red; } a { color: #e86519; text-decoration: none; } - .formulaire_login .retour { text-align: center; } + .retour { text-align: center;font-size:0.8em; } + formulaire_login.retour { font-size:1em; } --> </style> -[<script type='text/javascript' src='(#URL_PAGE{jquery.js})'></script>] +[(#REM|f_jQuery)] </head> <body class='page_login' > @@ -44,20 +55,16 @@ [(#ENV{url}|=={''}|?{#SET{prive,' '}})] [(#ENV{url}|match{'^ecrire/'}|?{#SET{prive,' '}})] [(#GET{prive}) <small><:login_acces_prive:></small>] - [(#GET{prive}|?{'',' '}) <!-- ?? -->] </h3> #MENU_LANG_ECRIRE - <div class="formulaire_spip formulaire_login"> - [(#GET{prive}|?{'',' '}) #LOGIN_PUBLIC] - [(#GET{prive}|?{' '}) #LOGIN_PRIVE] + [(#FORMULAIRE_LOGIN{#ENV{url}|sinon{#URL_ECRIRE{accueil}}})] <p class="retour"> [[<a href="#URL_PAGE{identifiants,focus=nom_inscription}&mode=(#URL_SITE_SPIP|tester_config{1comite})" target="spip_pass" onclick="javascript:window.open(this.href, 'spip_pass', 'scrollbars=yes, resizable=yes, width=480, height=400'); return false;"><:login_sinscrire:></a>]] [<a href="#URL_SITE_SPIP/"><:login_retoursitepublic:></a>] </p> - </div> </div><!--#minipres--> diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php index e02cad0a121d031b7aac9518887525656d2aab3c..f6caec1f70bfba85c252ad580bca0029e92d2009 100644 --- a/ecrire/action/cookie.php +++ b/ecrire/action/cookie.php @@ -20,7 +20,7 @@ function action_cookie_dist() { // La cible de notre operation de connexion $url = _request('url'); - $redirect = isset($url) ? $url : _DIR_RESTREINT_ABS; + $redirect = isset($url) ? $url : _DIR_RESTREINT; $redirect_echec = _request('url_echec'); if (!isset($redirect_echec)) { if (strpos($redirect,_DIR_RESTREINT_ABS)!==false) @@ -52,98 +52,27 @@ function action_cookie_dist() { redirige_par_entete(parametre_url(parametre_url($redirect_echec,'var_echec_cookie','oui','&'),'url',rawurlencode($redirect),'&')); } - - if (_request('essai_login') == "oui") { - // Recuperer le login en champ hidden - if (!$session_login = _request('session_login')) - $session_login = _request('session_login_hidden'); - - if (!spip_connect()) { - include_spip('inc/minipres'); - echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); - exit; - } - - $auteur = array(); - - // Essayer tour a tour les differentes sources d'authenfication - // on s'en souviendra dans visiteur_session['auth'] - $sources_auth = array('spip', 'ldap'); - while (!$auteur - AND list(,$methode) = each($sources_auth)) { - if ($auth = charger_fonction('auth_'.$methode, 'inc', true) - AND $auteur = $auth( - $session_login, _request('session_password') - )) { - $auteur['auth'] = $methode; - } else { - spip_log("pas de connexion avec $methode"); - } - } - - // Sinon, renvoyer le formulaire avec message d'erreur si 2e fois - if (!$auteur) { - $redirect = parametre_url($redirect_echec,'var_login',$session_login,'&'); - if (_request('session_password') - OR _request('session_password_md5')) - $redirect = parametre_url($redirect, 'var_erreur', 'pass', '&'); - $redirect = parametre_url($redirect,'url',$url,'&'); - spip_log("echec login: $session_login"); - } - - // OK on a ete authentifie, on se connecte - if ($auteur) { - spip_log("login de $session_login vers $redirect (".$auteur['auth']); - // Si on se connecte dans l'espace prive, - // ajouter "bonjour" (repere a peu pres les cookies desactives) - if (strpos($redirect,_DIR_RESTREINT_ABS)!==false) - $redirect = parametre_url($redirect, 'bonjour', 'oui', '&'); - - // Prevoir de demander un cookie de correspondance - if ($auteur['statut'] == '0minirezo') - $set_cookie_admin = "@".$session_login; - - $session = charger_fonction('session', 'inc'); - $cookie_session = $session($auteur); - - // La case "rester connecte quelques jours" - $session_remember = (_request('session_remember') == 'oui') ? 'perma' : ''; - if ($session_remember) - spip_setcookie('spip_session', $cookie_session, time() + 2 * _RENOUVELLE_ALEA); - else - spip_setcookie('spip_session', $cookie_session); - - $prefs = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array(); - $prefs['cnx'] = $session_remember; - - sql_updateq('spip_auteurs', array('prefs' => serialize($prefs)), "id_auteur = " . $auteur['id_auteur']); - } - } - $cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : ''; // Suppression cookie d'admin ? if (_request('cookie_admin') == "non") { - if (!$retour = _request('retour')) + /*if (!$retour = _request('retour')) $retour = generer_url_public('login', - 'url='.rawurlencode($url), true); + 'url='.rawurlencode($url), true);*/ if ($cook) spip_setcookie('spip_admin', $cook, time() - 3600 * 24); - $redirect = parametre_url($retour,'var_login','','&'); + /*$redirect = parametre_url($retour,'var_login','','&'); $redirect = parametre_url($redirect,'var_erreur','','&'); $redirect .= ((false !== strpos($redirect, "?")) ? "&" : "?") - . "var_login=-1"; + . "var_login=-1";*/ } - // Ajout de cookie d'admin - else if ( - isset($set_cookie_admin) - OR $set_cookie_admin = _request('cookie_admin') - ) { + else if (isset($set_cookie_admin) + OR $set_cookie_admin = _request('cookie_admin')) { spip_setcookie('spip_admin', $set_cookie_admin, time() + 14 * 24 * 3600); } - + // Redirection finale redirige_par_entete($redirect, true); } diff --git a/ecrire/action/informer_auteur.php b/ecrire/action/informer_auteur.php index f3798c648cdb89677d638a2d6caf61110ec1d6dd..93af68ebd4555995076937045e0cb78d00256868 100644 --- a/ecrire/action/informer_auteur.php +++ b/ecrire/action/informer_auteur.php @@ -18,24 +18,13 @@ function action_informer_auteur_dist() { include_spip('inc/json'); $row = array(); - if ($login=_request('var_login')) { - $row = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs', 'spip_auteurs', "login=" . sql_quote($login)); - // Retrouver ceux qui signent de leur nom ou email - if (!$row AND !spip_connect_ldap()) { - $row = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs', 'spip_auteurs', "(nom = " . sql_quote($login) . " OR email = " . sql_quote($login) . ") AND login<>'' AND statut<>'5poubelle'"); - } - if ($row) { - $prefs = unserialize($row['prefs']); - $row['cnx'] = $prefs['cnx'] == 'perma' ? '1' : '0'; - unset($row['prefs']); - - $page = evaluer_fond('formulaires/logo_auteur', array('id_auteur'=>$row['id_auteur'])); - $row['logo'] = $page['texte']; - } + if ($login=_request('var_login')){ + include_spip('inc/identifier_login'); + $row = informer_login($login); unset($row['id_auteur']); - - echo json_export($row); } + echo json_export($row); } -?> + +?> \ No newline at end of file diff --git a/ecrire/balise/formulaire_.php b/ecrire/balise/formulaire_.php index ab7c7f2a1f42ae231ac47195759bcb56841dc209..eeb8aaae9e0be7c7b016def4a655f0069eb83d4e 100644 --- a/ecrire/balise/formulaire_.php +++ b/ecrire/balise/formulaire_.php @@ -102,7 +102,7 @@ function balise_FORMULAIRE__dyn($form) $args['form'] = $form; return array("formulaires/$form", - 3600, + 0, array_merge( $valeurs, array( diff --git a/ecrire/balise/login_prive.php b/ecrire/balise/login_prive.php index 58830c3e0563f916495297c713293a9ae3d9b3b2..d640f0812059c6424355b37f1c525248038e05b6 100644 --- a/ecrire/balise/login_prive.php +++ b/ecrire/balise/login_prive.php @@ -35,6 +35,11 @@ function balise_LOGIN_PRIVE_stat ($args, $filtres) { // http://doc.spip.org/@balise_LOGIN_PRIVE_dyn function balise_LOGIN_PRIVE_dyn($login, $cible) { - return login_explicite($login, $cible); + include_spip('balise/formulaire_'); + if (!$url # pas d'url passee en filtre ou dans le contexte + AND !$url = _request('url') # ni d'url passee par l'utilisateur + ) + $url = generer_url_ecrire('accueil','',true); + return balise_FORMULAIRE__dyn('login',$url,$login,true); } -?> +?> \ No newline at end of file diff --git a/ecrire/balise/login_public.php b/ecrire/balise/login_public.php index 1cb33d4927ea2744f29b1a1002760e67afcd2292..78c002b96947b4456465e2fd7e5f8f21edb7a447 100644 --- a/ecrire/balise/login_public.php +++ b/ecrire/balise/login_public.php @@ -33,160 +33,12 @@ function balise_LOGIN_PUBLIC_stat ($args, $filtres) { // http://doc.spip.org/@balise_LOGIN_PUBLIC_dyn function balise_LOGIN_PUBLIC_dyn($url, $login) { - + include_spip('balise/formulaire_'); if (!$url # pas d'url passee en filtre ou dans le contexte AND !$url = _request('url') # ni d'url passee par l'utilisateur ) $url = parametre_url(self(), '', '', '&'); - return login_explicite($login, $url); -} - -// http://doc.spip.org/@login_explicite -function login_explicite($login, $cible) { - global $visiteur_session; - - $action = parametre_url(self(), '', '', '&'); - if ($cible) { - $cible = parametre_url($cible, 'var_erreur', '', '&'); - $cible = parametre_url($cible, 'var_login', '', '&'); - } else { - if (preg_match(",[?&]url=([^&]*),", $action, $m)) - $cible = rawurldecode($m[1]); - else $cible = generer_url_ecrire(); - } - - verifier_visiteur(); - - // Si on est connecte, envoyer vers la destination - // si on en a le droit, et sauf si on y est deja - if (!strncmp($cible, _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))) { - include_spip('inc/autoriser'); - $loge = autoriser('ecrire'); - } else { - $loge = ($visiteur_session['auth'] != ''); - } - - if ($loge) { - // on est a destination ? - if ($cible == $action) - return ''; - - // sinon on y va - if (!headers_sent() AND !$_GET['var_mode']) { - include_spip('inc/headers'); - redirige_par_entete($cible); - } else { - return "<a href='$cible'>" . - _T('login_par_ici') . - "</a>"; - } - } - - return login_pour_tous($login ? $login : _request('var_login'), $cible, $action); -} - -// http://doc.spip.org/@login_pour_tous -function login_pour_tous($login, $cible, $action) { - global $ignore_auth_http; - - // en cas d'echec de cookie, inc_auth a renvoye vers le script de - // pose de cookie ; s'il n'est pas la, c'est echec cookie - // s'il est la, c'est probablement un bookmark sur bonjour=oui, - // et pas un echec cookie. - if (_request('var_erreur') == 'cookie') - $echec_cookie = ($_COOKIE['spip_session'] != 'test_echec_cookie'); - else $echec_cookie = ''; - - // hack grossier pour changer le message en cas d'echec d'un statut interdit sur ecrire/ - $echec_visiteur = (_request('var_erreur') == 'statut') ?' ':''; - - - $pose_cookie = generer_url_action('cookie',"",false,true); - $auth_http = ''; - if ($echec_cookie AND !$ignore_auth_http) { - if (($GLOBALS['flag_sapi_name'] - AND preg_match(",apache,i", @php_sapi_name())) - OR preg_match(",^Apache.* PHP,", $_SERVER['SERVER_SOFTWARE'])) - $auth_http = $pose_cookie; - } - // Attention dans le cas 'intranet' la proposition de se loger - // par auth_http peut conduire a l'echec. - if (isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW'])) - $auth_http = ''; - - // Le login est memorise dans le cookie d'admin eventuel - if (!$login) { - if (isset($_COOKIE['spip_admin']) && preg_match(",^@(.*)$,", $_COOKIE['spip_admin'], $regs)) - $login = $regs[1]; - } else if ($login == '-1') - $login = ''; - - $erreur = ''; - if ($login) { - $row = sql_fetsel('*', 'spip_auteurs', "login=" . sql_quote($login)); - // Retrouver ceux qui signent de leur nom ou email - if (!$row AND !spip_connect_ldap()) { - $row = sql_fetsel('*', 'spip_auteurs', "(nom = " . sql_quote($login) . " OR email = " . sql_quote($login) . ") AND login<>'' AND statut<>'5poubelle'"); - if ($row) { - $login_alt = $login; # afficher ce qu'on a tape - $login = $row['login']; - } - } - - if ((!$row AND !spip_connect_ldap()) OR - ($row['statut'] == '5poubelle') OR - (($row['source'] == 'spip') AND $row['pass'] == '')) { - $erreur = _T('login_identifiant_inconnu', - array('login' => htmlspecialchars($login))); - $row = array(); - $login = ''; - include_spip('inc/cookie'); - spip_setcookie("spip_admin", "", time() - 3600); - } else { - // on laisse le menu decider de la langue - unset($row['lang']); - } - } else { - $row = array(); - } - - // afficher "erreur de mot de passe" si &var_erreur=pass - if (_request('var_erreur') == 'pass') - $erreur = _T('login_erreur_pass'); - - // Ne pas proposer de "rester connecte quelques jours" - // si la duree de l'alea est inferieure a 12 h (valeur par defaut) - $rester_connecte = (_RENOUVELLE_ALEA < 12*3600) ? '' : ' '; - - // Appeler le squelette formulaire_login - return array('formulaires/login', $GLOBALS['delais'], - array_merge( - array_map('texte_script', $row), - array( - 'action2' => ($login ? $pose_cookie: $action), - 'erreur' => $erreur, - 'action' => $action, - 'pose_cookie' => $pose_cookie, - 'url' => $cible, - 'auth_http' => $auth_http, - 'echec_cookie' => ($echec_cookie ? ' ' : ''), - 'echec_visiteur' => $echec_visiteur, - 'login' => $login, - 'login_alt' => (isset($login_alt) ? $login_alt : $login), - 'self' => self('&'), - 'rester_connecte' => $rester_connecte - ) - ) - ); - -} - -// Bouton duree de connexion - -// http://doc.spip.org/@filtre_rester_connecte -function filtre_rester_connecte($prefs) { - $prefs = unserialize(stripslashes($prefs)); - return $prefs['cnx'] == 'perma' ? ' ' : ''; + return balise_FORMULAIRE__dyn('login',$url,$login,false); } -?> +?> \ No newline at end of file diff --git a/ecrire/exec/accueil.php b/ecrire/exec/accueil.php index 4bee0843de2956501deb4124ce85f558219baf36..f33ab43c5b6b780f97410d65e4af69179ae8bdc0 100644 --- a/ecrire/exec/accueil.php +++ b/ecrire/exec/accueil.php @@ -196,7 +196,7 @@ function colonne_droite_neq4($id_rubrique, $activer_breves, $activer_sites, $art if (!@$_COOKIE['spip_admin']) { $cookie = rawurlencode("@$connect_login"); - $retour = rawurlencode(_DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT); + $retour = rawurlencode('./' . _SPIP_ECRIRE_SCRIPT); $lien = generer_url_action('cookie', "cookie_admin=$cookie&url=$retour"); $gadget .= "<div> </div>". "<table width='95%'><tr>". @@ -254,7 +254,7 @@ function personnel_accueil($coockcookie) // if ($coockcookie) { - $lien = generer_url_action('cookie', "cookie_admin=non&url=".rawurlencode(_DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT)); + $lien = generer_url_action('cookie', "cookie_admin=non&url=".rawurlencode('./'. _SPIP_ECRIRE_SCRIPT)); $t = _T('icone_supprimer_cookie'); $t = icone_horizontale($t, $lien, "cookie-24.gif", "", false); if ($GLOBALS['spip_display'] != 1) diff --git a/ecrire/inc/auth_spip.php b/ecrire/inc/auth_spip.php index e559f150bb2e9723d11c986e7d79ee58823798de..8e330f905c897cc9620442a3c49b14130f17dc38 100644 --- a/ecrire/inc/auth_spip.php +++ b/ecrire/inc/auth_spip.php @@ -15,13 +15,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // Authentifie et retourne la ligne SQL decrivant l'utilisateur si ok // http://doc.spip.org/@inc_auth_spip_dist -function inc_auth_spip_dist ($login, $pass) { +function inc_auth_spip_dist ($login, $pass, $md5pass="", $md5next="") { - // recuperer le cryptage par JavaScript - $md5pass = $_POST['session_password_md5']; - $md5next = $_POST['next_session_password_md5']; - - // si envoi non crypte, crypter maintenant + // si envoi non crypte, crypter maintenant if (!$md5pass AND $pass) { $result = sql_select("alea_actuel, alea_futur", "spip_auteurs", "login=" . sql_quote($login)); diff --git a/ecrire/inc/headers.php b/ecrire/inc/headers.php index ec22c409ade1725e17e9f9c575e8d40c0a22f89d..7c953bc560b2164446a372f3a0b67e4f8bfe29a6 100644 --- a/ecrire/inc/headers.php +++ b/ecrire/inc/headers.php @@ -31,6 +31,7 @@ function redirige_par_entete($url, $equiv='') { if (!$equiv OR (strncmp("Apache", $_SERVER['SERVER_SOFTWARE'],6)==0)) { @header("Location: " . $url); + $equiv=""; } else { @header("Refresh: 0; url=" . $url); $equiv = "<meta http-equiv='Refresh' content='0; url=$url'>"; @@ -57,7 +58,10 @@ function redirige_par_entete($url, $equiv='') { // http://doc.spip.org/@redirige_formulaire function redirige_formulaire($url, $equiv = '') { - if (!_request('var_ajax') && !_request('var_ajaxcharset')) + if (!_request('var_ajax') + && !_request('var_ajaxcharset') + && !headers_sent() + && !$_GET['var_mode']) redirige_par_entete(str_replace('&','&',$url), $equiv); else { $url = strtr($url, "\n\r", " "); diff --git a/ecrire/inc/identifier_login.php b/ecrire/inc/identifier_login.php new file mode 100644 index 0000000000000000000000000000000000000000..a3a699dcdef92c2e75a820213ff136a2d32c8e15 --- /dev/null +++ b/ecrire/inc/identifier_login.php @@ -0,0 +1,106 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2008 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +include_spip('base/abstract_sql'); + + +function inc_identifier_login_dist($session_login, $session_password, $session_md5pass="", $session_md5next="", $session_remember=''){ + + $auteur = verifier_login($session_login, $session_password, $session_md5pass, $session_md5next); + + // OK on a ete authentifie, on se connecte + if ($auteur) { + spip_log("login de $session_login vers $redirect (".$auteur['auth']); + + // Prevoir de demander un cookie de correspondance + if ($auteur['statut'] == '0minirezo') + $set_cookie_admin = "@".$session_login; + + $session = charger_fonction('session', 'inc'); + $cookie_session = $session($auteur); + + // La case "rester connecte quelques jours" + $session_remember = ($session_remember == 'oui') ? 'perma' : ''; + if ($session_remember) + spip_setcookie('spip_session', $cookie_session, time() + 2 * _RENOUVELLE_ALEA); + else + spip_setcookie('spip_session', $cookie_session); + + $prefs = ($auteur['prefs']) ? unserialize($auteur['prefs']) : array(); + $prefs['cnx'] = $session_remember; + + sql_updateq('spip_auteurs', array('prefs' => serialize($prefs)), "id_auteur = " . $auteur['id_auteur']); + } + + $cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : ''; + + // Ajout de cookie d'admin + # rien a faire ici, trouver ou le mettre + /*if (isset($set_cookie_admin) + OR $set_cookie_admin = _request('cookie_admin') + ) { + spip_setcookie('spip_admin', $set_cookie_admin, time() + 14 * 24 * 3600); + }*/ + return $auteur; +} + +function verifier_login($session_login, $session_password, $session_md5pass="", $session_md5next=""){ + if (!spip_connect()) { + include_spip('inc/minipres'); + echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique')); + exit; + } + + $auteur = array(); + + // Essayer tour a tour les differentes sources d'authenfication + // on s'en souviendra dans visiteur_session['auth'] + $sources_auth = array('spip', 'ldap'); + while (!$auteur + AND list(,$methode) = each($sources_auth)) { + if ($auth = charger_fonction('auth_'.$methode, 'inc', true) + AND $auteur = $auth($session_login, $session_password, $session_md5pass,$session_md5next)) { + $auteur['auth'] = $methode; + } else { + spip_log("pas de connexion avec $methode"); + } + } + return $auteur; +} + + +function informer_login($login){ + $row = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source', 'spip_auteurs', "login=" . sql_quote($login)); + // Retrouver ceux qui signent de leur nom ou email + if (!$row AND !spip_connect_ldap()) { + $row = sql_fetsel('id_auteur,login,alea_actuel,alea_futur,prefs,source', 'spip_auteurs', "(nom = " . sql_quote($login) . " OR email = " . sql_quote($login) . ") AND login<>'' AND statut<>'5poubelle'"); + } + if ($row) { + // desactiver le hash md5 si pas auteur spip ? + if ($row['source']!=='spip'){ + $row['alea_actuel']=''; + $row['alea_futur']=''; + } + unset($row['source']); + $prefs = unserialize($row['prefs']); + $row['cnx'] = $prefs['cnx'] == 'perma' ? '1' : '0'; + unset($row['prefs']); + + $page = evaluer_fond('formulaires/logo_auteur', array('id_auteur'=>$row['id_auteur'])); + $row['logo'] = $page['texte']; + } + return $row; +} + +?> \ No newline at end of file