[php-blog-cvs] r2615 - in tags: . 1.5 1.5/bundled-libs/Cache 1.5/docs 1.5/htmlarea/plugins/Extended
A reliable, secure & extensible PHP blog | Not mainstream since 2002
Brought to you by:
garvinhicking,
jhermanns
From: garvinhicking at B. <gar...@ma...> - 2009-12-21 06:39:11
|
Author: garvinhicking Date: 2009-12-21 07:38:46 +0100 (Mon, 21 Dec 2009) New Revision: 2615 Added: tags/1.5/ tags/1.5/bundled-libs/Cache/Lite.php tags/1.5/docs/NEWS tags/1.5/htmlarea/plugins/ExtendedFileManager/demo_images/.htaccess tags/1.5/include/admin/comments.inc.php tags/1.5/plugins/serendipity_event_weblogping/servicesdb_ja.inc.php tags/1.5/serendipity_config.inc.php Removed: tags/1.5/bundled-libs/Cache/Lite.php tags/1.5/docs/NEWS tags/1.5/htmlarea/plugins/ExtendedFileManager/demo_images/.htaccess tags/1.5/include/admin/comments.inc.php tags/1.5/plugins/serendipity_event_weblogping/servicesdb_ja.inc.php tags/1.5/serendipity_config.inc.php Log: tag Copied: tags/1.5 (from rev 2600, branches/1.5) Deleted: tags/1.5/bundled-libs/Cache/Lite.php =================================================================== --- branches/1.5/bundled-libs/Cache/Lite.php 2009-12-08 13:16:18 UTC (rev 2600) +++ tags/1.5/bundled-libs/Cache/Lite.php 2009-12-21 06:38:46 UTC (rev 2615) @@ -1,755 +0,0 @@ -<?php - -/** -* Fast, light and safe Cache Class -* -* Cache_Lite is a fast, light and safe cache system. It's optimized -* for file containers. It is fast and safe (because it uses file -* locking and/or anti-corruption tests). -* -* There are some examples in the 'docs/examples' file -* Technical choices are described in the 'docs/technical' file -* -* Memory Caching is from an original idea of -* Mike BENOIT <ip...@sn...> -* -* Nota : A chinese documentation (thanks to RainX <chi...@16...>) is -* available at : -* http://rainx.phpmore.com/manual/cache_lite.html -* -* @package Cache_Lite -* @category Caching -* @version $Id: Lite.php,v 1.30 2005/06/13 20:50:48 fab Exp $ -* @author Fabien MARTY <fa...@ph...> -*/ - -define('CACHE_LITE_ERROR_RETURN', 1); -define('CACHE_LITE_ERROR_DIE', 8); - -class Cache_Lite -{ - - // --- Private properties --- - - /** - * Directory where to put the cache files - * (make sure to add a trailing slash) - * - * @var string $_cacheDir - */ - var $_cacheDir = '/tmp/'; - - /** - * Enable / disable caching - * - * (can be very usefull for the debug of cached scripts) - * - * @var boolean $_caching - */ - var $_caching = true; - - /** - * Cache lifetime (in seconds) - * - * @var int $_lifeTime - */ - var $_lifeTime = 3600; - - /** - * Enable / disable fileLocking - * - * (can avoid cache corruption under bad circumstances) - * - * @var boolean $_fileLocking - */ - var $_fileLocking = true; - - /** - * Timestamp of the last valid cache - * - * @var int $_refreshTime - */ - var $_refreshTime; - - /** - * File name (with path) - * - * @var string $_file - */ - var $_file; - - /** - * File name (without path) - * - * @var string $_fileName - */ - var $_fileName; - - /** - * Enable / disable write control (the cache is read just after writing to detect corrupt entries) - * - * Enable write control will lightly slow the cache writing but not the cache reading - * Write control can detect some corrupt cache files but maybe it's not a perfect control - * - * @var boolean $_writeControl - */ - var $_writeControl = true; - - /** - * Enable / disable read control - * - * If enabled, a control key is embeded in cache file and this key is compared with the one - * calculated after the reading. - * - * @var boolean $_writeControl - */ - var $_readControl = true; - - /** - * Type of read control (only if read control is enabled) - * - * Available values are : - * 'md5' for a md5 hash control (best but slowest) - * 'crc32' for a crc32 hash control (lightly less safe but faster, better choice) - * 'strlen' for a length only test (fastest) - * - * @var boolean $_readControlType - */ - var $_readControlType = 'crc32'; - - /** - * Pear error mode (when raiseError is called) - * - * (see PEAR doc) - * - * @see setToDebug() - * @var int $_pearErrorMode - */ - var $_pearErrorMode = CACHE_LITE_ERROR_RETURN; - - /** - * Current cache id - * - * @var string $_id - */ - var $_id; - - /** - * Current cache group - * - * @var string $_group - */ - var $_group; - - /** - * Enable / Disable "Memory Caching" - * - * NB : There is no lifetime for memory caching ! - * - * @var boolean $_memoryCaching - */ - var $_memoryCaching = false; - - /** - * Enable / Disable "Only Memory Caching" - * (be carefull, memory caching is "beta quality") - * - * @var boolean $_onlyMemoryCaching - */ - var $_onlyMemoryCaching = false; - - /** - * Memory caching array - * - * @var array $_memoryCachingArray - */ - var $_memoryCachingArray = array(); - - /** - * Memory caching counter - * - * @var int $memoryCachingCounter - */ - var $_memoryCachingCounter = 0; - - /** - * Memory caching limit - * - * @var int $memoryCachingLimit - */ - var $_memoryCachingLimit = 1000; - - /** - * File Name protection - * - * if set to true, you can use any cache id or group name - * if set to false, it can be faster but cache ids and group names - * will be used directly in cache file names so be carefull with - * special characters... - * - * @var boolean $fileNameProtection - */ - var $_fileNameProtection = true; - - /** - * Enable / disable automatic serialization - * - * it can be used to save directly datas which aren't strings - * (but it's slower) - * - * @var boolean $_serialize - */ - var $_automaticSerialization = false; - - /** - * Disable / Tune the automatic cleaning process - * - * The automatic cleaning process destroy too old (for the given life time) - * cache files when a new cache file is written. - * 0 => no automatic cache cleaning - * 1 => systematic cache cleaning - * x (integer) > 1 => automatic cleaning randomly 1 times on x cache write - * - * @var int $_automaticCleaning - */ - var $_automaticCleaningFactor = 0; - - /** - * Nested directory level - * - * Set the hashed directory structure level. 0 means "no hashed directory - * structure", 1 means "one level of directory", 2 means "two levels"... - * This option can speed up Cache_Lite only when you have many thousands of - * cache file. Only specific benchs can help you to choose the perfect value - * for you. Maybe, 1 or 2 is a good start. - * - * @var int $_hashedDirectoryLevel - */ - var $_hashedDirectoryLevel = 0; - - /** - * Umask for hashed directory structure - * - * @var int $_hashedDirectoryUmask - */ - var $_hashedDirectoryUmask = 0700; - - // --- Public methods --- - - /** - * Constructor - * - * $options is an assoc. Available options are : - * $options = array( - * 'cacheDir' => directory where to put the cache files (string), - * 'caching' => enable / disable caching (boolean), - * 'lifeTime' => cache lifetime in seconds (int), - * 'fileLocking' => enable / disable fileLocking (boolean), - * 'writeControl' => enable / disable write control (boolean), - * 'readControl' => enable / disable read control (boolean), - * 'readControlType' => type of read control 'crc32', 'md5', 'strlen' (string), - * 'pearErrorMode' => pear error mode (when raiseError is called) (cf PEAR doc) (int), - * 'memoryCaching' => enable / disable memory caching (boolean), - * 'onlyMemoryCaching' => enable / disable only memory caching (boolean), - * 'memoryCachingLimit' => max nbr of records to store into memory caching (int), - * 'fileNameProtection' => enable / disable automatic file name protection (boolean), - * 'automaticSerialization' => enable / disable automatic serialization (boolean) - * 'automaticCleaningFactor' => distable / tune automatic cleaning process (int) - * 'hashedDirectoryLevel' => level of the hashed directory system (int) - * 'hashedDirectoryUmask' => umask for hashed directory structure (int) - * ); - * - * @param array $options options - * @access public - */ - function Cache_Lite($options = array(NULL)) - { - $availableOptions = array('hashedDirectoryUmask', 'hashedDirectoryLevel', 'automaticCleaningFactor', 'automaticSerialization', 'fileNameProtection', 'memoryCaching', 'onlyMemoryCaching', 'memoryCachingLimit', 'cacheDir', 'caching', 'lifeTime', 'fileLocking', 'writeControl', 'readControl', 'readControlType', 'pearErrorMode'); - foreach($options as $key => $value) { - if(in_array($key, $availableOptions)) { - $property = '_'.$key; - $this->$property = $value; - } - } - $this->_refreshTime = time() - $this->_lifeTime; - } - - /** - * Test if a cache is available and (if yes) return it - * - * @param string $id cache id - * @param string $group name of the cache group - * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested - * @return string data of the cache (or false if no cache available) - * @access public - */ - function get($id, $group = 'default', $doNotTestCacheValidity = false) - { - $this->_id = $id; - $this->_group = $group; - $data = false; - if ($this->_caching) { - $this->_setFileName($id, $group); - if ($this->_memoryCaching) { - if (isset($this->_memoryCachingArray[$this->_file])) { - if ($this->_automaticSerialization) { - return unserialize($this->_memoryCachingArray[$this->_file]); - } else { - return $this->_memoryCachingArray[$this->_file]; - } - } else { - if ($this->_onlyMemoryCaching) { - return false; - } - } - } - if ($doNotTestCacheValidity) { - if (file_exists($this->_file)) { - $data = $this->_read(); - } - } else { - if ((file_exists($this->_file)) && (@filemtime($this->_file) > $this->_refreshTime)) { - $data = $this->_read(); - } - } - if (($data) and ($this->_memoryCaching)) { - $this->_memoryCacheAdd($this->_file, $data); - } - if (($this->_automaticSerialization) and (is_string($data))) { - $data = unserialize($data); - } - return $data; - } - return false; - } - - /** - * Save some data in a cache file - * - * @param string $data data to put in cache (can be another type than strings if automaticSerialization is on) - * @param string $id cache id - * @param string $group name of the cache group - * @return boolean true if no problem - * @access public - */ - function save($data, $id = NULL, $group = 'default') - { - if ($this->_caching) { - if ($this->_automaticSerialization) { - $data = serialize($data); - } - if (isset($id)) { - $this->_setFileName($id, $group); - } - if ($this->_memoryCaching) { - $this->_memoryCacheAdd($this->_file, $data); - if ($this->_onlyMemoryCaching) { - return true; - } - } - if ($this->_automaticCleaningFactor>0) { - $rand = rand(1, $this->_automaticCleaningFactor); - if ($rand==1) { - $this->clean(false, 'old'); - } - } - if ($this->_writeControl) { - if (!$this->_writeAndControl($data)) { - @touch($this->_file, time() - 2*abs($this->_lifeTime)); - return false; - } else { - return true; - } - } else { - return $this->_write($data); - } - } - return false; - } - - /** - * Remove a cache file - * - * @param string $id cache id - * @param string $group name of the cache group - * @return boolean true if no problem - * @access public - */ - function remove($id, $group = 'default') - { - $this->_setFileName($id, $group); - if ($this->_memoryCaching) { - if (isset($this->_memoryCachingArray[$this->_file])) { - unset($this->_memoryCachingArray[$this->_file]); - $this->_memoryCachingCounter = $this->_memoryCachingCounter - 1; - } - if ($this->_onlyMemoryCaching) { - return true; - } - } - return $this->_unlink($this->_file); - } - - /** - * Clean the cache - * - * if no group is specified all cache files will be destroyed - * else only cache files of the specified group will be destroyed - * - * @param string $group name of the cache group - * @param string $mode flush cache mode : 'old', 'ingroup', 'notingroup', - * 'callback_myFunction' - * @return boolean true if no problem - * @access public - */ - function clean($group = false, $mode = 'ingroup') - { - return $this->_cleanDir($this->_cacheDir, $group, $mode); - } - - /** - * Set to debug mode - * - * When an error is found, the script will stop and the message will be displayed - * (in debug mode only). - * - * @access public - */ - function setToDebug() - { - $this->_pearErrorMode = CACHE_LITE_ERROR_DIE; - } - - /** - * Set a new life time - * - * @param int $newLifeTime new life time (in seconds) - * @access public - */ - function setLifeTime($newLifeTime) - { - $this->_lifeTime = $newLifeTime; - $this->_refreshTime = time() - $newLifeTime; - } - - /** - * Save the state of the caching memory array into a cache file cache - * - * @param string $id cache id - * @param string $group name of the cache group - * @access public - */ - function saveMemoryCachingState($id, $group = 'default') - { - if ($this->_caching) { - $array = array( - 'counter' => $this->_memoryCachingCounter, - 'array' => $this->_memoryCachingState - ); - $data = serialize($array); - $this->save($data, $id, $group); - } - } - - /** - * Load the state of the caching memory array from a given cache file cache - * - * @param string $id cache id - * @param string $group name of the cache group - * @param boolean $doNotTestCacheValidity if set to true, the cache validity won't be tested - * @access public - */ - function getMemoryCachingState($id, $group = 'default', $doNotTestCacheValidity = false) - { - if ($this->_caching) { - if ($data = $this->get($id, $group, $doNotTestCacheValidity)) { - $array = unserialize($data); - $this->_memoryCachingCounter = $array['counter']; - $this->_memoryCachingArray = $array['array']; - } - } - } - - /** - * Return the cache last modification time - * - * BE CAREFUL : THIS METHOD IS FOR HACKING ONLY ! - * - * @return int last modification time - */ - function lastModified() { - return @filemtime($this->_file); - } - - /** - * Trigger a PEAR error - * - * To improve performances, the PEAR.php file is included dynamically. - * The file is so included only when an error is triggered. So, in most - * cases, the file isn't included and perfs are much better. - * - * @param string $msg error message - * @param int $code error code - * @access public - */ - function raiseError($msg, $code) - { - include_once(dirname(__FILE__) . '/../PEAR.php'); - PEAR::raiseError($msg, $code, $this->_pearErrorMode); - } - - // --- Private methods --- - - /** - * Remove a file - * - * @param string $file complete file path and name - * @return boolean true if no problem - * @access private - */ - function _unlink($file) - { - if (!@unlink($file)) { - $this->raiseError('Cache_Lite : Unable to remove cache !', -3); - return false; - } else { - return true; - } - } - - /** - * Recursive function for cleaning cache file in the given directory - * - * @param string $dir directory complete path (with a trailing slash) - * @param string $group name of the cache group - * @param string $mode flush cache mode : 'old', 'ingroup', 'notingroup', - 'callback_myFunction' - * @return boolean true if no problem - * @access private - */ - function _cleanDir($dir, $group = false, $mode = 'ingroup') - { - if ($this->_fileNameProtection) { - $motif = ($group) ? 'cache_'.md5($group).'_' : 'cache_'; - } else { - $motif = ($group) ? 'cache_'.$group.'_' : 'cache_'; - } - if ($this->_memoryCaching) { - while (list($key, $value) = each($this->_memoryCachingArray)) { - if (strpos($key, $motif, 0)) { - unset($this->_memoryCachingArray[$key]); - $this->_memoryCachingCounter = $this->_memoryCachingCounter - 1; - } - } - if ($this->_onlyMemoryCaching) { - return true; - } - } - if (!($dh = opendir($dir))) { - $this->raiseError('Cache_Lite : Unable to open cache directory !', -4); - return false; - } - $result = true; - while ($file = readdir($dh)) { - if (($file != '.') && ($file != '..')) { - if (substr($file, 0, 6)=='cache_') { - $file2 = $dir . $file; - if (is_file($file2)) { - switch (substr($mode, 0, 9)) { - case 'old': - // files older than lifeTime get deleted from cache - if ((mktime() - filemtime($file2)) > $this->_lifeTime) { - $result = ($result and ($this->_unlink($file2))); - } - break; - case 'notingrou': - if (!strpos($file2, $motif, 0)) { - $result = ($result and ($this->_unlink($file2))); - } - break; - case 'callback_': - $func = substr($mode, 9, strlen($mode) - 9); - if ($func($file2, $group)) { - $result = ($result and ($this->_unlink($file2))); - } - break; - case 'ingroup': - default: - if (strpos($file2, $motif, 0)) { - $result = ($result and ($this->_unlink($file2))); - } - break; - } - } - if ((is_dir($file2)) and ($this->_hashedDirectoryLevel>0)) { - $result = ($result and ($this->_cleanDir($file2 . '/', $group, $mode))); - } - } - } - } - return $result; - } - - /** - * Add some date in the memory caching array - * - * @param string $id cache id - * @param string $data data to cache - * @access private - */ - function _memoryCacheAdd($id, $data) - { - $this->_memoryCachingArray[$this->_file] = $data; - if ($this->_memoryCachingCounter >= $this->_memoryCachingLimit) { - list($key, $value) = each($this->_memoryCachingArray); - unset($this->_memoryCachingArray[$key]); - } else { - $this->_memoryCachingCounter = $this->_memoryCachingCounter + 1; - } - } - - /** - * Make a file name (with path) - * - * @param string $id cache id - * @param string $group name of the group - * @access private - */ - function _setFileName($id, $group) - { - - if ($this->_fileNameProtection) { - $suffix = 'cache_'.md5($group).'_'.md5($id); - } else { - $suffix = 'cache_'.$group.'_'.$id; - } - $root = $this->_cacheDir; - if ($this->_hashedDirectoryLevel>0) { - $hash = md5($suffix); - for ($i=0 ; $i<$this->_hashedDirectoryLevel ; $i++) { - $root = $root . 'cache_' . substr($hash, 0, $i + 1) . '/'; - } - } - $this->_fileName = $suffix; - $this->_file = $root.$suffix; - } - - /** - * Read the cache file and return the content - * - * @return string content of the cache file - * @access private - */ - function _read() - { - $fp = @fopen($this->_file, "rb"); - if ($this->_fileLocking) @flock($fp, LOCK_SH); - if ($fp) { - clearstatcache(); // because the filesize can be cached by PHP itself... - $length = @filesize($this->_file); - $mqr = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - if ($this->_readControl) { - $hashControl = @fread($fp, 32); - $length = $length - 32; - } - if ($length) { - $data = @fread($fp, $length); - } else { - $data = ''; - } - set_magic_quotes_runtime($mqr); - if ($this->_fileLocking) @flock($fp, LOCK_UN); - @fclose($fp); - if ($this->_readControl) { - $hashData = $this->_hash($data, $this->_readControlType); - if ($hashData != $hashControl) { - @touch($this->_file, time() - 2*abs($this->_lifeTime)); - return false; - } - } - return $data; - } - $this->raiseError('Cache_Lite : Unable to read cache !', -2); - return false; - } - - /** - * Write the given data in the cache file - * - * @param string $data data to put in cache - * @return boolean true if ok - * @access private - */ - function _write($data) - { - $try = 1; - while ($try<=2) { - $fp = @fopen($this->_file, "wb"); - if ($fp) { - if ($this->_fileLocking) @flock($fp, LOCK_EX); - if ($this->_readControl) { - @fwrite($fp, $this->_hash($data, $this->_readControlType), 32); - } - $len = strlen($data); - @fwrite($fp, $data, $len); - if ($this->_fileLocking) @flock($fp, LOCK_UN); - @fclose($fp); - return true; - } else { - if (($try==1) and ($this->_hashedDirectoryLevel>0)) { - $hash = md5($this->_fileName); - $root = $this->_cacheDir; - for ($i=0 ; $i<$this->_hashedDirectoryLevel ; $i++) { - $root = $root . 'cache_' . substr($hash, 0, $i + 1) . '/'; - @mkdir($root, $this->_hashedDirectoryUmask); - } - $try = 2; - } else { - $try = 999; - } - } - } - $this->raiseError('Cache_Lite : Unable to write cache file : '.$this->_file, -1); - return false; - } - - /** - * Write the given data in the cache file and control it just after to avoir corrupted cache entries - * - * @param string $data data to put in cache - * @return boolean true if the test is ok - * @access private - */ - function _writeAndControl($data) - { - $this->_write($data); - $dataRead = $this->_read($data); - return ($dataRead==$data); - } - - /** - * Make a control key with the string containing datas - * - * @param string $data data - * @param string $controlType type of control 'md5', 'crc32' or 'strlen' - * @return string control key - * @access private - */ - function _hash($data, $controlType) - { - switch ($controlType) { - case 'md5': - return md5($data); - case 'crc32': - return sprintf('% 32d', crc32($data)); - case 'strlen': - return sprintf('% 32d', strlen($data)); - default: - $this->raiseError('Unknown controlType ! (available values are only \'md5\', \'crc32\', \'strlen\')', -5); - } - } - -} - -?> Copied: tags/1.5/bundled-libs/Cache/Lite.php (from rev 2608, branches/1.5/bundled-libs/Cache/Lite.php) Deleted: tags/1.5/docs/NEWS =================================================================== --- branches/1.5/docs/NEWS 2009-12-08 13:16:18 UTC (rev 2600) +++ tags/1.5/docs/NEWS 2009-12-21 06:38:46 UTC (rev 2615) @@ -1,3461 +0,0 @@ -# $Id$ - -Version 1.5 () ------------------------------------------------------------------------- - - * Don't toggle the border of marked comments in the admin section - to 2px, to avoid padding. Thanks to hboeck! - - * Added expermiantel PDO::SQLite transport, by nth - - * Disallow uploading any files with ".php." in the filename - (garvinhicking) - - * Prevent password autocompletion for user passwords to prevent - possible mismatch. In media manager popup, fix bug that did - not properly forward to image selection after upload (onli) - - * Fix a bug in statistics output, when statistics for single-number - months is created. (Andreas Bilke) - - * Always increase last_modified when an entry is saved to prevent - stale entries in RSS feeds. Thanks to Cenic - - * Allow comment sidebar plugin to only show coments for entries - that are allowed to be viewed by the current visitor. - - * Also use htmlspecialchars() for the Recent Entries sidebar plugin - (Anson) - - * Do not send mails, if the "To:" address is empty, might happen - if authors do not have a mail account entered in their profile. - (nealk) - - * Fixed Spartacus download URLs for SF.Net mirror (christian_boltz) - - * Allow redirects when fetching remote images (garvinhicking) - - * Allow to define sort order for search-results (garvinhicking) - - * More PHP 5.3.0 compat (split(), ereg(), ereg_replace()). - - * PostgreSQL compatibility for the printArchives() function to - gather only unique timestamps (cite) - - -- beta1 release - - * PHP 5.3.0 compatibility without E_WARNING triggers (garvinhicking) - - * Added 'orderby' parameter to plugin API hooks for the serendipity - fulltext search function (garvinhicking) - - * Added new event hook frontend_sidebar_plugins to iterate through - sidebar plugins and modify their output. $eventData is the array - of their data. (garvinhicking) - - * Added ability to specify a custom Xinha config. Either supply - a 'my_custom.js' file inside the template directory, or if - omitted, the default htmlarea/my_custom.js is used. With this - you can overwrite the plugins and buttons of all Xinha instances. - See the mentioned default file for usage. (garvinhicking) - - * Removed "static" db layer typelist to prevent accidental over- - writes of referenced return values (garvinhicking) - - * Upgrade to Smarty 2.6.26 - - * Removed inline styles of the s9y media insertion, they will now - properly utilize CSS classes (defined in the new file - style_fallback.css). Also added support for entering "ALT/TITLE" - attributes to an <img> tag, can be used as a media property if - you add "ALT" and "TITLE" to the list of "Media properties" in the - main configuration. (garvinhicking) - - * Filter entries only by authors that have written at least - one article (garvinhicking) - - * Fix PDF imagemagick thumbnail generation to be properly displayed - (http://board.s9y.org/viewtopic.php?f=3&t=15446) - - * Warn about non-writable "plugins" directory in installation - - * Added new optional parameter for plugin config type "text": rows. - Added new optional parameter "input_type"="password" for plugin - string type configuration (brockhaus) - - * pingbacks were not counted as entry trackbacks although added to - entries. (brockhaus) - - * Added "exclude urls" to ip validation functionality in spam block - plugin. identi.ca is sending pingbacks but fails the ip validation! - (brockhaus) - - * no longer use htmlspecialchars() on the blog's title and sub- - title, to allow for custom HTML code to appear and unify - only letting Smarty do the escaping (garvinhicking,falk) - - * Plugin drag/drop now can scroll up/down/left/right when touching - the borders. Thanks to onli! - - * Changed shoutbox plugin. Shoutbox input size is configurable now. - Wrong description for dateformat fixed. - (brockhaus) - - * Change mail entry plugin to be able to send mails without - hyperlinks and images. (garvinhicking) - - * Change uriArgument parsing routine to allow "!" in URLs. - Now we can have absolute serocracy. - - * Changed image upload workflow so that the upload results/errors - are shown on top of the media library, allowing to go on - immediately (onli) - - * Added new smarty variable $admin_vars.title to the admin/index.tpl - template file to customize the title (onli) - - * Add new config option to base server time on UTC - (http://board.s9y.org/viewtopic.php?f=2&t=15123) (Abdussamad) - - * Use a unique session name for each blog instance, so that multiple - s9y installations can live on the same domain and having their - own sessions (kleinerChemiker, DrNI) - - * Livejournal importer update by Anson now supports importing - comments, see http://board.s9y.org/viewtopic.php?f=11&t=15141 - - * Enhance xhtml cleanup plugin to also work on <param value="..." /> - tags and fix youtube html. (garvinhicking) - - * Changed bookmarklet to work with Chrome, thanks to Oliver - Gassner & TextPattern :-) (garvinhicking) - - * Enhanced serendipity_printEntries() logic to bypass smarty - parsing ($smarty_fetch) (garvinhicking) - - * Changed karma plugin to only track GET requests as visits, not - POSTs. Thanks to Marcus Friedman - - * Enhanced nl2br plugin to also use <p> tags, by onli - - * Added possibility for templates to register a central function - serendipity_plugin_api_event_hook() and - serendipity_plugin_api_pre_event_hook() that can be used to - use plugin API interaction WITHOUT actual plugins. So special - plugins can be bundled within a template, without the need to - seperately install them. The "pre" function is called BEFORE - all normal plugins are executed, the normal function is called - AFTER plugin execution. (garvinhicking) - - * Change javascript non-wysiwyg insertion methods to propery - return to scrollposition, patch by onli - - * Enhance TrackExits plugin to also support link redirection for - future german law/access blocking :) (garvinhicking) - - * Enhance quicksearch by performing a wildcard-search for the - searchterms, when less than 4 matches are found. (onli) - - * Updated czech translation, by Vlada Ajgl - - * Use a space instead of comma to seperate DENY rules in spamblock - plugin, patch by brielle - - * Added ability to use strftime variables in the spamblock.log - filename. (kleinerchemiker) - - * Added improved Blogger.com importer using the API, thanks to jaa - - * Change password hashing from plain md5 to salted SHA1. Logins - should continue to work and are migrated to SHA1 keys upon - first login. MD5-logins will only work successfully once. This - mechanism will expire 6 months after the upgrade has been executed. - EXPERIMENTAL! (http://blog.s9y.org/archives/205-hash.html) - (garvinhicking) - - * Allow admins to also approve comments awaiting user-confirmation - (garvinhicking) - - * Fix statistics sidebar plugin to properly count weekly visitors - (garvinhicking) - - * Allow javascript inside Xinha WYSIWYG textarea (garvinhicking) - - * Allow anonymized submission to Typepad/Akismet to attribute - possible federal laws for data protection (garvinhicking) - (RFE #2517320) - - * Change antispam plugin to also support Typepad as an alternative - to Akismet. (judebert) - -Version 1.4.2 () ------------------------------------------------------------------------- - - * Changed spamblock plugin for text filtering to ignore trailing - or prepending spaces in blacklists (garvinhicking) - - * Change syndication plugin to also support new feeds2.feedburner.com - style URLs (garvinhicking) - - * Fix bad link in Remote RSS sidebar plugin (#2521122) - (garvinhicking) - -Version 1.4.1 (January 16th, 2009) ------------------------------------------------------------------------- - - * Fix missing index key creation for statistics tables in the - statistics plugin (isotopp) - - * Change "Allow duplicate content" in spamblock plugin to not - operate on (empty) pingbacks (garvinhicking) - - * Upgrade to Smarty 2.6.22 to fix a PCRE bug - - * Remove warning message when checking for plugin documentation files - on open_basedir servers (garvinhicking) - -Version 1.4 (December 29th 2008) ------------------------------------------------------------------------- - - * Added new event hooks for future support of WYSIWYG button - modifications (judebert) [1.4-beta2] - - * Added ability to rename "feeds" in the syndication plugin and - add a big image on top (onli) [1.4-beta2] - - * Added more parameters to {serendipity_printComments} function: - "block" (smarty block variable name), - "template" (smarty template file to render) - [1.4-beta2] - - * Fixed not remembering entryproperties when re-editing an entry, - introduced with 1.4-beta1 [1.4-beta2] - - * Added SMF importer [1.4-beta2] - - * Fix setting cookies for 30 Days, not only ~43 Minutes. Thanks - to konus! [1.4-beta2] - - * Adjust getting the right URL for karmavoting and shoutbox - plugins [1.4-beta2] - - * Added %parentname% permalink property to category structure, - so that a full category name path can be used instead of only - %name%. (garvinhicking) [1.4-beta2] - - * Made entrypropertie's password plugin form use "autocomplete=off" - to prevent inserting badly stored passwords. Thanks to sbauer! - [1.4-beta2] - - * Added full plugin name and links to documentation/changelog for - plugins on installation and configuration [1.4-beta2]: - - You can provide Documentation for your plugins by supplying a local file - called documentation_XX.html inside the plugin directory, which Serendipity - will automatically detect. - - You can also (additionally) add a property bag attribute "website" inside - your plugin's introspect() method: - - $propbag->add('website', 'http://anypage.com/'); - - To provide a version history, you can add a file "ChangeLog" (mind the exact - spelling) to your plugin directory. - - All three possible links are shown on the Serendipity interface when - configuring or installing a plugin. - - (garvinhicking) - - * Fix not properly counting trackbacks or resetting comment/tb - counter when editing an entry [1.4-beta2] (garvinhicking) - - * Added experimental Serendipity importer (for merging installations, - fore example). (Garvinhicking) - - * Use "autocomplete=off" for the default database password in - the installer, to workaround stupid Firefox password - autocompletion inserting the author password at this place. - - * Also recreate custom permalinks without using URL rewriting - (garvinhicking) - - * Fix WYSIWYG media insertion when being called on pages with - multiple HTML portions/nuggets, and also the staticpage plugin - (garvinhicking) - - * Prefix possibly missing http:// of commenting authors URLs - in recent comments sidebar plugin and admin interface. - (garvinhicking) - - * Recount trackbacks/comments when a new comment is made, instead - of carrying over an incrementing/decreminting counter for - entries, that might get off. (garvinhicking) - - * Add new global config option to support OptIn confirmation for - comment subscriptions (garvinhicking) - - * Allow spamblock plugin to use approval mechanism for comments, - so that commenting users first need to approve their comment - via email ("once" or "always" as options). - - * Replace htmlarea with XINHA. Thanks to abdussamad! - (Experimental! Needs testing on shared installations. Might - need browser cache refresh!) - - * Add link to preview entries by an author into the usermanagement - (garvinhicking) - - * Add memory_limit output to s9y installation, 8MB for 32bit and - 16MB for 64bit OSes - - * Add support for postgreSQL ts_vector fulltext search, thanks - to genesis. - - * Bulletproof: Added support for custom, randomized header image. - If you enter a path (relative to the domain root, like - '/blog/uploads/'), any of the contained images will be rotated. - (garvinhicking) - - * Added header('Status:...') calls so that some CGI installations - of apache emit proper headers (garvinhicking) - - * Add a "Configure this plugin" link to the frontend output for - every sidebar plugin, not only HTML nuggets. (garvinhicking) - - * Enhance entryproperties plugin to use sequencing widget: Allows - you to configure which fields you want to see in the 'Edit Entry' - panel for "Advanced Options". (garvinhicking) - - * Propagate a 'article_count' smarty variable for each category - in the category sidebar plugin, when article counting is - enabled. (garvinhicking) - - * Trackbacks are no longer sent when an entry shall be published - in the future. You can force them by editing and re-saving an - entry, once it is published. TODO: A plugin/cronjob to automatically - execute those trackbacks? (garvinhicking) - - * Allow 'sequence' widget to enable/disable each config item, - if the property "checkable" is added to the introspect method. - (garvinhicking) - - * Do not show title of entries marked as public/private when - viewed without permissions. Patch thanks to Anthem - - * Make cookie deletion routine use the same host like cookie - insertion, thanks to JPhilip - - * Added optional token insertion for comment notification - (moderation) e-mails, which you can click without the need - for authentication. This is a convenience feature, note that - if someone can access your mails, he does not need to authenticate - for deleting/approving a comment with the contained link. - (Rob A) - - * Fix showing wrong metadata (00:00:00" for uploaded metadata. - (garvinhicking) - - * RFE #2006182: Make search highlight plugin also honour serendipity's - search terms. (garvinhicking) - - * Improved "Remote RSS" plugin's templating output to select - custom template files. Add demo "Nasa Image of the Day" plugin - by Grigory F. (garvinhicking) - - * Fix Generic RSS import to not always assume WPXRSS feed. - (garvinhicking) - - * Fix bug in category sidebar plugin, which showed categories that - should have been hidden when the option "Hide parents of - selected sub-tree" was selected and Smarty templating was enabled. - (garvinhicking) - - * Change option to allow subscriptions to comments so that - fulltext comments can be mailed to subscribers. - (garvinhicking) - - * Default .htaccess now contains a conditional rewrite pattern - for fallback *.html generation. Thanks to absynth. - (TODO: Regenerate .htaccess on update, maybe make this - condition optional) - - * Update to Spartacus to support custom mirrors (garvinhicking) - - * Added possibility to access more SQL query parts of fetchEntries - through plugin API. New indexes of $eventData: - - 'single_group', 'single_having', 'single_orderby' for - serendipity_fetchEntry (through hook 'frontend_fetchentry') - - 'group', 'having' for - serendipity_fetchEntries (through hook 'frontend_fetchentries') - (judebert&garvinhicking) - - * Added RewriteRule to ensure that admin panel can be called, - thanks to rich4647 from the forums. - - * Added file checksums to be able to verify integral structure - of a s9y release (judebert) - - * Use semantically better HTML output by sidebar plugins - (ordererd lists, less <br>s, ...) (YellowLED) - - * Add new configuration option to allow rescaling thumbnails - with height/width/maximum size constraints. (judebert) - - * Allow to override $serendipity['languages'] array, do not issue - s9y version number in RSS feed if 'expose_s9y' is disabled. - - * Add new config option to entryproperties plugin to not use - extensive joins to save performance in cases where no ACLs - need to be evaluated. (garvinhicking) - -Version 1.3.1 () ------------------------------------------------------------------------- - - * Add XSS security checks for installer, even though very - hypothetical application :) (Hanno B - - * Add {serendipity_getImageSize} smarty function (judebert) - - * Add escaping to "Top Referrers" plugin and honor local configuration - of "Show links" option, thanks to Hanno B- - * Fix some PostgreSQL implicit casts for SQL queries (changed - LIKE to =). (Devrim G - -Version 1.3 (March 18th, 2008) ------------------------------------------------------------------------- - - * Fix possible XSS injection for published trackbacks, thanks to - Peter H - * Added "Google Reader" option to syndication plugin, by Adam - Charnock - - * Updated recent_entries plugin to show/hide on overview, detailed - entry, or all pages (don chambers). - - * Updated statistics plugin to contain per week/day visitors. - (roti) - - * Updated hungarian language - - * Allow to submit comments to future entries, when showing - future entries is enabled (garvinhicking) - -Version 1.3-beta1 (February 25th, 2008) ------------------------------------------------------------------------- - - * Fix sidebar plugin for the author's list to not include counting - drafted articles (garvinhicking) - - * Add option "template" to smarty function call {serendipity_ - printSidebar} (garvinhicking) - - * Upgrade to Smarty 2.6.19 (garvinhicking) - - * Fixed bug #1893108: Missing 'xmlns' attribute in templates for - <html> tag. (garvinhicking) - - * Updated karma ranking plugin to use nice graphics (judebert,gregman) - - * Added phpNuke importer (garvinhicking) - - * Add ability to plugins to check uploaded media files for invalid - file extensions. Added more escaping to user- and groupnames - for untrusted author environments, thanks to Hanno Boeck. - (garvinhicking) - - * Added czech translation to bulletproof templates and bundled - plugins, by Vlada Ajgl - - * Sidebar plugin comments: URLs of writers now are shown for all - entries not only for trackbacks. You may configure if they should - be shown for all, none, normal writers or trackback/pingbacks. - (brockhaus) - - * Pingback/Trackback textfetching: HTML Entities are now converted - to characters. (brockhaus) - - * For Pingback it is now possible to define the maximum amount of - characters while fetching text of the remote site. Add - $serendipity['pingbackFetchPageMaxLength'] = 200 to your - serendipity_config_local.php. (brockhaus) - - * Add ability to set comments as "pending" again, even when already - approved in the comment-moderation backend panel. - (garvinhicking) - - * Insert "serendipity_image_center", "serendipity_image_left" and - "serendipity_image_right" CSS classes to the image tag, when - inserting an image from the mediadatabase (garvinhicking) - - * Fix displaying entry title in the backend section exactly like - in the frontend, thanks to Alex (garvinhicking) - - * Added hooks to trackback listing in order to let plugins change - it (the avatar plugin in example) (brockhaus) - - * Add more verbose CSS classes to remote RSS sidebar plugin, also - only encapsulate the first XML-Item as link. All following - items are only encapsulated in <span>s. Also add possible - plugin_remoterss.tpl smarty output template to this - plugin. (garvinhicking) - - * Make browser compatibility plugin bail out for IE7. Thanks to - Freudi from the forums. - - * Add possibility to spartacus to upload files via FTP. This can - bypass Safe_mode restrictions on your server to make Spartacus - work for you. (VladaAjgl) - - * Add spartacus remote management versioning information subpage. - (garvinhicking) - - * Allow the "send mail" plugin to send mails to all registered - authors (garvinhicking) - - * New spam blocking method for trackbacks: ip validation. The - senders ip is compared with the ip of the host, the trackback is - set to. If they don't match, the trackback is rejected/moderated. - This should reject most of the trackback spam bots. (brockhaus) - - * Updated karma plugin to not track clicks of registered users - (brockhaus) - - * Made short-urls index.php?serendipity[id]=X or index.php?p=X - properly show a single entry view (garvinhicking) - - * Added new parameter "joinown" and "entryprops" to {serendipity_ - fetchPrintEntries} smarty function, to be able to fetch entries - according to their entryprops or other custom SQL. - (garvinhicking) - - * New plugin API method "parseTemplate($filename)" to allow a - sidebar- or event-plugin to fetch+display a smarty template. - (garvinhicking) - - * The archive sidebar plugin shiped with s9y now displays numbers - of articles correctly for month, catergories and so on, even - if multicategory articles are used. (brockhaus) - - * Added LifeType importer (garvinhicking) - - * The recent entries sidebar plugin shiped with s9y listed entries - not accessable by the current user because of right restrictions. - (brockhaus) - - * Patch popup-HTML-code insertion javascript to better inter- - operate with tinymce, xinha or fckeditor. Thanks to - Assen Tchorbadjiev. - - * Add experimental DB layer for "SQLRelay" database proxy extension, - by Dante Mason - - * On the fly update of the media database: Not only images are added - but video and audio, too. (brockhaus) - - * Trackbacks to links without a RDF-description now get properly - evaluated. Mostly WordPress-specific. (brockhaus) - - * Pingback receiving is working now with internal functionality in - comment.php Smarty trackback loader now loads trackbacks and - pingbacks (brockhaus) - - * Extended spam blocking plugin to handle pingbacks like trackbacks. - (brockhaus) - - * Full pingback support, fallback trackback method for WordPress - blogs. (brockhaus) - -Version 1.2.1 (December 8th, 2007) ------------------------------------------------------------------------- - - * Updated Textile library to 2.0, by Lars Strojny - - * Fix wrong entry timestamp used in comment feeds (garvinhicking) - - * Highlighting searched words in entries now uses str_replace instead - of slower and possibly insecure preg_replace(). Thanks to - Dietrich Raisin! - - * Updated WordPress imported to be able to import from a 2.3 - structure (experimental). Also added WPXRSS import to the - generic RSS importer. (garvinhicking) - - * Fix proper encoding of '%' sign when used in post titles - (garvinhicking) - - * Encode RSS feed links, Patch by Hanno Boeck - - * Fix spartacus filter listing showing event plugin groups in the - sidebar listing. - - * Patch PEAR.php for better detection, if already included. - Thanks to Assen Tchorbadjiev. - - * Fix admin entry list when no entries exist or meet filter - criteria. (Don Chambers) - - * Fix PHP notice about session_start() - - * Bulletproof template can now include custom user stylesheets - (*_style.css) in the dropdown of a colorset. (garvinhicking) - -Version 1.2 (August 26th, 2007) ------------------------------------------------------------------------- - - * Added bulletproof template by http://s9y-bulletproof.com - - * (beta4) Fix comment-RSS feeds - - * (beta4) serendipity_plugin_comments now also supports Favatars and - Pavatars in combination with serendipity_event_gravatar instead of - Gravatars only. (brockhaus) - - * (beta4) Fix wrong event hook for entry manager to display toolbar - for the main body area. - - * (beta4) Stronger autologin cookie encryption, prevent mixup with - template options (which could make foreign users delete your - configured template option keys). Also use new serendpity_db_implode() - function for a safer API on image handling. - All hail Stefan Esser. :) - - * (beta4) Backend templating changes to insert more classes to input fields - etc (Don Chambers) - - * (beta4) Fix invalid pingback XML code, by Slim - - * (beta2) Fix when saving personal configuration the userlevel and - "no_create" flags where not properly saved, thanks to PHPaws! - (garvinhicking) - - * When a category or entry does not exist, emit HTTP 404 message - template instead of "No entries to print" and HTTP 200 status. - (garvinhicking) - - * Fix URL permalink lookup in some cases (garvinhicking, beta2) - - * Add admin backend templates for main area and the entry editor. - Falls back to default PHP output if Smarty cannot be utilized. - (garvinhicking) - - * Fix properly reinstantiating sessions and properly deleting cookies - when requested (garvinhicking) - - * Add support for sqlite3 (http://php-sqlite3.sourceforge.net/), by - geekmug - - * Change database types for IP addresses to varchar(64) to support - IPv6 (garvinhicking) - - * Make statistics, karma and spamblock plugin only log 255 characters - of HTTP User-Agent and Referrer strings to the database, as the - fields are only varchar(255). Thanks to jemm4jemm! - - * Fix bug in conjunction with PHP 5.2.1 changed variable-by-reference - handling that could result in no groups being listed for author - accounts (garvinhicking) - - * Fix redundant space when inserting links through the non-WYSIWYG - editor panel. Fix "null" insertion. Thanks to Alp Uckan. - - * Fix RSS fullfeed "let client decide" option typo. Previously this - always enforced a fullfeed to show, regardless of what the client - indicated. Thanks to stm9x9 (garvinhicking) - - * Add proper charset to CSS stylesheet. Thanks to SADtg - (garvinhicking) - - * Strip tags from comments also in RSS-Feeds for comments, thanks to - tmix from the forums (garvinhicking) - - * Patch #1697590: Proper directory name of SQLite DB-error messages, - thanks to Thijs Kinkhorst - - * Enabled setting cache-control headers by default. - - * Fix wrong next/previous page links when using wrapper.php indexFile - option. (garvinhicking) - - * Prevent cookie-based session fixation by regenerationg server-side - session ID. Major thanks to David Vieira-Kurz. - - * Display theme's preview_fullsize.jpg image when existing. Added - screenshots by williamts99. - - * Upgrade bundled Smarty to 2.6.18 (garvinhicking) - - * Make plugins be able to emit their own RSS-Feeds using - $eventData['template_file'] on the 'frontend_rss' event hook - (garvinhicking) - - * Fix missing %username% permalink pattern in single entry view. - Patch by cress_cc - - * Allow to specify non-default port when using MySQLi - (garvinhicking) - - * Show current captcha look in the plugin configuration menu - (garvinhicking) - - * Add new category property to hide blog postings made into sub- - categories from the frontend view, per category. Thanks to - netmorix from the forums! (garvinhicking) - - * Move possible hazardous personal configuration options ("Rights: - Publishing entries", "Forbid creating entries", "Access level"; - "Group memberships") to the user management section. - (garvinhicking) - - * Fix track exit url ids off by one when being used in conjunction - with caching plugin (garvinhicking) - - * Fix permalink patterns for some cases to properly detect - pagination variables instead of interpreting search words - as those. (garvinhicking) - - * Improve performance of displaying the complete archive. Instead - of year*months SQL queries, only one query is now used. - (garvinhicking) - - * Improve installation on hosts where fsockopen() is disabled - (garvinhicking) - - * Improve memory usage of WordPress importer, add debug output - (garvinhicking) - - * EXPERIMENTAL: Modify session language fetch function to allow - earlier plugin API calls (Rob Richards) - - * No longer accept trackbacks to draft entries.Thanks to j_b_poquelin - (garvinhicking) - - * Do not store an unnecessary config value for check_password - and password user properties. Thanks to jenzo from the forums! - (garvinhicking) - - * Update spamblock plugin to update a .htaccess file with DENY - rules based on recent spammer IPs. EXPERIMENTAL. - - * Support shared http/https sessions. Performing admin actions will - only be allowed (through tokens) on the protocol that was used for - login. Patch by Rob Richards - (http://board.s9y.org/viewtopic.php?p=49276) - - * Added PDO:PostgreSQL support (Theo Schlossnagle) - - * Dutch translation update with many fixes by Sam Geeraerts - - * Improve Livesearch-Plugin to abort search on outside-of-box - click, fetch proper "not found" message on zero results - (Lars Strojny) - - * Change bbCode plugin to use "white-space: pre". Thanks to jtb! - - * Moved drag+drop and YahooUI library into templates/default/ to - be used in shared installation environments (garvinhicking) - - * Improve WP importer by only fetching real posts (attachments/static - only optional) and splitting a post into extended/normal entry. - Thanks to jtb! - - * Update Spartacus plugin to allow configuring whether to fetch - Themes or Plugins, or only one/none of them (garvinhicking) - - * Remove "View" option for drafted entries in the "Edit entries" - section and replace with a "Preview" option. (garvinhicking) - - * Make spamblock plugin be more verbose in moderation-queue emails. - RFE #1626712 (garvinhicking) - - * BBCode plugin improvement: Proper DIV-tag nesting, modify CSS - code to use scrollbars (Jez Hancock) - - * Stricter mbstring-extension check for special charsets like czech, - thanks to mila - - * Upgraded DB-scheme to allow longer author usernames - - * Improved Spamblock plugin to allow filtering email addresses - (Boris) - - * Improved Spartacus' detection of firewalling/network connection - issues (judebert) - - * Introduce '%lowertitle%' permalink attribute to use lowercase - permalinks. (garvinhicking) - - * Allow to call permalinks that end with a "/" the same as if not - ending with a "/" (garvinhicking) - -Version 1.1.4 (August 8th, 2007) ------------------------------------------------------------------------- - - * Fix being able to set entryproperties values via POST-Request (and - being able to bypass password-protection of an entry, when the - Entryproperties plugin is installed). Thanks to Erich Schubert - -Version 1.1.3 (June 17th, 2007) ------------------------------------------------------------------------- - - * Fix SQL injection through 'commentMode' variable. Thanks to - Dr. Neal Krawetz - - * Fix missing %username% permalink pattern in single entry view. - Patch by cress_cc - -Version 1.1.2 (March 1st, 2007) ------------------------------------------------------------------------ - - * Fix showing SQL error message when an empty category is selected - for viewing. Fixes an issue reported by Samenspender that was - falsely declard as SQL injection. In fact, no invalid SQL code - can be injected. (garvinhicking) - - * Better checks to see if the local PEAR inclusion is required - (garvinhicking) - -Version 1.1.1 (February 22nd, 2007) ------------------------------------------------------------------------- - - * Patch plugin permissionship management to properly indicate - forbidden plugins/hooks, even if the admin user is not contained - within the configured group. Thanks to ICE! - (http://board.s9y.org/viewtopic.php?t=8773) (garvinhicking) - - * Patch pingback receiving function to use proper Regexp, thanks to - dhaun from the forums - - * Make categories sidebar plugin properly return evaluated categories - list to plugin_categories.tpl template. Currently, a hidden - structure would only be displayed when not using custom - template. (garvinhicking) - - * Change order of trackback execution flow (again) to preserve - references for plugins like Track Exits, when used in conjunction - with the entryproperties cache (garvinhicking) - - * Fixed a bug that prevented some entryproperty-plugins to execute - on the entry detail pane. (garvinhicking, Dragonblast) - - * Fix a bug in sending the right login session cookies on Windows IIS - servers. Major thanks to Shadowin from the forums! - -Version 1.1 (December 28th, 2006) ------------------------------------------------------------------------- - - * Fix better installer warning messages when directories have no - write privileges and already exist. Thanks to wagwag! - - * Small bugfixes: Allow to use different login credentials than the - current HTTP Basic-Auth, if used. Order categories by name in - single entry view (garvinhicking) - - * Added bookmarklet to Serendipity core, added to the "Further links" - welcome screen. Thanks to stm999999999! (garvinhicking) - - * Fixed a bug in lowercased DB key names in the plugin API table, - which prevented postgresql for properly printing a plugin list - in some setups (garvinhicking) - - * Huge SQL improvement by "caching" the current timestamp for - 5 minutes, so that an SQL string for the central logic will - stay the same for a 5 minute window, thus relying on the DB-Server - to cache query results ... [truncated message content] |