"; ecrire_fichier($nom, $texte); } /** * Retourne le code source d'un fichier de connexion à une base de données * * Le code est un appel à la fonction spip_connect_db() * * @see spip_connect_db() * * @internal * Attention etape_ldap4 suppose qu'il n'y aura qu'un seul appel de fonction * dans le fichier produit. * * @param string $adr Adresse de la base de données {@example 'localhost'} * @param string $port Numéro de port * @param string $login Login de connexion * @param string $pass Mot de passe de connexion * @param string $base Nom de la base de données * @param string $type Moteur SQL {@example 'sqlite3', 'mysql'} * @param string $pref Préfixe des tables {@example 'spip'} * @param string $ldap Type d'authentification (cas si 'ldap') * @param string $charset Charset de la connexion SQL * @return string * Texte du fichier de connexion * **/ function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $ldap = '', $charset = '') { $adr = addcslashes($adr, "'\\"); $port = addcslashes($port, "'\\"); $login = addcslashes($login, "'\\"); $pass = addcslashes($pass, "'\\"); $base = addcslashes($base, "'\\"); $type = addcslashes($type, "'\\"); $pref = addcslashes($pref, "'\\"); $ldap = addcslashes($ldap, "'\\"); $charset = addcslashes($charset, "'\\"); return "\$GLOBALS['spip_connect_version'] = 0.8;\n" . "spip_connect_db(" . "'$adr','$port','$login','$pass','$base'" . ",'$type', '$pref','$ldap','$charset');\n"; } /** * Analyse un fichier de connexion à une base de données * * Le fichier contient normalement le résultat de la fonction install_connexion(). * L'analyse tient également compte des syntaxes des versions précédentes. * * @param string $file * Chemin du fichier de connexion à analyser * @return array * Tableau des informations sur la connexion **/ function analyse_fichier_connection($file) { $s = @join('', file($file)); if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { array_shift($regs); return $regs; } else { $ar = '\s*\'([^\']*)\''; $r = '\s*,' . $ar; $r = "#spip_connect_db[(]$ar$r$r$r$r(?:$r(?:$r(?:$r(?:$r)?)?)?)?#"; if (preg_match($r, $s, $regs)) { $regs[2] = $regs[1] . (!$regs[2] ? '' : ":" . $regs[2] . ";"); array_shift($regs); array_shift($regs); return $regs; } } spip_log("$file n'est pas un fichier de connexion"); return array(); } /** * Liste les connecteurs aux bases SQL disponibles * * Dans le code SPIP ces connecteurs sont souvent appelés $connect ou $serveur * * @example * $bases = bases_referencees(_FILE_CONNECT_TMP); * * @param string $exclu * Exclure un connecteur particulier (nom du fichier) * @return array * Liste des noms de connecteurs **/ 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; } function install_mode_appel($server_db, $tout = true) { return ($server_db != 'mysql') ? '' : (($tout ? test_rappel_nom_base_mysql($server_db) : '') . test_sql_mode_mysql($server_db)); } // // Verifier que l'hebergement est compatible SPIP ... ou l'inverse :-) // (sert a l'etape 1 de l'installation) // http://code.spip.net/@tester_compatibilite_hebergement function tester_compatibilite_hebergement() { $err = array(); $p = phpversion(); if (version_compare($p, _PHP_MIN, '<')) { $err[] = _T('install_php_version', array('version' => $p, 'minimum' => _PHP_MIN)); } // Si on n'a pas la bonne version de PHP, c'est la fin if ($err) { die("
" . "

" . _T('avis_attention') . '

' . _T('install_echec_annonce') . "

"); } // Il faut une base de donnees tout de meme ... $serveurs = install_select_serveur(); if (!$serveurs) { $err[] = _T('install_extension_php_obligatoire') . " MYSQL" . "| PostgreSQL" . "| SQLite"; } // et il faut preg if (!function_exists('preg_match_all')) { $err[] = _T('install_extension_php_obligatoire') . " PCRE"; } // et surtout pas ce mbstring.overload if ($a = @ini_get('mbstring.func_overload')) { $err[] = _T('install_extension_mbstring') . "mbstring.func_overload=$a - mb_string.
"; } if ($err) { echo "
" . "

" . _T('avis_attention') . '

' . _T('install_echec_annonce') . "

\n"; } } /** * Faciliter la recherche du login d'installation en fonction de certains hébergeurs connus * * @note superflu ?? */ function login_hebergeur() { $base_hebergeur = 'localhost'; # par defaut // Free if (preg_match(',(.*)\.free\.fr$,', $_SERVER['SERVER_NAME'], $regs)) { $base_hebergeur = 'sql.free.fr'; $login_hebergeur = $regs[1]; } else { $login_hebergeur = ''; } return array($base_hebergeur, $login_hebergeur); } // http://code.spip.net/@info_etape function info_etape($titre, $complement = '') { return "

" . $titre . "

\n" . ($complement ? "" . $complement . "\n" : ''); } /** * Retourne le code HTML d'un bouton `suivant>>` pour les phases d'installation * * @param string $code Texte du bouton * @return string Code HTML du bouton **/ function bouton_suivant($code = '') { if ($code == '') { $code = _T('bouton_suivant'); } static $suivant = 0; $id = 'suivant' . (($suivant > 0) ? strval($suivant) : ''); $suivant += 1; return "\n

>\" />

\n"; } // http://code.spip.net/@info_progression_etape function info_progression_etape($en_cours, $phase, $dir, $erreur = false) { //$en_cours = _request('etape')?_request('etape'):""; $liste = find_all_in_path($dir, $phase . '(([0-9])+|fin)[.]php$'); $debut = 1; $etat = "ok"; $last = count($liste); // $texte_etat = array('ok'=>'OK','encours'=>_T('en_cours'),'todo'=>_T('todo')); $intitule_etat["etape_"][1] = typo(_T('info_connexion_base_donnee')); $intitule_etat["etape_"][2] = typo(_T('menu_aide_installation_choix_base')); $intitule_etat["etape_"][3] = typo(_T('info_informations_personnelles')); $intitule_etat["etape_"][4] = typo(_T('info_derniere_etape')); $intitule_etat["etape_ldap"][1] = typo(_T('titre_connexion_ldap')); $intitule_etat["etape_ldap"][2] = typo(_T('titre_connexion_ldap')); $intitule_etat["etape_ldap"][3] = typo(_T('info_chemin_acces_1')); $intitule_etat["etape_ldap"][4] = typo(_T('info_reglage_ldap')); $intitule_etat["etape_ldap"][5] = typo(_T('info_ldap_ok')); // $aff_etapes = ""; $aff_etapes = ""; $aff_etapes .= "
\n"; return $aff_etapes; } // http://code.spip.net/@fieldset function fieldset($legend, $champs = array(), $apres = '', $avant = '') { return "
\n" . $avant . ($legend ? "" . $legend . "\n" : '') . fieldset_champs($champs) . $apres . "
\n"; } function fieldset_champs($champs = array()) { $fieldset = ''; foreach ($champs as $nom => $contenu) { $type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text'); $class = isset($contenu['hidden']) ? '' : "class='formo' size='40' "; if (isset($contenu['alternatives'])) { $fieldset .= $contenu['label'] . "\n"; foreach ($contenu['alternatives'] as $valeur => $label) { $fieldset .= "\n"; $fieldset .= "\n"; } $fieldset .= "
\n"; } else { $fieldset .= "\n"; $fieldset .= "\n"; } } return $fieldset; } function install_select_serveur() { $options = array(); $dir = _DIR_RESTREINT . 'req/'; $d = opendir($dir); if (!$d) { return array(); } while (($f = readdir($d)) !== false) { if ((preg_match('/^(.*)[.]php$/', $f, $s)) and is_readable($f = $dir . $f) ) { require_once($f); $s = $s[1]; $v = 'spip_versions_' . $s; if (function_exists($v) and $v()) { $titre = _T("install_select_type_$s"); // proposer mysql par defaut si dispo $checked = ($s == 'mysql' ? " checked='checked'" : ""); $options[$s] = "
  • " . "
  • "; } else { spip_log("$s: portage indisponible"); } } } sort($options); return $options; } // http://code.spip.net/@install_connexion_form function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $jquery = true) { $server_db = (is_string($predef[0])) ? $predef[0] : ''; return generer_form_ecrire('install', ( "\n" . $hidden . (_request('echec') ? ("

    " . _T('avis_connexion_echec_1') . "

    " . _T('avis_connexion_echec_2') . "

    " . _T('avis_connexion_echec_3') . "

    ") : "") . ($jquery ? http_script('', 'jquery.js') : '') . http_script(' jQuery(function($) { $("input[type=hidden][name=server_db]").each(function(){ if ($(this).attr("value").match("sqlite*")){ $("#install_adresse_base_hebergeur,#install_login_base_hebergeur,#install_pass_base_hebergeur").hide(); } }); if ($("input[name=server_db][checked]").attr("value").match("sqlite*")) $("#install_adresse_base_hebergeur,#install_login_base_hebergeur,#install_pass_base_hebergeur").hide(); else $("#install_adresse_base_hebergeur,#install_login_base_hebergeur,#install_pass_base_hebergeur").show(); $("input[name=server_db]").each(function(){ $(this).on("change",function(){ if ($(this).prop("checked") && $(this).attr("value").match("sqlite*")) { $("#install_adresse_base_hebergeur,#install_login_base_hebergeur,#install_pass_base_hebergeur").hide(); } if ($(this).prop("checked") && !$(this).attr("value").match("sqlite*")) { $("#install_adresse_base_hebergeur,#install_login_base_hebergeur,#install_pass_base_hebergeur").show(); } }); }); });') . ($server_db ? '' . (($predef[0]) ? ('

    ' . _T('install_serveur_hebergeur') . '

    ') : '') : ('
    ' . _T('install_select_type_db') . "" . '

    ' . _T('install_types_db_connus') // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions. // . "
    (". _T('install_types_db_connus_avertissement') .')' . '

    ' . "\n
    \n
      \n" . join("\n", install_select_serveur()) . "\n
    \n
    ") ) . '
    ' . '

    ' . _T('texte_connexion_mysql') . '

    ' . ($predef[1] ? '

    ' . _T('install_adresse_base_hebergeur') . '

    ' : fieldset(_T('entree_base_donnee_1'), array( 'adresse_db' => array( 'label' => $db[1], 'valeur' => $db[0] ), ) ) ) . '
    ' . '
    ' . ($predef[2] ? '

    ' . _T('install_login_base_hebergeur') . '

    ' : fieldset(_T('entree_login_connexion_1'), array( 'login_db' => array( 'label' => $login[1], 'valeur' => $login[0] ), ) ) ) . '
    ' . '
    ' . ($predef[3] ? '

    ' . _T('install_pass_base_hebergeur') . '

    ' : 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. // http://code.spip.net/@predef_ou_cache function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) { return ((defined('_INSTALL_HOST_DB')) ? '' : "\n" ) . ((defined('_INSTALL_USER_DB')) ? '' : "\n" ) . ((defined('_INSTALL_PASS_DB')) ? '' : "\n" ) . ((defined('_INSTALL_SERVER_DB')) ? '' : "\n" ); } // presentation des bases existantes // http://code.spip.net/@install_etape_liste_bases function install_etape_liste_bases($server_db, $login_db, $disabled = array()) { $bases = $checked = array(); $noms = sql_listdbs($server_db); if (!$noms) { return ''; } foreach ($noms as $nom) { $id = spip_htmlspecialchars($nom); $dis = in_array($nom, $disabled) ? " disabled='disabled'" : ''; $base = " name=\"choix_db\" value=\"" . $nom . '"' . $dis . " type='radio' id='$id'"; $label = ""; if (!$checked and !$dis and (($nom == $login_db) or ($GLOBALS['table_prefix'] == $nom)) ) { $checked = "\n$label"; } else { $bases[] = "\n$label"; } } if (!$bases && !$checked) { return false; } if ($checked) { array_unshift($bases, $checked); $checked = true; } return array($checked, $bases); } function install_propager($hidden) { $res = ''; foreach ($hidden as $k) { $v = spip_htmlentities(_request($k)); $res .= ""; } return $res; }