From: Michael M Slusarz Date: Tue, 25 Jan 2011 06:16:37 +0000 (-0700) Subject: Bug #9325: Upgrade serialized prefs from Horde 3 X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=cff66908a40c3fc9ab9241a24efbd7925d54ac43;p=horde.git Bug #9325: Upgrade serialized prefs from Horde 3 --- diff --git a/framework/Core/lib/Horde/Core/Prefs/Storage/Upgrade.php b/framework/Core/lib/Horde/Core/Prefs/Storage/Upgrade.php new file mode 100644 index 000000000..5a0659a2c --- /dev/null +++ b/framework/Core/lib/Horde/Core/Prefs/Storage/Upgrade.php @@ -0,0 +1,68 @@ + + * @category Horde + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @package Core + */ +class Horde_Core_Prefs_Storage_Upgrade +{ + /** + * Upgrades the given preferences from the old H3 way of storing + * serialized data. + * OLD method: convert charset, serialize, store. + * NEW method: serialize, convert charset, store. + * + * @param Horde_Prefs $prefs_ob The preferences object. + * @param array $names The list of names to upgrade. + */ + public function upgradeSerialized($prefs_ob, array $names) + { + /* Only do upgrade for SQL driver. */ + $storage = $prefs_ob->getStorage(); + if (!($storage instanceof Horde_Prefs_Storage_Sql)) { + return; + } + + /* Only do upgrade if charset is not UTF-8. */ + $params = $storage->getParams(); + $charset = isset($params['charset']) + ? $params['charset'] + : 'UTF-8'; + + if (strcasecmp($charset, 'UTF-8') === 0) { + return; + } + + foreach ($names as $name) { + if (!$prefs_ob->isDefault($name)) { + $data = $prefs_ob->getValue($name); + + /* Need to convert only if unserialize fails. If it succeeds, + * the data has already been converted or there is no need + * to convert. */ + if (@unserialize($data) === false) { + /* Re-convert to original charset. */ + $data = Horde_String::convertCharset($data, 'UTF-8', $charset); + + /* Unserialize. If we fail here, remove the value + * outright since it is invalid and can not be fixed. */ + if (($data = @unserialize($data)) !== false) { + $data = Horde_String::convertCharset($data, $charset); + + /* Re-save in the prefs backend in the new format. */ + $prefs_ob->setValue($name, $data); + } + } + } + } + } + +} diff --git a/framework/Core/package.xml b/framework/Core/package.xml index 54fde1a3c..ab1ba3db1 100644 --- a/framework/Core/package.xml +++ b/framework/Core/package.xml @@ -23,8 +23,8 @@ Application Framework. slusarz@horde.org yes - 2010-12-21 - + 2011-01-24 + 0.1.0 0.1.0 @@ -203,6 +203,7 @@ Application Framework. + @@ -831,6 +832,7 @@ Application Framework. + @@ -986,7 +988,7 @@ Initial packaging beta beta - 2010-12-21 + 2011-01-24 LGPL * Add cache support for themes. diff --git a/hermes/lib/LoginTasks/SystemTask/UpgradeFromHermes1.php b/hermes/lib/LoginTasks/SystemTask/UpgradeFromHermes1.php new file mode 100644 index 000000000..8faf0f59a --- /dev/null +++ b/hermes/lib/LoginTasks/SystemTask/UpgradeFromHermes1.php @@ -0,0 +1,44 @@ + + * @category Horde + * @license http://www.horde.org/licenses/bsdl.php BSD + * @package Hermes + */ +class Hermes_LoginTasks_SystemTask_UpgradeFromHermes1 extends Horde_LoginTasks_SystemTask +{ + /** + * The interval at which to run the task. + * + * @var integer + */ + public $interval = Horde_LoginTasks::ONCE; + + /** + * Perform all functions for this task. + */ + public function execute() + { + $this->_upgradePrefs(); + } + + /** + * Upgrade to the new preferences storage format. + */ + protected function _upgradePrefs() + { + $upgrade_prefs = array( + 'running_timers' + ); + + $GLOBALS['injector']->getInstance('Horde_Core_Prefs_Storage_Upgrade')->upgradeSerialized($GLOBALS['prefs'], $upgrade_prefs); + } + +} diff --git a/horde/lib/LoginTasks/SystemTask/UpgradeFromHorde3.php b/horde/lib/LoginTasks/SystemTask/UpgradeFromHorde3.php new file mode 100644 index 000000000..a9ebaa5b1 --- /dev/null +++ b/horde/lib/LoginTasks/SystemTask/UpgradeFromHorde3.php @@ -0,0 +1,44 @@ + + * @category Horde + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @package Horde + */ +class Horde_LoginTasks_SystemTask_UpgradeFromHorde3 extends Horde_LoginTasks_SystemTask +{ + /** + * The interval at which to run the task. + * + * @var integer + */ + public $interval = Horde_LoginTasks::ONCE; + + /** + * Perform all functions for this task. + */ + public function execute() + { + $this->_upgradePrefs(); + } + + /** + * Upgrade to the new preferences storage format. + */ + protected function _upgradePrefs() + { + $upgrade_prefs = array( + 'identities' + ); + + $GLOBALS['injector']->getInstance('Horde_Core_Prefs_Storage_Upgrade')->upgradeSerialized($GLOBALS['prefs'], $upgrade_prefs); + } + +} diff --git a/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php b/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php index 103f57f27..143c7d7dc 100644 --- a/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php +++ b/imp/lib/LoginTasks/SystemTask/UpgradeFromImp4.php @@ -32,6 +32,7 @@ class IMP_LoginTasks_SystemTask_UpgradeFromImp4 extends Horde_LoginTasks_SystemT $this->_upgradeLoginTasksPrefs(); $this->_upgradeMsgDisplayPrefs(); $this->_upgradeSortPrefs(); + $this->_upgradeStationery(); $this->_upgradeVirtualFolders(); } @@ -209,6 +210,18 @@ class IMP_LoginTasks_SystemTask_UpgradeFromImp4 extends Horde_LoginTasks_SystemT } /** + * Upgrade stationery preference. + */ + protected function _upgradeStationery() + { + $upgrade_prefs = array( + 'stationery' + ); + + $GLOBALS['injector']->getInstance('Horde_Core_Prefs_Storage_Upgrade')->upgradeSerialized($GLOBALS['prefs'], $upgrade_prefs); + } + + /** * Upgrade IMP 4 style virtual folders. */ protected function _upgradeVirtualFolders() diff --git a/ingo/lib/LoginTasks/SystemTask/UpgradeFromIngo1.php b/ingo/lib/LoginTasks/SystemTask/UpgradeFromIngo1.php new file mode 100644 index 000000000..adf715f7a --- /dev/null +++ b/ingo/lib/LoginTasks/SystemTask/UpgradeFromIngo1.php @@ -0,0 +1,44 @@ + + * @category Horde + * @license http://www.horde.org/licenses/asl.php ASL + * @package Ingo + */ +class Ingo_LoginTasks_SystemTask_UpgradeFromIngo1 extends Horde_LoginTasks_SystemTask +{ + /** + * The interval at which to run the task. + * + * @var integer + */ + public $interval = Horde_LoginTasks::ONCE; + + /** + * Perform all functions for this task. + */ + public function execute() + { + $this->_upgradePrefs(); + } + + /** + * Upgrade to the new preferences storage format. + */ + protected function _upgradePrefs() + { + $upgrade_prefs = array( + 'rules' + ); + + $GLOBALS['injector']->getInstance('Horde_Core_Prefs_Storage_Upgrade')->upgradeSerialized($GLOBALS['prefs'], $upgrade_prefs); + } + +}