Current oav website

This commit is contained in:
Charlie Root
2023-03-20 12:18:38 +01:00
commit a096ce07cf
3270 changed files with 261778 additions and 0 deletions

View File

@ -0,0 +1,133 @@
<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
if (!defined('DC_RC_PATH')) { return; }
class backupFile
{
protected $fp;
private $line_cols = array();
private $line_name;
private $replacement = array(
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\n)/u' => "\$1\n",
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\r)/u' => "\$1\r",
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\")/u' => '$1"',
'/(\\\\\\\\)/' => '\\'
);
public function __construct($file)
{
if (file_exists($file) && is_readable($file)) {
$this->fp = fopen($file,'rb');
} else {
throw new Exception(__('No file to read.'));
}
}
public function __destruct()
{
if ($this->fp) {
fclose($this->fp);
}
}
public function getLine()
{
if (feof($this->fp)) {
return false;
}
$line = trim(fgets($this->fp));
if (substr($line,0,1) == '[')
{
$this->line_name = substr($line,1,strpos($line,' ')-1);
$line = substr($line,strpos($line,' ')+1,-1);
$this->line_cols = explode(',',$line);
return $this->getLine();
}
elseif (substr($line,0,1) == '"')
{
$line = preg_replace('/^"|"$/','',$line);
$line = preg_split('/(^"|","|"$)/m',$line);
if (count($this->line_cols) != count($line)) {
throw new Exception('Invalid row count');
}
$res = array();
for ($i=0; $i<count($line); $i++) {
$res[$this->line_cols[$i]] =
preg_replace(array_keys($this->replacement),array_values($this->replacement),$line[$i]);
}
return new backupFileItem($this->line_name,$res);
}
else
{
return $this->getLine();
}
}
}
class backupFileItem
{
public $__name;
private $__data = array();
public function __construct($name,$data)
{
$this->__name = $name;
$this->__data = $data;
}
public function f($name)
{
return iconv('UTF-8','UTF-8//IGNORE',$this->__data[$name]);
}
public function __get($name)
{
return $this->f($name);
}
public function __set($n,$v)
{
$this->__data[$n] = $v;
}
public function exists($n)
{
return isset($this->__data[$n]);
}
public function drop()
{
foreach (func_get_args() as $n) {
if (isset($this->__data[$n])) {
unset($this->__data[$n]);
}
}
}
public function substitute($old,$new)
{
if (isset($this->__data[$old])) {
$this->__data[$new] = $this->__data[$old];
unset($this->__data[$old]);
}
}
}
?>

View File

@ -0,0 +1,106 @@
<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
if (!defined('DC_RC_PATH')) { return; }
class dbExport
{
private $con;
private $prefix;
private $line_reg = array('/\\\\/u', '/\n/u','/\r/u','/"/u');
private $line_rep = array('\\\\\\\\', '\n' ,'\r' ,'\"');
public $fp;
function __construct($con,$out='php://output',$prefix=null)
{
$this->con =& $con;
$this->prefix = $prefix;
if (($this->fp = fopen($out,'w')) === false) {
return false;
}
@set_time_limit(300);
}
function __destruct()
{
if (is_resource($this->fp)) {
fclose($this->fp);
}
}
function export($name,$sql)
{
$rs = $this->con->select($sql);
if (!$rs->isEmpty())
{
fwrite($this->fp,"\n[".$name.' '.implode(',',$rs->columns())."]\n");
while ($rs->fetch()) {
fwrite($this->fp,$this->getLine($rs));
}
fflush($this->fp);
}
}
function exportAll()
{
$tables = $this->getTables();
foreach ($tables as $table)
{
$this->exportTable($table);
}
}
function exportTable($table)
{
$req = 'SELECT * FROM '.$this->con->escapeSystem($this->prefix.$table);
$this->export($table,$req);
}
function getTables()
{
$schema = dbSchema::init($this->con);
$db_tables = $schema->getTables();
$tables = array();
foreach ($db_tables as $t)
{
if ($this->prefix) {
if (strpos($t,$this->prefix) === 0) {
$tables[] = $t;
}
} else {
$tables[] = $t;
}
}
return $tables;
}
function getLine($rs)
{
$l = array();
$cols = $rs->columns();
foreach ($cols as $i => &$c) {
$s = $rs->f($c);
$s = preg_replace($this->line_reg,$this->line_rep,$s);
$s = '"'.$s.'"';
$l[$i] = $s;
}
return implode(',',$l)."\n";
}
}
?>

View File

@ -0,0 +1,857 @@
<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
if (!defined('DC_RC_PATH')) { return; }
class dcImport extends backupFile
{
private $core;
private $con;
private $prefix;
private $dc_version;
private $dc_major;
private $mode;
private $blog_url;
private $blog_name;
private $blog_desc;
private $users = array();
public $old_ids = array(
'category' => array(),
'post' => array(),
'media' => array()
);
public $stack = array(
'categories'=>null,
'cat_id'=>1,
'cat_lft'=>array(),
'post_id'=>1,
'media_id'=>1,
'comment_id'=>1,
'link_id'=>1
);
public $has_categories = false;
public function __construct($core,$file)
{
parent::__construct($file);
$first_line = fgets($this->fp);
if (strpos($first_line,'///DOTCLEAR|') !== 0) {
throw new Exception(__('File is not a DotClear backup.'));
}
@set_time_limit(300);
$l = explode('|',$first_line);
if (isset($l[1])) {
$this->dc_version = $l[1];
}
$this->mode = isset($l[2]) ? strtolower(trim($l[2])) : 'single';
if ($this->mode != 'full' && $this->mode != 'single') {
$this->mode = 'single';
}
if (version_compare('1.2',$this->dc_version,'<=') &&
version_compare('1.3',$this->dc_version,'>')) {
$this->dc_major_version = '1.2';
} else {
$this->dc_major_version = '2.0';
}
$this->core =& $core;
$this->con =& $core->con;
$this->prefix = $core->prefix;
$this->cur_blog = $this->con->openCursor($this->prefix.'blog');
$this->cur_category = $this->con->openCursor($this->prefix.'category');
$this->cur_link = $this->con->openCursor($this->prefix.'link');
$this->cur_setting = $this->con->openCursor($this->prefix.'setting');
$this->cur_user = $this->con->openCursor($this->prefix.'user');
$this->cur_pref = $this->con->openCursor($this->prefix.'pref');
$this->cur_permissions = $this->con->openCursor($this->prefix.'permissions');
$this->cur_post = $this->con->openCursor($this->prefix.'post');
$this->cur_meta = $this->con->openCursor($this->prefix.'meta');
$this->cur_media = $this->con->openCursor($this->prefix.'media');
$this->cur_post_media = $this->con->openCursor($this->prefix.'post_media');
$this->cur_log = $this->con->openCursor($this->prefix.'log');
$this->cur_ping = $this->con->openCursor($this->prefix.'ping');
$this->cur_comment = $this->con->openCursor($this->prefix.'comment');
$this->cur_spamrule = $this->con->openCursor($this->prefix.'spamrule');
$this->cur_version = $this->con->openCursor($this->prefix.'version');
# --BEHAVIOR-- importInit
$this->core->callBehavior('importInit',$this,$this->core);
}
public function importSingle()
{
if ($this->mode != 'single') {
throw new Exception(__('File is not a single blog export.'));
}
if (!$this->core->auth->check('admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$this->blog_id = $this->core->blog->id;
$this->stack['categories'] = $this->con->select(
'SELECT cat_id, cat_title, cat_url '.
'FROM '.$this->prefix.'category '.
"WHERE blog_id = '".$this->con->escape($this->blog_id)."' "
);
$rs = $this->con->select('SELECT MAX(cat_id) FROM '.$this->prefix.'category');
$this->stack['cat_id'] = ((integer) $rs->f(0))+1;
$rs = $this->con->select('SELECT MAX(link_id) FROM '.$this->prefix.'link');
$this->stack['link_id'] = ((integer) $rs->f(0))+1;
$rs = $this->con->select('SELECT MAX(post_id) FROM '.$this->prefix.'post');
$this->stack['post_id'] = ((integer) $rs->f(0))+1;
$rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->prefix.'media');
$this->stack['media_id'] = ((integer) $rs->f(0))+1;
$rs = $this->con->select('SELECT MAX(comment_id) FROM '.$this->prefix.'comment');
$this->stack['comment_id'] = ((integer) $rs->f(0))+1;
$rs = $this->con->select(
'SELECT MAX(cat_rgt) AS cat_rgt FROM '.$this->prefix.'category '.
"WHERE blog_id = '".$this->con->escape($this->core->blog->id)."'"
);
if ((integer) $rs->cat_rgt > 0) {
$this->has_categories = true;
$this->stack['cat_lft'][$this->core->blog->id] = (integer) $rs->cat_rgt + 1;
}
$this->con->begin();
try
{
$last_line_name = '';
$constrained = array('post', 'meta', 'post_media', 'ping', 'comment');
while (($line = $this->getLine()) !== false)
{
# import DC 1.2.x, we fix lines before insert
if ($this->dc_major_version == '1.2') {
$this->prepareDC12line($line);
}
if ($last_line_name != $line->__name) {
if (in_array($last_line_name,$constrained)) {
# UNDEFER
if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 1');
if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
}
if (in_array($line->__name,$constrained)) {
# DEFER
if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 0');
if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL IMMEDIATE');
}
$last_line_name = $line->__name;
}
switch ($line->__name)
{
case 'category':
$this->insertCategorySingle($line);
break;
case 'link':
$this->insertLinkSingle($line);
break;
case 'post':
$this->insertPostSingle($line);
break;
case 'meta':
$this->insertMetaSingle($line);
break;
case 'media':
$this->insertMediaSingle($line);
break;
case 'post_media':
$this->insertPostMediaSingle($line);
break;
case 'ping':
$this->insertPingSingle($line);
break;
case 'comment':
$this->insertCommentSingle($line);
break;
}
# --BEHAVIOR-- importSingle
$this->core->callBehavior('importSingle',$line,$this,$this->core);
}
if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 1');
if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
}
catch (Exception $e)
{
$this->con->rollback();
throw $e;
}
$this->con->commit();
}
public function importFull()
{
if ($this->mode != 'full') {
throw new Exception(__('File is not a full export.'));
}
if (!$this->core->auth->isSuperAdmin()) {
throw new Exception(__('Permission denied.'));
}
$this->con->begin();
$this->con->execute('DELETE FROM '.$this->prefix.'blog');
$this->con->execute('DELETE FROM '.$this->prefix.'media');
$this->con->execute('DELETE FROM '.$this->prefix.'spamrule');
$this->con->execute('DELETE FROM '.$this->prefix.'setting');
try
{
while (($line = $this->getLine()) !== false)
{
switch ($line->__name)
{
case 'blog':
$this->insertBlog($line);
break;
case 'category':
$this->insertCategory($line);
break;
case 'link':
$this->insertLink($line);
break;
case 'setting':
$this->insertSetting($line);
break;
case 'user':
$this->insertUser($line);
break;
case 'pref':
$this->insertPref($line);
break;
case 'permissions':
$this->insertPermissions($line);
break;
case 'post':
$this->insertPost($line);
break;
case 'meta':
$this->insertMeta($line);
break;
case 'media':
$this->insertMedia($line);
break;
case 'post_media':
$this->insertPostMedia($line);
break;
case 'log';
$this->insertLog($line);
break;
case 'ping':
$this->insertPing($line);
break;
case 'comment':
$this->insertComment($line);
break;
case 'spamrule':
$this->insertSpamRule($line);
break;
}
# --BEHAVIOR-- importFull
$this->core->callBehavior('importFull',$line,$this,$this->core);
}
}
catch (Exception $e)
{
$this->con->rollback();
throw $e;
}
$this->con->commit();
}
private function insertBlog($blog)
{
$this->cur_blog->clean();
$this->cur_blog->blog_id = (string) $blog->blog_id;
$this->cur_blog->blog_uid = (string) $blog->blog_uid;
$this->cur_blog->blog_creadt = (string) $blog->blog_creadt;
$this->cur_blog->blog_upddt = (string) $blog->blog_upddt;
$this->cur_blog->blog_url = (string) $blog->blog_url;
$this->cur_blog->blog_name = (string) $blog->blog_name;
$this->cur_blog->blog_desc = (string) $blog->blog_desc;
$this->cur_blog->blog_status = $blog->exists('blog_status') ? (integer) $blog->blog_status : 1;
$this->cur_blog->insert();
}
private function insertCategory($category)
{
$this->cur_category->clean();
$this->cur_category->cat_id = (string) $category->cat_id;
$this->cur_category->blog_id = (string) $category->blog_id;
$this->cur_category->cat_title = (string) $category->cat_title;
$this->cur_category->cat_url = (string) $category->cat_url;
$this->cur_category->cat_desc = (string) $category->cat_desc;
if (!$this->has_categories && $category->exists('cat_lft') && $category->exists('cat_rgt')) {
$this->cur_category->cat_lft = (integer) $category->cat_lft;
$this->cur_category->cat_rgt = (integer) $category->cat_rgt;
} else {
if (!isset($this->stack['cat_lft'][$category->blog_id])) {
$this->stack['cat_lft'][$category->blog_id] = 2;
}
$this->cur_category->cat_lft = $this->stack['cat_lft'][$category->blog_id]++;
$this->cur_category->cat_rgt = $this->stack['cat_lft'][$category->blog_id]++;
}
$this->cur_category->insert();
}
private function insertLink($link)
{
$this->cur_link->clean();
$this->cur_link->link_id = (integer) $link->link_id;
$this->cur_link->blog_id = (string) $link->blog_id;
$this->cur_link->link_href = (string) $link->link_href;
$this->cur_link->link_title = (string) $link->link_title;
$this->cur_link->link_desc = (string) $link->link_desc;
$this->cur_link->link_lang = (string) $link->link_lang;
$this->cur_link->link_xfn = (string) $link->link_xfn;
$this->cur_link->link_position = (integer) $link->link_position;
$this->cur_link->insert();
}
private function insertSetting($setting)
{
$this->cur_setting->clean();
$this->cur_setting->setting_id = (string) $setting->setting_id;
$this->cur_setting->blog_id = !$setting->blog_id ? null : (string) $setting->blog_id;
$this->cur_setting->setting_ns = (string) $setting->setting_ns;
$this->cur_setting->setting_value = (string) $setting->setting_value;
$this->cur_setting->setting_type = (string) $setting->setting_type;
$this->cur_setting->setting_label = (string) $setting->setting_label;
$this->cur_setting->insert();
}
private function insertPref($pref)
{
if ($this->prefExists($pref->pref_ws,$pref->pref_id,$pref->user_id)) {
return;
}
$this->cur_pref->clean();
$this->cur_pref->pref_id = (string) $pref->pref_id;
$this->cur_pref->user_id = !$pref->user_id ? null : (string) $pref->user_id;
$this->cur_pref->pref_ws = (string) $pref->pref_ws;
$this->cur_pref->pref_value = (string) $pref->pref_value;
$this->cur_pref->pref_type = (string) $pref->pref_type;
$this->cur_pref->pref_label = (string) $pref->pref_label;
$this->cur_pref->insert();
}
private function insertUser($user)
{
if ($this->userExists($user->user_id)) {
return;
}
$this->cur_user->clean();
$this->cur_user->user_id = (string) $user->user_id;
$this->cur_user->user_super = (integer) $user->user_super;
$this->cur_user->user_pwd = (string) $user->user_pwd;
$this->cur_user->user_recover_key = (string) $user->user_recover_key;
$this->cur_user->user_name = (string) $user->user_name;
$this->cur_user->user_firstname = (string) $user->user_firstname;
$this->cur_user->user_displayname = (string) $user->user_displayname;
$this->cur_user->user_email = (string) $user->user_email;
$this->cur_user->user_url = (string) $user->user_url;
$this->cur_user->user_default_blog = !$user->user_default_blog ? null : (string) $user->user_default_blog;
$this->cur_user->user_lang = (string) $user->user_lang;
$this->cur_user->user_tz = (string) $user->user_tz;
$this->cur_user->user_post_status = (integer) $user->user_post_status;
$this->cur_user->user_creadt = (string) $user->user_creadt;
$this->cur_user->user_upddt = (string) $user->user_upddt;
$this->cur_user->user_desc = $user->exists('user_desc') ? (string) $user->user_desc : null;
$this->cur_user->user_options = $user->exists('user_options') ? (string) $user->user_options : null;
$this->cur_user->user_status = $user->exists('user_status') ? (integer) $user->user_status : 1;
$this->cur_user->insert();
$this->stack['users'][$user->user_id] = true;
}
private function insertPermissions($permissions)
{
$this->cur_permissions->clean();
$this->cur_permissions->user_id = (string) $permissions->user_id;
$this->cur_permissions->blog_id = (string) $permissions->blog_id;
$this->cur_permissions->permissions = (string) $permissions->permissions;
$this->cur_permissions->insert();
}
private function insertPost($post)
{
$this->cur_post->clean();
$cat_id = (integer) $post->cat_id;
if (!$cat_id) {
$cat_id = null;
}
$post_password = $post->post_password ? (string) $post->post_password : null;
$this->cur_post->post_id = (integer) $post->post_id;
$this->cur_post->blog_id = (string) $post->blog_id;
$this->cur_post->user_id = (string) $this->getUserId($post->user_id);
$this->cur_post->cat_id = $cat_id;
$this->cur_post->post_dt = (string) $post->post_dt;
$this->cur_post->post_creadt = (string) $post->post_creadt;
$this->cur_post->post_upddt = (string) $post->post_upddt;
$this->cur_post->post_password = $post_password;
$this->cur_post->post_type = (string) $post->post_type;
$this->cur_post->post_format = (string) $post->post_format;
$this->cur_post->post_url = (string) $post->post_url;
$this->cur_post->post_lang = (string) $post->post_lang;
$this->cur_post->post_title = (string) $post->post_title;
$this->cur_post->post_excerpt = (string) $post->post_excerpt;
$this->cur_post->post_excerpt_xhtml = (string) $post->post_excerpt_xhtml;
$this->cur_post->post_content = (string) $post->post_content;
$this->cur_post->post_content_xhtml = (string) $post->post_content_xhtml;
$this->cur_post->post_notes = (string) $post->post_notes;
$this->cur_post->post_words = (string) $post->post_words;
$this->cur_post->post_meta = (string) $post->post_meta;
$this->cur_post->post_status = (integer) $post->post_status;
$this->cur_post->post_selected = (integer) $post->post_selected;
$this->cur_post->post_open_comment = (integer) $post->post_open_comment;
$this->cur_post->post_open_tb = (integer) $post->post_open_tb;
$this->cur_post->nb_comment = (integer) $post->nb_comment;
$this->cur_post->nb_trackback = (integer) $post->nb_trackback;
$this->cur_post->post_tz = $post->exists('post_tz') ? (string) $post->post_tz : 'UTC';
$this->cur_post->insert();
}
private function insertMeta($meta)
{
$this->cur_meta->clean();
$this->cur_meta->meta_id = (string) $meta->meta_id;
$this->cur_meta->meta_type = (string) $meta->meta_type;
$this->cur_meta->post_id = (integer) $meta->post_id;
$this->cur_meta->insert();
}
private function insertMedia($media)
{
$this->cur_media->clean();
$this->cur_media->media_id = (integer) $media->media_id;
$this->cur_media->user_id = (string) $media->user_id;
$this->cur_media->media_path = (string) $media->media_path;
$this->cur_media->media_title = (string) $media->media_title;
$this->cur_media->media_file = (string) $media->media_file;
$this->cur_media->media_meta = (string) $media->media_meta;
$this->cur_media->media_dt = (string) $media->media_dt;
$this->cur_media->media_creadt = (string) $media->media_creadt;
$this->cur_media->media_upddt = (string) $media->media_upddt;
$this->cur_media->media_private = (integer) $media->media_private;
$this->cur_media->media_dir = $media->exists('media_dir') ? (string) $media->media_dir : dirname($media->media_file);
if (!$this->mediaExists()) {
$this->cur_media->insert();
}
}
private function insertPostMedia($post_media)
{
$this->cur_post_media->clean();
$this->cur_post_media->media_id = (integer) $post_media->media_id;
$this->cur_post_media->post_id = (integer) $post_media->post_id;
$this->cur_post_media->insert();
}
private function insertLog($log)
{
$this->cur_log->clean();
$this->cur_log->log_id = (integer) $log->log_id;
$this->cur_log->user_id = (string) $log->user_id;
$this->cur_log->log_table = (string) $log->log_table;
$this->cur_log->log_dt = (string) $log->log_dt;
$this->cur_log->log_ip = (string) $log->log_ip;
$this->cur_log->log_msg = (string) $log->log_msg;
$this->cur_log->insert();
}
private function insertPing($ping)
{
$this->cur_ping->clean();
$this->cur_ping->post_id = (integer) $ping->post_id;
$this->cur_ping->ping_url = (string) $ping->ping_url;
$this->cur_ping->ping_dt = (string) $ping->ping_dt;
$this->cur_ping->insert();
}
private function insertComment($comment)
{
$this->cur_comment->clean();
$this->cur_comment->comment_id = (integer) $comment->comment_id;
$this->cur_comment->post_id = (integer) $comment->post_id;
$this->cur_comment->comment_dt = (string) $comment->comment_dt;
$this->cur_comment->comment_upddt = (string) $comment->comment_upddt;
$this->cur_comment->comment_author = (string) $comment->comment_author;
$this->cur_comment->comment_email = (string) $comment->comment_email;
$this->cur_comment->comment_site = (string) $comment->comment_site;
$this->cur_comment->comment_content = (string) $comment->comment_content;
$this->cur_comment->comment_words = (string) $comment->comment_words;
$this->cur_comment->comment_ip = (string) $comment->comment_ip;
$this->cur_comment->comment_status = (integer) $comment->comment_status;
$this->cur_comment->comment_spam_status = (integer) $comment->comment_spam_status;
$this->cur_comment->comment_trackback = (integer) $comment->comment_trackback;
$this->cur_comment->comment_tz = $comment->exists('comment_tz') ? (string) $comment->comment_tz : 'UTC';
$this->cur_comment->comment_spam_filter = $comment->exists('comment_spam_filter') ? (integer) $comment->comment_spam_filter : null;
$this->cur_comment->insert();
}
private function insertSpamRule($spamrule)
{
$this->cur_spamrule->clean();
$this->cur_spamrule->rule_id = (integer) $spamrule->rule_id;
$this->cur_spamrule->blog_id = !$spamrule->blog_id ? null : (string) $spamrule->blog_id;
$this->cur_spamrule->rule_type = (string) $spamrule->rule_type;
$this->cur_spamrule->rule_content = (string) $spamrule->rule_content;
$this->cur_spamrule->insert();
}
private function insertCategorySingle($category)
{
$this->cur_category->clean();
$m = $this->searchCategory($this->stack['categories'],$category->cat_url);
$old_id = $category->cat_id;
if ($m !== false)
{
$cat_id = $m;
}
else
{
$cat_id = $this->stack['cat_id'];
$category->cat_id = $cat_id;
$category->blog_id = $this->blog_id;
$this->insertCategory($category);
$this->stack['cat_id']++;
}
$this->old_ids['category'][(integer) $old_id] = $cat_id;
}
private function insertLinkSingle($link)
{
$link->blog_id = $this->blog_id;
$link->link_id = $this->stack['link_id'];
$this->insertLink($link);
$this->stack['link_id']++;
}
private function insertPostSingle($post)
{
if (!$post->cat_id || isset($this->old_ids['category'][(integer) $post->cat_id])) {
$post_id = $this->stack['post_id'];
$this->old_ids['post'][(integer) $post->post_id] = $post_id;
$cat_id = $post->cat_id ? $this->old_ids['category'][(integer) $post->cat_id] : null;
$post->post_id = $post_id;
$post->cat_id = $cat_id;
$post->blog_id = $this->blog_id;
$post->post_url = $this->core->blog->getPostURL(
$post->post_url,$post->post_dt,$post->post_title,$post->post_id
);
$this->insertPost($post);
$this->stack['post_id']++;
} else {
throw new Exception(__('The backup file does not appear to be well formed.'));
}
}
private function insertMetaSingle($meta)
{
if (isset($this->old_ids['post'][(integer) $meta->post_id])) {
$meta->post_id = $this->old_ids['post'][(integer) $meta->post_id];
$this->insertMeta($meta);
} else {
throw new Exception(__('The backup file does not appear to be well formed.'));
}
}
private function insertMediaSingle($media)
{
$media_id = $this->stack['media_id'];
$old_id = $media->media_id;
$media->media_id = $media_id;
$media->media_path = $this->core->blog->settings->system->public_path;
$media->user_id = $this->getUserId($media->user_id);
$this->insertMedia($media);
$this->stack['media_id']++;
$this->old_ids['media'][(integer) $old_id] = $media_id;
}
private function insertPostMediaSingle($post_media)
{
if (isset($this->old_ids['media'][(integer) $post_media->media_id]) &&
isset($this->old_ids['post'][(integer) $post_media->post_id])) {
$post_media->media_id = $this->old_ids['media'][(integer) $post_media->media_id];
$post_media->post_id = $this->old_ids['post'][(integer) $post_media->post_id];
$this->insertPostMedia($post_media);
} else {
throw new Exception(__('The backup file does not appear to be well formed.'));
}
}
private function insertPingSingle($ping)
{
if (isset($this->old_ids['post'][(integer) $ping->post_id])) {
$ping->post_id = $this->old_ids['post'][(integer) $ping->post_id];
$this->insertPing($ping);
} else {
throw new Exception(__('The backup file does not appear to be well formed.'));
}
}
private function insertCommentSingle($comment)
{
if (isset($this->old_ids['post'][(integer) $comment->post_id])) {
$comment_id = $this->stack['comment_id'];
$comment->comment_id = $comment_id;
$comment->post_id = $this->old_ids['post'][(integer) $comment->post_id];
$this->insertComment($comment);
$this->stack['comment_id']++;
} else {
throw new Exception(__('The backup file does not appear to be well formed.'));
}
}
public function searchCategory($rs,$url)
{
while ($rs->fetch())
{
if ($rs->cat_url == $url) {
return $rs->cat_id;
}
}
return false;
}
public function getUserId($user_id)
{
if (!$this->userExists($user_id))
{
if ($this->core->auth->isSuperAdmin())
{
# Sanitizes user_id and create a lambda user
$user_id = preg_replace('/[^A-Za-z0-9]$/','',$user_id);
$user_id .= strlen($user_id) < 2 ? '-a' : '';
# We change user_id, we need to check again
if (!$this->userExists($user_id))
{
$this->cur_user->clean();
$this->cur_user->user_id = (string) $user_id;
$this->cur_user->user_pwd = md5(uniqid());
$this->core->addUser($this->cur_user);
$this->stack['users'][$user_id] = true;
}
}
else
{
# Returns current user id
$user_id = $this->core->auth->userID();
}
}
return $user_id;
}
private function userExists($user_id)
{
if (isset($this->stack['users'][$user_id])) {
return $this->stack['users'][$user_id];
}
$strReq = 'SELECT user_id '.
'FROM '.$this->prefix.'user '.
"WHERE user_id = '".$this->con->escape($user_id)."' ";
$rs = $this->con->select($strReq);
$this->stack['users'][$user_id] = !$rs->isEmpty();
return $this->stack['users'][$user_id];
}
private function prefExists($pref_ws,$pref_id,$user_id)
{
$strReq = 'SELECT pref_id,pref_ws,user_id '.
'FROM '.$this->prefix.'pref '.
"WHERE pref_id = '".$this->con->escape($pref_id)."' ".
"AND pref_ws = '".$this->con->escape($pref_ws)."' ";
if (!$user_id) {
$strReq .= "AND user_id IS NULL ";
} else {
$strReq .= "AND user_id = '".$this->con->escape($user_id)."' ";
}
$rs = $this->con->select($strReq);
return !$rs->isEmpty();
}
private function mediaExists()
{
$strReq = 'SELECT media_id '.
'FROM '.$this->prefix.'media '.
"WHERE media_path = '".$this->cur_media->media_path."' ".
"AND media_file = '".$this->cur_media->media_file."' ";
$rs = $this->con->select($strReq);
return !$rs->isEmpty();
}
private function prepareDC12line(&$line)
{
$settings = array('dc_theme','dc_nb_post_per_page','dc_allow_comments',
'dc_allow_trackbacks','dc_comment_pub','dc_comments_ttl',
'dc_wiki_comments','dc_use_smilies','dc_date_format','dc_time_format',
'dc_url_scan');
switch ($line->__name)
{
case 'categorie':
$line->substitute('cat_libelle','cat_title');
$line->substitute('cat_libelle_url','cat_url');
$line->__name = 'category';
$line->blog_id = 'default';
break;
case 'link':
$line->substitute('href','link_href');
$line->substitute('label','link_title');
$line->substitute('title','link_desc');
$line->substitute('lang','link_lang');
$line->substitute('rel','link_xfn');
$line->substitute('position','link_position');
$line->blog_id = 'default';
break;
case 'post':
$line->substitute('post_titre','post_title');
$line->post_title = html::decodeEntities($line->post_title);
$line->post_url = date('Y/m/d/',strtotime($line->post_dt)).$line->post_id.'-'.$line->post_titre_url;
$line->post_url = substr($line->post_url,0,255);
$line->post_format = $line->post_content_wiki == '' ? 'xhtml' : 'wiki';
$line->post_content_xhtml = $line->post_content;
$line->post_excerpt_xhtml = $line->post_chapo;
if ($line->post_format == 'wiki') {
$line->post_content = $line->post_content_wiki;
$line->post_excerpt = $line->post_chapo_wiki;
} else {
$line->post_content = $line->post_content;
$line->post_excerpt = $line->post_chapo;
}
$line->post_status = (integer) $line->post_pub;
$line->post_type = 'post';
$line->blog_id = 'default';
$line->drop('post_titre_url','post_content_wiki','post_chapo','post_chapo_wiki','post_pub');
break;
case 'post_meta':
$line->drop('meta_id');
$line->substitute('meta_key','meta_type');
$line->substitute('meta_value','meta_id');
$line->__name = 'meta';
$line->blog_id = 'default';
break;
case 'comment':
$line->substitute('comment_auteur','comment_author');
if ($line->comment_site != '' && !preg_match('!^http://.*$!', $line->comment_site,$m)) {
$line->comment_site = 'http://'.$line->comment_site;
}
$line->comment_status = (integer) $line->comment_pub;
$line->drop('comment_pub');
break;
}
# --BEHAVIOR-- importPrepareDC12
$this->core->callBehavior('importPrepareDC12',$line,$this,$this->core);
}
}
?>

View File

@ -0,0 +1,142 @@
<?php
/**
* @brief importExport, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugins
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
if (!defined('DC_RC_PATH')) {return;}
class flatBackup
{
protected $fp;
private $line_cols = [];
private $line_name;
private $line_num;
private $replacement = [
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\n)/u' => "\$1\n",
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\r)/u' => "\$1\r",
'/(?<!\\\\)(?>(\\\\\\\\)*+)(\\\\")/u' => '$1"',
'/(\\\\\\\\)/' => '\\'
];
public function __construct($file)
{
if (file_exists($file) && is_readable($file)) {
$this->fp = fopen($file, 'rb');
$this->line_num = 1;
} else {
throw new Exception(__('No file to read.'));
}
}
public function __destruct()
{
if ($this->fp) {
@fclose($this->fp);
}
}
public function getLine()
{
if (($line = $this->nextLine()) === false) {
return false;
}
if (substr($line, 0, 1) == '[') {
$this->line_name = substr($line, 1, strpos($line, ' ') - 1);
$line = substr($line, strpos($line, ' ') + 1, -1);
$this->line_cols = explode(',', $line);
return $this->getLine();
} elseif (substr($line, 0, 1) == '"') {
$line = preg_replace('/^"|"$/', '', $line);
$line = preg_split('/(^"|","|(?<!\\\)\"$)/m', $line);
if (count($this->line_cols) != count($line)) {
throw new Exception(sprintf('Invalid row count at line %s', $this->line_num));
}
$res = [];
for ($i = 0; $i < count($line); $i++) {
$res[$this->line_cols[$i]] =
preg_replace(array_keys($this->replacement), array_values($this->replacement), $line[$i]);
}
return new flatBackupItem($this->line_name, $res, $this->line_num);
} else {
return $this->getLine();
}
}
private function nextLine()
{
if (feof($this->fp)) {
return false;
}
$this->line_num++;
$line = fgets($this->fp);
$line = trim($line);
return empty($line) ? $this->nextLine() : $line;
}
}
class flatBackupItem
{
public $__name;
public $__line;
private $__data = [];
public function __construct($name, $data, $line)
{
$this->__name = $name;
$this->__data = $data;
$this->__line = $line;
}
public function f($name)
{
return iconv('UTF-8', 'UTF-8//IGNORE', $this->__data[$name]);
}
public function __get($name)
{
return $this->f($name);
}
public function __set($n, $v)
{
$this->__data[$n] = $v;
}
public function exists($n)
{
return isset($this->__data[$n]);
}
public function drop(...$args)
{
foreach ($args as $n) {
if (isset($this->__data[$n])) {
unset($this->__data[$n]);
}
}
}
public function substitute($old, $new)
{
if (isset($this->__data[$old])) {
$this->__data[$new] = $this->__data[$old];
unset($this->__data[$old]);
}
}
}

View File

@ -0,0 +1,102 @@
<?php
/**
* @brief importExport, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugins
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
if (!defined('DC_RC_PATH')) {return;}
class flatExport
{
private $con;
private $prefix;
private $line_reg = ['/\\\\/u', '/\n/u', '/\r/u', '/"/u'];
private $line_rep = ['\\\\\\\\', '\n', '\r', '\"'];
public $fp;
public function __construct($con, $out = 'php://output', $prefix = null)
{
$this->con = &$con;
$this->prefix = $prefix;
if (($this->fp = fopen($out, 'w')) === false) {
return false;
}
@set_time_limit(300);
}
public function __destruct()
{
if (is_resource($this->fp)) {
fclose($this->fp);
}
}
public function export($name, $sql)
{
$rs = $this->con->select($sql);
if (!$rs->isEmpty()) {
fwrite($this->fp, "\n[" . $name . ' ' . implode(',', $rs->columns()) . "]\n");
while ($rs->fetch()) {
fwrite($this->fp, $this->getLine($rs));
}
fflush($this->fp);
}
}
public function exportAll()
{
$tables = $this->getTables();
foreach ($tables as $table) {
$this->exportTable($table);
}
}
public function exportTable($table)
{
$req = 'SELECT * FROM ' . $this->con->escapeSystem($this->prefix . $table);
$this->export($table, $req);
}
public function getTables()
{
$schema = dbSchema::init($this->con);
$db_tables = $schema->getTables();
$tables = [];
foreach ($db_tables as $t) {
if ($this->prefix) {
if (strpos($t, $this->prefix) === 0) {
$tables[] = $t;
}
} else {
$tables[] = $t;
}
}
return $tables;
}
public function getLine($rs)
{
$l = [];
$cols = $rs->columns();
foreach ($cols as $i => &$c) {
$s = $rs->f($c);
$s = preg_replace($this->line_reg, $this->line_rep, $s);
$s = '"' . $s . '"';
$l[$i] = $s;
}
return implode(',', $l) . "\n";
}
}

View File

@ -0,0 +1,881 @@
<?php
/**
* @brief importExport, a plugin for Dotclear 2
*
* @package Dotclear
* @subpackage Plugins
*
* @copyright Olivier Meunier & Association Dotclear
* @copyright GPL-2.0-only
*/
if (!defined('DC_RC_PATH')) {return;}
class flatImport extends flatBackup
{
private $core;
private $con;
private $prefix;
private $dc_version;
private $dc_major;
private $mode;
private $blog_url;
private $blog_name;
private $blog_desc;
private $users = [];
public $old_ids = [
'category' => [],
'post' => [],
'media' => []
];
public $stack = [
'categories' => null,
'cat_id' => 1,
'cat_lft' => [],
'post_id' => 1,
'media_id' => 1,
'comment_id' => 1,
'link_id' => 1,
'log_id' => 1
];
public $has_categories = false;
public function __construct($core, $file)
{
parent::__construct($file);
$first_line = fgets($this->fp);
if (strpos($first_line, '///DOTCLEAR|') !== 0) {
throw new Exception(__('File is not a DotClear backup.'));
}
@set_time_limit(300);
$l = explode('|', $first_line);
if (isset($l[1])) {
$this->dc_version = $l[1];
}
$this->mode = isset($l[2]) ? strtolower(trim($l[2])) : 'single';
if ($this->mode != 'full' && $this->mode != 'single') {
$this->mode = 'single';
}
if (version_compare('1.2', $this->dc_version, '<=') &&
version_compare('1.3', $this->dc_version, '>')) {
$this->dc_major_version = '1.2';
} else {
$this->dc_major_version = '2.0';
}
$this->core = &$core;
$this->con = &$core->con;
$this->prefix = $core->prefix;
$this->cur_blog = $this->con->openCursor($this->prefix . 'blog');
$this->cur_category = $this->con->openCursor($this->prefix . 'category');
$this->cur_link = $this->con->openCursor($this->prefix . 'link');
$this->cur_setting = $this->con->openCursor($this->prefix . 'setting');
$this->cur_user = $this->con->openCursor($this->prefix . 'user');
$this->cur_pref = $this->con->openCursor($this->prefix . 'pref');
$this->cur_permissions = $this->con->openCursor($this->prefix . 'permissions');
$this->cur_post = $this->con->openCursor($this->prefix . 'post');
$this->cur_meta = $this->con->openCursor($this->prefix . 'meta');
$this->cur_media = $this->con->openCursor($this->prefix . 'media');
$this->cur_post_media = $this->con->openCursor($this->prefix . 'post_media');
$this->cur_log = $this->con->openCursor($this->prefix . 'log');
$this->cur_ping = $this->con->openCursor($this->prefix . 'ping');
$this->cur_comment = $this->con->openCursor($this->prefix . 'comment');
$this->cur_spamrule = $this->con->openCursor($this->prefix . 'spamrule');
$this->cur_version = $this->con->openCursor($this->prefix . 'version');
# --BEHAVIOR-- importInit
$this->core->callBehavior('importInit', $this, $this->core);
}
public function getMode()
{
return $this->mode;
}
public function importSingle()
{
if ($this->mode != 'single') {
throw new Exception(__('File is not a single blog export.'));
}
if (!$this->core->auth->check('admin', $this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$this->blog_id = $this->core->blog->id;
$this->stack['categories'] = $this->con->select(
'SELECT cat_id, cat_title, cat_url ' .
'FROM ' . $this->prefix . 'category ' .
"WHERE blog_id = '" . $this->con->escape($this->blog_id) . "' "
);
$rs = $this->con->select('SELECT MAX(cat_id) FROM ' . $this->prefix . 'category');
$this->stack['cat_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select('SELECT MAX(link_id) FROM ' . $this->prefix . 'link');
$this->stack['link_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select('SELECT MAX(post_id) FROM ' . $this->prefix . 'post');
$this->stack['post_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select('SELECT MAX(media_id) FROM ' . $this->prefix . 'media');
$this->stack['media_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select('SELECT MAX(comment_id) FROM ' . $this->prefix . 'comment');
$this->stack['comment_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select('SELECT MAX(log_id) FROM ' . $this->prefix . 'log');
$this->stack['log_id'] = ((integer) $rs->f(0)) + 1;
$rs = $this->con->select(
'SELECT MAX(cat_rgt) AS cat_rgt FROM ' . $this->prefix . 'category ' .
"WHERE blog_id = '" . $this->con->escape($this->core->blog->id) . "'"
);
if ((integer) $rs->cat_rgt > 0) {
$this->has_categories = true;
$this->stack['cat_lft'][$this->core->blog->id] = (integer) $rs->cat_rgt + 1;
}
$this->con->begin();
try
{
$last_line_name = '';
$constrained = ['post', 'meta', 'post_media', 'ping', 'comment'];
while (($line = $this->getLine()) !== false) {
# import DC 1.2.x, we fix lines before insert
if ($this->dc_major_version == '1.2') {
$this->prepareDC12line($line);
}
if ($last_line_name != $line->__name) {
if (in_array($last_line_name, $constrained)) {
# UNDEFER
if ($this->con->syntax() == 'mysql') {
$this->con->execute('SET foreign_key_checks = 1');
}
if ($this->con->syntax() == 'postgresql') {
$this->con->execute('SET CONSTRAINTS ALL DEFERRED');
}
}
if (in_array($line->__name, $constrained)) {
# DEFER
if ($this->con->syntax() == 'mysql') {
$this->con->execute('SET foreign_key_checks = 0');
}
if ($this->con->syntax() == 'postgresql') {
$this->con->execute('SET CONSTRAINTS ALL IMMEDIATE');
}
}
$last_line_name = $line->__name;
}
switch ($line->__name) {
case 'category':
$this->insertCategorySingle($line);
break;
case 'link':
$this->insertLinkSingle($line);
break;
case 'post':
$this->insertPostSingle($line);
break;
case 'meta':
$this->insertMetaSingle($line);
break;
case 'media':
$this->insertMediaSingle($line);
break;
case 'post_media':
$this->insertPostMediaSingle($line);
break;
case 'ping':
$this->insertPingSingle($line);
break;
case 'comment':
$this->insertCommentSingle($line);
break;
}
# --BEHAVIOR-- importSingle
$this->core->callBehavior('importSingle', $line, $this, $this->core);
}
if ($this->con->syntax() == 'mysql') {
$this->con->execute('SET foreign_key_checks = 1');
}
if ($this->con->syntax() == 'postgresql') {
$this->con->execute('SET CONSTRAINTS ALL DEFERRED');
}
} catch (Exception $e) {
@fclose($this->fp);
$this->con->rollback();
throw new Exception($e->getMessage() . ' - ' . sprintf(__('Error raised at line %s'), $line->__line));
}
@fclose($this->fp);
$this->con->commit();
}
public function importFull()
{
if ($this->mode != 'full') {
throw new Exception(__('File is not a full export.'));
}
if (!$this->core->auth->isSuperAdmin()) {
throw new Exception(__('Permission denied.'));
}
$this->con->begin();
$this->con->execute('DELETE FROM ' . $this->prefix . 'blog');
$this->con->execute('DELETE FROM ' . $this->prefix . 'media');
$this->con->execute('DELETE FROM ' . $this->prefix . 'spamrule');
$this->con->execute('DELETE FROM ' . $this->prefix . 'setting');
$this->con->execute('DELETE FROM ' . $this->prefix . 'log');
try
{
while (($line = $this->getLine()) !== false) {
switch ($line->__name) {
case 'blog':
$this->insertBlog($line);
break;
case 'category':
$this->insertCategory($line);
break;
case 'link':
$this->insertLink($line);
break;
case 'setting':
$this->insertSetting($line);
break;
case 'user':
$this->insertUser($line);
break;
case 'pref':
$this->insertPref($line);
break;
case 'permissions':
$this->insertPermissions($line);
break;
case 'post':
$this->insertPost($line);
break;
case 'meta':
$this->insertMeta($line);
break;
case 'media':
$this->insertMedia($line);
break;
case 'post_media':
$this->insertPostMedia($line);
break;
case 'log';
$this->insertLog($line);
break;
case 'ping':
$this->insertPing($line);
break;
case 'comment':
$this->insertComment($line);
break;
case 'spamrule':
$this->insertSpamRule($line);
break;
}
# --BEHAVIOR-- importFull
$this->core->callBehavior('importFull', $line, $this, $this->core);
}
} catch (Exception $e) {
@fclose($this->fp);
$this->con->rollback();
throw new Exception($e->getMessage() . ' - ' . sprintf(__('Error raised at line %s'), $line->__line));
}
@fclose($this->fp);
$this->con->commit();
}
private function insertBlog($blog)
{
$this->cur_blog->clean();
$this->cur_blog->blog_id = (string) $blog->blog_id;
$this->cur_blog->blog_uid = (string) $blog->blog_uid;
$this->cur_blog->blog_creadt = (string) $blog->blog_creadt;
$this->cur_blog->blog_upddt = (string) $blog->blog_upddt;
$this->cur_blog->blog_url = (string) $blog->blog_url;
$this->cur_blog->blog_name = (string) $blog->blog_name;
$this->cur_blog->blog_desc = (string) $blog->blog_desc;
$this->cur_blog->blog_status = $blog->exists('blog_status') ? (integer) $blog->blog_status : 1;
$this->cur_blog->insert();
}
private function insertCategory($category)
{
$this->cur_category->clean();
$this->cur_category->cat_id = (string) $category->cat_id;
$this->cur_category->blog_id = (string) $category->blog_id;
$this->cur_category->cat_title = (string) $category->cat_title;
$this->cur_category->cat_url = (string) $category->cat_url;
$this->cur_category->cat_desc = (string) $category->cat_desc;
if (!$this->has_categories && $category->exists('cat_lft') && $category->exists('cat_rgt')) {
$this->cur_category->cat_lft = (integer) $category->cat_lft;
$this->cur_category->cat_rgt = (integer) $category->cat_rgt;
} else {
if (!isset($this->stack['cat_lft'][$category->blog_id])) {
$this->stack['cat_lft'][$category->blog_id] = 2;
}
$this->cur_category->cat_lft = $this->stack['cat_lft'][$category->blog_id]++;
$this->cur_category->cat_rgt = $this->stack['cat_lft'][$category->blog_id]++;
}
$this->cur_category->insert();
}
private function insertLink($link)
{
$this->cur_link->clean();
$this->cur_link->link_id = (integer) $link->link_id;
$this->cur_link->blog_id = (string) $link->blog_id;
$this->cur_link->link_href = (string) $link->link_href;
$this->cur_link->link_title = (string) $link->link_title;
$this->cur_link->link_desc = (string) $link->link_desc;
$this->cur_link->link_lang = (string) $link->link_lang;
$this->cur_link->link_xfn = (string) $link->link_xfn;
$this->cur_link->link_position = (integer) $link->link_position;
$this->cur_link->insert();
}
private function insertSetting($setting)
{
$this->cur_setting->clean();
$this->cur_setting->setting_id = (string) $setting->setting_id;
$this->cur_setting->blog_id = !$setting->blog_id ? null : (string) $setting->blog_id;
$this->cur_setting->setting_ns = (string) $setting->setting_ns;
$this->cur_setting->setting_value = (string) $setting->setting_value;
$this->cur_setting->setting_type = (string) $setting->setting_type;
$this->cur_setting->setting_label = (string) $setting->setting_label;
$this->cur_setting->insert();
}
private function insertPref($pref)
{
if ($this->prefExists($pref->pref_ws, $pref->pref_id, $pref->user_id)) {
return;
}
$this->cur_pref->clean();
$this->cur_pref->pref_id = (string) $pref->pref_id;
$this->cur_pref->user_id = !$pref->user_id ? null : (string) $pref->user_id;
$this->cur_pref->pref_ws = (string) $pref->pref_ws;
$this->cur_pref->pref_value = (string) $pref->pref_value;
$this->cur_pref->pref_type = (string) $pref->pref_type;
$this->cur_pref->pref_label = (string) $pref->pref_label;
$this->cur_pref->insert();
}
private function insertUser($user)
{
if ($this->userExists($user->user_id)) {
return;
}
$this->cur_user->clean();
$this->cur_user->user_id = (string) $user->user_id;
$this->cur_user->user_super = (integer) $user->user_super;
$this->cur_user->user_pwd = (string) $user->user_pwd;
$this->cur_user->user_recover_key = (string) $user->user_recover_key;
$this->cur_user->user_name = (string) $user->user_name;
$this->cur_user->user_firstname = (string) $user->user_firstname;
$this->cur_user->user_displayname = (string) $user->user_displayname;
$this->cur_user->user_email = (string) $user->user_email;
$this->cur_user->user_url = (string) $user->user_url;
$this->cur_user->user_default_blog = !$user->user_default_blog ? null : (string) $user->user_default_blog;
$this->cur_user->user_lang = (string) $user->user_lang;
$this->cur_user->user_tz = (string) $user->user_tz;
$this->cur_user->user_post_status = (integer) $user->user_post_status;
$this->cur_user->user_creadt = (string) $user->user_creadt;
$this->cur_user->user_upddt = (string) $user->user_upddt;
$this->cur_user->user_desc = $user->exists('user_desc') ? (string) $user->user_desc : null;
$this->cur_user->user_options = $user->exists('user_options') ? (string) $user->user_options : null;
$this->cur_user->user_status = $user->exists('user_status') ? (integer) $user->user_status : 1;
$this->cur_user->insert();
$this->stack['users'][$user->user_id] = true;
}
private function insertPermissions($permissions)
{
$this->cur_permissions->clean();
$this->cur_permissions->user_id = (string) $permissions->user_id;
$this->cur_permissions->blog_id = (string) $permissions->blog_id;
$this->cur_permissions->permissions = (string) $permissions->permissions;
$this->cur_permissions->insert();
}
private function insertPost($post)
{
$this->cur_post->clean();
$cat_id = (integer) $post->cat_id;
if (!$cat_id) {
$cat_id = null;
}
$post_password = $post->post_password ? (string) $post->post_password : null;
$this->cur_post->post_id = (integer) $post->post_id;
$this->cur_post->blog_id = (string) $post->blog_id;
$this->cur_post->user_id = (string) $this->getUserId($post->user_id);
$this->cur_post->cat_id = $cat_id;
$this->cur_post->post_dt = (string) $post->post_dt;
$this->cur_post->post_creadt = (string) $post->post_creadt;
$this->cur_post->post_upddt = (string) $post->post_upddt;
$this->cur_post->post_password = $post_password;
$this->cur_post->post_type = (string) $post->post_type;
$this->cur_post->post_format = (string) $post->post_format;
$this->cur_post->post_url = (string) $post->post_url;
$this->cur_post->post_lang = (string) $post->post_lang;
$this->cur_post->post_title = (string) $post->post_title;
$this->cur_post->post_excerpt = (string) $post->post_excerpt;
$this->cur_post->post_excerpt_xhtml = (string) $post->post_excerpt_xhtml;
$this->cur_post->post_content = (string) $post->post_content;
$this->cur_post->post_content_xhtml = (string) $post->post_content_xhtml;
$this->cur_post->post_notes = (string) $post->post_notes;
$this->cur_post->post_words = (string) $post->post_words;
$this->cur_post->post_meta = (string) $post->post_meta;
$this->cur_post->post_status = (integer) $post->post_status;
$this->cur_post->post_selected = (integer) $post->post_selected;
$this->cur_post->post_open_comment = (integer) $post->post_open_comment;
$this->cur_post->post_open_tb = (integer) $post->post_open_tb;
$this->cur_post->nb_comment = (integer) $post->nb_comment;
$this->cur_post->nb_trackback = (integer) $post->nb_trackback;
$this->cur_post->post_position = (integer) $post->post_position;
$this->cur_post->post_tz = $post->exists('post_tz') ? (string) $post->post_tz : 'UTC';
$this->cur_post->insert();
}
private function insertMeta($meta)
{
$this->cur_meta->clean();
$this->cur_meta->meta_id = (string) $meta->meta_id;
$this->cur_meta->meta_type = (string) $meta->meta_type;
$this->cur_meta->post_id = (integer) $meta->post_id;
$this->cur_meta->insert();
}
private function insertMedia($media)
{
$this->cur_media->clean();
$this->cur_media->media_id = (integer) $media->media_id;
$this->cur_media->user_id = (string) $media->user_id;
$this->cur_media->media_path = (string) $media->media_path;
$this->cur_media->media_title = (string) $media->media_title;
$this->cur_media->media_file = (string) $media->media_file;
$this->cur_media->media_meta = (string) $media->media_meta;
$this->cur_media->media_dt = (string) $media->media_dt;
$this->cur_media->media_creadt = (string) $media->media_creadt;
$this->cur_media->media_upddt = (string) $media->media_upddt;
$this->cur_media->media_private = (integer) $media->media_private;
$this->cur_media->media_dir = $media->exists('media_dir') ? (string) $media->media_dir : dirname($media->media_file);
if (!$this->mediaExists()) {
$this->cur_media->insert();
}
}
private function insertPostMedia($post_media)
{
$this->cur_post_media->clean();
$this->cur_post_media->media_id = (integer) $post_media->media_id;
$this->cur_post_media->post_id = (integer) $post_media->post_id;
$this->cur_post_media->insert();
}
private function insertLog($log)
{
$this->cur_log->clean();
$this->cur_log->log_id = (integer) $log->log_id;
$this->cur_log->user_id = (string) $log->user_id;
$this->cur_log->log_table = (string) $log->log_table;
$this->cur_log->log_dt = (string) $log->log_dt;
$this->cur_log->log_ip = (string) $log->log_ip;
$this->cur_log->log_msg = (string) $log->log_msg;
$this->cur_log->insert();
}
private function insertPing($ping)
{
$this->cur_ping->clean();
$this->cur_ping->post_id = (integer) $ping->post_id;
$this->cur_ping->ping_url = (string) $ping->ping_url;
$this->cur_ping->ping_dt = (string) $ping->ping_dt;
$this->cur_ping->insert();
}
private function insertComment($comment)
{
$this->cur_comment->clean();
$this->cur_comment->comment_id = (integer) $comment->comment_id;
$this->cur_comment->post_id = (integer) $comment->post_id;
$this->cur_comment->comment_dt = (string) $comment->comment_dt;
$this->cur_comment->comment_upddt = (string) $comment->comment_upddt;
$this->cur_comment->comment_author = (string) $comment->comment_author;
$this->cur_comment->comment_email = (string) $comment->comment_email;
$this->cur_comment->comment_site = (string) $comment->comment_site;
$this->cur_comment->comment_content = (string) $comment->comment_content;
$this->cur_comment->comment_words = (string) $comment->comment_words;
$this->cur_comment->comment_ip = (string) $comment->comment_ip;
$this->cur_comment->comment_status = (integer) $comment->comment_status;
$this->cur_comment->comment_spam_status = (string) $comment->comment_spam_status;
$this->cur_comment->comment_trackback = (integer) $comment->comment_trackback;
$this->cur_comment->comment_tz = $comment->exists('comment_tz') ? (string) $comment->comment_tz : 'UTC';
$this->cur_comment->comment_spam_filter = $comment->exists('comment_spam_filter') ? (string) $comment->comment_spam_filter : null;
$this->cur_comment->insert();
}
private function insertSpamRule($spamrule)
{
$this->cur_spamrule->clean();
$this->cur_spamrule->rule_id = (integer) $spamrule->rule_id;
$this->cur_spamrule->blog_id = !$spamrule->blog_id ? null : (string) $spamrule->blog_id;
$this->cur_spamrule->rule_type = (string) $spamrule->rule_type;
$this->cur_spamrule->rule_content = (string) $spamrule->rule_content;
$this->cur_spamrule->insert();
}
private function insertCategorySingle($category)
{
$this->cur_category->clean();
$m = $this->searchCategory($this->stack['categories'], $category->cat_url);
$old_id = $category->cat_id;
if ($m !== false) {
$cat_id = $m;
} else {
$cat_id = $this->stack['cat_id'];
$category->cat_id = $cat_id;
$category->blog_id = $this->blog_id;
$this->insertCategory($category);
$this->stack['cat_id']++;
}
$this->old_ids['category'][(integer) $old_id] = $cat_id;
}
private function insertLinkSingle($link)
{
$link->blog_id = $this->blog_id;
$link->link_id = $this->stack['link_id'];
$this->insertLink($link);
$this->stack['link_id']++;
}
private function insertPostSingle($post)
{
if (!$post->cat_id || isset($this->old_ids['category'][(integer) $post->cat_id])) {
$post_id = $this->stack['post_id'];
$this->old_ids['post'][(integer) $post->post_id] = $post_id;
$cat_id = $post->cat_id ? $this->old_ids['category'][(integer) $post->cat_id] : null;
$post->post_id = $post_id;
$post->cat_id = $cat_id;
$post->blog_id = $this->blog_id;
$post->post_url = $this->core->blog->getPostURL(
$post->post_url, $post->post_dt, $post->post_title, $post->post_id
);
$this->insertPost($post);
$this->stack['post_id']++;
} else {
self::throwIdError($post->__name, $post->__line, 'category');
}
}
private function insertMetaSingle($meta)
{
if (isset($this->old_ids['post'][(integer) $meta->post_id])) {
$meta->post_id = $this->old_ids['post'][(integer) $meta->post_id];
$this->insertMeta($meta);
} else {
self::throwIdError($meta->__name, $meta->__line, 'post');
}
}
private function insertMediaSingle($media)
{
$media_id = $this->stack['media_id'];
$old_id = $media->media_id;
$media->media_id = $media_id;
$media->media_path = $this->core->blog->settings->system->public_path;
$media->user_id = $this->getUserId($media->user_id);
$this->insertMedia($media);
$this->stack['media_id']++;
$this->old_ids['media'][(integer) $old_id] = $media_id;
}
private function insertPostMediaSingle($post_media)
{
if (isset($this->old_ids['media'][(integer) $post_media->media_id]) &&
isset($this->old_ids['post'][(integer) $post_media->post_id])) {
$post_media->media_id = $this->old_ids['media'][(integer) $post_media->media_id];
$post_media->post_id = $this->old_ids['post'][(integer) $post_media->post_id];
$this->insertPostMedia($post_media);
} elseif (!isset($this->old_ids['media'][(integer) $post_media->media_id])) {
self::throwIdError($post_media->__name, $post_media->__line, 'media');
} else {
self::throwIdError($post_media->__name, $post_media->__line, 'post');
}
}
private function insertPingSingle($ping)
{
if (isset($this->old_ids['post'][(integer) $ping->post_id])) {
$ping->post_id = $this->old_ids['post'][(integer) $ping->post_id];
$this->insertPing($ping);
} else {
self::throwIdError($ping->__name, $ping->__line, 'post');
}
}
private function insertCommentSingle($comment)
{
if (isset($this->old_ids['post'][(integer) $comment->post_id])) {
$comment_id = $this->stack['comment_id'];
$comment->comment_id = $comment_id;
$comment->post_id = $this->old_ids['post'][(integer) $comment->post_id];
$this->insertComment($comment);
$this->stack['comment_id']++;
} else {
self::throwIdError($comment->__name, $comment->__line, 'post');
}
}
private static function throwIdError($name, $line, $related)
{
throw new Exception(sprintf(
__('ID of "%3$s" does not match on record "%1$s" at line %2$s of backup file.'),
html::escapeHTML($name),
html::escapeHTML($line),
html::escapeHTML($related)
));
}
public function searchCategory($rs, $url)
{
while ($rs->fetch()) {
if ($rs->cat_url == $url) {
return $rs->cat_id;
}
}
return false;
}
public function getUserId($user_id)
{
if (!$this->userExists($user_id)) {
if ($this->core->auth->isSuperAdmin()) {
# Sanitizes user_id and create a lambda user
$user_id = preg_replace('/[^A-Za-z0-9]$/', '', $user_id);
$user_id .= strlen($user_id) < 2 ? '-a' : '';
# We change user_id, we need to check again
if (!$this->userExists($user_id)) {
$this->cur_user->clean();
$this->cur_user->user_id = (string) $user_id;
$this->cur_user->user_pwd = md5(uniqid());
$this->core->addUser($this->cur_user);
$this->stack['users'][$user_id] = true;
}
} else {
# Returns current user id
$user_id = $this->core->auth->userID();
}
}
return $user_id;
}
private function userExists($user_id)
{
if (isset($this->stack['users'][$user_id])) {
return $this->stack['users'][$user_id];
}
$strReq = 'SELECT user_id ' .
'FROM ' . $this->prefix . 'user ' .
"WHERE user_id = '" . $this->con->escape($user_id) . "' ";
$rs = $this->con->select($strReq);
$this->stack['users'][$user_id] = !$rs->isEmpty();
return $this->stack['users'][$user_id];
}
private function prefExists($pref_ws, $pref_id, $user_id)
{
$strReq = 'SELECT pref_id,pref_ws,user_id ' .
'FROM ' . $this->prefix . 'pref ' .
"WHERE pref_id = '" . $this->con->escape($pref_id) . "' " .
"AND pref_ws = '" . $this->con->escape($pref_ws) . "' ";
if (!$user_id) {
$strReq .= "AND user_id IS NULL ";
} else {
$strReq .= "AND user_id = '" . $this->con->escape($user_id) . "' ";
}
$rs = $this->con->select($strReq);
return !$rs->isEmpty();
}
private function mediaExists()
{
$strReq = 'SELECT media_id ' .
'FROM ' . $this->prefix . 'media ' .
"WHERE media_path = '" . $this->con->escape($this->cur_media->media_path) . "' " .
"AND media_file = '" . $this->con->escape($this->cur_media->media_file) . "' ";
$rs = $this->con->select($strReq);
return !$rs->isEmpty();
}
private function prepareDC12line(&$line)
{
$settings = ['dc_theme', 'dc_nb_post_per_page', 'dc_allow_comments',
'dc_allow_trackbacks', 'dc_comment_pub', 'dc_comments_ttl',
'dc_wiki_comments', 'dc_use_smilies', 'dc_date_format', 'dc_time_format',
'dc_url_scan'];
switch ($line->__name) {
case 'categorie':
$line->substitute('cat_libelle', 'cat_title');
$line->substitute('cat_libelle_url', 'cat_url');
$line->__name = 'category';
$line->blog_id = 'default';
break;
case 'link':
$line->substitute('href', 'link_href');
$line->substitute('label', 'link_title');
$line->substitute('title', 'link_desc');
$line->substitute('lang', 'link_lang');
$line->substitute('rel', 'link_xfn');
$line->substitute('position', 'link_position');
$line->blog_id = 'default';
break;
case 'post':
$line->substitute('post_titre', 'post_title');
$line->post_title = html::decodeEntities($line->post_title);
$line->post_url = date('Y/m/d/', strtotime($line->post_dt)) . $line->post_id . '-' . $line->post_titre_url;
$line->post_url = substr($line->post_url, 0, 255);
$line->post_format = $line->post_content_wiki == '' ? 'xhtml' : 'wiki';
$line->post_content_xhtml = $line->post_content;
$line->post_excerpt_xhtml = $line->post_chapo;
if ($line->post_format == 'wiki') {
$line->post_content = $line->post_content_wiki;
$line->post_excerpt = $line->post_chapo_wiki;
} else {
$line->post_content = $line->post_content;
$line->post_excerpt = $line->post_chapo;
}
$line->post_status = (integer) $line->post_pub;
$line->post_type = 'post';
$line->blog_id = 'default';
$line->drop('post_titre_url', 'post_content_wiki', 'post_chapo', 'post_chapo_wiki', 'post_pub');
break;
case 'post_meta':
$line->drop('meta_id');
$line->substitute('meta_key', 'meta_type');
$line->substitute('meta_value', 'meta_id');
$line->__name = 'meta';
$line->blog_id = 'default';
break;
case 'comment':
$line->substitute('comment_auteur', 'comment_author');
if ($line->comment_site != '' && !preg_match('!^http(s)?://.*$!', $line->comment_site, $m)) {
$line->comment_site = 'http://' . $line->comment_site;
}
$line->comment_status = (integer) $line->comment_pub;
$line->drop('comment_pub');
break;
}
# --BEHAVIOR-- importPrepareDC12
$this->core->callBehavior('importPrepareDC12', $line, $this, $this->core);
}
}