[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / exec / import_all.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
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')) return;
14
15 include_spip('inc/headers');
16
17 /**
18 * On arrive ici le premier coup depuis admin_tech
19 * -> dans ce cas on verifie si le dump est lisible et dans une version connu
20 * -> on affiche un message qui va bien
21 * -> on passe la main a inc/admin qui va verifier les droits a executer
22 * base/import_all (fichier ftp ou webmestres) et lancer ce dernier
23 *
24 * Lorsqu'un timeout se produit, on rerentre par ici :
25 * -> on lit la meta import_all pour voir si on est bien en cours de restauration
26 * -> dans ce cas on passe la main a inc/admin qui verifie les droits et relance
27 * base/import_all
28 *
29 */
30
31 // Restauration d'une base. Comme ca peut etre interrompu pour cause
32 // de Timeout, un javascript relance automatiquement (cf inc/import.php)
33 // Comme il peut relancer une action qui vient de se terminer,
34 // il faut ignorer son appel si la meta indiquant l'action en cours
35 // est absente.
36
37 // http://doc.spip.org/@exec_import_all_dist
38 function exec_import_all_dist()
39 {
40 // permettre l'appel en GET
41 if (!$_POST) $_POST = $_GET;
42 $archive=_request('archive');
43 if (!strlen($archive)) {
44 $_POST['archive'] = $archive = _request('archive_perso');
45 }
46 exec_import_all_args($archive);
47 }
48
49 function exec_import_all_args($archive)
50 {
51 if ($archive) {
52 // On arrive ici en debut d'operation
53 // Est-ce une fusion ou un ecrasement ?
54 $insert = _request('insertion');
55 if (!$insert AND !autoriser('detruire'))
56 export_all_abort();
57 $dir = import_queldir();
58 $_POST['dir'] = $dir;
59 // voir si un message d'avertissement est necessaire
60 $commentaire = verifier_sauvegarde($dir . $archive);
61 } else {
62 // sinon, si on a bien la meta qui donne l'etat d'avancement
63 // on est en cours d'operation
64 // Tester si l'archive est toujous la:
65 // ca sert pour forcer a sortir d'une restauration inachevee
66
67 if (!isset($GLOBALS['meta']['import_all'])
68 OR (!$request = @unserialize($GLOBALS['meta']['import_all']))
69 OR (!is_readable($request['dir'] . $request['archive']))) {
70 // on ne sait pas quoi importer, il faut sortir de la
71 export_all_abort();
72 }
73 $archive = $request['archive'];
74 $insert = $request['insertion'];
75 $commentaire = '';
76 }
77 $action = _T($insert
78 ? 'info_restauration_sauvegarde_insert'
79 : 'info_restauration_sauvegarde',
80 array('archive' => $archive));
81 $admin = charger_fonction('admin', 'inc');
82 echo $admin('import_all', $action, $commentaire, !$insert);
83 }
84
85 function export_all_abort()
86 {
87 // evacuer la fausse erreur du cas du validateur en boucle.
88 if (_request('exec') == 'valider_xml') return;
89 include_spip('base/import_all');
90 import_all_fin(array());
91 include_spip('inc/import');
92 detruit_restaurateur();
93 effacer_meta('admin');
94 // et verifier la session
95 include_spip('inc/auth');
96 $login = auth_retrouver_login($GLOBALS['visiteur_session']['login']);
97 $id_auteur = sql_getfetsel('id_auteur', 'spip_auteurs', 'login=' . sql_quote($login));
98 if ($GLOBALS['visiteur_session']['id_auteur'] != $id_auteur)
99 auth_deloger();
100 else
101 redirige_url_ecrire();
102 }
103
104 // http://doc.spip.org/@import_queldir
105 function import_queldir()
106 {
107 global $connect_toutes_rubriques, $connect_login;
108
109 if ($connect_toutes_rubriques) {
110 $repertoire = _DIR_DUMP;
111 if(!@file_exists($repertoire)) {
112 $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
113 $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
114 }
115 return $repertoire;
116 } else {
117 $repertoire = _DIR_TRANSFERT;
118 if(!@file_exists($repertoire)) {
119 $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire);
120 $repertoire = sous_repertoire(_DIR_TMP, $repertoire);
121 }
122 return sous_repertoire($repertoire, $connect_login);
123 }
124 }
125
126
127 /**
128 * Verifier que le dump qu'on essaye d'importer est bien compatible avec la
129 * version en cours, ou alerter des risques et perils
130 *
131 * @global string $spip_version_base
132 * @param string $archive
133 * @return string
134 * message d'avertissement ou d'erreur si necessaire
135 */
136 function verifier_sauvegarde ($archive) {
137 global $spip_version_base;
138
139 $g = preg_match(",\.gz$,", $archive);
140 $_fopen = $g ? 'gzopen' : 'fopen';
141 $_fread = $g ? 'gzread' : 'fread';
142 $buf_len = 1024; // la version doit etre dans le premier ko
143
144 if (!(@file_exists($archive) AND $f = $_fopen($archive, "rb")))
145 return _T('avis_probleme_archive', array('archive' => $archive));
146
147 $buf = $_fread($f, $buf_len);
148
149 if (preg_match('/<SPIP\s+[^>]*version_base="([0-9.]+)"[^>]*version_archive="([^"]+)"/', $buf, $regs)
150 AND version_compare($regs[1], "1.813", ">=")
151 AND import_charge_version($regs[2]) )
152 return ''; // c'est bon
153
154 $r = $regs[1] . ' ' . $regs[2];
155 return _T('avis_erreur_version_archive',
156 array('archive' => str_replace('/', ' / ', $archive) . " ($r)",
157 'spipnet' => $GLOBALS['home_server']
158 . '/' . $GLOBALS['spip_lang'] . '_article1489.html'
159 ));
160 }
161
162 /**
163 * Verifier qu'on a bien le script qui sait lire la version d'archive
164 *
165 * @param string $version_archive
166 * @return string
167 */
168 function import_charge_version($version_archive)
169 {
170 // si c'est une archive xml par phpmyadmin, on sait la lire avec le script import_1_3
171 if (preg_match("{^phpmyadmin::}is",$version_archive)){
172 $fimport = 'import_1_3';
173 }
174 else
175 $fimport = 'import_' . str_replace('.','_',$version_archive);
176
177 return charger_fonction($fimport, 'inc', true);
178 }
179 ?>