From 3f347f0330727dee6eda346266dac1573dcb31b3 Mon Sep 17 00:00:00 2001 From: Jean-Christian Denis Date: Sun, 5 Mar 2023 22:58:55 +0100 Subject: [PATCH] use json rather than serialize --- src/Action.php | 6 +++--- src/Core.php | 21 +++++++++++++-------- src/Install.php | 31 ++++++++++++++++++++++++++++++- src/Manage.php | 2 +- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/Action.php b/src/Action.php index c78965f..843060d 100644 --- a/src/Action.php +++ b/src/Action.php @@ -36,7 +36,7 @@ use ArrayObject; */ abstract class Action { - /** @var array Current module */ + /** @var array Current module */ protected $module = []; /** @var string Current full path */ @@ -87,7 +87,7 @@ abstract class Action $settings = dcCore::app()->blog->settings->get(Core::id())->get('settings_' . $this->class_name); if (null != $settings) { - $settings = unserialize($settings); + $settings = json_decode($settings, true); } $this->settings = is_array($settings) ? $settings : []; @@ -237,7 +237,7 @@ abstract class Action { dcCore::app()->blog->settings->get(Core::id())->put( 'settings_' . $this->class_name, - serialize($this->settings), + json_encode($this->settings), 'string', null, true, diff --git a/src/Core.php b/src/Core.php index cff7d60..dd5ef3a 100644 --- a/src/Core.php +++ b/src/Core.php @@ -79,6 +79,11 @@ class Core return basename(dirname(__DIR__)); } + public static function name() + { + return __('improve'); + } + public function getLogs(): array { return $this->logs; @@ -95,8 +100,8 @@ class Core return 0; } $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcLog::LOG_TABLE_NAME); - $cur->log_msg = serialize($this->logs); - $cur->log_table = 'improve'; + $cur->log_msg = json_encode($this->logs); + $cur->log_table = self::id(); $id = dcCore::app()->log->addLog($cur); return $id; @@ -104,13 +109,13 @@ class Core public function readLogs(int $id): array { - $rs = dcCore::app()->log->getLogs(['log_table' => 'improve', 'log_id' => $id, 'limit' => 1]); + $rs = dcCore::app()->log->getLogs(['log_table' => self::id(), 'log_id' => $id, 'limit' => 1]); if ($rs->isEmpty()) { return []; } dcCore::app()->log->delLogs($rs->__get('log_id')); - $res = unserialize($rs->__get('log_msg')); + $res = json_decode($rs->__get('log_msg'), true); return is_array($res) ? $res : []; } @@ -122,7 +127,7 @@ class Core return []; } $lines = []; - foreach ($logs['improve'] as $path => $tools) { + foreach ($logs[self::id()] as $path => $tools) { $l_types = []; foreach (['success', 'warning', 'error'] as $type) { $l_tools = []; @@ -198,7 +203,7 @@ class Core } foreach ($workers as $action) { // trace all path and action in logs - $this->logs['improve'][__('Begin')][] = $action->id(); + $this->logs[self::id()][__('Begin')][] = $action->id(); // info: set current module $action->setModule($module); $action->setPath(__('Begin'), '', true); @@ -215,7 +220,7 @@ class Core } foreach ($workers as $action) { // trace all path and action in logs - $this->logs['improve'][$file[0]][] = $action->id(); + $this->logs[self::id()][$file[0]][] = $action->id(); // info: set current path $action->setPath($file[0], $file[1], $file[2]); } @@ -254,7 +259,7 @@ class Core } foreach ($workers as $action) { // trace all path and action in logs - $this->logs['improve'][__('End')][] = $action->id(); + $this->logs[self::id()][__('End')][] = $action->id(); // info: set current module $action->setPath(__('End'), '', true); // action: close module diff --git a/src/Install.php b/src/Install.php index 9da1345..8c3af44 100644 --- a/src/Install.php +++ b/src/Install.php @@ -16,6 +16,7 @@ namespace Dotclear\Plugin\improve; /* dotclear */ use dcCore; +use dcNamespace; use dcNsProcess; /* php */ @@ -33,7 +34,7 @@ class Install extends dcNsProcess private static $default_settings = [[ 'disabled', 'List of hidden action modules', - 'tab;newline;endoffile', + 'cssheader;tab;newline;endoffile', 'string', ]]; @@ -52,6 +53,7 @@ class Install extends dcNsProcess try { self::update_0_8_0(); + self::update_1_1_0(); self::putSettings(); return true; @@ -88,4 +90,31 @@ class Install extends dcNsProcess } } } + + /** Update improve < 1.1 : use json_(en|de)code rather than (un)serialize */ + private static function update_1_1_0(): void + { + if (version_compare(dcCore::app()->getVersion(Core::id()) ?? '0', '1.1', '<')) { + foreach (['setting_', 'preferences'] as $key) { + $record = dcCore::app()->con->select( + 'SELECT * FROM ' . dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME . ' ' . + "WHERE setting_ns = '" . dcCore::app()->con->escape(Core::id()) . "' " . + "AND setting_id LIKE '" . $key . "%' " + ); + + while ($record->fetch()) { + try { + $value = @unserialize($record->f('setting_value')); + $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME); + $cur->setting_value = json_encode(is_array($value) ? $value : []); + $cur->update( + "WHERE setting_id = '" . $record->f('setting_id') . "' and setting_ns = '" . dcCore::app()->con->escape($record->f('setting_ns')) . "' " . + 'AND blog_id ' . (null === $record->f('blog_id') ? 'IS NULL ' : ("= '" . dcCore::app()->con->escape($record->f('blog_id')) . "' ")) + ); + } catch(Exception) { + } + } + } + } + } } diff --git a/src/Manage.php b/src/Manage.php index ed9c868..a536d1b 100644 --- a/src/Manage.php +++ b/src/Manage.php @@ -89,7 +89,7 @@ class Manage extends dcNsProcess if (!empty(self::$type)) { $preferences = dcCore::app()->blog->settings->get(Core::id())->get('preferences'); if (is_string($preferences)) { - $preferences = unserialize($preferences); + $preferences = json_decode($preferences, true); if (is_array($preferences)) { return $all ? $preferences : (array_key_exists(self::$type, $preferences) ? $preferences[self::$type] : []); }