diff --git a/ecrire/auteur_infos.php3 b/ecrire/auteur_infos.php3 index 406ed6fb4f9171f80a9ca0fee459ffac8247cb5f..89eb6219468988ec4f0e8c124133ad694a144099 100644 --- a/ecrire/auteur_infos.php3 +++ b/ecrire/auteur_infos.php3 @@ -81,7 +81,7 @@ if ($id_auteur) { // Modification (et creation si besoin) // if ($statut) { // si on poste un nom, c'est qu'on modifie une fiche auteur - if ($connect_statut == '0minirezo' AND ereg("^(0minirezo|1comite|5poubelle)$",$statut)) // changer le statut + if ($connect_statut == '0minirezo' AND ereg("^(0minirezo|1comite|5poubelle|6forum)$",$statut)) // changer le statut $auteur['statut'] = $statut; if ($nom) // pas de nom vide @@ -90,19 +90,23 @@ if ($statut) { // si on poste un nom, c'est qu'on modifie une fiche auteur // login et mot de passe unset ($modif_login); $old_login = $auteur['login']; - if ($login) { - if (strlen($login) < 4) - $echec .= "<p>Login trop court."; - else if (mysql_num_rows(spip_query("SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."' AND id_auteur!=$id_auteur AND statut!='5poubelle'"))) - $echec .= "<p>Ce login existe déjà."; - else if ($login != $old_login) { - $modif_login = true; - $auteur['login'] = $login; + if ($connect_statut == '0minirezo' AND $auteur['source'] == 'spip') { + if ($login) { + if (strlen($login) < 4) + $echec .= "<p>Login trop court."; + else if (mysql_num_rows(spip_query("SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."' AND id_auteur!=$id_auteur AND statut!='5poubelle'"))) + $echec .= "<p>Ce login existe déjà."; + else if ($login != $old_login) { + $modif_login = true; + $auteur['login'] = $login; + } } - } else if ($connect_statut == '0minirezo') // suppression du login - $auteur['login'] = ''; + // suppression du login + else if ($connect_statut == '0minirezo') $auteur['login'] = ''; + } - if ($new_pass AND ($statut != '5poubelle') AND $auteur['login']) { // changement de pass, a securiser en jaja ? + // changement de pass, a securiser en jaja ? + if ($new_pass AND ($statut != '5poubelle') AND $auteur['login'] AND $auteur['source'] == 'spip') { if ($new_pass != $new_pass2) $echec .= "<p>Les deux mots de passe ne sont pas identiques."; else if ($new_pass AND strlen($new_pass) < 6) @@ -146,7 +150,7 @@ if ($statut) { // si on poste un nom, c'est qu'on modifie une fiche auteur // l'entrer dans la base if (!$echec) { - if (! $auteur['id_auteur']) { // creation si pas d'id + if (!$auteur['id_auteur']) { // creation si pas d'id spip_query("INSERT INTO spip_auteurs (nom) VALUES ('temp')"); $auteur['id_auteur'] = mysql_insert_id(); $id_auteur = $auteur['id_auteur']; @@ -231,9 +235,11 @@ debut_cadre_formulaire(); echo "<FORM ACTION='auteur_infos.php3?id_auteur=$id_auteur' METHOD='post'>"; echo "<INPUT TYPE='Hidden' NAME='id_auteur' VALUE=\"$id_auteur\">"; + // // Infos personnelles // + echo "<FONT FACE='Georgia,Garamond,Times,serif' SIZE=3>"; debut_cadre_relief("fiche-perso-24.gif"); @@ -275,35 +281,48 @@ echo "<INPUT TYPE='text' NAME='url_site' CLASS='forml' VALUE=\"".entites_html($a fin_cadre_relief(); +// +// Login et mot de passe : +// accessibles seulement aux admins non restreints et l'auteur lui-meme +// -/////// -// login modifiable ? -if (($connect_statut == "0minirezo" AND $connect_toutes_rubriques) OR $connect_id_auteur == $id_auteur) { - debut_cadre_relief("base-24.gif"); +$edit_login = ($connect_statut == "0minirezo" AND $connect_toutes_rubriques AND $auteur['source'] == 'spip'); +$edit_pass = ((($connect_statut == "0minirezo" AND $connect_toutes_rubriques) OR $connect_id_auteur == $id_auteur) + AND $auteur['source'] == 'spip'); - if ($connect_id_auteur == $id_auteur) { - debut_cadre_enfonce(); - echo '<img src="img_pack/warning.gif" alt="Avertissement" width="48" height="48" align="right">'; - echo "<b>Attention ! Ceci est le login sous lequel vous êtes connecté actuellement. - <font color=\"red\">Utilisez ce formulaire avec précaution : si vous oubliez votre mot de passe, il sera impossible de le retrouver (seul un administrateur pourra vous en attribuer un nouveau).</font></b>\n"; - fin_cadre_enfonce(); - echo "<p>"; - } +debut_cadre_relief("base-24.gif"); + +// Avertissement en cas de modifs de ses propres donnees +if (($edit_login OR $edit_pass) AND $connect_id_auteur == $id_auteur) { + debut_cadre_enfonce(); + echo '<img src="img_pack/warning.gif" alt="Avertissement" width="48" height="48" align="right">'; + echo "<b>Attention ! Ceci est le login sous lequel vous êtes connecté actuellement. + <font color=\"red\">Utilisez ce formulaire avec précaution : si vous oubliez votre mot de passe, il sera impossible de le retrouver (seul un administrateur pourra vous en attribuer un nouveau).</font></b>\n"; + fin_cadre_enfonce(); + echo "<p>"; +} +// Un redacteur n'a pas le droit de modifier son login ! +if ($edit_login) { echo "<B>Login</B> "; echo "<font color='red'>(plus de 3 caractères)</font> :<BR>"; echo "<INPUT TYPE='text' NAME='login' CLASS='formo' VALUE=\"".entites_html($auteur['login'])."\" SIZE='40'><P>\n"; +} +else { + echo "<fieldset style='padding:5'><legend><B>Login</B><BR></legend><br><b>".$auteur['login']."</b> "; + echo "<i> (ne peut pas être modifié)</i>"; +} + +// On ne peut modifier le mot de passe en cas de source externe (par exemple LDAP) +if ($edit_pass) { echo "<B>Nouveau mot de passe</B> "; echo "<font color='red'>(plus de 5 caractères)</font> :<BR>"; echo "<INPUT TYPE='password' NAME='new_pass' CLASS='formo' VALUE=\"\" SIZE='40'><BR>\n"; echo "Confirmer ce nouveau mot de passe :<BR>"; echo "<INPUT TYPE='password' NAME='new_pass2' CLASS='formo' VALUE=\"\" SIZE='40'><P>\n"; - fin_cadre_relief(); -} else { - if ($connect_id_auteur == $id_auteur) { - echo "<fieldset style='padding:5'><legend><B>Login</B><BR></legend><br><b>$login</b><p>\n"; - } } +fin_cadre_relief(); + // // Seuls les admins voient le menu 'statut', mais les admins restreints ne @@ -323,9 +342,7 @@ AND $connect_id_auteur != $id_auteur) { echo "<OPTION".mySel("0minirezo",$statut).">administrateur"; echo "<OPTION".mySel("1comite",$statut).">rédacteur"; - - /* if ($statut=="6forum") */ echo "<OPTION".mySel("6forum",$statut).">visiteur"; - + echo "<OPTION".mySel("6forum",$statut).">visiteur"; echo "<OPTION".mySel("5poubelle",$statut).">> à la poubelle"; echo "</SELECT></center>\n"; diff --git a/ecrire/inc_base.php3 b/ecrire/inc_base.php3 index 285bca8ea0d6e91f8d0568aa484672a1e4bdcd43..8d3f062ea1fefb36bc14652e69d40cfe98e49506 100644 --- a/ecrire/inc_base.php3 +++ b/ecrire/inc_base.php3 @@ -63,6 +63,7 @@ function creer_base() { alea_futur tinytext NOT NULL, prefs tinytext NOT NULL, cookie_oubli tinytext NOT NULL, + source VARCHAR(10) DEFAULT 'spip' NOT NULL, PRIMARY KEY (id_auteur), KEY login (login), KEY statut (statut))"; @@ -1033,6 +1034,10 @@ function maj_base() { spip_query("ALTER TABLE spip_articles CHANGE popularite popularite DOUBLE NOT NULL"); } + if ($version_installee < 1.466) { + spip_query("ALTER TABLE spip_auteurs ADD source VARCHAR(10) DEFAULT 'spip' NOT NULL"); + } + // // Mettre a jour le numero de version installee // diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3 index 47a28d3adafe2712aeaa8c770401495adecd188e..bb4cb528504bca1ff266143ca88a9be859311ed6 100644 --- a/ecrire/inc_version.php3 +++ b/ecrire/inc_version.php3 @@ -12,7 +12,7 @@ define("_ECRIRE_INC_VERSION", "1"); // // version de la base -$spip_version = 1.465; +$spip_version = 1.466; // version de spip // (mettre a jour a la main et conserver la mention "CVS") @@ -112,6 +112,7 @@ if ($flag_function_exists) { $flag_apc = function_exists("apc_rm"); $flag_sapi_name = function_exists("php_sapi_name"); $flag_utf8_decode = function_exists("utf8_decode"); + $flag_ldap = function_exists("ldap_connect"); } else { $flag_ini_get = false; @@ -123,6 +124,8 @@ else { $flag_wordwrap = false; $flag_apc = false; $flag_sapi_name = false; + $flag_utf8_decode = false; + $flag_ldap = false; } diff --git a/ecrire/install.php3 b/ecrire/install.php3 index da65d39c025fb62030a0818accebfad3b8407c99..1ad018192eca76e120ab8aa903bb8b12b9eac31b 100644 --- a/ecrire/install.php3 +++ b/ecrire/install.php3 @@ -13,7 +13,12 @@ if (file_exists("inc_connect.php3")) { include_ecrire ("inc_acces.php3"); include_ecrire ("inc_base.php3"); -if ($etape6) { + +// +// Etapes de l'installation standard +// + +if ($etape == 6) { install_debut_html(); echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Dernière étape : <B>C'est terminé !</B></FONT>"; @@ -21,8 +26,8 @@ if ($etape6) { echo "<B>N'oubliez pas vos propres codes d'accès !</B>"; echo "<P>Vous pouvez maintenant commencer à utiliser le système de publication assisté..."; - $link = mysql_connect($adresse_db, $login_db, $pass_db); - mysql_select_db($sel_db); + include_ecrire ("inc_connect_install.php3"); + if ($login) { $nom = addslashes($nom); $query = "SELECT id_auteur FROM spip_auteurs WHERE login=\"$login\""; @@ -47,18 +52,6 @@ if ($etape6) { ecrire_metas(); } - // Si PHP est installe en module Apache, pas besoin de .htaccess - $ecrire_htaccess = !$php_module; - - /* .htaccess n'est plus necessaire puisqu'on authentifie par cookie - if ($ecrire_htaccess) { - $protec = "AuthUserFile $rootf$htpasswd\nAuthGroupFile /dev/null\nAuthName administrateur\nAuthType Basic\n\n<Limit GET POST PUT>\nrequire valid-user\n</Limit>\n"; - $myFile = fopen($htaccess, "w"); - fputs($myFile, $protec); - fclose($myFile); - } - */ - ecrire_acces(); $protec = "deny from all\n"; @@ -66,19 +59,11 @@ if ($etape6) { fputs($myFile, $protec); fclose($myFile); - $conn = "<"."?php\n"; - $conn .= "if (defined(\"_ECRIRE_INC_CONNECT\")) return;\n"; - $conn .= "define(\"_ECRIRE_INC_CONNECT\", \"1\");\n"; - $conn .= "\$GLOBALS['db_ok'] = true;\n"; - $conn .= "@mysql_connect(\"$adresse_db\",\"$login_db\",\"$pass_db\");\n"; - $conn .= "@mysql_select_db(\"$sel_db\");\n"; - $conn .= "\$GLOBALS['db_ok'] &= !!@mysql_num_rows(@spip_query('SELECT COUNT(*) FROM spip_meta'));\n"; - $conn .= "?".">"; - $myFile = fopen("inc_connect.php3", "wb"); - fputs($myFile, $conn); - fclose($myFile); - @unlink("inc_meta_cache.php3"); + if (!@rename("inc_connect_install.php3", "inc_connect.php3")) { + copy("inc_connect_install.php3", "inc_connect.php3"); + @unlink("inc_connect_install.php3"); + } echo "<FORM ACTION='index.php3' METHOD='post'>"; echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; @@ -86,9 +71,13 @@ if ($etape6) { install_fin_html(); -}elseif($etape5){ +} + +else if ($etape == 5) { install_debut_html(); + include_ecrire ("inc_connect_install.php3"); + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Cinquième étape : <B>Informations personnelles</B></FONT>"; echo "<P>"; @@ -98,11 +87,7 @@ if ($etape6) { echo "laisser ces champs vides)"; echo "<FORM ACTION='install.php3' METHOD='post'>"; - echo "<INPUT TYPE='hidden' NAME='etape6' VALUE='oui'>"; - echo "<INPUT TYPE='hidden' NAME='adresse_db' VALUE=\"$adresse_db\" SIZE='40'>"; - echo "<INPUT TYPE='hidden' NAME='login_db' VALUE=\"$login_db\">"; - echo "<INPUT TYPE='hidden' NAME='pass_db' VALUE=\"$pass_db\"><P>"; - echo "<INPUT TYPE='hidden' NAME='sel_db' VALUE=\"$sel_db\"><P>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='6'>"; echo "<fieldset><label><B>Votre identité publique...</B><BR></label>"; echo "<B>Signature</B><BR>"; @@ -111,7 +96,7 @@ if ($etape6) { echo "<B>Votre adresse email</B><BR>"; echo "<INPUT TYPE='text' NAME='email' CLASS='formo' VALUE=\"$email\" SIZE='40'></fieldset><P>\n"; - + echo "<fieldset><label><B>Vos identifiants de connexion...</B><BR></label>"; echo "<B>Votre login</B><BR>"; echo "(Plus de 3 caractères)<BR>"; @@ -121,22 +106,26 @@ if ($etape6) { echo "(Plus de 5 caractères)<BR>"; echo "<INPUT TYPE='text' NAME='pass' CLASS='formo' VALUE=\"$pass\" SIZE='40'></fieldset><P>\n"; - $rootf = $PATH_TRANSLATED; - $rootf = ereg_replace("\\\\", "/", $rootf); - $rootf = substr($rootf, 0, strrpos($rootf, "/"))."/"; - - // Cas particuliers - - echo "<INPUT TYPE='hidden' NAME='rootf' CLASS='forml' VALUE=\"$rootf\" SIZE='40'>"; - echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; echo "</FORM>"; + echo "<p>"; + if ($flag_ldap AND !$ldap_present) { + echo "<div style='border: 1px solid #404040; padding: 10px; text-align: left;'>"; + echo "<b>Authentification externe</b>"; + echo "<p>Si vous avez accès à un annuaire (LDAP), vous pouvez l'utiliser pour "; + echo "importer automatiquement des utilisateurs sous SPIP."; + echo "<FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='ldap1'>"; + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE=\"Ajouter l'accès à LDAP >>\">"; + echo "</FORM>"; + } install_fin_html(); } -elseif ($etape4) { + +else if ($etape == 4) { install_debut_html(); @@ -145,7 +134,6 @@ elseif ($etape4) { $link = mysql_connect("$adresse_db", "$login_db", "$pass_db"); - echo "<"."!--"; if ($choix_db == "new_spip") { @@ -168,27 +156,36 @@ elseif ($etape4) { if ($result_ok) { + $conn = "<"."?php\n"; + $conn .= "if (defined(\"_ECRIRE_INC_CONNECT\")) return;\n"; + $conn .= "define(\"_ECRIRE_INC_CONNECT\", \"1\");\n"; + $conn .= "\$GLOBALS['db_ok'] = true;\n"; + $conn .= "@mysql_connect(\"$adresse_db\",\"$login_db\",\"$pass_db\");\n"; + $conn .= "@mysql_select_db(\"$sel_db\");\n"; + $conn .= "\$GLOBALS['db_ok'] &= !!@mysql_num_rows(@spip_query('SELECT COUNT(*) FROM spip_meta'));\n"; + $conn .= "?".">"; + $myFile = fopen("inc_connect_install.php3", "wb"); + fputs($myFile, $conn); + fclose($myFile); + echo "<B>La structure de votre base de données est installée.</B><P>Vous pouvez passer à l'étape suivante."; echo "<FORM ACTION='install.php3' METHOD='post'>"; - echo "<INPUT TYPE='hidden' NAME='etape5' VALUE='oui'>"; - echo "<INPUT TYPE='hidden' NAME='adresse_db' VALUE=\"$adresse_db\" SIZE='40'>"; - echo "<INPUT TYPE='hidden' NAME='login_db' VALUE=\"$login_db\">"; - echo "<INPUT TYPE='hidden' NAME='pass_db' VALUE=\"$pass_db\"><P>"; - echo "<INPUT TYPE='hidden' NAME='sel_db' VALUE=\"$sel_db\"><P>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='5'>"; echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; echo "</FORM>"; } - else{ + else { echo "<B>L'opération a échoué.</B> Retournez à la page précédente, sélectionnez une autre base ou créez-en une nouvelle. Vérifiez les informations fournies par votre hébergeur."; } install_fin_html(); } -elseif ($etape3) { + +else if ($etape == 3) { install_debut_html(); @@ -198,7 +195,7 @@ elseif ($etape3) { echo "<P>"; echo "<FORM ACTION='install.php3' METHOD='post'>"; - echo "<INPUT TYPE='hidden' NAME='etape4' VALUE='oui'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='4'>"; echo "<INPUT TYPE='hidden' NAME='adresse_db' VALUE=\"$adresse_db\" SIZE='40'>"; echo "<INPUT TYPE='hidden' NAME='login_db' VALUE=\"$login_db\">"; echo "<INPUT TYPE='hidden' NAME='pass_db' VALUE=\"$pass_db\"><P>"; @@ -256,7 +253,8 @@ elseif ($etape3) { install_fin_html(); } -elseif($etape2) { + +else if ($etape == 2) { install_debut_html(); @@ -273,7 +271,7 @@ elseif($etape2) { echo "<B>La connexion a réussi.</B><P> Vous pouvez passer à l'étape suivante."; echo "<FORM ACTION='install.php3' METHOD='post'>"; - echo "<INPUT TYPE='hidden' NAME='etape3' VALUE='oui'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='3'>"; echo "<INPUT TYPE='hidden' NAME='adresse_db' VALUE=\"$adresse_db\" SIZE='40'>"; echo "<INPUT TYPE='hidden' NAME='login_db' VALUE=\"$login_db\">"; echo "<INPUT TYPE='hidden' NAME='pass_db' VALUE=\"$pass_db\"><P>"; @@ -290,7 +288,7 @@ elseif($etape2) { install_fin_html(); } -elseif ($etape1) { +else if ($etape == 1) { install_debut_html(); echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Première étape : <B>Votre connexion MySQL</B></FONT>"; @@ -299,20 +297,33 @@ elseif ($etape1) { echo aide ("install1"); + $adresse_db = 'localhost'; + $login_db = $login_hebergeur; + $pass_db = ''; + + // Recuperer les anciennes donnees (si presentes) + if (file_exists("inc_connect_install.php3")) { + $s = @join('', @file("inc_connect_install.php3")); + if (ereg('mysql_connect\("(.*)","(.*)","(.*)"\)', $s, $regs)) { + $adresse_db = $regs[1]; + $login_db = $regs[2]; + $pass_db = $regs[3]; + } + } echo "<p><FORM ACTION='install.php3' METHOD='post'>"; - echo "<INPUT TYPE='hidden' NAME='etape2' VALUE='oui'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='2'>"; echo "<fieldset><label><B>Adresse de la base de données</B><BR></label>"; echo "(Souvent cette adresse correspond à celle de votre site, parfois elle correspond à la mention «localhost», parfois elle est laissée totalement vide.)<BR>"; - echo "<INPUT TYPE='text' NAME='adresse_db' CLASS='formo' VALUE=\"localhost\" SIZE='40'></fieldset><P>"; + echo "<INPUT TYPE='text' NAME='adresse_db' CLASS='formo' VALUE=\"$adresse_db\" SIZE='40'></fieldset><P>"; echo "<fieldset><label><B>Le login de connexion</B><BR></label>"; echo "(Correspond parfois à votre login d'accès au FTP; parfois laissé vide)<BR>"; - echo "<INPUT TYPE='text' NAME='login_db' CLASS='formo' VALUE=\"$login_hebergeur\" SIZE='40'></fieldset><P>"; + echo "<INPUT TYPE='text' NAME='login_db' CLASS='formo' VALUE=\"$login_db\" SIZE='40'></fieldset><P>"; echo "<fieldset><label><B>Le mot de passe de connexion</B><BR></label>"; echo "(Correspond parfois à votre mot de passe pour le FTP; parfois laissé vide)<BR>"; - echo "<INPUT TYPE='text' NAME='pass_db' CLASS='formo' VALUE=\"\" SIZE='40'></fieldset><P>"; + echo "<INPUT TYPE='password' NAME='pass_db' CLASS='formo' VALUE=\"$pass_db\" SIZE='40'></fieldset><P>"; echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; @@ -322,8 +333,222 @@ elseif ($etape1) { install_fin_html(); } -else { +else if (!$etape) { header("Location: ../spip_test_dirs.php3"); } + +// +// Etapes de l'installation LDAP +// + +else if ($etape == 'ldap5') { + install_debut_html(); + + include_ecrire('inc_connect_install.php3'); + include_ecrire('inc_meta.php3'); + ecrire_meta("ldap_statut_import", $statut_ldap); + ecrire_metas(); + + echo "<B>L'authentification LDAP est installée.</B>"; + echo "<P>Vous pouvez maintenant terminer la procédure d'installation standard."; + + echo "<FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='5'>"; + + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; + + echo "</FORM>"; +} + +else if ($etape == 'ldap4') { + install_debut_html(); + + $ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap"); + + if (!$base_ldap) $base_ldap = $base_ldap_text; + + $r = @ldap_compare($ldap_link, $base_ldap, "objectClass", ""); + + if ($r < 0) { + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Options : <B>Chemin d'accès dans l'annuaire</B></FONT>"; + echo "<P>"; + + echo "<B>L'opération a échoué.</B> Le chemin que vous avez choisi (<tt>".htmlspecialchars($base_ldap); + echo "</tt>) ne semble pas valide, ou ne vous est pas autorisé. Veuillez retourner à la page précédente "; + echo "et vérifier les informations fournies."; + } + else { + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Options : <B>Réglage de l'importation LDAP</B></FONT>"; + echo "<P>"; + + $conn = join('', file("inc_connect_install.php3")); + $conn = split('\?'.'\>', $conn, 2); + $conn = $conn[0]; + if (!strpos($conn, 'spip_connect_ldap')) { + $conn .= "function spip_connect_ldap() {\n"; + $conn .= "\treturn (\$GLOBALS['ldap_link'] = @ldap_connect(\"$adresse_ldap\",\"$port_ldap\"));\n"; + $conn .= "}\n"; + $conn .= "\$GLOBALS['ldap_base'] = \"$base_ldap\";\n"; + $conn .= "\$GLOBALS['ldap_present'] = true;\n"; + } + $conn .= "?".">"; + $myFile = fopen("inc_connect_install.php3", "wb"); + fputs($myFile, $conn); + fclose($myFile); + + echo "<p><FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='ldap5'>"; + echo "<fieldset><label><B>Statut par défaut des utilisateurs importés</B></label><BR>"; + echo "Choisissez le statut qui est attribué aux personnes présentes dans "; + echo "l'annuaire LDAP lorsqu'elles se connectent pour la première fois. "; + echo "Vous pourrez par la suite modifier cette valeur pour chaque auteur au cas par cas. "; + echo "<p>"; + echo "<INPUT TYPE='Radio' NAME='statut_ldap' VALUE=\"6forum\" id='visit'>"; + echo "<label for='visit'><b>Visiteur</b></label> du site public<br>"; + echo "<INPUT TYPE='Radio' NAME='statut_ldap' VALUE=\"1comite\" id='redac' CHECKED>"; + echo "<label for='redac'><b>Rédacteur</b></label> ayant accès à l'espace privé (<i>recommandé</i>)<br>"; + echo "<INPUT TYPE='Radio' NAME='statut_ldap' VALUE=\"0minirezo\" id='admin'>"; + echo "<label for='admin'><b>Administrateur</b></label> du site (<i>utilisez avec précaution</i>)<br>"; + + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; + + echo "</FORM>"; + } + + install_fin_html(); +} + +else if ($etape == 'ldap3') { + install_debut_html(); + + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Options : <B>Chemin d'accès dans l'annuaire</B></FONT>"; + + echo "<P>Vous devez désormais configurer le chemin d'accès aux informations dans l'annuaire. "; + echo "Cette information est indispensable pour lire les profils utilisateurs stockés dans l'annuaire. "; + + $ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap"); + + $result = @ldap_read($ldap_link, "", "objectclass=*", array("namingContexts")); + $info = @ldap_get_entries($ldap_link, $result); + + echo "<FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='ldap4'>"; + echo "<INPUT TYPE='hidden' NAME='adresse_ldap' VALUE=\"$adresse_ldap\" SIZE='40'>"; + echo "<INPUT TYPE='hidden' NAME='port_ldap' VALUE=\"$port_ldap\">"; + + echo "<fieldset>"; + + $checked = false; + + if (is_array($info)) { + echo "<P><b>Sélectionnez</b> ci-après le chemin d'accès dans l'annuaire :"; + echo "<UL>"; + $n = 0; + for ($i = 0; $i < $info["count"]; $i++) { + $names = $info[$i]["namingcontexts"]; + if (is_array($names)) { + for ($j = 0; $j < $names["count"]; $j++) { + $n++; + echo "<INPUT NAME=\"base_ldap\" VALUE=\"".htmlspecialchars($names[$j])."\" TYPE='Radio' id='tab$n'"; + if (!$checked) { + echo " CHECKED"; + $checked = true; + } + echo ">"; + echo "<label for='tab$n'>".htmlspecialchars($names[$j])."</label><BR>\n"; + } + } + } + echo "</UL>"; + echo "ou... "; + } + echo "<INPUT NAME=\"base_ldap\" VALUE=\"\" TYPE='Radio' id='manuel'"; + if (!$checked) { + echo " CHECKED"; + $checked = true; + } + echo ">"; + echo "<label for='manuel'><B>Entrer</B> le chemin d'accès :</label> "; + echo "<INPUT TYPE='text' NAME='base_ldap_text' CLASS='fondo' VALUE=\"dc=mon-domaine, dc=com\" SIZE='40'></fieldset><P>"; + + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; + echo "</FORM>"; + + install_fin_html(); + +} + +else if ($etape == 'ldap2') { + install_debut_html(); + + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Options : <B>Votre connexion LDAP</B></FONT>"; + + echo "<P>"; + + $ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap"); + + if ($ldap_link) { + echo "<B>La connexion LDAP a réussi.</B><P> Vous pouvez passer à l'étape suivante."; + + echo "<FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='ldap3'>"; + echo "<INPUT TYPE='hidden' NAME='adresse_ldap' VALUE=\"$adresse_ldap\" SIZE='40'>"; + echo "<INPUT TYPE='hidden' NAME='port_ldap' VALUE=\"$port_ldap\">"; + + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; + echo "</FORM>"; + } + else { + echo "<B>La connexion au serveur LDAP a échoué.</B>"; + echo "<P>Revenez à la page précédente, et vérifiez les informations que vous avez fournies. "; + echo "<br>Alternativement, n'utilisez pas le support LDAP pour importer des utilisateurs."; + } + + install_fin_html(); + +} + +else if ($etape == 'ldap1') { + install_debut_html(); + + echo "<BR><FONT FACE='Verdana,Arial,Helvetica,sans-serif' SIZE=3>Options : <B>Votre connexion LDAP</B></FONT>"; + + echo "<P>Veuillez entrer dans ce formulaire les informations de connexion à votre annuaire LDAP. "; + echo "Ces informations doivent pouvoir vous être fournies par l'administrateur du système "; + echo "ou du réseau."; + + $adresse_ldap = 'localhost'; + $port_ldap = 389; + + // Recuperer les anciennes donnees (si presentes) + if (file_exists("inc_connect_install.php3")) { + $s = @join('', @file("inc_connect_install.php3")); + if (ereg('ldap_connect\("(.*)","(.*)"\)', $s, $regs)) { + $adresse_ldap = $regs[1]; + $port_ldap = $regs[2]; + } + } + + echo "<p><FORM ACTION='install.php3' METHOD='post'>"; + echo "<INPUT TYPE='hidden' NAME='etape' VALUE='ldap2'>"; + echo "<fieldset><label><B>Adresse de l'annuaire</B><BR></label>"; + echo "(Si votre annuaire est installé sur la même machine que ce site Web, il s'agit "; + echo "probablement de «localhost».)<BR>"; + echo "<INPUT TYPE='text' NAME='adresse_ldap' CLASS='formo' VALUE=\"$adresse_ldap\" SIZE='20'><P>"; + + echo "<label><B>Le numéro de port de l'annuaire</B><BR></label>"; + echo "(La valeur indiquée par défaut convient généralement.)<BR>"; + echo "<INPUT TYPE='text' NAME='port_ldap' CLASS='formo' VALUE=\"$port_ldap\" SIZE='20'><P></fieldset>"; + + echo "<DIV align='right'><INPUT TYPE='submit' CLASS='fondl' NAME='Valider' VALUE='Suivant >>'>"; + + + echo "</FORM>"; + + install_fin_html(); + +} + + ?> diff --git a/inc-login.php3 b/inc-login.php3 index 7f77ad551e1e6c1a9480647b411c443e34cf2609..a5c6eb969956b3ac48e7ceb29a0ef73129742a64 100644 --- a/inc-login.php3 +++ b/inc-login.php3 @@ -105,6 +105,8 @@ function login($cible = '', $prive = 'prive', $message_login='') { } else if ($login == '-1') $login = ''; + $flag_autres_sources = $GLOBALS['ldap_present']; + // quels sont les aleas a passer ? if ($login) { $login = addslashes($login); @@ -112,9 +114,10 @@ function login($cible = '', $prive = 'prive', $message_login='') { $result = spip_query($query); if ($row = mysql_fetch_array($result)) { $id_auteur = $row['id_auteur']; + $source_auteur = $row['source']; $alea_actuel = $row['alea_actuel']; $alea_futur = $row['alea_futur']; - } else { + } else if (!$flag_autres_sources) { $erreur = "L'identifiant « $login » est inconnu."; $login = ''; @setcookie("spip_admin", "", time() - 3600); @@ -140,10 +143,12 @@ function login($cible = '', $prive = 'prive', $message_login='') { } if ($login) { - // affiche formulaire de login en incluant le javascript MD5 - echo "<script type=\"text/javascript\" src=\"ecrire/md5.js\"></script>"; + // Affiche formulaire de login en incluant le javascript MD5 + $flag_challenge_md5 = ($source_auteur == 'spip'); + + if ($flag_challenge_md5) echo "<script type=\"text/javascript\" src=\"ecrire/md5.js\"></script>"; echo "<form name='form_login' action='./spip_cookie.php3' method='post'"; - echo " onSubmit='if (this.session_password.value) { + if ($flag_challenge_md5) echo " onSubmit='if (this.session_password.value) { this.session_password_md5.value = calcMD5(\"$alea_actuel\" + this.session_password.value); this.next_session_password_md5.value = calcMD5(\"$alea_futur\" + this.session_password.value); this.session_password.value = \"\"; @@ -152,21 +157,24 @@ function login($cible = '', $prive = 'prive', $message_login='') { echo "<div class='spip_encadrer'>"; if ($erreur) echo "<div class='reponse_formulaire'><b>$erreur</b></div><p>"; - // si jaja actif, on affiche le login en 'dur', et on le passe en champ hidden - echo "<script type=\"text/javascript\"><!--\n" . - "document.write('Login : <b>$login</b> <br><font size=\\'2\\'>[<a href=\\'spip_cookie.php3?cookie_admin=non&url=".rawurlencode($clean_link->getUrl())."\\'>se connecter sous un autre identifiant</a>]</font>');\n" . - "//--></script>\n"; - echo "<input type='hidden' name='session_login_hidden' value='$login'>"; - - // si jaja inactif, le login est modifiable (puisque le challenge n'est pas utilise) - echo "<noscript>"; - echo "<font face='Georgia, Garamond, Times, serif' size='3'>"; - echo "Attention, ce formulaire n'est pas sécurisé. "; - echo "Si vous ne voulez pas que votre mot de passe puisse être "; - echo "intercepté sur le réseau, veuillez activer Javascript "; - echo "dans votre navigateur et <a href=\"".$clean_link->getUrl()."\">recharger cette page</a>.<p></font>\n"; + if ($flag_challenge_md5) { + // si jaja actif, on affiche le login en 'dur', et on le passe en champ hidden + echo "<script type=\"text/javascript\"><!--\n" . + "document.write('Login : <b>$login</b> <br><font size=\\'2\\'>[<a href=\\'spip_cookie.php3?cookie_admin=non&url=".rawurlencode($clean_link->getUrl())."\\'>se connecter sous un autre identifiant</a>]</font>');\n" . + "//--></script>\n"; + echo "<input type='hidden' name='session_login_hidden' value='$login'>"; + + // si jaja inactif, le login est modifiable (puisque le challenge n'est pas utilise) + echo "<noscript>"; + echo "<font face='Georgia, Garamond, Times, serif' size='3'>"; + echo "Attention, ce formulaire n'est pas sécurisé. "; + echo "Si vous ne voulez pas que votre mot de passe puisse être "; + echo "intercepté sur le réseau, veuillez activer Javascript "; + echo "dans votre navigateur et <a href=\"".$clean_link->getUrl()."\">recharger cette page</a>.<p></font>\n"; + } echo "<label><b>Login (identifiant de connexion au site) :</b><br></label>"; - echo "<input type='text' name='session_login' class='forml' value=\"$login\" size='40'></noscript>\n"; + echo "<input type='text' name='session_login' class='forml' value=\"$login\" size='40'>\n"; + if ($flag_challenge_md5) echo "</noscript>\n"; echo "<br><br>\n<label><b>Mot de passe :</b><br></label>"; echo "<input type='password' name='session_password' class='forml' value=\"\" size='40'>\n"; diff --git a/spip_cookie.php3 b/spip_cookie.php3 index 399d6110755d50a44945ef8ff56f1face57e7856..0c8ceb9ccb85f8007e27a57944f5c837857eb25f 100644 --- a/spip_cookie.php3 +++ b/spip_cookie.php3 @@ -67,21 +67,23 @@ if ($test_echec_cookie == 'oui') { exit; } -// tentative de login +// Tentative de login unset ($cookie_session); if ($essai_login == "oui") { - // recuperer le login passe en champ hidden + // Recuperer le login en champ hidden if ($session_login_hidden AND !$session_login) $session_login = $session_login_hidden; - // verifier l'auteur - $login = addslashes($session_login); + $login = $session_login; + $pass = $session_password; + + // Recuperer le mot de passe en champ hidden if ($session_password_md5) { // mot passe en md5 $md5pass = $session_password_md5; $md5next = $next_session_password_md5; } - else { // mot passe en clair - $query = "SELECT * FROM spip_auteurs WHERE login='$login' AND statut!='5poubelle'"; + else if ($session_password) { // mot passe en clair + $query = "SELECT alea_actuel, alea_futur FROM spip_auteurs WHERE login='$login' AND statut!='5poubelle'"; $result = spip_query($query); if ($row = mysql_fetch_array($result)) { $md5pass = md5($row['alea_actuel'] . $session_password); @@ -89,28 +91,36 @@ if ($essai_login == "oui") { } } - $query = "SELECT * FROM spip_auteurs WHERE login='$login' AND pass='$md5pass' AND statut<>'5poubelle'"; - $result = spip_query($query); - - if ($row_auteur = mysql_fetch_array($result)) { // login reussi - if ($row_auteur['statut'] == 'nouveau') { // nouvel inscrit - spip_query ("UPDATE spip_auteurs SET statut='1comite' WHERE login='$login'"); - $row_auteur['statut'] = '1comite'; + // Essayer differentes methodes d'authentification + $auths = array('spip'); + if ($ldap_present) $auths[] = 'ldap'; + + $ok = false; + reset($auths); + while (list(, $nom_auth) = each($auths)) { + include_ecrire("inc_auth_".$nom_auth.".php3"); + $classe_auth = "Auth_".$nom_auth; + $auth = new $classe_auth; + if ($auth->init()) { + $ok = $auth->verifier_challenge_md5($login, $md5pass, $md5next); + if (!$ok && $session_password) $ok = $auth->verifier($login, $session_password); } + if ($ok) break; + } + + if ($ok) $ok = $auth->lire(); + + if ($ok) { + $auth->activer(); + + if ($auth->login AND $auth->statut == '0minirezo') // force le cookie pour les admins + $cookie_admin = "@".$auth->login; + + $query = "SELECT * FROM spip_auteurs WHERE login='".addslashes($login)."'"; + $result = spip_query($query); + if ($row_auteur = mysql_fetch_array($result)) + $cookie_session = creer_cookie_session($row_auteur); - if ($row_auteur['statut'] == '0minirezo') // force le cookie pour les admins - $cookie_admin = "@".$row_auteur['login']; - - $cookie_session = creer_cookie_session($row_auteur); - - // fait tourner le codage du pass dans la base - $nouvel_alea_futur = creer_uniqid(); - $query = "UPDATE spip_auteurs - SET alea_actuel = alea_futur, - pass = '$md5next', - alea_futur = '$nouvel_alea_futur' - WHERE login='$login'"; - @spip_query($query); if (ereg("ecrire/", $cible->getUrl())) { $cible->addVar('bonjour','oui'); } diff --git a/spip_test_dirs.php3 b/spip_test_dirs.php3 index 131ce654afbf9cc41479c811c7e73a67f8eba963..5ce648a0b6e76c80217c323349b3d8f58d4ba683 100644 --- a/spip_test_dirs.php3 +++ b/spip_test_dirs.php3 @@ -54,7 +54,7 @@ if ($bad_dirs) { install_fin_html(); } else { if ($install) - header("Location: ./ecrire/install.php3?etape1=oui"); + header("Location: ./ecrire/install.php3?etape=1"); else header("Location: ./ecrire/"); }