fluxbb-1.5.8 to fluxbb-1.5.9 Legend
Lines removed 
Lines changed
 Lines added

a/admin_maintenance.php b/admin_maintenance.php
120:     $db->end_transaction();120:     $db->end_transaction();
121:     $db->close();121:     $db->close();
122: 122: 
123:     exit('<script type="text/javascript">window.location="admin_maintenance.php'.$query_str.'"</script><hr /><p>'.sprintf($lang_admin_maintenance['Javascript redirect failed'], '<a href="admin_maintenance.php'.$query_str.'">'.$lang_admin_maintenance['Click here'].'</a>').'</p>');123:     exit('<meta http-equiv="refresh" content="0;url=admin_maintenance.php'.$query_str.'" /><hr /><p>'.sprintf($lang_admin_maintenance['Javascript redirect failed'], '<a href="admin_maintenance.php'.$query_str.'">'.$lang_admin_maintenance['Click here'].'</a>').'</p>');
124: }124: }
125: 125: 
126: if ($action == 'prune')126: if ($action == 'prune')


a/db_update.php b/db_update.php
  7:  */  7:  */
  8:   8: 
  9: // The FluxBB version this script updates to  9: // The FluxBB version this script updates to
 10: define('UPDATE_TO', '1.5.8'); 10: define('UPDATE_TO', '1.5.9');
 11:  11: 
 12: define('UPDATE_TO_DB_REVISION', 21); 12: define('UPDATE_TO_DB_REVISION', 21);
 13: define('UPDATE_TO_SI_REVISION', 2); 13: define('UPDATE_TO_SI_REVISION', 2);
1906: $db->close();1906: $db->close();
1907: 1907: 
1908: if ($query_str != '')1908: if ($query_str != '')


a/footer.php b/footer.php
 29: { 29: {
 30:     echo "\t\t".'<div id="modcontrols" class="inbox">'."\n"; 30:     echo "\t\t".'<div id="modcontrols" class="inbox">'."\n";
 31:  31: 
  32:     $token_url = '&amp;csrf_token='.pun_csrf_token();
  33: 
 32:     if ($footer_style == 'viewforum') 34:     if ($footer_style == 'viewforum')
 33:     { 35:     {
 34:         echo "\t\t\t".'<dl>'."\n"; 36:         echo "\t\t\t".'<dl>'."\n";
 44:         echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;move_topics='.$id.'">'.$lang_common['Move topic'].'</a></span></dd>'."\n"; 46:         echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;move_topics='.$id.'">'.$lang_common['Move topic'].'</a></span></dd>'."\n";
 45:  47: 
 46:         if ($cur_topic['closed'] == '1') 48:         if ($cur_topic['closed'] == '1')
 47:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;open='.$id.'">'.$lang_common['Open topic'].'</a></span></dd>'."\n"; 49:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;open='.$id.$token_url.'">'.$lang_common['Open topic'].'</a></span></dd>'."\n";
 48:         else 50:         else
 49:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;close='.$id.'">'.$lang_common['Close topic'].'</a></span></dd>'."\n"; 51:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;close='.$id.$token_url.'">'.$lang_common['Close topic'].'</a></span></dd>'."\n";
 50:  52: 
 51:         if ($cur_topic['sticky'] == '1') 53:         if ($cur_topic['sticky'] == '1')
 52:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;unstick='.$id.'">'.$lang_common['Unstick topic'].'</a></span></dd>'."\n"; 54:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;unstick='.$id.$token_url.'">'.$lang_common['Unstick topic'].'</a></span></dd>'."\n";
 53:         else 55:         else
 54:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;stick='.$id.'">'.$lang_common['Stick topic'].'</a></span></dd>'."\n"; 56:             echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;stick='.$id.$token_url.'">'.$lang_common['Stick topic'].'</a></span></dd>'."\n";
 55:  57: 
 56:         echo "\t\t\t".'</dl>'."\n"; 58:         echo "\t\t\t".'</dl>'."\n";
 57:     } 59:     }


a/header.php b/header.php
 20: header('Content-type: text/html; charset=utf-8'); 20: header('Content-type: text/html; charset=utf-8');
 21:  21: 
 22: // Prevent site from being embedded in a frame 22: // Prevent site from being embedded in a frame
 23: header('X-Frame-Options: deny'); 23: $frame_options = defined('FORUM_FRAME_OPTIONS') ? FORUM_FRAME_OPTIONS : 'deny';
  24: header('X-Frame-Options: '.$frame_options);
 24:  25: 
 25: // Load the template 26: // Load the template
 26: if (defined('PUN_ADMIN_CONSOLE')) 27: if (defined('PUN_ADMIN_CONSOLE'))
207:     if ($pun_user['is_admmod'])208:     if ($pun_user['is_admmod'])
208:         $links[] = '<li id="navadmin"'.((PUN_ACTIVE_PAGE == 'admin') ? ' class="isactive"' : '').'><a href="admin_index.php">'.$lang_common['Admin'].'</a></li>';209:         $links[] = '<li id="navadmin"'.((PUN_ACTIVE_PAGE == 'admin') ? ' class="isactive"' : '').'><a href="admin_index.php">'.$lang_common['Admin'].'</a></li>';
209: 210: 
210:     $links[] = '<li id="navlogout"><a href="login.php?action=out&amp;id='.$pun_user['id'].'&amp;csrf_token='.pun_hash($pun_user['id'].pun_hash(get_remote_address())).'">'.$lang_common['Logout'].'</a></li>';211:     $links[] = '<li id="navlogout"><a href="login.php?action=out&amp;id='.$pun_user['id'].'&amp;csrf_token='.pun_csrf_token().'">'.$lang_common['Logout'].'</a></li>';
211: }212: }
212: 213: 
213: // Are there any additional navlinks we should insert into the array before imploding it?214: // Are there any additional navlinks we should insert into the array before imploding it?


a/include/addons.php b/include/addons.php
 26:     { 26:     {
 27:         $this->loaded = true; 27:         $this->loaded = true;
 28:  28: 
 29:         foreach (glob(PUN_ROOT.'addons/*.php') as $addon_file) 29:         $d = dir(PUN_ROOT.'addons');
  30:         if (!$d) return;
  31: 
  32:         while (($addon_file = $d->read()) !== false)
 30:         { 33:         {
 31:             $addon_name = 'addon_'.basename($addon_file, '.php'); 34:             if (!is_dir(PUN_ROOT.'addons/'.$addon_file) && preg_match('%(\w+)\.php$%', $addon_file))
  35:             {
  36:                 $addon_name = 'addon_'.substr($addon_file, 0, -4);
 32:  37: 
 33:             include $addon_file; 38:                 include PUN_ROOT.'addons/'.$addon_file;
 34:             $addon = new $addon_name; 39:                 $addon = new $addon_name;
 35:  40: 
 36:             $addon->register($this); 41:                 $addon->register($this);
  42:             }
 37:         } 43:         }
  44:         $d->close();
 38:     } 45:     }
 39:  46: 
 40:     function bind($hook, $callback) 47:     function bind($hook, $callback)


a/include/common.php b/include/common.php
 10:     exit('The constant PUN_ROOT must be defined and point to a valid FluxBB installation root directory.'); 10:     exit('The constant PUN_ROOT must be defined and point to a valid FluxBB installation root directory.');
 11:  11: 
 12: // Define the version and database revision that this code was written for 12: // Define the version and database revision that this code was written for
 13: define('FORUM_VERSION', '1.5.8'); 13: define('FORUM_VERSION', '1.5.9');
 14:  14: 
 15: define('FORUM_DB_REVISION', 21); 15: define('FORUM_DB_REVISION', 21);
 16: define('FORUM_SI_REVISION', 2); 16: define('FORUM_SI_REVISION', 2);
 38: if (defined('FORUM')) 38: if (defined('FORUM'))
 39:     define('PUN', FORUM); 39:     define('PUN', FORUM);
 40:  40: 
  41: // If PUN isn't defined, config.php is missing or corrupt
  42: if (!defined('PUN'))
  43: {
  44:     header('Location: install.php');
  45:     exit;
  46: }
  47: 
 41: // Load the functions script 48: // Load the functions script
 42: require PUN_ROOT.'include/functions.php'; 49: require PUN_ROOT.'include/functions.php';
 43:  50: 
 53: // Reverse the effect of register_globals 60: // Reverse the effect of register_globals
 54: forum_unregister_globals(); 61: forum_unregister_globals();
 55:  62: 
 56: // If PUN isn't defined, config.php is missing or corrupt 
 57: if (!defined('PUN')) 
 58: { 
 59:     header('Location: install.php'); 
 60:     exit; 
 61: } 
 62:  
 63: // The addon manager is responsible for storing the hook listeners and communicating with the addons 63: // The addon manager is responsible for storing the hook listeners and communicating with the addons
 64: $flux_addons = new flux_addon_manager(); 64: $flux_addons = new flux_addon_manager();
 65:  65: 


a/include/dblayer/mysql.php b/include/dblayer/mysql.php
 28:     ); 28:     );
 29:  29: 
 30:  30: 
 31:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 31:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 32:     { 32:     {
 33:         $this->prefix = $db_prefix; 33:         $this->prefix = $db_prefix;
 34:  34: 
 51:  51: 
 52:         return $this->link_id; 52:         return $this->link_id;
 53:     } 53:     }
  54:     
  55: 
  56:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  57:     {
  58:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  59:     }
 54:  60: 
 55:  61: 
 56:     function start_transaction() 62:     function start_transaction()
176:     {182:     {
177:         if ($this->link_id)183:         if ($this->link_id)
178:         {184:         {
179:             if ($this->query_result)185:             if (is_resource($this->query_result))
180:                 @mysql_free_result($this->query_result);186:                 @mysql_free_result($this->query_result);
181: 187: 
182:             return @mysql_close($this->link_id);188:             return @mysql_close($this->link_id);


a/include/dblayer/mysql_innodb.php b/include/dblayer/mysql_innodb.php
 29:     ); 29:     );
 30:  30: 
 31:  31: 
 32:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 32:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 33:     { 33:     {
 34:         $this->prefix = $db_prefix; 34:         $this->prefix = $db_prefix;
 35:  35: 
 52:  52: 
 53:         return $this->link_id; 53:         return $this->link_id;
 54:     } 54:     }
  55:     
  56:     
  57:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  58:     {
  59:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  60:     }
 55:  61: 
 56:  62: 
 57:     function start_transaction() 63:     function start_transaction()
189:     {195:     {
190:         if ($this->link_id)196:         if ($this->link_id)
191:         {197:         {
192:             if ($this->query_result)198:             if (is_resource($this->query_result))
193:                 @mysql_free_result($this->query_result);199:                 @mysql_free_result($this->query_result);
194: 200: 
195:             return @mysql_close($this->link_id);201:             return @mysql_close($this->link_id);


a/include/dblayer/mysqli.php b/include/dblayer/mysqli.php
 28:     ); 28:     );
 29:  29: 
 30:  30: 
 31:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 31:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 32:     { 32:     {
 33:         $this->prefix = $db_prefix; 33:         $this->prefix = $db_prefix;
 34:  34: 
 53:  53: 
 54:         return $this->link_id; 54:         return $this->link_id;
 55:     } 55:     }
  56:     
  57:     
  58:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  59:     {
  60:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  61:     }
 56:  62: 
 57:  63: 
 58:     function start_transaction() 64:     function start_transaction()
182:     {188:     {
183:         if ($this->link_id)189:         if ($this->link_id)
184:         {190:         {
185:             if ($this->query_result)191:             if ($this->query_result instanceof mysqli_result)
186:                 @mysqli_free_result($this->query_result);192:                 @mysqli_free_result($this->query_result);
187: 193: 
188:             return @mysqli_close($this->link_id);194:             return @mysqli_close($this->link_id);


a/include/dblayer/mysqli_innodb.php b/include/dblayer/mysqli_innodb.php
 29:     ); 29:     );
 30:  30: 
 31:  31: 
 32:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 32:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 33:     { 33:     {
 34:         $this->prefix = $db_prefix; 34:         $this->prefix = $db_prefix;
 35:  35: 
 56:     } 56:     }
 57:  57: 
 58:  58: 
  59:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  60:     {
  61:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  62:     }
  63: 
  64: 
 59:     function start_transaction() 65:     function start_transaction()
 60:     { 66:     {
 61:         ++$this->in_transaction; 67:         ++$this->in_transaction;
195:     {201:     {
196:         if ($this->link_id)202:         if ($this->link_id)
197:         {203:         {
198:             if ($this->query_result)204:             if ($this->query_result instanceof mysqli_result)
199:                 @mysqli_free_result($this->query_result);205:                 @mysqli_free_result($this->query_result);
200: 206: 
201:             return @mysqli_close($this->link_id);207:             return @mysqli_close($this->link_id);


a/include/dblayer/pgsql.php b/include/dblayer/pgsql.php
 35:     ); 35:     );
 36:  36: 
 37:  37: 
 38:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 38:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 39:     { 39:     {
 40:         $this->prefix = $db_prefix; 40:         $this->prefix = $db_prefix;
 41:  41: 
 73:  73: 
 74:         return $this->link_id; 74:         return $this->link_id;
 75:     } 75:     }
  76:     
  77: 
  78:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  79:     {
  80:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  81:     }
 76:  82: 
 77:  83: 
 78:     function start_transaction() 84:     function start_transaction()


a/include/dblayer/sqlite.php b/include/dblayer/sqlite.php
 31:     ); 31:     );
 32:  32: 
 33:  33: 
 34:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect) 34:     function __construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
 35:     { 35:     {
 36:         // Prepend $db_name with the path to the forum root directory 36:         // Prepend $db_name with the path to the forum root directory
 37:         $db_name = PUN_ROOT.$db_name; 37:         $db_name = PUN_ROOT.$db_name;
 62:         else 62:         else
 63:             return $this->link_id; 63:             return $this->link_id;
 64:     } 64:     }
  65:     
  66:     
  67:     function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
  68:     {
  69:         $this->__construct($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect);
  70:     }
 65:  71: 
 66:  72: 
 67:     function start_transaction() 73:     function start_transaction()


a/include/functions.php b/include/functions.php
 41:     if (isset($cookie) && $cookie['user_id'] > 1 && $cookie['expiration_time'] > $now) 41:     if (isset($cookie) && $cookie['user_id'] > 1 && $cookie['expiration_time'] > $now)
 42:     { 42:     {
 43:         // If the cookie has been tampered with 43:         // If the cookie has been tampered with
 44:         if (forum_hmac($cookie['user_id'].'|'.$cookie['expiration_time'], $cookie_seed.'_cookie_hash') != $cookie['cookie_hash']) 44:         $is_authorized = pun_hash_equals(forum_hmac($cookie['user_id'].'|'.$cookie['expiration_time'], $cookie_seed.'_cookie_hash'), $cookie['cookie_hash']);
  45:         if (!$is_authorized)
 45:         { 46:         {
 46:             $expire = $now + 31536000; // The cookie expires after a year 47:             $expire = $now + 31536000; // The cookie expires after a year
 47:             pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire); 48:             pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire);
 55:         $pun_user = $db->fetch_assoc($result); 56:         $pun_user = $db->fetch_assoc($result);
 56:  57: 
 57:         // If user authorisation failed 58:         // If user authorisation failed
 58:         if (!isset($pun_user['id']) || forum_hmac($pun_user['password'], $cookie_seed.'_password_hash') !== $cookie['password_hash']) 59:         $is_authorized = pun_hash_equals(forum_hmac($pun_user['password'], $cookie_seed.'_password_hash'), $cookie['password_hash']);
  60:         if (!isset($pun_user['id']) || !$is_authorized)
 59:         { 61:         {
 60:             $expire = $now + 31536000; // The cookie expires after a year 62:             $expire = $now + 31536000; // The cookie expires after a year
 61:             pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire); 63:             pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire);
161:     $result = $db->query('SELECT u.*, g.*, o.logged, o.idle FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON o.user_id=u.id WHERE '.(is_int($user) ? 'u.id='.intval($user) : 'u.username=\''.$db->escape($user).'\'')) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());163:     $result = $db->query('SELECT u.*, g.*, o.logged, o.idle FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON o.user_id=u.id WHERE '.(is_int($user) ? 'u.id='.intval($user) : 'u.username=\''.$db->escape($user).'\'')) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
162:     $pun_user = $db->fetch_assoc($result);164:     $pun_user = $db->fetch_assoc($result);
163: 165: 
 166:     $is_password_authorized = pun_hash_equals($password, $pun_user['password']);
 167:     $is_hash_authorized = pun_hash_equals(pun_hash($password), $pun_user['password']);
 168: 
164:     if (!isset($pun_user['id']) ||169:     if (!isset($pun_user['id']) ||
165:         ($password_is_hash && $password != $pun_user['password']) ||170:         ($password_is_hash && !$is_password_authorized ||
166:         (!$password_is_hash && pun_hash($password) != $pun_user['password']))171:         (!$password_is_hash && !$is_hash_authorized)))
167:         set_default_user();172:         set_default_user();
168:     else173:     else
169:         $pun_user['is_guest'] = false;174:         $pun_user['is_guest'] = false;
1142: 1147: 
1143: 1148: 
1144: //1149: //
 1150: // Compare two strings in constant time
 1151: // Inspired by WordPress
 1152: //
 1153: function pun_hash_equals($a, $b)
 1154: {
 1155:     if (function_exists('hash_equals'))
 1156:         return hash_equals($a, $b);
 1157: 
 1158:     $a_length = strlen($a);
 1159: 
 1160:     if ($a_length !== strlen($b))
 1161:         return false;
 1162: 
 1163:     $result = 0;
 1164: 
 1165:     // Do not attempt to "optimize" this.
 1166:     for ($i = 0; $i < $a_length; $i++)
 1167:         $result |= ord($a[$i]) ^ ord($b[$i]);
 1168: 
 1169:     return $result === 0;
 1170: }
 1171: 
 1172: 
 1173: //
 1174: // Compute a random hash used against CSRF attacks
 1175: //
 1176: function pun_csrf_token()
 1177: {
 1178:     global $pun_user;
 1179:     static $token;
 1180: 
 1181:     if (!isset($token))
 1182:         $token = pun_hash($pun_user['id'].$pun_user['password'].pun_hash(get_remote_address()));
 1183: 
 1184:     return $token;
 1185: }
 1186: 
 1187: //
 1188: // Check if the CSRF hash is correct
 1189: //
 1190: function check_csrf($token)
 1191: {
 1192:     global $lang_common;
 1193: 
 1194:     $is_hash_authorized = pun_hash_equals($token, pun_csrf_token());
 1195: 
 1196:     if (!isset($token) || !$is_hash_authorized)
 1197:         message($lang_common['Bad csrf hash'], false, '404 Not Found');
 1198: }
 1199: 
 1200: 
 1201: //
1145: // Try to determine the correct remote IP-address1202: // Try to determine the correct remote IP-address
1146: //1203: //
1147: function get_remote_address()1204: function get_remote_address()
2023: //2080: //
2024: function ucp_preg_replace($pattern, $replace, $subject, $callback = false)2081: function ucp_preg_replace($pattern, $replace, $subject, $callback = false)
2025: {2082: {
2026:     if($callback) 2083:     if($callback)
2027:         $replaced = preg_replace_callback($pattern, create_function('$matches', 'return '.$replace.';'), $subject);2084:         $replaced = preg_replace_callback($pattern, create_function('$matches', 'return '.$replace.';'), $subject);
2028:     else2085:     else
2029:         $replaced = preg_replace($pattern, $replace, $subject);2086:         $replaced = preg_replace($pattern, $replace, $subject);


a/include/parser.php b/include/parser.php
477:                                 if (!in_array($temp_tag, $tags_fix))477:                                 if (!in_array($temp_tag, $tags_fix))
478:                                 {478:                                 {
479:                                     // We couldn't fix nesting479:                                     // We couldn't fix nesting
480:                                     $errors[] = sprintf($lang_common['BBCode error no closing tag'], array_pop($temp_opened));480:                                     $errors[] = sprintf($lang_common['BBCode error no closing tag'], $temp_tag);
481:                                     return false;481:                                     return false;
482:                                 }482:                                 }
483:                                 array_push($temp_opened, $temp_tag);483:                                 array_push($temp_opened, $temp_tag);
761:     if (strpos($text, '[quote') !== false)761:     if (strpos($text, '[quote') !== false)
762:     {762:     {
763:         $text = preg_replace('%\[quote\]\s*%', '</p><div class="quotebox"><blockquote><div><p>', $text);763:         $text = preg_replace('%\[quote\]\s*%', '</p><div class="quotebox"><blockquote><div><p>', $text);
764:         $text = preg_replace_callback('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%s', create_function('$matches', 'global $lang_common; return "</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), $matches[2])." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>";'), $text);764:         $text = preg_replace_callback('%\[quote=(&quot;|&\#039;|"|\'|)([^\r\n]*?)\\1\]%s', create_function('$matches', 'global $lang_common; return "</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), $matches[2])." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>";'), $text);
765:         $text = preg_replace('%\s*\[\/quote\]%S', '</p></div></blockquote></div><p>', $text);765:         $text = preg_replace('%\s*\[\/quote\]%S', '</p></div></blockquote></div><p>', $text);
766:     }766:     }
767:     if (!$is_signature)767:     if (!$is_signature)


a/index.php b/index.php
 60:  60: 
 61: // Display a "mark all as read" link 61: // Display a "mark all as read" link
 62: if (!$pun_user['is_guest']) 62: if (!$pun_user['is_guest'])
 63:     $forum_actions[] = '<a href="misc.php?action=markread">'.$lang_common['Mark all as read'].'</a>'; 63:     $forum_actions[] = '<a href="misc.php?action=markread&amp;csrf_token='.pun_csrf_token().'">'.$lang_common['Mark all as read'].'</a>';
 64:  64: 
 65: $page_title = array(pun_htmlspecialchars($pun_config['o_board_title'])); 65: $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']));
 66: define('PUN_ALLOW_INDEX', 1); 66: define('PUN_ALLOW_INDEX', 1);


a/install.php b/install.php
  7:  */  7:  */
  8:   8: 
  9: // The FluxBB version this script installs  9: // The FluxBB version this script installs
 10: define('FORUM_VERSION', '1.5.8'); 10: define('FORUM_VERSION', '1.5.9');
 11:  11: 
 12: define('FORUM_DB_REVISION', 21); 12: define('FORUM_DB_REVISION', 21);
 13: define('FORUM_SI_REVISION', 2); 13: define('FORUM_SI_REVISION', 2);


a/lang/English/admin_maintenance.php b/lang/English/admin_maintenance.php
 12: 'Starting post help'            =>    'The post ID to start rebuilding at. The default value is the first available ID in the database. Normally you wouldn\'t want to change this.', 12: 'Starting post help'            =>    'The post ID to start rebuilding at. The default value is the first available ID in the database. Normally you wouldn\'t want to change this.',
 13: 'Empty index label'                =>    'Empty index', 13: 'Empty index label'                =>    'Empty index',
 14: 'Empty index help'                =>    'Select this if you want the search index to be emptied before rebuilding (see below).', 14: 'Empty index help'                =>    'Select this if you want the search index to be emptied before rebuilding (see below).',
 15: 'Rebuild completed info'        =>    'Once the process has completed, you will be redirected back to this page. It is highly recommended that you have JavaScript enabled in your browser during rebuilding (for automatic redirect when a cycle has completed). If you are forced to abort the rebuild process, make a note of the last processed post ID and enter that ID+1 in "Starting post ID" when/if you want to continue ("Empty index" must not be selected).', 15: 'Rebuild completed info'        =>    'Once the process has completed, you will be redirected back to this page. If you are forced to abort the rebuild process, make a note of the last processed post ID and enter that ID+1 in "Starting post ID" when/if you want to continue ("Empty index" must not be selected).',
 16: 'Rebuild index'                    =>    'Rebuild index', 16: 'Rebuild index'                    =>    'Rebuild index',
 17: 'Rebuilding search index'        =>    'Rebuilding search index', 17: 'Rebuilding search index'        =>    'Rebuilding search index',
 18: 'Rebuilding index info'            =>    'Rebuilding index. This might be a good time to put on some coffee :-)', 18: 'Rebuilding index info'            =>    'Rebuilding index. This might be a good time to put on some coffee :-)',
 19: 'Processing post'                =>    'Processing post <strong>%s</strong> …', 19: 'Processing post'                =>    'Processing post <strong>%s</strong> …',
 20: 'Click here'                    =>    'Click here', 20: 'Click here'                    =>    'Click here',
 21: 'Javascript redirect failed'    =>    'JavaScript redirect unsuccessful. %s to continue …', 21: 'Javascript redirect failed'    =>    'Automatic redirect unsuccessful. %s to continue …',
 22: 'Posts must be integer message'    =>    'Posts per cycle must be a positive integer value.', 22: 'Posts must be integer message'    =>    'Posts per cycle must be a positive integer value.',
 23: 'Days must be integer message'    =>    'Days to prune must be a positive integer value.', 23: 'Days must be integer message'    =>    'Days to prune must be a positive integer value.',
 24: 'No old topics message'            =>    'There are no topics that are %s days old. Please decrease the value of "Days old" and try again.', 24: 'No old topics message'            =>    'There are no topics that are %s days old. Please decrease the value of "Days old" and try again.',


a/lang/English/common.php b/lang/English/common.php
 16: 'No view'                            =>    'You do not have permission to view these forums.', 16: 'No view'                            =>    'You do not have permission to view these forums.',
 17: 'No permission'                        =>    'You do not have permission to access this page.', 17: 'No permission'                        =>    'You do not have permission to access this page.',
 18: 'Bad referrer'                        =>    'Bad HTTP_REFERER. You were referred to this page from an unauthorized source. If the problem persists please make sure that \'Base URL\' is correctly set in Admin/Options and that you are visiting the forum by navigating to that URL. More information regarding the referrer check can be found in the FluxBB documentation.', 18: 'Bad referrer'                        =>    'Bad HTTP_REFERER. You were referred to this page from an unauthorized source. If the problem persists please make sure that \'Base URL\' is correctly set in Admin/Options and that you are visiting the forum by navigating to that URL. More information regarding the referrer check can be found in the FluxBB documentation.',
  19: 'Bad csrf hash'                        =>    'Bad CSRF hash. You were referred to this page from an unauthorized source.',
 19: 'No cookie'                            =>    'You appear to have logged in successfully, however a cookie has not been set. Please check your settings and if applicable, enable cookies for this website.', 20: 'No cookie'                            =>    'You appear to have logged in successfully, however a cookie has not been set. Please check your settings and if applicable, enable cookies for this website.',
 20: 'Pun include extension'              =>    'Unable to process user include %s from template %s. "%s" files are not allowed', 21: 'Pun include extension'              =>    'Unable to process user include %s from template %s. "%s" files are not allowed',
 21: 'Pun include directory'                =>    'Unable to process user include %s from template %s. Directory traversal is not allowed', 22: 'Pun include directory'                =>    'Unable to process user include %s from template %s. Directory traversal is not allowed',


a/lang/English/update.php b/lang/English/update.php
 50: 'Converting item'                =>    'Converting %1$s %2$s …', 50: 'Converting item'                =>    'Converting %1$s %2$s …',
 51: 'Preparsing item'                =>    'Preparsing %1$s %2$s …', 51: 'Preparsing item'                =>    'Preparsing %1$s %2$s …',
 52: 'Rebuilding index item'            =>    'Rebuilding index for %1$s %2$s', 52: 'Rebuilding index item'            =>    'Rebuilding index for %1$s %2$s',
  53: 'Click here'                    =>    'Click here',
  54: 'Automatic redirect failed'        =>    'Automatic redirect unsuccessful. %s to continue …',
 53:  55: 
 54: 'ban'                            =>    'ban', 56: 'ban'                            =>    'ban',
 55: 'categories'                    =>    'categories', 57: 'categories'                    =>    'categories',


a/login.php b/login.php
 40:         // If there is a salt in the database we have upgraded from 1.3-legacy though haven't yet logged in 40:         // If there is a salt in the database we have upgraded from 1.3-legacy though haven't yet logged in
 41:         if (!empty($cur_user['salt'])) 41:         if (!empty($cur_user['salt']))
 42:         { 42:         {
 43:             if (sha1($cur_user['salt'].sha1($form_password)) == $cur_user['password']) // 1.3 used sha1(salt.sha1(pass)) 43:             $is_salt_authorized = pun_hash_equals(sha1($cur_user['salt'].sha1($form_password)), $cur_user['password']);
 44:             { 44:             if ($is_salt_authorized) // 1.3 used sha1(salt.sha1(pass))
  45:              {
 45:                 $authorized = true; 46:                 $authorized = true;
 46:  47: 
 47:                 $db->query('UPDATE '.$db->prefix.'users SET password=\''.$form_password_hash.'\', salt=NULL WHERE id='.$cur_user['id']) or error('Unable to update user password', __FILE__, __LINE__, $db->error()); 48:                 $db->query('UPDATE '.$db->prefix.'users SET password=\''.$form_password_hash.'\', salt=NULL WHERE id='.$cur_user['id']) or error('Unable to update user password', __FILE__, __LINE__, $db->error());
 50:         // If the length isn't 40 then the password isn't using sha1, so it must be md5 from 1.2 51:         // If the length isn't 40 then the password isn't using sha1, so it must be md5 from 1.2
 51:         else if (strlen($cur_user['password']) != 40) 52:         else if (strlen($cur_user['password']) != 40)
 52:         { 53:         {
 53:             if (md5($form_password) == $cur_user['password']) 54:             $is_md5_authorized = pun_hash_equals(md5($form_password), $cur_user['password']);
  55:             if ($is_md5_authorized)
 54:             { 56:             {
 55:                 $authorized = true; 57:                 $authorized = true;
 56:  58: 
 59:         } 61:         }
 60:         // Otherwise we should have a normal sha1 password 62:         // Otherwise we should have a normal sha1 password
 61:         else 63:         else
 62:             $authorized = ($cur_user['password'] == $form_password_hash); 64:             $authorized = pun_hash_equals($cur_user['password'], $form_password_hash);
 63:     } 65:     }
 64:  66: 
 65:     if (!$authorized) 67:     if (!$authorized)
 97:  99: 
 98: else if ($action == 'out')100: else if ($action == 'out')
 99: {101: {
100:     if ($pun_user['is_guest'] || !isset($_GET['id']) || $_GET['id'] != $pun_user['id'] || !isset($_GET['csrf_token']) || $_GET['csrf_token'] != pun_hash($pun_user['id'].pun_hash(get_remote_address())))102:     if ($pun_user['is_guest'] || !isset($_GET['id']) || $_GET['id'] != $pun_user['id'])
101:     {103:     {
102:         header('Location: index.php');104:         header('Location: index.php');
103:         exit;105:         exit;
104:     }106:     }
105: 107: 
 108:     check_csrf($_GET['csrf_token']);
 109: 
106:     // Remove user from "users online" list110:     // Remove user from "users online" list
107:     $db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id']) or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());111:     $db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id']) or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
108: 112: 


a/misc.php b/misc.php
 51:     if ($pun_user['is_guest']) 51:     if ($pun_user['is_guest'])
 52:         message($lang_common['No permission'], false, '403 Forbidden'); 52:         message($lang_common['No permission'], false, '403 Forbidden');
 53:  53: 
  54:     check_csrf($_GET['csrf_token']);
  55: 
 54:     $db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Unable to update user last visit data', __FILE__, __LINE__, $db->error()); 56:     $db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Unable to update user last visit data', __FILE__, __LINE__, $db->error());
 55:  57: 
 56:     // Reset tracked topics 58:     // Reset tracked topics
 66:     if ($pun_user['is_guest']) 68:     if ($pun_user['is_guest'])
 67:         message($lang_common['No permission'], false, '403 Forbidden'); 69:         message($lang_common['No permission'], false, '403 Forbidden');
 68:  70: 
  71:     check_csrf($_GET['csrf_token']);
  72: 
 69:     $fid = isset($_GET['fid']) ? intval($_GET['fid']) : 0; 73:     $fid = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
 70:     if ($fid < 1) 74:     if ($fid < 1)
 71:         message($lang_common['Bad request'], false, '404 Not Found'); 75:         message($lang_common['Bad request'], false, '404 Not Found');
317:     if ($pun_user['is_guest'])321:     if ($pun_user['is_guest'])
318:         message($lang_common['No permission'], false, '403 Forbidden');322:         message($lang_common['No permission'], false, '403 Forbidden');
319: 323: 
 324:     check_csrf($_GET['csrf_token']);
 325: 
320:     $topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;326:     $topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
321:     $forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;327:     $forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
322:     if ($topic_id < 1 && $forum_id < 1)328:     if ($topic_id < 1 && $forum_id < 1)
367:     if ($pun_user['is_guest'])373:     if ($pun_user['is_guest'])
368:         message($lang_common['No permission'], false, '403 Forbidden');374:         message($lang_common['No permission'], false, '403 Forbidden');
369: 375: 
 376:     check_csrf($_GET['csrf_token']);
 377: 
370:     $topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;378:     $topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
371:     $forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;379:     $forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
372:     if ($topic_id < 1 && $forum_id < 1)380:     if ($topic_id < 1 && $forum_id < 1)


a/moderate.php b/moderate.php
754:     {754:     {
755:         confirm_referrer('viewtopic.php');755:         confirm_referrer('viewtopic.php');
756: 756: 
 757:         check_csrf($_GET['csrf_token']);
 758: 
757:         $topic_id = ($action) ? intval($_GET['close']) : intval($_GET['open']);759:         $topic_id = ($action) ? intval($_GET['close']) : intval($_GET['open']);
758:         if ($topic_id < 1)760:         if ($topic_id < 1)
759:             message($lang_common['Bad request'], false, '404 Not Found');761:             message($lang_common['Bad request'], false, '404 Not Found');
771: {773: {
772:     confirm_referrer('viewtopic.php');774:     confirm_referrer('viewtopic.php');
773: 775: 
 776:     check_csrf($_GET['csrf_token']);
 777: 
774:     $stick = intval($_GET['stick']);778:     $stick = intval($_GET['stick']);
775:     if ($stick < 1)779:     if ($stick < 1)
776:         message($lang_common['Bad request'], false, '404 Not Found');780:         message($lang_common['Bad request'], false, '404 Not Found');
786: {790: {
787:     confirm_referrer('viewtopic.php');791:     confirm_referrer('viewtopic.php');
788: 792: 
 793:     check_csrf($_GET['csrf_token']);
 794: 
789:     $unstick = intval($_GET['unstick']);795:     $unstick = intval($_GET['unstick']);
790:     if ($unstick < 1)796:     if ($unstick < 1)
791:         message($lang_common['Bad request'], false, '404 Not Found');797:         message($lang_common['Bad request'], false, '404 Not Found');


a/post.php b/post.php
219:                     require_once PUN_ROOT.'include/email.php';219:                     require_once PUN_ROOT.'include/email.php';
220: 220: 
221:                     $notification_emails = array();221:                     $notification_emails = array();
 222:                     $languages = forum_list_langs();
222: 223: 
223:                     if ($pun_config['o_censoring'] == '1')224:                     if ($pun_config['o_censoring'] == '1')
224:                         $cleaned_message = bbcode2email($censored_message, -1);225:                         $cleaned_message = bbcode2email($censored_message, -1);
228:                     // Loop through subscribed users and send emails229:                     // Loop through subscribed users and send emails
229:                     while ($cur_subscriber = $db->fetch_assoc($result))230:                     while ($cur_subscriber = $db->fetch_assoc($result))
230:                     {231:                     {
 232:                         if (!in_array($cur_subscriber['language'], $languages))
 233:                             $cur_subscriber['language'] = $pun_config['o_default_lang'];
 234: 
231:                         // Is the subscription email for $cur_subscriber['language'] cached or not?235:                         // Is the subscription email for $cur_subscriber['language'] cached or not?
232:                         if (!isset($notification_emails[$cur_subscriber['language']]))236:                         if (!isset($notification_emails[$cur_subscriber['language']]))
233:                         {237:                         {
327:                     require_once PUN_ROOT.'include/email.php';331:                     require_once PUN_ROOT.'include/email.php';
328: 332: 
329:                     $notification_emails = array();333:                     $notification_emails = array();
 334:                     $languages = forum_list_langs();
330: 335: 
331:                     if ($pun_config['o_censoring'] == '1')336:                     if ($pun_config['o_censoring'] == '1')
332:                         $cleaned_message = bbcode2email($censored_message, -1);337:                         $cleaned_message = bbcode2email($censored_message, -1);
336:                     // Loop through subscribed users and send emails341:                     // Loop through subscribed users and send emails
337:                     while ($cur_subscriber = $db->fetch_assoc($result))342:                     while ($cur_subscriber = $db->fetch_assoc($result))
338:                     {343:                     {
 344:                         if (!in_array($cur_subscriber['language'], $languages))
 345:                             $cur_subscriber['language'] = $pun_config['o_default_lang'];
 346: 
339:                         // Is the subscription email for $cur_subscriber['language'] cached or not?347:                         // Is the subscription email for $cur_subscriber['language'] cached or not?
340:                         if (!isset($notification_emails[$cur_subscriber['language']]))348:                         if (!isset($notification_emails[$cur_subscriber['language']]))
341:                         {349:                         {


a/profile.php b/profile.php
449: 449: 
450:     confirm_referrer('profile.php');450:     confirm_referrer('profile.php');
451: 451: 
 452:     check_csrf($_GET['csrf_token']);
 453: 
452:     delete_avatar($id);454:     delete_avatar($id);
453: 455: 
454:     redirect('profile.php?section=personality&amp;id='.$id, $lang_profile['Avatar deleted redirect']);456:     redirect('profile.php?section=personality&amp;id='.$id, $lang_profile['Avatar deleted redirect']);
753:                 if (!in_array($form['language'], $languages))755:                 if (!in_array($form['language'], $languages))
754:                     message($lang_common['Bad request'], false, '404 Not Found');756:                     message($lang_common['Bad request'], false, '404 Not Found');
755:             }757:             }
 758:             else
 759:                 $form['language'] = $pun_config['o_default_lang'];
756: 760: 
757:             if ($pun_user['is_admmod'])761:             if ($pun_user['is_admmod'])
758:             {762:             {
1531: 1535: 
1532:         $user_avatar = generate_avatar_markup($id);1536:         $user_avatar = generate_avatar_markup($id);
1533:         if ($user_avatar)1537:         if ($user_avatar)
1534:             $avatar_field .= ' <span><a href="profile.php?action=delete_avatar&amp;id='.$id.'">'.$lang_profile['Delete avatar'].'</a></span>';1538:             $avatar_field .= ' <span><a href="profile.php?action=delete_avatar&amp;id='.$id.'&amp;csrf_token='.pun_csrf_token().'">'.$lang_profile['Delete avatar'].'</a></span>';
1535:         else1539:         else
1536:             $avatar_field = '<span><a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Upload avatar'].'</a></span>';1540:             $avatar_field = '<span><a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Upload avatar'].'</a></span>';
1537: 1541: 


a/search.php b/search.php
452: 452: 
453:     // If we're on the new posts search, display a "mark all as read" link453:     // If we're on the new posts search, display a "mark all as read" link
454:     if (!$pun_user['is_guest'] && $search_type[0] == 'action' && $search_type[1] == 'show_new')454:     if (!$pun_user['is_guest'] && $search_type[0] == 'action' && $search_type[1] == 'show_new')
455:         $forum_actions[] = '<a href="misc.php?action=markread">'.$lang_common['Mark all as read'].'</a>';455:         $forum_actions[] = '<a href="misc.php?action=markread&amp;csrf_token='.pun_csrf_token().'">'.$lang_common['Mark all as read'].'</a>';
456: 456: 
457:     // Fetch results to display457:     // Fetch results to display
458:     if (!empty($search_ids))458:     if (!empty($search_ids))


a/viewforum.php b/viewforum.php
 99:  99: 
100: if (!$pun_user['is_guest'])100: if (!$pun_user['is_guest'])
101: {101: {
 102:     $token_url = '&amp;csrf_token='.pun_csrf_token();
 103: 
102:     if ($pun_config['o_forum_subscriptions'] == '1')104:     if ($pun_config['o_forum_subscriptions'] == '1')
103:     {105:     {
104:         if ($cur_forum['is_subscribed'])106:         if ($cur_forum['is_subscribed'])
105:             $forum_actions[] = '<span>'.$lang_forum['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;fid='.$id.'">'.$lang_forum['Unsubscribe'].'</a>';107:             $forum_actions[] = '<span>'.$lang_forum['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;fid='.$id.$token_url.'">'.$lang_forum['Unsubscribe'].'</a>';
106:         else108:         else
107:             $forum_actions[] = '<a href="misc.php?action=subscribe&amp;fid='.$id.'">'.$lang_forum['Subscribe'].'</a>';109:             $forum_actions[] = '<a href="misc.php?action=subscribe&amp;fid='.$id.$token_url.'">'.$lang_forum['Subscribe'].'</a>';
108:     }110:     }
109: 111: 
110:     $forum_actions[] = '<a href="misc.php?action=markforumread&amp;fid='.$id.'">'.$lang_common['Mark forum read'].'</a>';112:     $forum_actions[] = '<a href="misc.php?action=markforumread&amp;fid='.$id.$token_url.'">'.$lang_common['Mark forum read'].'</a>';
111: }113: }
112: 114: 
113: $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_forum['forum_name']));115: $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_forum['forum_name']));


a/viewtopic.php b/viewtopic.php
158: 158: 
159: if (!$pun_user['is_guest'] && $pun_config['o_topic_subscriptions'] == '1')159: if (!$pun_user['is_guest'] && $pun_config['o_topic_subscriptions'] == '1')
160: {160: {
 161:     $token_url = '&amp;csrf_token='.pun_csrf_token();
 162: 
161:     if ($cur_topic['is_subscribed'])163:     if ($cur_topic['is_subscribed'])
162:         // I apologize for the variable naming here. It's a mix of subscription and action I guess :-)164:         // I apologize for the variable naming here. It's a mix of subscription and action I guess :-)
163:         $subscraction = "\t\t".'<p class="subscribelink clearb"><span>'.$lang_topic['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;tid='.$id.'">'.$lang_topic['Unsubscribe'].'</a></p>'."\n";165:         $subscraction = "\t\t".'<p class="subscribelink clearb"><span>'.$lang_topic['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;tid='.$id.$token_url.'">'.$lang_topic['Unsubscribe'].'</a></p>'."\n";
164:     else166:     else
165:         $subscraction = "\t\t".'<p class="subscribelink clearb"><a href="misc.php?action=subscribe&amp;tid='.$id.'">'.$lang_topic['Subscribe'].'</a></p>'."\n";167:         $subscraction = "\t\t".'<p class="subscribelink clearb"><a href="misc.php?action=subscribe&amp;tid='.$id.$token_url.'">'.$lang_topic['Subscribe'].'</a></p>'."\n";
166: }168: }
167: else169: else
168:     $subscraction = '';170:     $subscraction = '';


hdiff - version: 2.1.0 (modified)