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