a115cfd4c2c024fabed197057d8f44165835c24f
[lhc/web/www.git] / www / ecrire / install / etape_3.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 include_spip('inc/headers');
18 include_spip('base/abstract_sql');
19
20 // http://code.spip.net/@install_bases
21 function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db) {
22
23 // Prefix des tables :
24 // contrairement a ce qui est dit dans le message (trop strict mais c'est
25 // pour notre bien), on va tolerer les chiffres en plus des minuscules
26 // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer
27 // a partir de ce qui est envoye a l'installation
28 if (!defined('_INSTALL_TABLE_PREFIX')) {
29 $table_prefix = ($GLOBALS['table_prefix'] != 'spip')
30 ? $GLOBALS['table_prefix']
31 : trim(preg_replace(',[^a-z0-9],', '', strtolower(_request('tprefix'))));
32 // S'il est vide on remet spip
33 if (!$table_prefix) {
34 $table_prefix = 'spip';
35 }
36 } else {
37 $table_prefix = _INSTALL_TABLE_PREFIX;
38 }
39
40 if (preg_match(',(.*):(.*),', $adresse_db, $r)) {
41 list(, $adresse_db, $port) = $r;
42 } else {
43 $port = '';
44 }
45
46 $GLOBALS['connexions'][$server_db]
47 = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db);
48
49 $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']]
50 = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']];
51
52 $fquery = sql_serveur('query', $server_db);
53 if ($choix_db == 'new_spip') {
54 $re = ',^[a-z_][a-z_0-9-]*$,i';
55 if (preg_match($re, $sel_db)) {
56 $ok = sql_create_base($sel_db, $server_db);
57 if (!$ok) {
58 $re = "Impossible de creer la base $re";
59 spip_log($re);
60 return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->";
61 }
62 } else {
63 $re = "Le nom de la base doit correspondre a $re";
64 spip_log($re);
65
66 return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->";
67 }
68 }
69
70 // on rejoue la connexion apres avoir teste si il faut lui indiquer
71 // un sql_mode
72 install_mode_appel($server_db, false);
73 $GLOBALS['connexions'][$server_db]
74 = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db);
75
76 $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']]
77 = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']];
78
79 // Completer le tableau decrivant la connexion
80
81 $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix;
82 $GLOBALS['connexions'][$server_db]['db'] = $sel_db;
83
84 $old = sql_showbase($table_prefix . '_meta', $server_db);
85 if ($old) {
86 $old = sql_fetch($old, $server_db);
87 }
88 if (!$old) {
89 // Si possible, demander au serveur d'envoyer les textes
90 // dans le codage std de SPIP,
91 $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db);
92
93 if ($charset) {
94 sql_set_charset($charset['charset'], $server_db);
95 $GLOBALS['meta']['charset_sql_base'] =
96 $charset['charset'];
97 $GLOBALS['meta']['charset_collation_sql_base'] =
98 $charset['collation'];
99 $GLOBALS['meta']['charset_sql_connexion'] =
100 $charset['charset'];
101 $charsetbase = $charset['charset'];
102 } else {
103 spip_log(_DEFAULT_CHARSET . ' inconnu du serveur SQL');
104 $charsetbase = 'standard';
105 }
106 spip_log("Creation des tables. Codage $charsetbase");
107 creer_base($server_db); // AT LAST
108 // memoriser avec quel charset on l'a creee
109
110 if ($charset) {
111 $t = array(
112 'nom' => 'charset_sql_base',
113 'valeur' => $charset['charset'],
114 'impt' => 'non'
115 );
116 @sql_insertq('spip_meta', $t, '', $server_db);
117 $t['nom'] = 'charset_collation_sql_base';
118 $t['valeur'] = $charset['collation'];
119 @sql_insertq('spip_meta', $t, '', $server_db);
120 $t['nom'] = 'charset_sql_connexion';
121 $t['valeur'] = $charset['charset'];
122 @sql_insertq('spip_meta', $t, '', $server_db);
123 }
124 $t = array(
125 'nom' => 'version_installee',
126 'valeur' => $GLOBALS['spip_version_base'],
127 'impt' => 'non'
128 );
129 @sql_insertq('spip_meta', $t, '', $server_db);
130 $t['nom'] = 'nouvelle_install';
131 $t['valeur'] = 1;
132 @sql_insertq('spip_meta', $t, '', $server_db);
133 // positionner la langue par defaut du site si un cookie de lang a ete mis
134 if (isset($_COOKIE['spip_lang_ecrire'])) {
135 @sql_insertq(
136 'spip_meta',
137 array('nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']),
138 '',
139 $server_db
140 );
141 }
142 } else {
143 // pour recreer les tables disparues au besoin
144 spip_log('Table des Meta deja la. Verification des autres.');
145 creer_base($server_db);
146 $fupdateq = sql_serveur('updateq', $server_db);
147
148 $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db);
149
150 if ($r) {
151 $r = sql_fetch($r, $server_db);
152 }
153 $version_installee = !$r ? 0 : (double)$r['valeur'];
154 if (!$version_installee or ($GLOBALS['spip_version_base'] < $version_installee)) {
155 $fupdateq(
156 'spip_meta',
157 array('valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'),
158 "nom='version_installee'",
159 '',
160 $server_db
161 );
162 spip_log('nouvelle version installee: ' . $GLOBALS['spip_version_base']);
163 }
164 // eliminer la derniere operation d'admin mal terminee
165 // notamment la mise a jour
166 @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db);
167 }
168
169 // recuperer le charset de la connexion dans les meta
170 $charset = '';
171 $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db);
172 if ($r) {
173 $r = sql_fetch($r, $server_db);
174 }
175 if ($r) {
176 $charset = $r['valeur'];
177 }
178
179 $ligne_rappel = install_mode_appel($server_db);
180
181 $result_ok = @$fquery('SELECT COUNT(*) FROM spip_meta', $server_db);
182 if (!$result_ok) {
183 return "<!--\nvielle = $old rappel= $ligne_rappel\n-->";
184 }
185
186 if ($chmod_db) {
187 install_fichier_connexion(
188 _FILE_CHMOD_TMP,
189 "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n"
190 );
191 }
192
193 // si ce fichier existe a cette etape c'est qu'il provient
194 // d'une installation qui ne l'a pas cree correctement.
195 // Le supprimer pour que _FILE_CONNECT_TMP prime.
196
197 if (_FILE_CONNECT and file_exists(_FILE_CONNECT)) {
198 spip_unlink(_FILE_CONNECT);
199 }
200
201 install_fichier_connexion(
202 _FILE_CONNECT_TMP,
203 $ligne_rappel
204 . install_connexion(
205 $adresse_db,
206 $port,
207 $login_db,
208 $pass_db,
209 $sel_db,
210 $server_db,
211 $table_prefix,
212 '',
213 $charset
214 )
215 );
216
217 return '';
218 }
219
220 // http://code.spip.net/@install_propose_ldap
221 function install_propose_ldap() {
222 return generer_form_ecrire('install', (
223 fieldset(
224 _T('info_authentification_externe'),
225 array(
226 'etape' => array(
227 'label' => _T('texte_annuaire_ldap_1'),
228 'valeur' => 'ldap1',
229 'hidden' => true
230 )
231 ),
232 bouton_suivant(_T('bouton_acces_ldap'))
233 )));
234 }
235
236
237 // http://code.spip.net/@install_premier_auteur
238 function install_premier_auteur($email, $login, $nom, $pass, $hidden, $auteur_obligatoire) {
239 return info_progression_etape(3, 'etape_', 'install/') .
240 info_etape(
241 _T('info_informations_personnelles'),
242 '<b>' . _T('texte_informations_personnelles_1') . '</b>' .
243 aider('install5', true) .
244 '<p>' .
245 ($auteur_obligatoire ?
246 ''
247 :
248 _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides')
249 )
250 )
251 . generer_form_ecrire('install', (
252 "\n<input type='hidden' name='etape' value='3b' />"
253 . $hidden
254 . fieldset(
255 _T('info_identification_publique'),
256 array(
257 'nom' => array(
258 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n",
259 'valeur' => $nom,
260 'required' => $auteur_obligatoire,
261 ),
262 'email' => array(
263 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n",
264 'valeur' => $email,
265 )
266 )
267 )
268
269 . fieldset(
270 _T('entree_identifiants_connexion'),
271 array(
272 'login' => array(
273 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T(
274 'info_login_trop_court_car_pluriel',
275 array('nb' => _LOGIN_TROP_COURT)
276 ) . "\n",
277 'valeur' => $login,
278 'required' => $auteur_obligatoire,
279 ),
280 'pass' => array(
281 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T(
282 'info_passe_trop_court_car_pluriel',
283 array('nb' => _PASS_LONGUEUR_MINI)
284 ) . "\n",
285 'valeur' => $pass,
286 'required' => $auteur_obligatoire,
287 ),
288 'pass_verif' => array(
289 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n",
290 'valeur' => $pass,
291 'required' => $auteur_obligatoire,
292 )
293 )
294 )
295 . bouton_suivant()));
296 }
297
298 // http://code.spip.net/@install_etape_3_dist
299 function install_etape_3_dist() {
300 $ldap_present = _request('ldap_present');
301
302 if (!$ldap_present) {
303 $adresse_db = defined('_INSTALL_HOST_DB')
304 ? _INSTALL_HOST_DB
305 : _request('adresse_db');
306
307 $login_db = defined('_INSTALL_USER_DB')
308 ? _INSTALL_USER_DB
309 : _request('login_db');
310
311 $pass_db = defined('_INSTALL_PASS_DB')
312 ? _INSTALL_PASS_DB
313 : _request('pass_db');
314
315 $server_db = defined('_INSTALL_SERVER_DB')
316 ? _INSTALL_SERVER_DB
317 : _request('server_db');
318
319 $chmod_db = defined('_SPIP_CHMOD')
320 ? _SPIP_CHMOD
321 : _request('chmod');
322
323 $choix_db = defined('_INSTALL_NAME_DB')
324 ? _INSTALL_NAME_DB
325 : _request('choix_db');
326
327 $sel_db = ($choix_db == 'new_spip')
328 ? _request('table_new') : $choix_db;
329
330 $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db);
331
332 if ($res) {
333 $res = info_progression_etape(2, 'etape_', 'install/', true)
334 . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>'
335 . $res
336 . '<p>' . _T('texte_operation_echec') . '</p>'
337 . '</div>';
338 }
339 } else {
340 $res = '';
341 list($adresse_db, $login_db, $pass_db, $sel_db, $server_db) = analyse_fichier_connection(_FILE_CONNECT_TMP);
342 $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db);
343 }
344
345 if (!$res) {
346 if (file_exists(_FILE_CONNECT_TMP)) {
347 include(_FILE_CONNECT_TMP);
348 } else {
349 redirige_url_ecrire('install');
350 }
351
352 if (file_exists(_FILE_CHMOD_TMP)) {
353 include(_FILE_CHMOD_TMP);
354 } else {
355 redirige_url_ecrire('install');
356 }
357
358 $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db)
359 . (defined('_INSTALL_NAME_DB') ? ''
360 : "\n<input type='hidden' name='sel_db' value='$sel_db' />");
361
362 $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db));
363
364 $res = "<div class='success'><b>"
365 . _T('info_base_installee')
366 . '</b></div>'
367 . install_premier_auteur(
368 _request('email'),
369 _request('login'),
370 _request('nom'),
371 _request('pass'),
372 $hidden,
373 $auteur_obligatoire
374 )
375 . (($ldap_present or !function_exists('ldap_connect'))
376 ? '' : install_propose_ldap());
377 }
378
379 echo install_debut_html();
380 echo $res;
381 echo install_fin_html();
382 }