PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/inc/install.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 467 lines | 379 code | 47 blank | 41 comment | 39 complexity | d7438a2da5afad688b55c326be2fe0f1 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. // Pour ecrire les fichiers memorisant les parametres de connexion
  13. // http://doc.spip.org/@install_fichier_connexion
  14. function install_fichier_connexion($nom, $texte)
  15. {
  16. $texte = "<"."?php\n"
  17. . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n"
  18. . $texte
  19. . "?".">";
  20. ecrire_fichier($nom, $texte);
  21. }
  22. // Attention etape_ldap4 suppose qu'il n'y aura qu'un seul appel de fonction
  23. // dans le fichier produit.
  24. // http://doc.spip.org/@install_connexion
  25. function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $ldap='')
  26. {
  27. $adr = addcslashes($adr,"'\\");
  28. $port = addcslashes($port,"'\\");
  29. $login = addcslashes($login,"'\\");
  30. $pass = addcslashes($pass,"'\\");
  31. $base = addcslashes($base,"'\\");
  32. $type = addcslashes($type,"'\\");
  33. $pref = addcslashes($pref,"'\\");
  34. $ldap = addcslashes($ldap,"'\\");
  35. return "\$GLOBALS['spip_connect_version'] = 0.7;\n"
  36. . "spip_connect_db("
  37. . "'$adr','$port','$login','$pass','$base'"
  38. . ",'$type', '$pref','$ldap');\n";
  39. }
  40. // Analyse si un fichier contient le resultat de la fonction install_connexion
  41. // y compris ce qu'elle produisait dans les versions precedentes
  42. // http://doc.spip.org/@analyse_fichier_connection
  43. function analyse_fichier_connection($file)
  44. {
  45. $s = @join('', file($file));
  46. if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) {
  47. array_shift($regs);
  48. return $regs;
  49. } else {
  50. $arg = '\s*\'([^\']*)\'\s*,';
  51. if (preg_match("#spip_connect_db\($arg$arg$arg$arg\s*'([^']*)'\s*(?:,\s*'([^']*))?#", $s, $regs)) {
  52. $regs[2] = $regs[1] . (!$regs[2] ? '' : ":$port_db;");
  53. array_shift($regs);
  54. array_shift($regs);
  55. return $regs;
  56. }
  57. }
  58. spip_log("$file n'est pas un fichier de connexion");
  59. return '';
  60. }
  61. // http://doc.spip.org/@bases_referencees
  62. function bases_referencees($exclu='')
  63. {
  64. $tables = array();
  65. foreach(preg_files(_DIR_CONNECT, '.php$') as $f) {
  66. if ($f != $exclu AND analyse_fichier_connection($f))
  67. $tables[]= basename($f, '.php');
  68. }
  69. return $tables;
  70. }
  71. function install_mode_appel($server_db, $tout=true)
  72. {
  73. return ($server_db != 'mysql') ? ''
  74. : (($tout ? test_rappel_nom_base_mysql($server_db) : '')
  75. . test_sql_mode_mysql($server_db) );
  76. }
  77. //
  78. // Verifier que l'hebergement est compatible SPIP ... ou l'inverse :-)
  79. // (sert a l'etape 1 de l'installation)
  80. // http://doc.spip.org/@tester_compatibilite_hebergement
  81. function tester_compatibilite_hebergement() {
  82. $err = array();
  83. $p = phpversion();
  84. if (preg_match(',^([0-9]+)\.([0-9]+)\.([0-9]+),', $p, $regs)) {
  85. $php = array($regs[1], $regs[2], $regs[3]);
  86. $m = '4.0.8';
  87. $min = explode('.', $m);
  88. if ($php[0]<$min[0]
  89. OR ($php[0]==$min[0] AND $php[1]<$min[1])
  90. OR ($php[0]==$min[0] AND $php[1]==$min[1] AND $php[2]<$min[2]))
  91. $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m));
  92. }
  93. // Il faut une base de donnees tout de meme ...
  94. if (!function_exists('mysql_query')
  95. AND !function_exists('pg_connect')
  96. AND !function_exists('sqlite_open'))
  97. $err[] = _T('install_extension_php_obligatoire')
  98. . " <a href='http://www.php.net/mysql'>MYSQL</a>"
  99. . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>"
  100. . "| <a href='http://www.php.net/sqlite'>SQLite</a>";
  101. // et il faut preg
  102. if (!function_exists('preg_match_all'))
  103. $err[] = _T('install_extension_php_obligatoire')
  104. . " <a href='http://se.php.net/pcre'>PCRE</a>";
  105. // et surtout pas ce mbstring.overload
  106. if ($a = @ini_get('mbstring.func_overload'))
  107. $err[] = _T('install_extension_mbstring')
  108. . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>";
  109. if ($err) {
  110. echo "<p class='verdana1 spip_large'><b>"._T('avis_attention').'</b></p><p>'._T('install_echec_annonce')."</p><ul>";
  111. while (list(,$e) = each ($err))
  112. echo "<li>$e</li>\n";
  113. # a priori ici on pourrait die(), mais il faut laisser la possibilite
  114. # de forcer malgre tout (pour tester, ou si bug de detection)
  115. echo "</ul><hr />\n";
  116. }
  117. }
  118. // Une fonction pour faciliter la recherche du login (superflu ?)
  119. // http://doc.spip.org/@login_hebergeur
  120. function login_hebergeur() {
  121. global $HTTP_X_HOST, $REQUEST_URI, $SERVER_NAME, $HTTP_HOST;
  122. $base_hebergeur = 'localhost'; # par defaut
  123. // Lycos (ex-Multimachin)
  124. if ($HTTP_X_HOST == 'membres.lycos.fr') {
  125. preg_match(',^/([^/]*),', $REQUEST_URI, $regs);
  126. $login_hebergeur = $regs[1];
  127. }
  128. // Altern
  129. else if (preg_match(',altern\.com$,', $SERVER_NAME)) {
  130. preg_match(',([^.]*\.[^.]*)$,', $HTTP_HOST, $regs);
  131. $login_hebergeur = preg_replace('[^\w\d]', '_', $regs[1]);
  132. }
  133. // Free
  134. else if (preg_match(',(.*)\.free\.fr$,', $SERVER_NAME, $regs)) {
  135. $base_hebergeur = 'sql.free.fr';
  136. $login_hebergeur = $regs[1];
  137. } else $login_hebergeur = '';
  138. return array($base_hebergeur, $login_hebergeur);
  139. }
  140. // http://doc.spip.org/@info_etape
  141. function info_etape($titre, $complement = ''){
  142. return "<h2>".$titre."</h2>\n" .
  143. ($complement ? "<br />".$complement."\n":'');
  144. }
  145. // http://doc.spip.org/@bouton_suivant
  146. function bouton_suivant($code = '') {
  147. if($code=='') $code = _T('bouton_suivant');
  148. static $suivant = 0;
  149. $id = 'suivant'.(($suivant>0)?strval($suivant):'');
  150. $suivant +=1;
  151. return "\n<span class='suivant'><input id='".$id."' type='submit'\nvalue=\"" .
  152. $code .
  153. " >>\" /></span>\n";
  154. }
  155. // http://doc.spip.org/@info_progression_etape
  156. function info_progression_etape($en_cours,$phase,$dir, $erreur = false){
  157. //$en_cours = _request('etape')?_request('etape'):"";
  158. $liste = find_all_in_path($dir,$phase.'(([0-9])+|fin)[.]php$');
  159. $debut = 1; $etat = "ok";
  160. $last = count($liste);
  161. // $texte_etat = array('ok'=>'OK','encours'=>_T('en_cours'),'todo'=>_T('todo'));
  162. $intitule_etat["etape_"][1] = typo(_T('info_connexion_base_donnee'));
  163. $intitule_etat["etape_"][2] = typo(_T('menu_aide_installation_choix_base'));
  164. $intitule_etat["etape_"][3] = typo(_T('info_informations_personnelles'));
  165. $intitule_etat["etape_"][4] = typo(_T('info_derniere_etape'));
  166. $intitule_etat["etape_ldap"][1] = typo(_T('titre_connexion_ldap'));
  167. $intitule_etat["etape_ldap"][2] = typo(_T('titre_connexion_ldap'));
  168. $intitule_etat["etape_ldap"][3] = typo(_T('info_chemin_acces_1'));
  169. $intitule_etat["etape_ldap"][4] = typo(_T('info_reglage_ldap'));
  170. $intitule_etat["etape_ldap"][5] = typo(_T('info_ldap_ok'));
  171. // $aff_etapes = "<span id='etapes'>";
  172. $aff_etapes = "<ul id='infos_etapes' class='infos_$phase$en_cours'>";
  173. foreach($liste as $etape=>$fichier){
  174. if ($debut < $last) {
  175. if ($debut == $en_cours && $erreur) $class = "on erreur";
  176. else if ($debut == $en_cours) $class = "on";
  177. else if ($debut > $en_cours) $class = "prochains";
  178. else $class = "valides";
  179. $aff_etapes .= "<li class='$class'><div class='fond'>";
  180. $aff_etapes .= ($debut == $en_cours)?"<strong>":'';
  181. $aff_etapes .= "<em>"._T('etape')." </em><span class='numero_etape'>$debut</span><em>&nbsp;: </em>";
  182. $aff_etapes .= $intitule_etat["$phase"][$debut];
  183. $aff_etapes .= ($debut == $en_cours)?"</strong>":'';
  184. $aff_etapes .= "</div></li>";
  185. }
  186. $debut++;
  187. }
  188. $aff_etapes .= "</ul>";
  189. $aff_etapes .= "<br class='nettoyeur' />\n";
  190. return $aff_etapes;
  191. }
  192. // http://doc.spip.org/@fieldset
  193. function fieldset($legend, $champs = array(), $apres='', $avant='') {
  194. return "<fieldset>\n" .
  195. $avant .
  196. ($legend ? "<legend>".$legend."</legend>\n" : '') .
  197. fieldset_champs($champs) .
  198. $apres .
  199. "</fieldset>\n";
  200. }
  201. function fieldset_champs($champs = array())
  202. {
  203. $fieldset = '';
  204. foreach ($champs as $nom => $contenu) {
  205. $type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text');
  206. $class = isset($contenu['hidden']) ? '' : "class='formo' size='40' ";
  207. if(isset($contenu['alternatives'])) {
  208. $fieldset .= $contenu['label'] ."\n";
  209. foreach($contenu['alternatives'] as $valeur => $label) {
  210. $fieldset .= "<input type='radio' name='".$nom .
  211. "' id='$nom-$valeur' value='$valeur'"
  212. .(($valeur==$contenu['valeur'])?"\nchecked='checked'":'')
  213. ."/>\n";
  214. $fieldset .= "<label for='$nom-$valeur'>".$label."</label>\n";
  215. }
  216. $fieldset .= "<br />\n";
  217. }
  218. else {
  219. $fieldset .= "<label for='".$nom."'>".$contenu['label']."</label>\n";
  220. $fieldset .= "<input ".$class."type='".$type."' id='" . $nom . "' name='".$nom."'\nvalue='".$contenu['valeur']."'"
  221. .(preg_match(',^(pass|login),', $nom)?" autocomplete='off'":'') . " />\n";
  222. }
  223. }
  224. return $fieldset;
  225. }
  226. function install_select_serveur()
  227. {
  228. $options = array();
  229. $dir = _DIR_RESTREINT . 'req/';
  230. $d = @opendir($dir);
  231. if (!$d) return array();
  232. while ($f = readdir($d)) {
  233. if ((preg_match('/^(.*)[.]php$/', $f, $s))
  234. AND is_readable($f = $dir . $f)) {
  235. require_once($f);
  236. $s = $s[1];
  237. $v = 'spip_versions_' . $s;
  238. if (function_exists($v) AND $v()) {
  239. $titre = _T("install_select_type_$s");
  240. $options[$s] = "<option value='$s'>"
  241. . ($titre ? $titre : $s)
  242. ."</option>";
  243. } else spip_log("$s: portage indisponible");
  244. }
  245. }
  246. sort($options);
  247. return $options;
  248. }
  249. // http://doc.spip.org/@install_connexion_form
  250. function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape)
  251. {
  252. $server_db = (is_string($predef[0])) ? $predef[0] : '';
  253. return generer_form_ecrire('install', (
  254. "\n<input type='hidden' name='etape' value='$etape' />"
  255. . $hidden
  256. . (_request('echec')?
  257. ("<p><b>"._T('avis_connexion_echec_1').
  258. "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>")
  259. :"")
  260. . http_script('', 'jquery.js')
  261. . http_script('
  262. $(document).ready(function() {
  263. $("input[type=hidden][name=server_db]").each(function(){
  264. if ($(this).attr("value").match("sqlite*")){
  265. $("#install_adresse_base_hebergeur").hide();
  266. $("#install_login_base_hebergeur").hide();
  267. $("#install_pass_base_hebergeur").hide();
  268. }
  269. });
  270. $("#sql_serveur_db").change(function(){
  271. if ($(this).find("option:selected").attr("value").match("sqlite*")){
  272. $("#install_adresse_base_hebergeur").hide();
  273. $("#install_login_base_hebergeur").hide();
  274. $("#install_pass_base_hebergeur").hide();
  275. } else {
  276. $("#install_adresse_base_hebergeur").show();
  277. $("#install_login_base_hebergeur").show();
  278. $("#install_pass_base_hebergeur").show();
  279. }
  280. });
  281. });')
  282. . ($server_db
  283. ? '<input type="hidden" name="server_db" value="'.$server_db.'" />'
  284. . (($predef[0])
  285. ?('<h3>'._T('install_serveur_hebergeur').'</h3>')
  286. :'')
  287. : ('<fieldset><legend>'
  288. ._T('install_select_type_db')
  289. . "</legend>"
  290. .'<label for="sql_serveur_db">'
  291. . _T('install_types_db_connus')
  292. // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions.
  293. . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>'
  294. .'</label>'
  295. . "\n<div style='text-align: center;'><select name='server_db' id='sql_serveur_db' >\n"
  296. . join("\n", install_select_serveur())
  297. . "\n</select></div></fieldset>")
  298. )
  299. . '<div id="install_adresse_base_hebergeur">'
  300. . ($predef[1]
  301. ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>'
  302. : fieldset(_T('entree_base_donnee_1'),
  303. array(
  304. 'adresse_db' => array(
  305. 'label' => $db[1],
  306. 'valeur' => $db[0]
  307. ),
  308. )
  309. )
  310. )
  311. . '</div>'
  312. . '<div id="install_login_base_hebergeur">'
  313. . ($predef[2]
  314. ? '<h3>'._T('install_login_base_hebergeur').'</h3>'
  315. : fieldset(_T('entree_login_connexion_1'),
  316. array(
  317. 'login_db' => array(
  318. 'label' => $login[1],
  319. 'valeur' => $login[0]
  320. ),
  321. )
  322. )
  323. )
  324. . '</div>'
  325. . '<div id="install_pass_base_hebergeur">'
  326. . ($predef[3]
  327. ? '<h3>'._T('install_pass_base_hebergeur').'</h3>'
  328. : fieldset(_T('entree_mot_passe_1'),
  329. array(
  330. 'pass_db' => array(
  331. 'label' => $pass[1],
  332. 'valeur' => $pass[0]
  333. ),
  334. )
  335. )
  336. )
  337. . '</div>'
  338. . bouton_suivant()));
  339. }
  340. // 4 valeurs qu'on reconduit d'un script a l'autre
  341. // sauf s'ils sont predefinis.
  342. // http://doc.spip.org/@predef_ou_cache
  343. function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db)
  344. {
  345. return ((defined('_INSTALL_HOST_DB'))
  346. ? ''
  347. : "\n<input type='hidden' name='adresse_db' value=\"".htmlspecialchars($adresse_db)."\" />"
  348. )
  349. . ((defined('_INSTALL_USER_DB'))
  350. ? ''
  351. : "\n<input type='hidden' name='login_db' value=\"".htmlspecialchars($login_db)."\" />"
  352. )
  353. . ((defined('_INSTALL_PASS_DB'))
  354. ? ''
  355. : "\n<input type='hidden' name='pass_db' value=\"".htmlspecialchars($pass_db)."\" />"
  356. )
  357. . ((defined('_INSTALL_SERVER_DB'))
  358. ? ''
  359. : "\n<input type='hidden' name='server_db' value=\"".htmlspecialchars($server_db)."\" />"
  360. );
  361. }
  362. // presentation des bases existantes
  363. // http://doc.spip.org/@install_etape_liste_bases
  364. function install_etape_liste_bases($server_db, $login_db, $disabled=array())
  365. {
  366. $result = sql_listdbs($server_db);
  367. if (!$result) return '';
  368. $bases = $checked = $noms = array();
  369. // si sqlite : result est deja un tableau
  370. if (is_array($result)){
  371. $noms = $result;
  372. } else {
  373. while ($row = sql_fetch($result, $server_db)) {
  374. $noms[] = array_shift($row);
  375. }
  376. }
  377. foreach ($noms as $nom){
  378. $id = htmlspecialchars($nom);
  379. $dis = in_array($nom, $disabled) ? " disabled='disabled'" : '';
  380. $base = " name=\"choix_db\" value=\""
  381. . $nom
  382. . '"'
  383. . $dis
  384. . " type='radio' id='$id'";
  385. $label = "<label for='$id'>"
  386. . ($dis ? "<i>$nom</i>" : $nom)
  387. . "</label>";
  388. if (!$checked AND !$dis AND
  389. (($nom == $login_db) OR
  390. ($GLOBALS['table_prefix'] == $nom))) {
  391. $checked = "<input$base checked='checked' />\n$label";
  392. } else {
  393. $bases[]= "<input$base />\n$label";
  394. }
  395. }
  396. if (!$bases && !$checked) return false;
  397. if ($checked) {array_unshift($bases, $checked); $checked = true;}
  398. return array($checked, $bases);
  399. }
  400. function install_propager($hidden)
  401. {
  402. $res = '';
  403. foreach($hidden as $k) {
  404. $v = htmlentities(_request($k));
  405. $res .= "<input type='hidden' name='$k' value='$v' />";
  406. }
  407. return $res;
  408. }
  409. ?>