[Xfce4-commits] [www/forum.xfce.org] 55/79: Upgrade to Fluxbb 1.4.8.

noreply at xfce.org noreply at xfce.org
Tue May 21 14:48:50 CEST 2019


This is an automated email from the git hooks/post-receive script.

s   k   u   n   n   y   k       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       o   l   d   f   o   r   u   m   
   in repository www/forum.xfce.org.

commit ce720bfa9b9139a22a0facc0687207188f0bc5d1
Author: Nick Schermer <nick at xfce.org>
Date:   Sat Jan 7 21:24:01 2012 +0100

    Upgrade to Fluxbb 1.4.8.
---
 admin_bans.php                                 |   2 +-
 admin_categories.php                           |   2 +-
 admin_censoring.php                            |   2 +-
 admin_forums.php                               |   2 +-
 admin_groups.php                               |   2 +-
 admin_index.php                                |   2 +-
 admin_loader.php                               |   2 +-
 admin_maintenance.php                          |   2 +-
 admin_options.php                              |   2 +-
 admin_permissions.php                          |   2 +-
 admin_ranks.php                                |   2 +-
 admin_reports.php                              |   2 +-
 admin_users.php                                |   2 +-
 common.js                                      |   8 +-
 db_update.php                                  |   6 +-
 delete.php                                     |   2 +-
 edit.php                                       |   5 +-
 extern.php                                     |   2 +-
 footer.php                                     |   2 +-
 header.php                                     |  15 +-
 help.php                                       |   4 +-
 include/cache.php                              |   4 +-
 include/common.php                             |  14 +-
 include/common_admin.php                       |   2 +-
 include/dblayer/common_db.php                  |   2 +-
 include/dblayer/mysql.php                      |   2 +-
 include/dblayer/mysql_innodb.php               |   2 +-
 include/dblayer/mysqli.php                     |   2 +-
 include/dblayer/mysqli_innodb.php              |   2 +-
 include/dblayer/pgsql.php                      |   2 +-
 include/dblayer/sqlite.php                     |  16 +-
 include/email.php                              | 288 ++++++++++++-------------
 include/functions.php                          |  67 +++++-
 include/parser.php                             | 135 +++++++-----
 include/search_idx.php                         |  11 +-
 include/utf8/utf8.php                          |   2 +-
 include/utf8/utils/bad.php                     |  93 ++++----
 index.php                                      |   2 +-
 lang/English/admin_options.php                 |  22 +-
 lang/English/mail_templates/new_reply_full.tpl |   4 +-
 lang/English/mail_templates/new_topic_full.tpl |   4 +-
 lang/English/post.php                          |   2 +-
 lang/English/prof_reg.php                      |  22 +-
 login.php                                      |   2 +-
 misc.php                                       |   2 +-
 moderate.php                                   |   2 +-
 post.php                                       |  10 +-
 profile.php                                    |   2 +-
 register.php                                   |   2 +-
 search.php                                     |   4 +-
 style/imports/minmax.js                        |  12 +-
 userlist.php                                   |   2 +-
 viewforum.php                                  |   2 +-
 viewtopic.php                                  |   2 +-
 54 files changed, 455 insertions(+), 357 deletions(-)

diff --git a/admin_bans.php b/admin_bans.php
index d141889..ec5aa96 100644
--- a/admin_bans.php
+++ b/admin_bans.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_categories.php b/admin_categories.php
index 7f5ec0f..5baf447 100644
--- a/admin_categories.php
+++ b/admin_categories.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_censoring.php b/admin_censoring.php
index 06d2a85..de2c844 100644
--- a/admin_censoring.php
+++ b/admin_censoring.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_forums.php b/admin_forums.php
index 1d15a2a..c069392 100644
--- a/admin_forums.php
+++ b/admin_forums.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_groups.php b/admin_groups.php
index 7852e79..fa00b4f 100644
--- a/admin_groups.php
+++ b/admin_groups.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_index.php b/admin_index.php
index e4f6023..3515e13 100644
--- a/admin_index.php
+++ b/admin_index.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_loader.php b/admin_loader.php
index 7e753cd..4891f72 100644
--- a/admin_loader.php
+++ b/admin_loader.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_maintenance.php b/admin_maintenance.php
index 60cb957..600d434 100644
--- a/admin_maintenance.php
+++ b/admin_maintenance.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_options.php b/admin_options.php
index fdabe2b..3e8581e 100644
--- a/admin_options.php
+++ b/admin_options.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_permissions.php b/admin_permissions.php
index c92e01d..6abf977 100644
--- a/admin_permissions.php
+++ b/admin_permissions.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_ranks.php b/admin_ranks.php
index fb5f7c1..37e7e18 100644
--- a/admin_ranks.php
+++ b/admin_ranks.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_reports.php b/admin_reports.php
index 4f7d091..58aa976 100644
--- a/admin_reports.php
+++ b/admin_reports.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/admin_users.php b/admin_users.php
index d393d24..063b0b8 100644
--- a/admin_users.php
+++ b/admin_users.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/common.js b/common.js
index b7ff12f..47a7155 100644
--- a/common.js
+++ b/common.js
@@ -1,4 +1,10 @@
 
+/**
+ * Copyright (C) 2008-2012 FluxBB
+ * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
+ * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
+ */
+
 function select_checkboxes(curFormId, link, new_string)
 {
 	var curForm = document.getElementById(curFormId);
@@ -29,4 +35,4 @@ function unselect_checkboxes(curFormId, link, new_string)
 	link.innerHTML = new_string;
 
 	return false;
-}
\ No newline at end of file
+}
diff --git a/db_update.php b/db_update.php
index 20a00af..7706230 100644
--- a/db_update.php
+++ b/db_update.php
@@ -1,13 +1,13 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
 
 // The FluxBB version this script updates to
-define('UPDATE_TO', '1.4.7');
+define('UPDATE_TO', '1.4.8');
 
 define('UPDATE_TO_DB_REVISION', 15);
 define('UPDATE_TO_SI_REVISION', 2);
@@ -1905,4 +1905,4 @@ $db->end_transaction();
 $db->close();
 
 if ($query_str != '')
-	exit('<script type="text/javascript">window.location="db_update.php'.$query_str.'&uid='.$uid.'"</script><noscript><meta http-equiv="refresh" content="0;url=db_update.php'.$query_str.'&uid='.$uid.'" /></noscript>');
\ No newline at end of file
+	exit('<script type="text/javascript">window.location="db_update.php'.$query_str.'&uid='.$uid.'"</script><noscript><meta http-equiv="refresh" content="0;url=db_update.php'.$query_str.'&uid='.$uid.'" /></noscript>');
diff --git a/delete.php b/delete.php
index 7844c4b..ba92f19 100644
--- a/delete.php
+++ b/delete.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/edit.php b/edit.php
index 1f35edd..58f8be3 100644
--- a/edit.php
+++ b/edit.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -108,6 +108,9 @@ if (isset($_POST['form_sent']))
 	$stick_topic = isset($_POST['stick_topic']) ? '1' : '0';
 	if (!$is_admmod)
 		$stick_topic = $cur_post['sticky'];
+	
+	// Replace four-byte characters (MySQL cannot handle them)
+	$message = strip_bad_multibyte_chars($message);
 
 	// Did everything go according to plan?
 	if (empty($errors) && !isset($_POST['preview']))
diff --git a/extern.php b/extern.php
index 364229e..eb4bc94 100644
--- a/extern.php
+++ b/extern.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/footer.php b/footer.php
index 6c92e00..b6b8a7a 100644
--- a/footer.php
+++ b/footer.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/header.php b/header.php
index b3a15a1..b4905aa 100644
--- a/header.php
+++ b/header.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -104,7 +104,7 @@ if (isset($required_fields))
 /* <![CDATA[ */
 function process_form(the_form)
 {
-	var element_names = {
+	var required_fields = {
 <?php
 	// Output a JavaScript object with localised field names
 	$tpl_temp = count($required_fields);
@@ -120,14 +120,11 @@ function process_form(the_form)
 		for (var i = 0; i < the_form.length; ++i)
 		{
 			var elem = the_form.elements[i];
-			if (elem.name && (/^req_/.test(elem.name)))
+			if (elem.name && required_fields[elem.name] && !elem.value && elem.type && (/^(?:text(?:area)?|password|file)$/i.test(elem.type)))
 			{
-				if (!elem.value && elem.type && (/^(?:text(?:area)?|password|file)$/i.test(elem.type)))
-				{
-					alert('"' + element_names[elem.name] + '" <?php echo $lang_common['required field'] ?>');
-					elem.focus();
-					return false;
-				}
+				alert('"' + required_fields[elem.name] + '" <?php echo $lang_common['required field'] ?>');
+				elem.focus();
+				return false;
 			}
 		}
 	}
diff --git a/help.php b/help.php
index 0820794..39e5d07 100644
--- a/help.php
+++ b/help.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -55,7 +55,7 @@ require PUN_ROOT.'header.php';
 		<p><?php echo $lang_help['Links info'] ?></p>
 		<p><code>[url=<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>]<?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>"><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?></a></samp></p>
 		<p><code>[url]<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/') ?></a></samp></p>
-		<p><code>[url=/help.php]<?php echo $lang_help['This help page'] ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo get_base_url(true).'/help.php' ?>"><?php echo $lang_help['This help page'] ?></a></samp></p>
+		<p><code>[url=/help.php]<?php echo $lang_help['This help page'] ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/help.php') ?>"><?php echo $lang_help['This help page'] ?></a></samp></p>
 		<p><code>[email]myname at mydomain.com[/email]</code> <?php echo $lang_help['produces'] ?> <samp><a href="mailto:myname at mydomain.com">myname at mydomain.com</a></samp></p>
 		<p><code>[email=myname at mydomain.com]<?php echo $lang_help['My email address'] ?>[/email]</code> <?php echo $lang_help['produces'] ?> <samp><a href="mailto:myname at mydomain.com"><?php echo $lang_help['My email address'] ?></a></samp></p>
 		<p><code>[topic=1]<?php echo $lang_help['Test topic'] ?>[/topic]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?id=1') ?>"><?php echo $lang_help['Test topic'] ?></a></samp></p>
diff --git a/include/cache.php b/include/cache.php
index 2070fb4..e4b9112 100644
--- a/include/cache.php
+++ b/include/cache.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -20,6 +20,8 @@ function generate_config_cache()
 
 	// Get the forum config from the DB
 	$result = $db->query('SELECT * FROM '.$db->prefix.'config', true) or error('Unable to fetch forum config', __FILE__, __LINE__, $db->error());
+
+	$output = array();
 	while ($cur_config_item = $db->fetch_row($result))
 		$output[$cur_config_item[0]] = $cur_config_item[1];
 
diff --git a/include/common.php b/include/common.php
index 59d21e6..6b9319e 100644
--- a/include/common.php
+++ b/include/common.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -10,7 +10,7 @@ if (!defined('PUN_ROOT'))
 	exit('The constant PUN_ROOT must be defined and point to a valid FluxBB installation root directory.');
 
 // Define the version and database revision that this code was written for
-define('FORUM_VERSION', '1.4.7');
+define('FORUM_VERSION', '1.4.8');
 
 define('FORUM_DB_REVISION', 15);
 define('FORUM_SI_REVISION', 2);
@@ -71,7 +71,7 @@ if (get_magic_quotes_runtime())
 	set_magic_quotes_runtime(0);
 
 // Strip slashes from GET/POST/COOKIE/REQUEST/FILES (if magic_quotes_gpc is enabled)
-if (get_magic_quotes_gpc())
+if (!defined('FORUM_DISABLE_STRIPSLASHES') && get_magic_quotes_gpc())
 {
 	function stripslashes_array($array)
 	{
@@ -82,7 +82,13 @@ if (get_magic_quotes_gpc())
 	$_POST = stripslashes_array($_POST);
 	$_COOKIE = stripslashes_array($_COOKIE);
 	$_REQUEST = stripslashes_array($_REQUEST);
-	$_FILES = stripslashes_array($_FILES);
+	if (is_array($_FILES))
+	{
+		// Don't strip valid slashes from tmp_name path on Windows
+		foreach ($_FILES AS $key => $value)
+			$_FILES[$key]['tmp_name'] = str_replace('\\', '\\\\', $value['tmp_name']);
+		$_FILES = stripslashes_array($_FILES);
+	}
 }
 
 // If a cookie name is not specified in config.php, we use the default (pun_cookie)
diff --git a/include/common_admin.php b/include/common_admin.php
index bc353ac..594b401 100644
--- a/include/common_admin.php
+++ b/include/common_admin.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/common_db.php b/include/dblayer/common_db.php
index be48607..5b9e67e 100644
--- a/include/dblayer/common_db.php
+++ b/include/dblayer/common_db.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/mysql.php b/include/dblayer/mysql.php
index 53b37b2..6f0e3af 100644
--- a/include/dblayer/mysql.php
+++ b/include/dblayer/mysql.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/mysql_innodb.php b/include/dblayer/mysql_innodb.php
index 6851309..2b14ab2 100644
--- a/include/dblayer/mysql_innodb.php
+++ b/include/dblayer/mysql_innodb.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/mysqli.php b/include/dblayer/mysqli.php
index c17294d..9da4cf1 100644
--- a/include/dblayer/mysqli.php
+++ b/include/dblayer/mysqli.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/mysqli_innodb.php b/include/dblayer/mysqli_innodb.php
index b9f43db..1538c71 100644
--- a/include/dblayer/mysqli_innodb.php
+++ b/include/dblayer/mysqli_innodb.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/pgsql.php b/include/dblayer/pgsql.php
index 66b81ca..577b5a0 100644
--- a/include/dblayer/pgsql.php
+++ b/include/dblayer/pgsql.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/include/dblayer/sqlite.php b/include/dblayer/sqlite.php
index e934dc4..f634d5e 100644
--- a/include/dblayer/sqlite.php
+++ b/include/dblayer/sqlite.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -49,7 +49,7 @@ class DBLayer
 		if (!is_readable($db_name))
 			error('Unable to open database \''.$db_name.'\' for reading. Permission denied', __FILE__, __LINE__);
 
-		if (!is_writable($db_name))
+		if (!forum_is_writable($db_name))
 			error('Unable to open database \''.$db_name.'\' for writing. Permission denied', __FILE__, __LINE__);
 
 		if ($p_connect)
@@ -345,7 +345,7 @@ class DBLayer
 		if (!$this->table_exists($table_name, $no_prefix))
 			return true;
 
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
+		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name)) ? true : false;
 	}
 
 
@@ -372,7 +372,7 @@ class DBLayer
 		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($new_name).' SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($old_name)) ? true : false;
 
 		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
+		$result &= $this->drop_table($table_name, $no_prefix);
 
 		return $result;
 	}
@@ -460,7 +460,7 @@ class DBLayer
 		$new_table = trim($new_table, ',')."\n".');';
 
 		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
+		$result &= $this->drop_table($table_name, $no_prefix);
 
 		// Create new table
 		$result &= $this->query($new_table) ? true : false;
@@ -476,7 +476,7 @@ class DBLayer
 		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' ('.implode(', ', $old_columns).') SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now) ? true : false;
 
 		// Drop temp table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now);
+		$result &= $this->drop_table($table_name.'_t'.$now, $no_prefix);
 
 		return $result;
 	}
@@ -520,7 +520,7 @@ class DBLayer
 		$new_table = trim($new_table, ',')."\n".');';
 
 		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
+		$result &= $this->drop_table($table_name, $no_prefix);
 
 		// Create new table
 		$result &= $this->query($new_table) ? true : false;
@@ -537,7 +537,7 @@ class DBLayer
 		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' SELECT '.implode(', ', $new_columns).' FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now) ? true : false;
 
 		// Drop temp table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now);
+		$result &= $this->drop_table($table_name.'_t'.$now, $no_prefix);
 
 		return $result;
 	}
diff --git a/include/email.php b/include/email.php
index 94058d0..85543d1 100644
--- a/include/email.php
+++ b/include/email.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -60,149 +60,149 @@ function encode_mail_text($str)
 //
 function bbcode2email($text, $wrap_length = 72)
 {
-    static $base_url;
-
-    if (!isset($base_url))
-        $base_url = get_base_url();
-
-    $text = pun_trim($text, "\t\n ");
-
-    $shortcut_urls = array(
-        'topic' => '/viewtopic.php?id=$1',
-        'post' => '/viewtopic.php?pid=$1#p$1',
-        'forum' => '/viewforum.php?id=$1',
-        'user' => '/profile.php?id=$1',
-    );
-
-    // Split code blocks and text so BBcode in codeblocks won't be touched
-    list($code, $text) = extract_blocks($text, '[code]', '[/code]');
-
-    // Strip all bbcodes, except the quote, url, img, email, code and list items bbcodes
-    $text = preg_replace(array(
-        '%\[/?(?!(?:quote|url|topic|post|user|forum|img|email|code|list|\*))[a-z]+(?:=[^\]]+)?\]%i',
-        '%\n\[/?list(?:=[^\]]+)?\]%i' // A separate regex for the list tags to get rid of some whitespace
-    ), '', $text);
-
-    // Match the deepest nested bbcode
-    // An adapted example from Mastering Regular Expressions
-    $match_quote_regex = '%
-        \[(quote|\*|url|img|email|topic|post|user|forum)(?:=([^\]]+))?\]
-        (
-            (?>[^\[]*)
-            (?>
-                (?!\[/?\1(?:=[^\]]+)?\])
-                \[
-                [^\[]*
-            )*
-        )
-        \[/\1\]
-    %ix';
-
-    $url_index = 1;
-    $url_stack = array();
-    while (preg_match($match_quote_regex, $text, $matches))
-    {
-        // Quotes
-        if ($matches[1] == 'quote')
-        {
-            // Put '>' or '> ' at the start of a line
-            $replacement = preg_replace(
-                array('%^(?=\>)%m', '%^(?!\>)%m'),
-                array('>', '> '),
-                $matches[2]." said:\n".$matches[3]);
-        }
-
-        // List items
-        elseif ($matches[1] == '*')
-        {
-            $replacement = ' * '.$matches[3];
-        }
-
-        // URLs and emails
-        elseif (in_array($matches[1], array('url', 'email')))
-        {
-            if (!empty($matches[2]))
-            {
-                $replacement = '['.$matches[3].']['.$url_index.']';
-                $url_stack[$url_index] = $matches[2];
-                $url_index++;
-            }
-            else
-                $replacement = '['.$matches[3].']';
-        }
-
-        // Images
-        elseif ($matches[1] == 'img')
-        {
-            if (!empty($matches[2]))
-                $replacement = '['.$matches[2].']['.$url_index.']';
-            else
-                $replacement = '['.basename($matches[3]).']['.$url_index.']';
-
-            $url_stack[$url_index] = $matches[3];
-            $url_index++;
-        }
-
-        // Topic, post, forum and user URLs
-        elseif (in_array($matches[1], array('topic', 'post', 'forum', 'user')))
-        {
-            $url = isset($shortcut_urls[$matches[1]]) ? $base_url.$shortcut_urls[$matches[1]] : '';
-
-            if (!empty($matches[2]))
-            {
-                $replacement = '['.$matches[3].']['.$url_index.']';
-                $url_stack[$url_index] = str_replace('$1', $matches[2], $url);
-                $url_index++;
-            }
-            else
-                $replacement = '['.str_replace('$1', $matches[3], $url).']';
-        }
-
-        // Update the main text if there is a replacment
-        if (!is_null($replacement))
-        {
-            $text = str_replace($matches[0], $replacement, $text);
-            $replacement = null;
-        }
-    }
-
-    // Put code blocks and text together
-    if (isset($code))
-    {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($code[$i]))
-                $text .= trim($code[$i], "\n\r");
-        }
-    }
-
-    // Put URLs at the bottom
-    if ($url_stack)
-    {
-        $text .= "\n\n";
-        foreach ($url_stack as $i => $url)
-            $text .= "\n".' ['.$i.']: '.$url;
-    }
-
-    // Wrap lines if $wrap_length is higher than -1
-    if ($wrap_length > -1)
-    {
-        // Split all lines and wrap them individually
-        $parts = explode("\n", $text);
-        foreach ($parts as $k => $part)
-        {
-            preg_match('%^(>+ )?(.*)%', $part, $matches);
-            $parts[$k] = wordwrap($matches[1].$matches[2], $wrap_length -
-                strlen($matches[1]), "\n".$matches[1]);
-        }
-
-        return implode("\n", $parts);
-    }
-    else
-        return $text;
+	static $base_url;
+
+	if (!isset($base_url))
+		$base_url = get_base_url();
+
+	$text = pun_trim($text, "\t\n ");
+
+	$shortcut_urls = array(
+		'topic' => '/viewtopic.php?id=$1',
+		'post' => '/viewtopic.php?pid=$1#p$1',
+		'forum' => '/viewforum.php?id=$1',
+		'user' => '/profile.php?id=$1',
+	);
+
+	// Split code blocks and text so BBcode in codeblocks won't be touched
+	list($code, $text) = extract_blocks($text, '[code]', '[/code]');
+
+	// Strip all bbcodes, except the quote, url, img, email, code and list items bbcodes
+	$text = preg_replace(array(
+		'%\[/?(?!(?:quote|url|topic|post|user|forum|img|email|code|list|\*))[a-z]+(?:=[^\]]+)?\]%i',
+		'%\n\[/?list(?:=[^\]]+)?\]%i' // A separate regex for the list tags to get rid of some whitespace
+	), '', $text);
+
+	// Match the deepest nested bbcode
+	// An adapted example from Mastering Regular Expressions
+	$match_quote_regex = '%
+		\[(quote|\*|url|img|email|topic|post|user|forum)(?:=([^\]]+))?\]
+		(
+			(?>[^\[]*)
+			(?>
+				(?!\[/?\1(?:=[^\]]+)?\])
+				\[
+				[^\[]*
+			)*
+		)
+		\[/\1\]
+	%ix';
+
+	$url_index = 1;
+	$url_stack = array();
+	while (preg_match($match_quote_regex, $text, $matches))
+	{
+		// Quotes
+		if ($matches[1] == 'quote')
+		{
+			// Put '>' or '> ' at the start of a line
+			$replacement = preg_replace(
+				array('%^(?=\>)%m', '%^(?!\>)%m'),
+				array('>', '> '),
+				$matches[2]." said:\n".$matches[3]);
+		}
+
+		// List items
+		elseif ($matches[1] == '*')
+		{
+			$replacement = ' * '.$matches[3];
+		}
+
+		// URLs and emails
+		elseif (in_array($matches[1], array('url', 'email')))
+		{
+			if (!empty($matches[2]))
+			{
+				$replacement = '['.$matches[3].']['.$url_index.']';
+				$url_stack[$url_index] = $matches[2];
+				$url_index++;
+			}
+			else
+				$replacement = '['.$matches[3].']';
+		}
+
+		// Images
+		elseif ($matches[1] == 'img')
+		{
+			if (!empty($matches[2]))
+				$replacement = '['.$matches[2].']['.$url_index.']';
+			else
+				$replacement = '['.basename($matches[3]).']['.$url_index.']';
+
+			$url_stack[$url_index] = $matches[3];
+			$url_index++;
+		}
+
+		// Topic, post, forum and user URLs
+		elseif (in_array($matches[1], array('topic', 'post', 'forum', 'user')))
+		{
+			$url = isset($shortcut_urls[$matches[1]]) ? $base_url.$shortcut_urls[$matches[1]] : '';
+
+			if (!empty($matches[2]))
+			{
+				$replacement = '['.$matches[3].']['.$url_index.']';
+				$url_stack[$url_index] = str_replace('$1', $matches[2], $url);
+				$url_index++;
+			}
+			else
+				$replacement = '['.str_replace('$1', $matches[3], $url).']';
+		}
+
+		// Update the main text if there is a replacment
+		if (!is_null($replacement))
+		{
+			$text = str_replace($matches[0], $replacement, $text);
+			$replacement = null;
+		}
+	}
+
+	// Put code blocks and text together
+	if (isset($code))
+	{
+		$parts = explode("\1", $text);
+		$text = '';
+		foreach ($parts as $i => $part)
+		{
+			$text .= $part;
+			if (isset($code[$i]))
+				$text .= trim($code[$i], "\n\r");
+		}
+	}
+
+	// Put URLs at the bottom
+	if ($url_stack)
+	{
+		$text .= "\n\n";
+		foreach ($url_stack as $i => $url)
+			$text .= "\n".' ['.$i.']: '.$url;
+	}
+
+	// Wrap lines if $wrap_length is higher than -1
+	if ($wrap_length > -1)
+	{
+		// Split all lines and wrap them individually
+		$parts = explode("\n", $text);
+		foreach ($parts as $k => $part)
+		{
+			preg_match('%^(>+ )?(.*)%', $part, $matches);
+			$parts[$k] = wordwrap($matches[1].$matches[2], $wrap_length -
+				strlen($matches[1]), "\n".$matches[1]);
+		}
+
+		return implode("\n", $parts);
+	}
+	else
+		return $text;
 }
 
 
diff --git a/include/functions.php b/include/functions.php
index 7f10be3..e430b29 100644
--- a/include/functions.php
+++ b/include/functions.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -1653,7 +1653,7 @@ function remove_bad_characters($array)
 	$array = utf8_bad_strip($array);
 
 	// Remove control characters
-	$array = preg_replace('%[\x{00}-\x{08}\x{0b}-\x{0c}\x{0e}-\x{1f}]%', '', $array);
+	$array = preg_replace('%[\x00-\x08\x0b-\x0c\x0e-\x1f]%', '', $array);
 
 	// Replace some "bad" characters
 	$array = str_replace(array_keys($bad_utf8_chars), array_values($bad_utf8_chars), $array);
@@ -1777,7 +1777,7 @@ function forum_list_plugins($is_admin)
 //
 // Split text into chunks ($inside contains all text inside $start and $end, and $outside contains all text outside)
 //
-function split_text($text, $start, $end, &$errors, $retab = true)
+function split_text($text, $start, $end, $retab = true)
 {
 	global $pun_config, $lang_common;
 
@@ -1805,7 +1805,7 @@ function split_text($text, $start, $end, &$errors, $retab = true)
 // Extract blocks from a text with a starting and ending string
 // This function always matches the most outer block so nesting is possible
 //
-function extract_blocks($text, $start, $end, &$errors = array(), $retab = true)
+function extract_blocks($text, $start, $end, $retab = true)
 {
 	global $pun_config;
 
@@ -1995,6 +1995,65 @@ function ucp_preg_replace($pattern, $replace, $subject)
 	return $replaced;
 }
 
+//
+// Replace four-byte characters with a question mark
+//
+// As MySQL cannot properly handle four-byte characters with the default utf-8
+// charset up until version 5.5.3 (where a special charset has to be used), they
+// need to be replaced, by question marks in this case. 
+//
+function strip_bad_multibyte_chars($str)
+{
+	$result = '';
+	$length = strlen($str);
+	
+	for ($i = 0; $i < $length; $i++)
+	{
+		// Replace four-byte characters (11110www 10zzzzzz 10yyyyyy 10xxxxxx)
+		$ord = ord($str[$i]);
+		if ($ord >= 240 && $ord <= 244)
+		{
+			$result .= '?';
+			$i += 3;
+		}
+		else
+		{
+			$result .= $str[$i];
+		}
+	}
+	
+	return $result;
+}
+
+//
+// Check whether a file/folder is writable.
+//
+// This function also works on Windows Server where ACLs seem to be ignored.
+//
+function forum_is_writable($path)
+{
+	if (is_dir($path))
+	{
+		$path = rtrim($path, '/').'/';
+		return forum_is_writable($path.uniqid(mt_rand()).'.tmp');
+	}
+
+	// Check temporary file for read/write capabilities
+	$rm = file_exists($path);
+	$f = @fopen($path, 'a');
+
+	if ($f === false)
+		return false;
+
+	fclose($f);
+
+	if (!$rm)
+		@unlink($path);
+
+	return true;
+}
+
+
 // DEBUG FUNCTIONS BELOW
 
 //
diff --git a/include/parser.php b/include/parser.php
index 0aba148..5bb208a 100644
--- a/include/parser.php
+++ b/include/parser.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -76,10 +76,10 @@ function preparse_bbcode($text, &$errors, $is_signature = false)
 
 	// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
 	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
+		list($inside, $text) = extract_blocks($text, '[code]', '[/code]');
 
 	// Tidy up lists
-	$temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\', $errors)', $text);
+	$temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $text);
 
 	// If the regex failed
 	if ($temp === null)
@@ -115,7 +115,7 @@ function preparse_bbcode($text, &$errors, $is_signature = false)
 		$text = $temp_text;
 
 	// Remove empty tags
-	while (($new_text = strip_empty_bbcode($text, $errors)) !== false)
+	while (($new_text = strip_empty_bbcode($text)) !== false)
 	{
 		if ($new_text != $text)
 		{
@@ -137,11 +137,11 @@ function preparse_bbcode($text, &$errors, $is_signature = false)
 //
 // Strip empty bbcode tags from some text
 //
-function strip_empty_bbcode($text, &$errors)
+function strip_empty_bbcode($text)
 {
 	// If the message contains a code tag we have to split it up (empty tags within [code][/code] are fine)
 	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
+		list($inside, $text) = extract_blocks($text, '[code]', '[/code]');
 
 	// Remove empty tags
 	while (($new_text = preg_replace('%\[(b|u|s|ins|del|em|i|h|colou?r|quote|img|url|email|list|topic|post|forum|user)(?:\=[^\]]*)?\]\s*\[/\1\]%', '', $text)) !== NULL)
@@ -153,16 +153,17 @@ function strip_empty_bbcode($text, &$errors)
 	}
 
 	// If we split up the message before we have to concatenate it together again (code tags)
-    if (isset($inside)) {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($inside[$i]))
-                $text .= '[code]'.$inside[$i].'[/code]';
-        }
-    }
+	if (isset($inside))
+	{
+		$parts = explode("\1", $text);
+		$text = '';
+		foreach ($parts as $i => $part)
+		{
+			$text .= $part;
+			if (isset($inside[$i]))
+				$text .= '[code]'.$inside[$i].'[/code]';
+		}
+	}
 
 	// Remove empty code tags
 	while (($new_text = preg_replace('%\[(code)\]\s*\[/\1\]%', '', $text)) !== NULL)
@@ -352,18 +353,13 @@ function preparse_tags($text, &$errors, $is_signature = false)
 			$current = strtolower($current);
 
 		// This is if we are currently in a tag which escapes other bbcode such as code
-		// We keep a cound of ignored bbcodes (code tags) so we can nest them, but
+		// We keep a count of ignored bbcodes (code tags) so we can nest them, but
 		// only balanced sets of tags can be nested
 		if ($current_ignore)
 		{
 			// Increase the current ignored tags counter
 			if ('['.$current_ignore.']' == $current)
-			{
-				if (!isset($count_ignored[$current_tag]))
-					$count_ignored[$current_tag] = 2;
-				else
-					$count_ignored[$current_tag]++;
-			}
+				$count_ignored[$current_tag]++;
 
 			// Decrease the current ignored tags counter
 			if ('[/'.$current_ignore.']' == $current)
@@ -531,6 +527,7 @@ function preparse_tags($text, &$errors, $is_signature = false)
 			{
 				// It's an ignore tag so we don't need to worry about what's inside it
 				$current_ignore = $current_tag;
+				$count_ignored[$current_tag] = 1;
 				$new_text .= $current;
 				continue;
 			}
@@ -601,7 +598,7 @@ function preparse_tags($text, &$errors, $is_signature = false)
 //
 // Preparse the contents of [list] bbcode
 //
-function preparse_list_tag($content, $type = '*', &$errors)
+function preparse_list_tag($content, $type = '*')
 {
 	global $lang_common, $re_list;
 
@@ -610,7 +607,7 @@ function preparse_list_tag($content, $type = '*', &$errors)
 
 	if (strpos($content,'[list') !== false)
 	{
-		$content = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\', $errors)', $content);
+		$content = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $content);
 	}
 
 	$items = explode('[*]', str_replace('\"', '"', $content));
@@ -632,6 +629,11 @@ function preparse_list_tag($content, $type = '*', &$errors)
 function handle_url_tag($url, $link = '', $bbcode = false)
 {
 	$url = pun_trim($url);
+
+	// Deal with [url][img]http://example.com/test.png[/img][/url]
+	if (preg_match('%<img src=\\\\"(.*?)\\\\"%', $url, $matches))
+		return handle_url_tag($matches[1], $url, $bbcode);
+
 	$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
 	if (strpos($url, 'www.') === 0) // If it starts with www, we add http://
 		$full_url = 'http://'.$full_url;
@@ -776,14 +778,14 @@ function do_bbcode($text, $is_signature = false)
 	$pattern[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%e';
 	$pattern[] = '%\[email\]([^\[]*?)\[/email\]%';
 	$pattern[] = '%\[email=([^\[]+?)\](.*?)\[/email\]%';
-	$pattern[] = '%\[topic\]([^\[]*?)\[/topic\]%e';
-	$pattern[] = '%\[topic=([^\[]+?)\](.*?)\[/topic\]%e';
-	$pattern[] = '%\[post\]([^\[]*?)\[/post\]%e';
-	$pattern[] = '%\[post=([^\[]+?)\](.*?)\[/post\]%e';
-	$pattern[] = '%\[forum\]([^\[]*?)\[/forum\]%e';
-	$pattern[] = '%\[forum=([^\[]+?)\](.*?)\[/forum\]%e';
-	$pattern[] = '%\[user\]([^\[]*?)\[/user\]%e';
-	$pattern[] = '%\[user=([^\[]+?)\](.*?)\[/user\]%e';
+	$pattern[] = '%\[topic\]([1-9]\d*)\[/topic\]%e';
+	$pattern[] = '%\[topic=([1-9]\d*)\](.*?)\[/topic\]%e';
+	$pattern[] = '%\[post\]([1-9]\d*)\[/post\]%e';
+	$pattern[] = '%\[post=([1-9]\d*)\](.*?)\[/post\]%e';
+	$pattern[] = '%\[forum\]([1-9]\d*)\[/forum\]%e';
+	$pattern[] = '%\[forum=([1-9]\d*)\](.*?)\[/forum\]%e';
+	$pattern[] = '%\[user\]([1-9]\d*)\[/user\]%e';
+	$pattern[] = '%\[user=([1-9]\d*)\](.*?)\[/user\]%e';
 
 	$replace[] = 'handle_url_tag(\'$1\')';
 	$replace[] = 'handle_url_tag(\'$1\', \'$2\')';
@@ -812,8 +814,8 @@ function do_clickable($text)
 {
 	$text = ' '.$text;
 
-	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/[^\s\[]*[^\s.,?!\[;:-])?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5://$6\', \'$5://$6\', true).stripslashes(\'$4$10$11$12\')', $text);
-	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/[^\s\[]*[^\s.,?!\[;:-])?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5.$6\', \'$5.$6\', true).stripslashes(\'$4$10$11$12\')', $text);
+	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5://$6\', \'$5://$6\', true).stripslashes(\'$4$10$11$12\')', $text);
+	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5.$6\', \'$5.$6\', true).stripslashes(\'$4$10$11$12\')', $text);
 
 	return substr($text, 1);
 }
@@ -853,7 +855,7 @@ function parse_message($text, $hide_smilies)
 
 	// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
 	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
+		list($inside, $text) = extract_blocks($text, '[code]', '[/code]');
 
 	if ($pun_config['p_message_bbcode'] == '1' && strpos($text, '[') !== false && strpos($text, ']') !== false)
 		$text = do_bbcode($text);
@@ -867,24 +869,46 @@ function parse_message($text, $hide_smilies)
 	$text = str_replace($pattern, $replace, $text);
 
 	// If we split up the message before we have to concatenate it together again (code tags)
-    if (isset($inside)) {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($inside[$i]))
-            {
-                $num_lines = (substr_count($inside[$i], "\n"));
-                $text .= '</p><div class="codebox"><pre'.(($num_lines > 28) ? ' class="vscroll"' : '').'><code>'.pun_trim($inside[$i], "\n\r").'</code></pre></div><p>';
-            }
-        }
-    }
+	if (isset($inside))
+	{
+		$parts = explode("\1", $text);
+		$text = '';
+		foreach ($parts as $i => $part)
+		{
+			$text .= $part;
+			if (isset($inside[$i]))
+			{
+				$num_lines = (substr_count($inside[$i], "\n"));
+				$text .= '</p><div class="codebox"><pre'.(($num_lines > 28) ? ' class="vscroll"' : '').'><code>'.pun_trim($inside[$i], "\n\r").'</code></pre></div><p>';
+			}
+		}
+	}
 
+	return clean_paragraphs($text);
+}
+
+
+//
+// Clean up paragraphs and line breaks
+//
+function clean_paragraphs($text)
+{
 	// Add paragraph tag around post, but make sure there are no empty paragraphs
-	$text = preg_replace('%<br />\s*?<br />((\s*<br />)*)%i', "</p>$1<p>", $text);
-	$text = str_replace('<p><br />', '<p>', $text);
-	$text = str_replace('<p></p>', '', '<p>'.$text.'</p>');
+
+	$text = '<p>'.$text.'</p>';
+
+	// Replace any breaks next to paragraphs so our replace below catches them
+	$text = preg_replace('%(</?p>)(?:\s*?<br />){1,2}%i', '$1', $text);
+	$text = preg_replace('%(?:<br />\s*?){1,2}(</?p>)%i', '$1', $text);
+
+	// Remove any empty paragraph tags (inserted via quotes/lists/code/etc) which should be stripped
+	$text = str_replace('<p></p>', '', $text);
+
+	$text = preg_replace('%<br />\s*?<br />%i', '</p><p>', $text);
+
+	$text = str_replace('<p><br />', '<br /><p>', $text);
+	$text = str_replace('<br /></p>', '</p><br />', $text);
+	$text = str_replace('<p></p>', '<br /><br />', $text);
 
 	return $text;
 }
@@ -915,10 +939,5 @@ function parse_signature($text)
 	$replace = array('<br />', '    ', '  ', '  ');
 	$text = str_replace($pattern, $replace, $text);
 
-	// Add paragraph tag around post, but make sure there are no empty paragraphs
-	$text = preg_replace('%<br />\s*?<br />((\s*<br />)*)%i', "</p>$1<p>", $text);
-	$text = str_replace('<p><br />', '<p>', $text);
-	$text = str_replace('<p></p>', '', '<p>'.$text.'</p>');
-
-	return $text;
+	return clean_paragraphs($text);
 }
diff --git a/include/search_idx.php b/include/search_idx.php
index 210b268..0a886f4 100644
--- a/include/search_idx.php
+++ b/include/search_idx.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -47,9 +47,6 @@ define('PUN_CJK_HANGUL_REGEX', '['.
 //
 function split_words($text, $idx)
 {
-	// Remove BBCode
-	$text = preg_replace('%\[/?(b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list)(?:\=[^\]]*)?\]%', ' ', $text);
-
 	// Remove any apostrophes or dashes which aren't part of words
 	$text = substr(ucp_preg_replace('%((?<=[^\p{L}\p{N}])[\'\-]|[\'\-](?=[^\p{L}\p{N}]))%u', '', ' '.$text.' '), 1, -1);
 
@@ -108,6 +105,9 @@ function validate_search_word($word, $idx)
 	if (is_cjk($word))
 		return !$idx;
 
+	// Exclude % and * when checking whether current word is valid
+	$word = str_replace(array('%', '*'), '', $word);
+
 	// Check the word is within the min/max length
 	$num_chars = pun_strlen($word);
 	return $num_chars >= PUN_SEARCH_MIN_WORD && $num_chars <= PUN_SEARCH_MAX_WORD;
@@ -144,7 +144,8 @@ function strip_bbcode($text)
 		$patterns = array(
 			'%\[img=([^\]]*+)\]([^[]*+)\[/img\]%'									=>	'$2 $1',	// Keep the url and description
 			'%\[(url|email)=([^\]]*+)\]([^[]*+(?:(?!\[/\1\])\[[^[]*+)*)\[/\1\]%'	=>	'$2 $3',	// Keep the url and text
-			'%\[(img|url|email)\]([^[]*+(?:(?!\[/\1\])\[[^[]*+)*)\[/\1\]%'			=>	'$2',		// Keep the url
+			'%\[(topic|post|forum|user)\][1-9]\d*\[/\1\]%'							=>	' ',		// Do not index topic/post/forum/user ID
+			'%\[/?(b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list|topic|post|forum|user)(?:\=[^\]]*)?\]%'	=> ' ' // Remove BBCode
 		);
 	}
 
diff --git a/include/utf8/utf8.php b/include/utf8/utf8.php
index 281f18c..661b2d7 100644
--- a/include/utf8/utf8.php
+++ b/include/utf8/utf8.php
@@ -34,7 +34,7 @@ if (!defined('UTF8'))
 
 if (extension_loaded('mbstring') && !defined('UTF8_USE_MBSTRING') && !defined('UTF8_USE_NATIVE'))
 	define('UTF8_USE_MBSTRING', true);
-else
+else if (!defined('UTF8_USE_NATIVE'))
 	define('UTF8_USE_NATIVE', true);
 
 // utf8_strpos() and utf8_strrpos() need utf8_bad_strip() to strip invalid
diff --git a/include/utf8/utils/bad.php b/include/utf8/utils/bad.php
index 78e9d17..2704294 100644
--- a/include/utf8/utils/bad.php
+++ b/include/utf8/utils/bad.php
@@ -114,33 +114,9 @@ function utf8_bad_findall($str)
 * @package utf8
 * @subpackage bad
 */
-function utf8_bad_strip($str)
+function utf8_bad_strip($original)
 {
-	$UTF8_BAD =
-		'([\x00-\x7F]'.                          # ASCII (including control chars)
-		'|[\xC2-\xDF][\x80-\xBF]'.               # Non-overlong 2-byte
-		'|\xE0[\xA0-\xBF][\x80-\xBF]'.           # Excluding overlongs
-		'|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.    # Straight 3-byte
-		'|\xED[\x80-\x9F][\x80-\xBF]'.           # Excluding surrogates
-		'|\xF0[\x90-\xBF][\x80-\xBF]{2}'.        # Planes 1-3
-		'|[\xF1-\xF3][\x80-\xBF]{3}'.            # Planes 4-15
-		'|\xF4[\x80-\x8F][\x80-\xBF]{2}'.        # Plane 16
-		'|(.{1}))';                              # Invalid byte
-
-	ob_start();
-
-	while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches))
-	{
-		if (!isset($matches[2]))
-			echo $matches[0];
-
-		$str = substr($str, strlen($matches[0]));
-	}
-
-	$result = ob_get_contents();
-	ob_end_clean();
-
-	return $result;
+	return utf8_bad_replace($original, '');
 }
 
 /**
@@ -156,33 +132,52 @@ function utf8_bad_strip($str)
 * @package utf8
 * @subpackage bad
 */
-function utf8_bad_replace($str, $replace='?')
-{
-	$UTF8_BAD =
-		'([\x00-\x7F]'.                          # ASCII (including control chars)
-		'|[\xC2-\xDF][\x80-\xBF]'.               # Non-overlong 2-byte
-		'|\xE0[\xA0-\xBF][\x80-\xBF]'.           # Excluding overlongs
-		'|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.    # Straight 3-byte
-		'|\xED[\x80-\x9F][\x80-\xBF]'.           # Excluding surrogates
-		'|\xF0[\x90-\xBF][\x80-\xBF]{2}'.        # Planes 1-3
-		'|[\xF1-\xF3][\x80-\xBF]{3}'.            # Planes 4-15
-		'|\xF4[\x80-\x8F][\x80-\xBF]{2}'.        # Plane 16
-		'|(.{1}))';                              # Invalid byte
+function utf8_bad_replace($original, $replace = '?') {
+	$result = '';
+
+	$strlen = strlen($original);
+	for ($i = 0; $i < $strlen;) {
+		$char = $original[$i++];
+		$byte = ord($char);
+
+		if ($byte < 0x80) $bytes = 0; // 1-bytes (00000000 - 01111111)
+		else if ($byte < 0xC0) { // 1-bytes (10000000 - 10111111)
+			$result .= $replace;
+			continue;
+		}
+		else if ($byte < 0xE0) $bytes = 1; // 2-bytes (11000000 - 11011111)
+		else if ($byte < 0xF0) $bytes = 2; // 3-bytes (11100000 - 11101111)
+		else if ($byte < 0xF8) $bytes = 3; // 4-bytes (11110000 - 11110111)
+		else if ($byte < 0xFC) $bytes = 4; // 5-bytes (11111000 - 11111011)
+		else if ($byte < 0xFE) $bytes = 5; // 6-bytes (11111100 - 11111101)
+		else { // Otherwise it's something invalid
+			$result .= $replace;
+			continue;
+		}
 
-	ob_start();
+		// Check our input actually has enough data
+		if ($i + $bytes > $strlen) {
+			$result .= $replace;
+			continue;
+		}
 
-	while (preg_match('/'.$UTF8_BAD.'/S', $str, $matches))
-	{
-		if (!isset($matches[2]))
-			echo $matches[0];
-		else
-			echo $replace;
+		// If we've got this far then we have a multiple-byte character
+		for ($j = 0; $j < $bytes; $j++) {
+			$byte = $original[$i + $j];
 
-		$str = substr($str, strlen($matches[0]));
-	}
+			$char .= $byte;
+			$byte = ord($byte);
 
-	$result = ob_get_contents();
-	ob_end_clean();
+			// Every following byte must be 10000000 - 10111111
+			if ($byte < 0x80 || $byte > 0xBF) {
+				$result .= $replace;
+				continue 2;
+			}
+		}
+
+		$i += $bytes;
+		$result .= $char;
+	}
 
 	return $result;
 }
diff --git a/index.php b/index.php
index e80e73b..4cfbe71 100644
--- a/index.php
+++ b/index.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/lang/English/admin_options.php b/lang/English/admin_options.php
index 00923ce..0274bdf 100644
--- a/lang/English/admin_options.php
+++ b/lang/English/admin_options.php
@@ -51,27 +51,27 @@ $lang_admin_options = array(
 'UTC'								=>	'(UTC) Western European, Greenwich',
 'UTC+01:00'							=>	'(UTC+01:00) Central European, West African',
 'UTC+02:00'							=>	'(UTC+02:00) Eastern European, Central African',
-'UTC+03:00'							=>	'(UTC+03:00) Moscow, Eastern African',
+'UTC+03:00'							=>	'(UTC+03:00) Eastern African',
 'UTC+03:30'							=>	'(UTC+03:30) Iran',
-'UTC+04:00'							=>	'(UTC+04:00) Gulf, Samara',
+'UTC+04:00'							=>	'(UTC+04:00) Moscow, Gulf, Samara',
 'UTC+04:30'							=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'							=>	'(UTC+05:00) Pakistan, Yekaterinburg',
+'UTC+05:00'							=>	'(UTC+05:00) Pakistan',
 'UTC+05:30'							=>	'(UTC+05:30) India, Sri Lanka',
 'UTC+05:45'							=>	'(UTC+05:45) Nepal',
-'UTC+06:00'							=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
+'UTC+06:00'							=>	'(UTC+06:00) Bangladesh, Bhutan, Yekaterinburg',
 'UTC+06:30'							=>	'(UTC+06:30) Cocos Islands, Myanmar',
-'UTC+07:00'							=>	'(UTC+07:00) Indochina, Krasnoyarsk',
-'UTC+08:00'							=>	'(UTC+08:00) Greater China, Australian Western, Irkutsk',
+'UTC+07:00'							=>	'(UTC+07:00) Indochina, Novosibirsk',
+'UTC+08:00'							=>	'(UTC+08:00) Greater China, Australian Western, Krasnoyarsk',
 'UTC+08:45'							=>	'(UTC+08:45) Southeastern Western Australia',
-'UTC+09:00'							=>	'(UTC+09:00) Japan, Korea, Chita',
+'UTC+09:00'							=>	'(UTC+09:00) Japan, Korea, Chita, Irkutsk',
 'UTC+09:30'							=>	'(UTC+09:30) Australian Central',
-'UTC+10:00'							=>	'(UTC+10:00) Australian Eastern, Vladivostok',
+'UTC+10:00'							=>	'(UTC+10:00) Australian Eastern',
 'UTC+10:30'							=>	'(UTC+10:30) Lord Howe',
-'UTC+11:00'							=>	'(UTC+11:00) Solomon Island, Magadan',
+'UTC+11:00'							=>	'(UTC+11:00) Solomon Island, Vladivostok',
 'UTC+11:30'							=>	'(UTC+11:30) Norfolk Island',
-'UTC+12:00'							=>	'(UTC+12:00) New Zealand, Fiji, Kamchatka',
+'UTC+12:00'							=>	'(UTC+12:00) New Zealand, Fiji, Magadan',
 'UTC+12:45'							=>	'(UTC+12:45) Chatham Islands',
-'UTC+13:00'							=>	'(UTC+13:00) Tonga, Phoenix Islands',
+'UTC+13:00'							=>	'(UTC+13:00) Tonga, Phoenix Islands, Kamchatka',
 'UTC+14:00'							=>	'(UTC+14:00) Line Islands',
 
 // Timeout Section
diff --git a/lang/English/mail_templates/new_reply_full.tpl b/lang/English/mail_templates/new_reply_full.tpl
index 73363ea..4fbc777 100644
--- a/lang/English/mail_templates/new_reply_full.tpl
+++ b/lang/English/mail_templates/new_reply_full.tpl
@@ -2,6 +2,8 @@ Subject: Reply to topic: '<topic_subject>'
 
 <replier> has replied to the topic '<topic_subject>' to which you are subscribed. There may be more new replies, but this is the only notification you will receive until you visit the board again.
 
+The post is located at <post_url>
+
 The message reads as follows:
 -----------------------------------------------------------------------
 
@@ -9,8 +11,6 @@ The message reads as follows:
 
 -----------------------------------------------------------------------
 
-The post is located at <post_url>
-
 You can unsubscribe by going to <unsubscribe_url>
 
 --
diff --git a/lang/English/mail_templates/new_topic_full.tpl b/lang/English/mail_templates/new_topic_full.tpl
index 2ea6b0f..f70c726 100644
--- a/lang/English/mail_templates/new_topic_full.tpl
+++ b/lang/English/mail_templates/new_topic_full.tpl
@@ -2,6 +2,8 @@ Subject: New topic in forum: '<forum_name>'
 
 <poster> has posted a new topic '<topic_subject>' in the forum '<forum_name>', to which you are subscribed.
 
+The topic is located at <topic_url>
+
 The message reads as follows:
 -----------------------------------------------------------------------
 
@@ -9,8 +11,6 @@ The message reads as follows:
 
 -----------------------------------------------------------------------
 
-The topic is located at <topic_url>
-
 You can unsubscribe by going to <unsubscribe_url>
 
 --
diff --git a/lang/English/post.php b/lang/English/post.php
index 2b3c678..b89804b 100644
--- a/lang/English/post.php
+++ b/lang/English/post.php
@@ -9,7 +9,7 @@ $lang_post = array(
 'Too long subject'	=>	'Subjects cannot be longer than 70 characters.',
 'No message'		=>	'You must enter a message.',
 'No message after censoring'	=>	'You must enter a message. After applying censoring filters, your message was empty.',
-'Too long message'	=>	'Posts cannot be longer that %s bytes.',
+'Too long message'	=>	'Posts cannot be longer than %s bytes.',
 'All caps subject'	=>	'Subjects cannot contain only capital letters.',
 'All caps message'	=>	'Posts cannot contain only capital letters.',
 'Empty after strip'	=>	'It seems your post consisted of empty BBCodes only. It is possible that this happened because e.g. the innermost quote was discarded because of the maximum quote depth level.',
diff --git a/lang/English/prof_reg.php b/lang/English/prof_reg.php
index 1cbbec6..7a0a6f6 100644
--- a/lang/English/prof_reg.php
+++ b/lang/English/prof_reg.php
@@ -53,27 +53,27 @@ $lang_prof_reg = array(
 'UTC'						=>	'(UTC) Western European, Greenwich',
 'UTC+01:00'					=>	'(UTC+01:00) Central European, West African',
 'UTC+02:00'					=>	'(UTC+02:00) Eastern European, Central African',
-'UTC+03:00'					=>	'(UTC+03:00) Moscow, Eastern African',
+'UTC+03:00'					=>	'(UTC+03:00) Eastern African',
 'UTC+03:30'					=>	'(UTC+03:30) Iran',
-'UTC+04:00'					=>	'(UTC+04:00) Gulf, Samara',
+'UTC+04:00'					=>	'(UTC+04:00) Moscow, Gulf, Samara',
 'UTC+04:30'					=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'					=>	'(UTC+05:00) Pakistan, Yekaterinburg',
+'UTC+05:00'					=>	'(UTC+05:00) Pakistan',
 'UTC+05:30'					=>	'(UTC+05:30) India, Sri Lanka',
 'UTC+05:45'					=>	'(UTC+05:45) Nepal',
-'UTC+06:00'					=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
+'UTC+06:00'					=>	'(UTC+06:00) Bangladesh, Bhutan, Yekaterinburg',
 'UTC+06:30'					=>	'(UTC+06:30) Cocos Islands, Myanmar',
-'UTC+07:00'					=>	'(UTC+07:00) Indochina, Krasnoyarsk',
-'UTC+08:00'					=>	'(UTC+08:00) Greater China, Australian Western, Irkutsk',
+'UTC+07:00'					=>	'(UTC+07:00) Indochina, Novosibirsk',
+'UTC+08:00'					=>	'(UTC+08:00) Greater China, Australian Western, Krasnoyarsk',
 'UTC+08:45'					=>	'(UTC+08:45) Southeastern Western Australia',
-'UTC+09:00'					=>	'(UTC+09:00) Japan, Korea, Chita',
+'UTC+09:00'					=>	'(UTC+09:00) Japan, Korea, Chita, Irkutsk',
 'UTC+09:30'					=>	'(UTC+09:30) Australian Central',
-'UTC+10:00'					=>	'(UTC+10:00) Australian Eastern, Vladivostok',
+'UTC+10:00'					=>	'(UTC+10:00) Australian Eastern',
 'UTC+10:30'					=>	'(UTC+10:30) Lord Howe',
-'UTC+11:00'					=>	'(UTC+11:00) Solomon Island, Magadan',
+'UTC+11:00'					=>	'(UTC+11:00) Solomon Island, Vladivostok',
 'UTC+11:30'					=>	'(UTC+11:30) Norfolk Island',
-'UTC+12:00'					=>	'(UTC+12:00) New Zealand, Fiji, Kamchatka',
+'UTC+12:00'					=>	'(UTC+12:00) New Zealand, Fiji, Magadan',
 'UTC+12:45'					=>	'(UTC+12:45) Chatham Islands',
-'UTC+13:00'					=>	'(UTC+13:00) Tonga, Phoenix Islands',
+'UTC+13:00'					=>	'(UTC+13:00) Tonga, Phoenix Islands, Kamchatka',
 'UTC+14:00'					=>	'(UTC+14:00) Line Islands'
 
 );
diff --git a/login.php b/login.php
index 97c66b1..35f8673 100644
--- a/login.php
+++ b/login.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/misc.php b/misc.php
index 6f7755b..06a661b 100644
--- a/misc.php
+++ b/misc.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/moderate.php b/moderate.php
index 7f27d66..b4dad37 100644
--- a/moderate.php
+++ b/moderate.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/post.php b/post.php
index 9d09f10..e0b7192 100644
--- a/post.php
+++ b/post.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -152,6 +152,9 @@ if (isset($_POST['form_sent']))
 	$hide_smilies = isset($_POST['hide_smilies']) ? '1' : '0';
 	$subscribe = isset($_POST['subscribe']) ? '1' : '0';
 	$stick_topic = isset($_POST['stick_topic']) && $is_admmod ? '1' : '0';
+	
+	// Replace four-byte characters (MySQL cannot handle them)
+	$message = strip_bad_multibyte_chars($message);
 
 	$now = time();
 
@@ -451,10 +454,7 @@ if ($tid)
 		// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
 		if (strpos($q_message, '[code]') !== false && strpos($q_message, '[/code]') !== false)
 		{
-			$errors = array();
-			list($inside, $outside) = split_text($q_message, '[code]', '[/code]', $errors);
-			if (!empty($errors)) // Technically this shouldn't happen, since $q_message is an existing post it should only exist if it previously passed validation
-				message($errors[0]);
+			list($inside, $outside) = split_text($q_message, '[code]', '[/code]');
 
 			$q_message = implode("\1", $outside);
 		}
diff --git a/profile.php b/profile.php
index b735305..3bf2385 100644
--- a/profile.php
+++ b/profile.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/register.php b/register.php
index 0ef9832..8e7bceb 100644
--- a/register.php
+++ b/register.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/search.php b/search.php
index 12e1bbc..5174c61 100644
--- a/search.php
+++ b/search.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
@@ -28,7 +28,7 @@ require PUN_ROOT.'include/search_idx.php';
 if (isset($_GET['action']) || isset($_GET['search_id']))
 {
 	$action = (isset($_GET['action'])) ? $_GET['action'] : null;
-	$forums = isset($_GET['forums']) ? (is_array($_GET['forums']) ? $_GET['forums'] : explode(',', $_GET['forums'])) : (isset($_GET['forum']) ? array($_GET['forum']) : array());
+	$forums = isset($_GET['forums']) ? (is_array($_GET['forums']) ? $_GET['forums'] : array_filter(explode(',', $_GET['forums']))) : (isset($_GET['forum']) ? array($_GET['forum']) : array());
 	$sort_dir = (isset($_GET['sort_dir']) && $_GET['sort_dir'] == 'DESC') ? 'DESC' : 'ASC';
 
 	$forums = array_map('intval', $forums);
diff --git a/style/imports/minmax.js b/style/imports/minmax.js
index 65fddca..c8cb073 100644
--- a/style/imports/minmax.js
+++ b/style/imports/minmax.js
@@ -25,6 +25,16 @@ function minmax_bind(el) {
 		minmax_elements[minmax_elements.length]= el;
 		minmax_delayout();
 	}
+
+	if (cs['min-width'])
+		st['minWidth']= cs['min-width'];
+
+	ms= cs['minWidth'];
+	if (ms && ms!='auto' && ms!='none' && ms!='0' && ms!='') {
+		st.minmaxWidth= cs.width;
+		minmax_elements[minmax_elements.length]= el;
+		minmax_delayout();
+	}
 }
 
 var minmax_delaying= false;
@@ -81,4 +91,4 @@ minmax_scan();
 minmax_scanner= window.setInterval(minmax_scan, minmax_SCANDELAY);
 window.attachEvent('onload', minmax_stop);
 
- at end @*/
+ at end @*/
\ No newline at end of file
diff --git a/userlist.php b/userlist.php
index 73d448d..4b2473b 100644
--- a/userlist.php
+++ b/userlist.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/viewforum.php b/viewforum.php
index 32c3201..d9fe7a1 100644
--- a/viewforum.php
+++ b/viewforum.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */
diff --git a/viewtopic.php b/viewtopic.php
index 68ad091..7d1eab6 100644
--- a/viewtopic.php
+++ b/viewtopic.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * Copyright (C) 2008-2011 FluxBB
+ * Copyright (C) 2008-2012 FluxBB
  * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
  * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  */

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list