Dotclear

source: plugins/importExport/inc/class.dc.import.flat.php @ 3421:34cfd92ec45a

Revision 3421:34cfd92ec45a, 8.5 KB checked in by franck <carnet.franck.paul@…>, 9 years ago (diff)

No more <![CDATA[ … ]]> but in rss2.xsl (only useful for XML document, as XHTML)

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of importExport, a plugin for DotClear2.
5#
6# Copyright (c) 2003-2012 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12if (!defined('DC_RC_PATH')) { return; }
13
14class dcImportFlat extends dcIeModule
15{
16     protected $status = false;
17
18     public function setInfo()
19     {
20          $this->type = 'import';
21          $this->name = __('Flat file import');
22          $this->description = __('Imports a blog or a full Dotclear installation from flat file.');
23     }
24
25     public function process($do)
26     {
27          if ($do == 'single' || $do == 'full') {
28               $this->status = $do;
29               return;
30          }
31
32          $to_unlink = false;
33
34          # Single blog import
35          $files = $this->getPublicFiles();
36          $single_upl = null;
37          if (!empty($_POST['public_single_file']) && in_array($_POST['public_single_file'],$files)) {
38               $single_upl = false;
39          } elseif (!empty($_FILES['up_single_file'])) {
40               $single_upl = true;
41          }
42
43          if ($single_upl !== null)
44          {
45               if ($single_upl) {
46                    files::uploadStatus($_FILES['up_single_file']);
47                    $file = DC_TPL_CACHE.'/'.md5(uniqid());
48                    if (!move_uploaded_file($_FILES['up_single_file']['tmp_name'],$file)) {
49                         throw new Exception(__('Unable to move uploaded file.'));
50                    }
51                    $to_unlink = true;
52               } else {
53                    $file = $_POST['public_single_file'];
54               }
55
56               try {
57                    # Try to unzip file
58                    $unzip_file = $this->unzip($file);
59                    if (false !== $unzip_file) {
60                         $bk = new flatImport($this->core,$unzip_file);
61                    }
62                    # Else this is a normal file
63                    else {
64                         $bk = new flatImport($this->core,$file);
65                    }
66
67                    $bk->importSingle();
68               } catch (Exception $e) {
69                    @unlink($unzip_file);
70                    if ($to_unlink) {
71                         @unlink($file);
72                    }
73                    throw $e;
74               }
75               @unlink($unzip_file);
76               if ($to_unlink) {
77                    @unlink($file);
78               }
79               http::redirect($this->getURL().'&do=single');
80          }
81
82          # Full import
83          $full_upl = null;
84          if (!empty($_POST['public_full_file']) && in_array($_POST['public_full_file'],$files)) {
85               $full_upl = false;
86          } elseif (!empty($_FILES['up_full_file'])) {
87               $full_upl = true;
88          }
89
90          if ($full_upl !== null && $this->core->auth->isSuperAdmin())
91          {
92               if (empty($_POST['your_pwd']) || !$this->core->auth->checkPassword($this->core->auth->crypt($_POST['your_pwd']))) {
93                    throw new Exception(__('Password verification failed'));
94               }
95
96               if ($full_upl) {
97                    files::uploadStatus($_FILES['up_full_file']);
98                    $file = DC_TPL_CACHE.'/'.md5(uniqid());
99                    if (!move_uploaded_file($_FILES['up_full_file']['tmp_name'],$file)) {
100                         throw new Exception(__('Unable to move uploaded file.'));
101                    }
102                    $to_unlink = true;
103               } else {
104                    $file = $_POST['public_full_file'];
105               }
106
107               try {
108                    # Try to unzip file
109                    $unzip_file = $this->unzip($file);
110                    if (false !== $unzip_file) {
111                         $bk = new flatImport($this->core,$unzip_file);
112                    }
113                    # Else this is a normal file
114                    else {
115                         $bk = new flatImport($this->core,$file);
116                    }
117
118                    $bk->importFull();
119               } catch (Exception $e) {
120                    @unlink($unzip_file);
121                    if ($to_unlink) {
122                         @unlink($file);
123                    }
124                    throw $e;
125               }
126               @unlink($unzip_file);
127               if ($to_unlink) {
128                    @unlink($file);
129               }
130               http::redirect($this->getURL().'&do=full');
131          }
132
133          header('content-type:text/plain');
134          var_dump($_POST);
135          exit;
136
137          $this->status = true;
138     }
139
140     public function gui()
141     {
142          if ($this->status == 'single')
143          {
144               dcPage::success(__('Single blog successfully imported.'));
145               return;
146          }
147          if ($this->status == 'full')
148          {
149               dcPage::success(__('Content successfully imported.'));
150               return;
151          }
152
153          $public_files = array_merge(array('-' => ''),$this->getPublicFiles());
154          $has_files = (boolean) (count($public_files) - 1);
155
156          echo
157          '<script type="text/javascript">'."\n".
158          dcPage::jsVar('dotclear.msg.confirm_full_import',
159               __('Are you sure you want to import a full backup file?')).
160          "$(function() {".
161               "$('#up_single_file').change(function() { ".
162                    "if (this.value != '') { $('#public_single_file').val(''); } ".
163               "}); ".
164               "$('#public_single_file').change(function() { ".
165                    "if (this.value != '') { $('#up_single_file').val(''); } ".
166               "}); ".
167               "$('#up_full_file').change(function() { ".
168                    "if (this.value != '') { $('#public_full_file').val(''); } ".
169               "}); ".
170               "$('#public_full_file').change(function() { ".
171                    "if (this.value != '') { $('#up_full_file').val(''); } ".
172               "}); ".
173               "$('#formfull').submit(function() { ".
174                    "return window.confirm(dotclear.msg.confirm_full_import); ".
175               "}); ".
176          "});\n".
177          "</script>\n";
178
179          echo
180          '<form action="'.$this->getURL(true).'" method="post" enctype="multipart/form-data" class="fieldset">'.
181          '<h3>'.__('Single blog').'</h3>'.
182          '<p>'.sprintf(__('This will import a single blog backup as new content in the current blog: <strong>%s</strong>.'),html::escapeHTML($this->core->blog->name)).'</p>'.
183
184          '<p><label for="up_single_file">'.__('Upload a backup file').
185          ' ('.sprintf(__('maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.' </label>'.
186          ' <input type="file" id="up_single_file" name="up_single_file" size="20" />'.
187          '</p>';
188
189          if ($has_files) {
190               echo
191               '<p><label for="public_single_file" class="">'.__('or pick up a local file in your public directory').' </label> '.
192               form::combo('public_single_file',$public_files).
193               '</p>';
194          }
195
196          echo
197          '<p>'.
198          $this->core->formNonce().
199          form::hidden(array('do'),1).
200          form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
201          '<input type="submit" value="'.__('Import').'" /></p>'.
202
203          '</form>';
204
205          if ($this->core->auth->isSuperAdmin())
206          {
207               echo
208               '<form action="'.$this->getURL(true).'" method="post" enctype="multipart/form-data" id="formfull" class="fieldset">'.
209               '<h3>'.__('Multiple blogs').'</h3>'.
210               '<p class="warning">'.__('This will reset all the content of your database, except users.').'</p>'.
211
212               '<p><label for="up_full_file">'.__('Upload a backup file').' '.
213               ' ('.sprintf(__('maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.' </label>'.
214               '<input type="file" id="up_full_file" name="up_full_file" size="20" />'.
215               '</p>';
216
217               if ($has_files) {
218                    echo
219                    '<p><label for="public_full_file">'.__('or pick up a local file in your public directory').' </label>'.
220                    form::combo('public_full_file',$public_files).
221                    '</p>';
222               }
223
224               echo
225               '<p><label for="your_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label>'.
226               form::password('your_pwd',20,255).'</p>'.
227
228               '<p>'.
229               $this->core->formNonce().
230               form::hidden(array('do'),1).
231               form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
232               '<input type="submit" value="'.__('Import').'" /></p>'.
233
234               '</form>';
235          }
236     }
237
238     protected function getPublicFiles()
239     {
240          $public_files = array();
241          $dir = @dir($this->core->blog->public_path);
242          if ($dir)
243          {
244               while (($entry = $dir->read()) !== false) {
245                    $entry_path = $dir->path.'/'.$entry;
246
247                    if (is_file($entry_path) && is_readable($entry_path))
248                    {
249                         # Do not test each zip file content here, its too long
250                         if (substr($entry_path,-4) == '.zip') {
251                                   $public_files[$entry] = $entry_path;
252                         }
253                         elseif (self::checkFileContent($entry_path)) {
254                              $public_files[$entry] = $entry_path;
255                         }
256                    }
257               }
258          }
259          return $public_files;
260     }
261
262     protected static function checkFileContent($entry_path)
263     {
264          $ret = false;
265
266          $fp = fopen($entry_path,'rb');
267          $ret = strpos(fgets($fp),'///DOTCLEAR|') === 0;
268          fclose($fp);
269
270          return $ret;
271     }
272
273     private function unzip($file)
274     {
275          $zip = new fileUnzip($file);
276
277          if ($zip->isEmpty()) {
278               $zip->close();
279               return false;//throw new Exception(__('File is empty or not a compressed file.'));
280          }
281
282          foreach($zip->getFilesList() as $zip_file)
283          {
284               # Check zipped file name
285               if (substr($zip_file,-4) != '.txt') {
286                    continue;
287               }
288
289               # Check zipped file contents
290               $content = $zip->unzip($zip_file);
291               if (strpos($content,'///DOTCLEAR|') !== 0) {
292                    unset($content);
293                    continue;
294               }
295
296               $target = path::fullFromRoot($zip_file,dirname($file));
297
298               # Check existing files with same name
299               if (file_exists($target)) {
300                    $zip->close();
301                    unset($content);
302                    throw new Exception(__('Another file with same name exists.'));
303               }
304
305               # Extract backup content
306               if (file_put_contents($target,$content) === false) {
307                    $zip->close();
308                    unset($content);
309                    throw new Exception(__('Failed to extract backup file.'));
310               }
311
312               $zip->close();
313               unset($content);
314
315               # Return extracted file name
316               return $target;
317          }
318
319          $zip->close();
320          throw new Exception(__('No backup in compressed file.'));
321     }
322}
Note: See TracBrowser for help on using the repository browser.

Sites map