diff --git a/ecrire/exec/install.php b/ecrire/exec/install.php index 86705321b9849227f4c86a4c3e4c59c1b3f6d7d1..8011e9a29b5121b82cbd0dc55599c795f081b927 100644 --- a/ecrire/exec/install.php +++ b/ecrire/exec/install.php @@ -45,6 +45,33 @@ function install_fichier_connexion($nom, $texte) ecrire_fichier($nom, $texte); } +function analyse_fichier_connection($file) +{ + + $s = @join('', @file($file)); + if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { + array_shift($regs); + return $regs; + } else if (preg_match("#spip_connect_db\('([^']*)','([^']*)','([^']*)','(.*)'#", $s, $regs)) { + if ($port_db = $regs[2]) $regs[1] .= ':'.$port_db; + $regs[2] = $regs[3]; + array_shift($regs); + return $regs; + } + return ''; +} + +function bases_referencees($exclu='') +{ + $tables = array(); + foreach(preg_files(_DIR_CONNECT, '.php$') as $f) { + if ($f != $exclu AND analyse_fichier_connection($f)) + $tables[]= basename($f, '.php'); + } + return $tables; +} + + // // Verifier que l'hebergement est compatible SPIP ... ou l'inverse :-) // (sert a l'etape 1 de l'installation) @@ -181,4 +208,141 @@ function fieldset($legend, $champs = array(), $horchamps='') { return $fieldset; } +function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape) +{ + $pg = function_exists('pg_connect'); + $mysql = function_exists('mysql_connect'); + + if ($predef[0] AND !is_string($predef[0])) + $server_db = _INSTALL_SERVER_DB; + else if (!($pg AND $mysql)) + $server_db = $mysql ? 'mysql' : 'pg'; + else { + $server_db =''; + $m = ($predef != 'mysql') ? '' : " selected='selected'"; + $p = ($predef != 'pg') ? '' : " selected='selected'"; + } + + return generer_form_ecrire('install', ( + "\n<input type='hidden' name='etape' value='$etape' />" + . $hidden + . (_request('echec')? + ("<p><b>"._T('avis_connexion_echec_1'). + "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>") + :"") + + . ($server_db + ? '<input type="hidden" name="server_db" value="'.$server_db.'" />' + : ('<fieldset><legend>' + ._L('Indiquer le type de base de données :') + . "\n<select name='server_db'>" + . ($mysql + ? "<option value='mysql'$m>"._L('MySQL')."</option>" + : '') + . ($pg + ? "<option value='pg'$p>"._L('PostGreSQL')."</option>" + : '') + . "</select></legend></fieldset>") + ) + + . ($predef[1] + ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>' + : fieldset(_T('entree_base_donnee_1'), + array( + 'adresse_db' => array( + 'label' => $db[1], + 'valeur' => $db[0] + ), + ) + ) + ) + + . ($predef[2] + ? '<h3>'._T('install_login_base_hebergeur').'</h3>' + : fieldset(_T('entree_login_connexion_1'), + array( + 'login_db' => array( + 'label' => $login[1], + 'valeur' => $login[0] + ), + ) + ) + ) + + . ($predef[3] + ? '<h3>'._T('install_pass_base_hebergeur').'</h3>' + : fieldset(_T('entree_mot_passe_1'), + array( + 'pass_db' => array( + 'label' => $pass[1], + 'valeur' => $pass[0] + ), + ) + ) + ) + + . bouton_suivant())); + +} + +// 4 valeurs qu'on reconduit d'un script a l'autre +// sauf s'ils sont predefinis. + +function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) +{ + return (defined('_INSTALL_HOST_DB') + ? '' + : "\n<input type='hidden' name='adresse_db' value=\"".htmlspecialchars($adresse_db)."\" />" + ) + . (defined('_INSTALL_USER_DB') + ? '' + : "\n<input type='hidden' name='login_db' value=\"".htmlspecialchars($login_db)."\" />" + ) + . (defined('_INSTALL_PASS_DB') + ? '' + : "\n<input type='hidden' name='pass_db' value=\"".htmlspecialchars($pass_db)."\" />" + ) + + . (defined('_INSTALL_SERVER_DB') + ? '' + : "\n<input type='hidden' name='server_db' value=\"".htmlspecialchars($server_db)."\" />" + ); +} + +// presentation des bases existantes + +function install_etape_liste_bases($server_db, $disabled=array()) +{ + $result = sql_listdbs($server_db); + if (!$result) return ''; + $bases = $checked = array(); + + while ($row = sql_fetch($result, $server_db)) { + + $nom = array_shift($row); + $id = htmlspecialchars($nom); + $dis = in_array($nom, $disabled) ? " disabled='disabled'" : ''; + $base = " name=\"choix_db\" value=\"" + . $nom + . '"' + . $dis + . " type='radio' id='$id'"; + $label = "<label for='$id'>" + . ($dis ? "<i>$nom</i>" : $nom) + . "</label>"; + + if (!$checked AND !$dis AND + (($nom == $login_db) OR + ($GLOBALS['table_prefix'] == $nom))) { + $checked = "<input$base checked='checked' />\n$label"; + } else { + $bases[]= "<input$base />\n$label"; + } + } + if (!$bases) return false; + + if ($checked) {array_unshift($bases, $checked); $checked = true;} + + return array($checked, $bases); +} ?> diff --git a/ecrire/install/etape_1.php b/ecrire/install/etape_1.php index 2e835980e54fe8ed56843a1c731c3d268c213093..134d1decf48c6ac00633eb1841ed94c4695e6fc7 100644 --- a/ecrire/install/etape_1.php +++ b/ecrire/install/etape_1.php @@ -10,42 +10,39 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ +if (!defined("_ECRIRE_INC_VERSION")) return; + // http://doc.spip.org/@inc_install_1 function install_etape_1_dist() { - echo install_debut_html(); // stopper en cas de grosse incompatibilite de l'hebergement tester_compatibilite_hebergement(); - list($adresse_db, $login_db) = login_hebergeur(); - $pass_db = ''; + // Recuperer les anciennes donnees pour plus de facilite (si presentes) + $s = !@is_readable(_FILE_CONNECT_TMP) ? '' + : analyse_fichier_connection(_FILE_CONNECT_TMP); + + list($adresse_db, $login_db) = $s ? $s : login_hebergeur(); $chmod = (isset($_GET['chmod']) AND preg_match(',^[0-9]+$,', $_GET['chmod']))? sprintf('%04o', $_GET['chmod']):'0777'; - // Recuperer les anciennes donnees pour plus de facilite (si presentes) - if (@file_exists(_FILE_CONNECT_TMP)) { - $s = @join('', @file(_FILE_CONNECT_TMP)); - if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { - $adresse_db = $regs[1]; - $login_db = $regs[2]; - } - else if (preg_match("#spip_connect_db\('(.*)','(.*)','(.*)','(.*)'#", $s, $regs)) { - $adresse_db = $regs[1]; - if ($port_db = $regs[2]) $adresse_db .= ':'.$port_db; - $login_db = $regs[3]; - } - } - if(@file_exists(_FILE_CHMOD_TMP)){ + + if(@is_readable(_FILE_CHMOD_TMP)){ $s = @join('', @file(_FILE_CHMOD_TMP)); if(preg_match("#define\('_SPIP_CHMOD', (.*)\)#", $s, $regs)) { $chmod = $regs[1]; } } - $req = array($adresse_db,$login_db,$pass_db); + $db = array($adresse_db, _T('entree_base_donnee_2')); + $login = array($login_db, _T('entree_login_connexion_2')); + $pass = array($pass_db, _T('entree_mot_passe_2')); - $predef = array(defined('_INSTALL_SERVER_DB'), defined('_INSTALL_HOST_DB'), defined('_INSTALL_USER_DB'), defined('_INSTALL_PASS_DB')); + $predef = array(defined('_INSTALL_SERVER_DB'), + defined('_INSTALL_HOST_DB'), + defined('_INSTALL_USER_DB'), + defined('_INSTALL_PASS_DB')); // ces deux chaines de langues doivent etre reecrites # echo info_etape(_T('info_connexion_mysql'), _T('texte_connexion_mysql').aide ("install1")); @@ -57,86 +54,10 @@ function install_etape_1_dist() . _L("SPIP sait utiliser MySQL (le plus répandu) et PostGreSQL (support encore expérimental).") .'</p>' ); - echo install_etape_1_form($req, $predef, "\n<input type='hidden' name='chmod' value='$chmod' />", 2); + echo install_connexion_form($db, $login, $pass, $predef, "\n<input type='hidden' name='chmod' value='$chmod' />", 2); echo info_progression_etape(1,'etape_','install/'); echo install_fin_html(); } -function install_etape_1_form($req, $predef, $hidden, $etape) -{ - - if ($predef[0]) - $server_db = _INSTALL_SERVER_DB; - else if ( - abs(function_exists('pg_connect')) - + abs(function_exists('mysql_connect')) - <= 1) - $server_db = function_exists('mysql_connect') - ? 'mysql' - : 'pg'; - else - $server_db =''; - - return generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='$etape' />" - . $hidden - . (_request('echec')? - ("<p><b>"._T('avis_connexion_echec_1'). - "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>") - :"") - - . ($server_db - ? '<input type="hidden" name="server_db" value="'.$server_db.'" />' - : - '<fieldset><legend>'._L('Indiquer le type de base de données :') - . "\n<select name='server_db'>" - . (function_exists('mysql_connect') - ? "<option value='mysql'>"._L('MySQL')."</option>" - : '') - . (function_exists('pg_connect') - ? "<option value='pg'>"._L('PostGreSQL')."</option>" - : '') - . "</select></legend></fieldset>" - ) - - . ($predef[1] - ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>' - : fieldset(_T('entree_base_donnee_1'), - array( - 'adresse_db' => array( - 'label' => _T('entree_base_donnee_2'), - 'valeur' => $req[0] - ), - ) - ) - ) - - . ($predef[2] - ? '<h3>'._T('install_login_base_hebergeur').'</h3>' - : fieldset(_T('entree_login_connexion_1'), - array( - 'login_db' => array( - 'label' => _T('entree_login_connexion_2'), - 'valeur' => $req[1] - ), - ) - ) - ) - - . ($predef[3] - ? '<h3>'._T('install_pass_base_hebergeur').'</h3>' - : fieldset(_T('entree_mot_passe_1'), - array( - 'pass_db' => array( - 'label' => _T('entree_mot_passe_2'), - 'valeur' => $req[2] - ), - ) - ) - ) - - . bouton_suivant())); - -} ?> diff --git a/ecrire/install/etape_2.php b/ecrire/install/etape_2.php index bf233c201242546201ea7602dc57bbcba5c70121..46eb1d7fae47cf21ff3feb4a911849e8894bc309 100644 --- a/ecrire/install/etape_2.php +++ b/ecrire/install/etape_2.php @@ -57,10 +57,10 @@ function install_etape_2_dist() $hidden = (defined('_SPIP_CHMOD') ? '' - : "\n<input type='hidden' name='chmod' value='".htmlspecialchars($chmod)."' />" - ); + : ("\n<input type='hidden' name='chmod' value='".htmlspecialchars($chmod)."' />")) + . predef_ou_cache($adresse_db,$login_db,$pass_db, $server_db); - echo install_etape_2_form($adresse_db,$login_db,$pass_db, $server_db, $hidden, $checked, $res); + echo install_etape_2_form($hidden, $checked, $res, 3); } else { echo info_etape(_T('info_connexion_base')); echo "<p class='resultat'><b>", @@ -83,36 +83,28 @@ function install_etape_2_dist() function install_etape_2_bases($login_db, $server_db) { - - $result = sql_listdbs($server_db); - - $bases = $checked = ''; - if ($result) { - while ($row = sql_fetch($result, $server_db)) { - - $table_nom = array_shift($row); - $base = "<li>\n<input name=\"choix_db\" value=\"".$table_nom."\" type='radio' id='tab$i'"; - $base_fin = " /><label for='tab$i'>".$table_nom."</label>\n</li>"; - if (!$checked AND - (($table_nom == $login_db) OR - ($GLOBALS['table_prefix'] == $table_nom))) { - $checked = "$base checked='checked'$base_fin"; - } else { - $bases .= "$base$base_fin\n"; - } - } - } - - if ($bases) + $res = install_etape_liste_bases($server_db); + if ($res) { + list($checked, $bases) = $res; return array($checked, - "<label for='choix_db'><b>"._T('texte_choix_base_2')."</b><br />"._T('texte_choix_base_3')."</label>" - . "<ul>$checked$bases</ul><p>"._T('info_ou')." "); - + "<label for='choix_db'><b>" + ._T('texte_choix_base_2') + ."</b><br />" + ._T('texte_choix_base_3') + ."</label>" + . "<ul>\n<li>" + . join("</li>\n<li>",$bases) + . "</li>\n</ul><p>" + . _T('info_ou') + . " " + ); + } $res = "<b>"._T('avis_lecture_noms_bases_1')."</b> "._T('avis_lecture_noms_bases_2')."<p>"; + if ($login_db) { - // Si un login comporte un point, le nom de la base est plus - // probablement le login sans le point -- testons pour savoir + // Si un login comporte un point, le nom de la base est plus + // probablement le login sans le point -- testons pour savoir $test_base = $login_db; $ok = sql_selectdb($test_base, $server_db); $test_base2 = str_replace('.', '_', $test_base); @@ -135,29 +127,11 @@ function install_etape_2_bases($login_db, $server_db) return array($checked, $res); } -function install_etape_2_form($adresse_db,$login_db,$pass_db, $server_db, $hidden, $checked, $res) +function install_etape_2_form($hidden, $checked, $res, $etape) { return generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='3' />" + "\n<input type='hidden' name='etape' value='$etape' />" . $hidden - . (defined('_INSTALL_HOST_DB') - ? '' - : "\n<input type='hidden' name='adresse_db' value=\"".htmlspecialchars($adresse_db)."\" />" - ) - . (defined('_INSTALL_USER_DB') - ? '' - : "\n<input type='hidden' name='login_db' value=\"".htmlspecialchars($login_db)."\" />" - ) - . (defined('_INSTALL_PASS_DB') - ? '' - : "\n<input type='hidden' name='pass_db' value=\"".htmlspecialchars($pass_db)."\" />" - ) - - . (defined('_INSTALL_SERVER_DB') - ? '' - : "\n<input type='hidden' name='server_db' value=\"".htmlspecialchars($server_db)."\" />" - ) - . (defined('_INSTALL_NAME_DB') ? '<h3>'._T('install_nom_base_hebergeur'). ' <tt>'._INSTALL_NAME_DB.'</tt>'.'</h3>' : "\n<fieldset><legend>"._T('texte_choix_base_1')."</legend>\n" @@ -180,5 +154,4 @@ function install_etape_2_form($adresse_db,$login_db,$pass_db, $server_db, $hidde . bouton_suivant())); } - ?> diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php index a241cef9c25624e9447166d5c2ee29537052c9bb..c4835e6366769781a37d413e1fb559989e0497e9 100644 --- a/ecrire/install/etape_3.php +++ b/ecrire/install/etape_3.php @@ -15,31 +15,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return; #securite include_spip('inc/headers'); include_spip('base/abstract_sql'); -function install_bases(){ +function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $chmod_db){ global $spip_version; - $adresse_db = defined('_INSTALL_HOST_DB') - ? _INSTALL_HOST_DB - : _request('adresse_db'); - - $login_db = defined('_INSTALL_USER_DB') - ? _INSTALL_USER_DB - : _request('login_db'); - - $pass_db = defined('_INSTALL_PASS_DB') - ? _INSTALL_PASS_DB - : _request('pass_db'); - - $choix_db = defined('_INSTALL_NAME_DB') - ? _INSTALL_NAME_DB - : _request('choix_db'); - - $server_db = defined('_INSTALL_SERVER_DB') - ? _INSTALL_SERVER_DB - : _request('server_db'); - - $chmod = defined('_SPIP_CHMOD') - ? _SPIP_CHMOD - : _request('chmod'); // Prefix des tables : // contrairement a ce qui est dit dans le message (trop strict mais c'est @@ -132,8 +109,8 @@ function install_bases(){ $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta", $server_db); if (!$result_ok) return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; - if($chmod) { - install_fichier_connexion(_FILE_CHMOD_TMP, "@define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod).");\n"); + if ($chmod_db) { + install_fichier_connexion(_FILE_CHMOD_TMP, "@define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod_db).");\n"); } if (preg_match(',(.*):(.*),', $adresse_db, $r)) @@ -167,7 +144,7 @@ function install_propose_ldap() } -function install_premier_auteur($email, $login, $nom, $pass) +function install_premier_auteur($email, $login, $nom, $pass, $hidden) { return info_etape(_T('info_informations_personnelles'), "<b>"._T('texte_informations_personnelles_1')."</b>" . @@ -178,11 +155,8 @@ function install_premier_auteur($email, $login, $nom, $pass) ) . generer_form_ecrire('install', ( "\n<input type='hidden' name='etape' value='4' />" - . (defined('_INSTALL_SERVER_DB') - ? '' - : "\n<input type='hidden' name='server_db' value=\"".htmlspecialchars(_request('server_db'))."\" />" - ) - . fieldset(_T('info_identification_publique'), + . $hidden + . fieldset(_T('info_identification_publique'), array( 'nom' => array( 'label' => "<b>"._T('entree_signature')."</b><br />\n"._T('entree_nom_pseudo_1')."\n", @@ -216,8 +190,32 @@ function install_premier_auteur($email, $login, $nom, $pass) function install_etape_3_dist() { + $adresse_db = defined('_INSTALL_HOST_DB') + ? _INSTALL_HOST_DB + : _request('adresse_db'); + + $login_db = defined('_INSTALL_USER_DB') + ? _INSTALL_USER_DB + : _request('login_db'); + + $pass_db = defined('_INSTALL_PASS_DB') + ? _INSTALL_PASS_DB + : _request('pass_db'); + + $server_db = defined('_INSTALL_SERVER_DB') + ? _INSTALL_SERVER_DB + : _request('server_db'); + + $choix_db = defined('_INSTALL_NAME_DB') + ? _INSTALL_NAME_DB + : _request('choix_db'); + + $chmod_db = defined('_SPIP_CHMOD') + ? _SPIP_CHMOD + : _request('chmod'); + $ldap_present = _request('ldap_present'); - $res = $ldap_present ? '' : install_bases(); + $res = $ldap_present ? '' : install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $chmod_db); if (!function_exists('ldap_connect')) $ldap_present = true; @@ -235,13 +233,20 @@ function install_etape_3_dist() else redirige_par_entete(generer_url_ecrire('install')); + $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) + . (defined('_INSTALL_NAME_DB') ? '' + : ("\n<input type='hidden' name='sel_db' value='" + . (($choix_db == "new_spip") ? _request('table_new'): $choix_db) + . "' />")); + $res = "<p class='resultat'><b>" . _T('info_base_installee') . "</b></p>" . install_premier_auteur(_request('email'), - _request('login'), - _request('nom'), - _request('pass')) + _request('login'), + _request('nom'), + _request('pass'), + $hidden) . ($ldap_present ? '' : install_propose_ldap()); } diff --git a/ecrire/install/etape_4.php b/ecrire/install/etape_4.php index e993617bd096da7f6f054d9f5cb8f501b3f23771..27cc9f53cb7ccb4a9c1c74a3dd698f5578df4db4 100644 --- a/ecrire/install/etape_4.php +++ b/ecrire/install/etape_4.php @@ -13,7 +13,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return; #securite include_spip('inc/headers'); -include_spip('inc/acces'); function install_etape_4_dist() { @@ -98,30 +97,50 @@ function install_etape_4_dist() $config = charger_fonction('config', 'inc'); $config(); - $htpasswd = _DIR_TMP . _AUTH_USER_FILE; - spip_unlink($htpasswd); - spip_unlink($htpasswd."-admin"); - ecrire_acces(); + $suite = "\n<input type='hidden' name='etape' value='fin' />" + . bouton_suivant(_T('login_espace_prive')); - // on l'envoie dans l'espace prive - echo generer_form_ecrire('accueil', bouton_suivant()); - echo info_progression_etape(4,'etape_','install/'); - echo install_fin_html(); + $adresse_db = defined('_INSTALL_HOST_DB') + ? _INSTALL_HOST_DB + : _request('adresse_db'); - // et on perennise + $login_db = defined('_INSTALL_USER_DB') + ? _INSTALL_USER_DB + : _request('login_db'); - $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CHMOD_TMP); - if (!@rename(_FILE_CHMOD_TMP, $f)) { - if (@copy(_FILE_CHMOD_TMP, $f)) - spip_unlink(_FILE_CHMOD_TMP); - } + $pass_db = defined('_INSTALL_PASS_DB') + ? _INSTALL_PASS_DB + : _request('pass_db'); - $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CONNECT_TMP); - if (!@rename(_FILE_CONNECT_TMP, $f)) { - if (@copy(_FILE_CONNECT_TMP, $f)) - @spip_unlink(_FILE_CONNECT_TMP); - } + $server_db = defined('_INSTALL_SERVER_DB') + ? _INSTALL_SERVER_DB + : _request('server_db'); + + $choix = defined('_INSTALL_NAME_DB') + ? '' + : ("\n<input type='hidden' name='sel_db' value='" . _request('sel_db') . "' />\n"); + echo generer_form_ecrire('install', $suite); + echo info_progression_etape(4,'etape_','install/'); + echo autres_bases($adresse_db, $login_db, $pass_db, $server_db, $choix); + echo install_fin_html(); } +function autres_bases($adresse_db, $login_db, $pass_db, $server_db, $hidden) +{ + $tables = bases_referencees(_FILE_CONNECT_TMP); + + if ($tables) + $tables = '<br /><br />' + . _L('Bases déjà interrogeables:') + . "<ul>\n<li>" + . join("</li>\n<li>", $tables) + . "</li>\n</ul>"; + + return "<br ><div style='padding: 10px; border: 1px solid; text-align: left'>" + . _L("Toutefois, si vous avez une autre base de données à interroger avec SPIP, sur ce serveur ou un autre, déclarez-la dès maintenant.") + . $tables + . install_connexion_form(array($adresse_db), array($login_db), array($pass_db), array(), $hidden, 'sup1') + . "</div>"; +} ?>