fluxbb-1.5.3 to fluxbb-1.5.4 Legend
Lines removed 
Lines changed
 Lines added

a/README /dev/null


a/admin_options.php b/admin_options.php
 92:     // Make sure base_url doesn't end with a slash 92:     // Make sure base_url doesn't end with a slash
 93:     if (substr($form['base_url'], -1) == '/') 93:     if (substr($form['base_url'], -1) == '/')
 94:         $form['base_url'] = substr($form['base_url'], 0, -1); 94:         $form['base_url'] = substr($form['base_url'], 0, -1);
  95:         
  96:     // Convert IDN to Punycode if needed
  97:     if (preg_match('/[^\x00-\x7F]/', $form['base_url']))
  98:     {
  99:         if (!function_exists('idn_to_ascii'))
 100:             message($lang_admin_options['Base URL problem']);
 101:         else
 102:             $form['base_url'] = idn_to_ascii($form['base_url']);
 103:     }
 95: 104: 
 96:     $languages = forum_list_langs();105:     $languages = forum_list_langs();
 97:     if (!in_array($form['default_lang'], $languages))106:     if (!in_array($form['default_lang'], $languages))


a/admin_users.php b/admin_users.php
208: ?>208: ?>
209:                 <tr>209:                 <tr>
210:                     <td class="tcl"><?php echo '<a href="profile.php?id='.$user_data[$cur_poster['poster_id']]['id'].'">'.pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['username']).'</a>' ?></td>210:                     <td class="tcl"><?php echo '<a href="profile.php?id='.$user_data[$cur_poster['poster_id']]['id'].'">'.pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['username']).'</a>' ?></td>
211:                     <td class="tc2"><a href="mailto:<?php echo $user_data[$cur_poster['poster_id']]['email'] ?>"><?php echo $user_data[$cur_poster['poster_id']]['email'] ?></a></td>211:                     <td class="tc2"><a href="mailto:<?php echo pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['email']) ?>"><?php echo pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['email']) ?></a></td>
212:                     <td class="tc3"><?php echo $user_title ?></td>212:                     <td class="tc3"><?php echo $user_title ?></td>
213:                     <td class="tc4"><?php echo forum_number_format($user_data[$cur_poster['poster_id']]['num_posts']) ?></td>213:                     <td class="tc4"><?php echo forum_number_format($user_data[$cur_poster['poster_id']]['num_posts']) ?></td>
214:                     <td class="tc5"><?php echo ($user_data[$cur_poster['poster_id']]['admin_note'] != '') ? pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['admin_note']) : '&#160;' ?></td>214:                     <td class="tc5"><?php echo ($user_data[$cur_poster['poster_id']]['admin_note'] != '') ? pun_htmlspecialchars($user_data[$cur_poster['poster_id']]['admin_note']) : '&#160;' ?></td>
871: ?>871: ?>
872:                 <tr>872:                 <tr>
873:                     <td class="tcl"><?php echo '<a href="profile.php?id='.$user_data['id'].'">'.pun_htmlspecialchars($user_data['username']).'</a>' ?></td>873:                     <td class="tcl"><?php echo '<a href="profile.php?id='.$user_data['id'].'">'.pun_htmlspecialchars($user_data['username']).'</a>' ?></td>
874:                     <td class="tc2"><a href="mailto:<?php echo $user_data['email'] ?>"><?php echo $user_data['email'] ?></a></td>874:                     <td class="tc2"><a href="mailto:<?php echo pun_htmlspecialchars($user_data['email']) ?>"><?php echo pun_htmlspecialchars($user_data['email']) ?></a></td>
875:                     <td class="tc3"><?php echo $user_title ?></td>875:                     <td class="tc3"><?php echo $user_title ?></td>
876:                     <td class="tc4"><?php echo forum_number_format($user_data['num_posts']) ?></td>876:                     <td class="tc4"><?php echo forum_number_format($user_data['num_posts']) ?></td>
877:                     <td class="tc5"><?php echo ($user_data['admin_note'] != '') ? pun_htmlspecialchars($user_data['admin_note']) : '&#160;' ?></td>877:                     <td class="tc5"><?php echo ($user_data['admin_note'] != '') ? pun_htmlspecialchars($user_data['admin_note']) : '&#160;' ?></td>


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.3'); 10: define('UPDATE_TO', '1.5.4');
 11:  11: 
 12: define('UPDATE_TO_DB_REVISION', 18); 12: define('UPDATE_TO_DB_REVISION', 20);
 13: define('UPDATE_TO_SI_REVISION', 2); 13: define('UPDATE_TO_SI_REVISION', 2);
 14: define('UPDATE_TO_PARSER_REVISION', 2); 14: define('UPDATE_TO_PARSER_REVISION', 2);
 15:  15: 
794:             if (substr($base_url, -1) == '/')794:             if (substr($base_url, -1) == '/')
795:                 $base_url = substr($base_url, 0, -1);795:                 $base_url = substr($base_url, 0, -1);
796: 796: 
797:             $db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_base_url\', \''.$db->escape($base_url).'\')') or error('Unable to insert config value \'o_quote_depth\'', __FILE__, __LINE__, $db->error());797:             $db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_base_url\', \''.$db->escape($base_url).'\')') or error('Unable to insert config value \'o_base_url\'', __FILE__, __LINE__, $db->error());
798:         }798:         }
799: 799: 
800:         if (strpos($cur_version, '1.2') === 0)800:         if (strpos($cur_version, '1.2') === 0)


a/delete.php b/delete.php
 42:     !$is_admmod) 42:     !$is_admmod)
 43:     message($lang_common['No permission'], false, '403 Forbidden'); 43:     message($lang_common['No permission'], false, '403 Forbidden');
 44:  44: 
  45: if ($is_admmod && $pun_user['g_id'] != PUN_ADMIN && in_array($cur_post['poster_id'], get_admin_ids()))
  46:     message($lang_common['No permission'], false, '403 Forbidden');
  47: 
 45: // Load the delete.php language file 48: // Load the delete.php language file
 46: require PUN_ROOT.'lang/'.$pun_user['language'].'/delete.php'; 49: require PUN_ROOT.'lang/'.$pun_user['language'].'/delete.php';
 47:  50: 


a/edit.php b/edit.php
 44:     !$is_admmod) 44:     !$is_admmod)
 45:     message($lang_common['No permission'], false, '403 Forbidden'); 45:     message($lang_common['No permission'], false, '403 Forbidden');
 46:  46: 
  47: if ($is_admmod && $pun_user['g_id'] != PUN_ADMIN && in_array($cur_post['poster_id'], get_admin_ids()))
  48:     message($lang_common['No permission'], false, '403 Forbidden');
  49: 
 47: // Load the post.php language file 50: // Load the post.php language file
 48: require PUN_ROOT.'lang/'.$pun_user['language'].'/post.php'; 51: require PUN_ROOT.'lang/'.$pun_user['language'].'/post.php';
 49:  52: 


a/extern.php b/extern.php
438:             // Output feed as PHP code438:             // Output feed as PHP code
439:             if (isset($cache_id))439:             if (isset($cache_id))
440:             {440:             {
441:                 $fh = @fopen(FORUM_CACHE_DIR.'cache_'.$cache_id.'.php', 'wb');441:                 if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
442:                 if (!$fh)442:                     require PUN_ROOT.'include/cache.php';
443:                     error('Unable to write feed cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
444: 443: 
445:                 fwrite($fh, '<?php'."\n\n".'$feed = '.var_export($feed, true).';'."\n\n".'$cache_expire = '.($now + ($pun_config['o_feed_ttl'] * 60)).';'."\n\n".'?>');444:                 $content = '<?php'."\n\n".'$feed = '.var_export($feed, true).';'."\n\n".'$cache_expire = '.($now + ($pun_config['o_feed_ttl'] * 60)).';'."\n\n".'?>';
446: 445:                 fluxbb_write_cache_file('cache_'.$cache_id.'.php', $content);
447:                 fclose($fh); 
448:  
449:                 if (function_exists('apc_delete_file')) 
450:                     @apc_delete_file(FORUM_CACHE_DIR.'cache_'.$cache_id.'.php'); 
451:             }446:             }
452:         }447:         }
453: 448: 


a/include/cache.php b/include/cache.php
 26:         $output[$cur_config_item[0]] = $cur_config_item[1]; 26:         $output[$cur_config_item[0]] = $cur_config_item[1];
 27:  27: 
 28:     // Output config as PHP code 28:     // Output config as PHP code
 29:     $fh = @fopen(FORUM_CACHE_DIR.'cache_config.php', 'wb'); 29:     $content = '<?php'."\n\n".'define(\'PUN_CONFIG_LOADED\', 1);'."\n\n".'$pun_config = '.var_export($output, true).';'."\n\n".'?>';
 30:     if (!$fh) 30:     fluxbb_write_cache_file('cache_config.php', $content);
 31:         error('Unable to write configuration cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
 32:  
 33:     fwrite($fh, '<?php'."\n\n".'define(\'PUN_CONFIG_LOADED\', 1);'."\n\n".'$pun_config = '.var_export($output, true).';'."\n\n".'?>'); 
 34:  
 35:     fclose($fh); 
 36:  
 37:     if (function_exists('apc_delete_file')) 
 38:         @apc_delete_file(FORUM_CACHE_DIR.'cache_config.php'); 
 39: } 31: }
 40:  32: 
 41:  33: 
 54:         $output[] = $cur_ban; 46:         $output[] = $cur_ban;
 55:  47: 
 56:     // Output ban list as PHP code 48:     // Output ban list as PHP code
 57:     $fh = @fopen(FORUM_CACHE_DIR.'cache_bans.php', 'wb'); 49:     $content = '<?php'."\n\n".'define(\'PUN_BANS_LOADED\', 1);'."\n\n".'$pun_bans = '.var_export($output, true).';'."\n\n".'?>';
 58:     if (!$fh) 50:     fluxbb_write_cache_file('cache_bans.php', $content);
 59:         error('Unable to write bans cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
 60:  
 61:     fwrite($fh, '<?php'."\n\n".'define(\'PUN_BANS_LOADED\', 1);'."\n\n".'$pun_bans = '.var_export($output, true).';'."\n\n".'?>'); 
 62:  
 63:     fclose($fh); 
 64:  
 65:     if (function_exists('apc_delete_file')) 
 66:         @apc_delete_file(FORUM_CACHE_DIR.'cache_bans.php'); 
 67: } 51: }
 68:  52: 
 69:  53: 
 72: // 56: //
 73: function generate_quickjump_cache($group_id = false) 57: function generate_quickjump_cache($group_id = false)
 74: { 58: {
 75:     global $db, $lang_common, $pun_user; 59:     global $db, $lang_common;
 76:  60: 
 77:     $groups = array(); 61:     $groups = array();
 78:  62: 
 99:     foreach ($groups as $group_id => $read_board) 83:     foreach ($groups as $group_id => $read_board)
100:     { 84:     {
101:         // Output quick jump as PHP code 85:         // Output quick jump as PHP code
102:         $fh = @fopen(FORUM_CACHE_DIR.'cache_quickjump_'.$group_id.'.php', 'wb'); 
103:         if (!$fh) 
104:             error('Unable to write quick jump cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
105:  
106:         $output = '<?php'."\n\n".'if (!defined(\'PUN\')) exit;'."\n".'define(\'PUN_QJ_LOADED\', 1);'."\n".'$forum_id = isset($forum_id) ? $forum_id : 0;'."\n\n".'?>'; 86:         $output = '<?php'."\n\n".'if (!defined(\'PUN\')) exit;'."\n".'define(\'PUN_QJ_LOADED\', 1);'."\n".'$forum_id = isset($forum_id) ? $forum_id : 0;'."\n\n".'?>';
107:  87: 
108:         if ($read_board == '1') 88:         if ($read_board == '1')
133:             }113:             }
134:         }114:         }
135: 115: 
136:         fwrite($fh, $output);116:         fluxbb_write_cache_file('cache_quickjump_'.$group_id.'.php', $output);
137:  
138:         fclose($fh); 
139:  
140:         if (function_exists('apc_delete_file')) 
141:             @apc_delete_file(FORUM_CACHE_DIR.'cache_quickjump_'.$group_id.'.php'); 
142:     }117:     }
143: }118: }
144: 119: 
161:     }136:     }
162: 137: 
163:     // Output censored words as PHP code138:     // Output censored words as PHP code
164:     $fh = @fopen(FORUM_CACHE_DIR.'cache_censoring.php', 'wb');139:     $content = '<?php'."\n\n".'define(\'PUN_CENSOR_LOADED\', 1);'."\n\n".'$search_for = '.var_export($search_for, true).';'."\n\n".'$replace_with = '.var_export($replace_with, true).';'."\n\n".'?>';
165:     if (!$fh)140:     fluxbb_write_cache_file('cache_censoring.php', $content);
166:         error('Unable to write censoring cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
167:  
168:     fwrite($fh, '<?php'."\n\n".'define(\'PUN_CENSOR_LOADED\', 1);'."\n\n".'$search_for = '.var_export($search_for, true).';'."\n\n".'$replace_with = '.var_export($replace_with, true).';'."\n\n".'?>'); 
169:  
170:     fclose($fh); 
171:  
172:     if (function_exists('apc_delete_file')) 
173:         @apc_delete_file(FORUM_CACHE_DIR.'cache_censoring.php'); 
174: }141: }
175: 142: 
176: 143: 
197:     $stopwords = array_filter($stopwords);164:     $stopwords = array_filter($stopwords);
198: 165: 
199:     // Output stopwords as PHP code166:     // Output stopwords as PHP code
200:     $fh = @fopen(FORUM_CACHE_DIR.'cache_stopwords.php', 'wb');167:     $content = '<?php'."\n\n".'$cache_id = \''.generate_stopwords_cache_id().'\';'."\n".'if ($cache_id != generate_stopwords_cache_id()) return;'."\n\n".'define(\'PUN_STOPWORDS_LOADED\', 1);'."\n\n".'$stopwords = '.var_export($stopwords, true).';'."\n\n".'?>';
201:     if (!$fh)168:     fluxbb_write_cache_file('cache_stopwords.php', $content);
202:         error('Unable to write stopwords cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__); 
203:  
204:     fwrite($fh, '<?php'."\n\n".'$cache_id = \''.generate_stopwords_cache_id().'\';'."\n".'if ($cache_id != generate_stopwords_cache_id()) return;'."\n\n".'define(\'PUN_STOPWORDS_LOADED\', 1);'."\n\n".'$stopwords = '.var_export($stopwords, true).';'."\n\n".'?>'); 
205:  
206:     fclose($fh); 
207:  
208:     if (function_exists('apc_delete_file')) 
209:         @apc_delete_file(FORUM_CACHE_DIR.'cache_stopwords.php'); 
210: }169: }
211: 170: 
212: 171: 
226:     $stats['last_user'] = $db->fetch_assoc($result);185:     $stats['last_user'] = $db->fetch_assoc($result);
227: 186: 
228:     // Output users info as PHP code187:     // Output users info as PHP code
229:     $fh = @fopen(FORUM_CACHE_DIR.'cache_users_info.php', 'wb');188:     $content = '<?php'."\n\n".'define(\'PUN_USERS_INFO_LOADED\', 1);'."\n\n".'$stats = '.var_export($stats, true).';'."\n\n".'?>';
 189:     fluxbb_write_cache_file('cache_users_info.php', $content);
 190: }
 191: 
 192: 
 193: //
 194: // Generate the admins cache PHP script
 195: //
 196: function generate_admins_cache()
 197: {
 198:     global $db;
 199: 
 200:     // Get admins from the DB
 201:     $result = $db->query('SELECT id FROM '.$db->prefix.'users WHERE group_id='.PUN_ADMIN) or error('Unable to fetch users info', __FILE__, __LINE__, $db->error());
 202: 
 203:     $output = array();
 204:     while ($row = $db->fetch_row($result))
 205:         $output[] = $row[0];
 206: 
 207:     // Output admin list as PHP code
 208:     $content = '<?php'."\n\n".'define(\'PUN_ADMINS_LOADED\', 1);'."\n\n".'$pun_admins = '.var_export($output, true).';'."\n\n".'?>';
 209:     fluxbb_write_cache_file('cache_admins.php', $content);
 210: }
 211: 
 212: 
 213: //
 214: // Safely write out a cache file.
 215: //
 216: function fluxbb_write_cache_file($file, $content)
 217: {
 218:     $fh = @fopen(FORUM_CACHE_DIR.$file, 'wb');
230:     if (!$fh)219:     if (!$fh)
231:         error('Unable to write users info cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);220:         error('Unable to write cache file '.pun_htmlspecialchars($file).' to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
 221: 
 222:     flock($fh, LOCK_EX);
 223:     ftruncate($fh, 0);
232: 224: 
233:     fwrite($fh, '<?php'."\n\n".'define(\'PUN_USERS_INFO_LOADED\', 1);'."\n\n".'$stats = '.var_export($stats, true).';'."\n\n".'?>');225:     fwrite($fh, $content);
234: 226: 
 227:     flock($fh, LOCK_UN);
235:     fclose($fh);228:     fclose($fh);
236: 229: 
237:     if (function_exists('apc_delete_file'))230:     if (function_exists('apc_delete_file'))
238:         @apc_delete_file(FORUM_CACHE_DIR.'cache_users_info.php');231:         @apc_delete_file(FORUM_CACHE_DIR.$file);
239: }232: }
240: 233: 
241: 234: 


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.3'); 13: define('FORUM_VERSION', '1.5.4');
 14:  14: 
 15: define('FORUM_DB_REVISION', 18); 15: define('FORUM_DB_REVISION', 20);
 16: define('FORUM_SI_REVISION', 2); 16: define('FORUM_SI_REVISION', 2);
 17: define('FORUM_PARSER_REVISION', 2); 17: define('FORUM_PARSER_REVISION', 2);
 18:  18: 


a/include/dblayer/pgsql.php b/include/dblayer/pgsql.php
115: 115: 
116:             ++$this->num_queries;116:             ++$this->num_queries;
117: 117: 
118:             $this->last_query_text[$this->query_result] = $sql;118:             $this->last_query_text[intval($this->query_result)] = $sql;
119: 119: 
120:             return $this->query_result;120:             return $this->query_result;
121:         }121:         }
171:     {171:     {
172:         $query_id = $this->query_result;172:         $query_id = $this->query_result;
173: 173: 
174:         if ($query_id && $this->last_query_text[$query_id] != '')174:         if ($query_id && $this->last_query_text[intval($query_id)] != '')
175:         {175:         {
176:             if (preg_match('%^INSERT INTO ([a-z0-9\_\-]+)%is', $this->last_query_text[$query_id], $table_name))176:             if (preg_match('%^INSERT INTO ([a-z0-9\_\-]+)%is', $this->last_query_text[intval($query_id)], $table_name))
177:             {177:             {
178:                 // Hack (don't ask)178:                 // Hack (don't ask)
179:                 if (substr($table_name[1], -6) == 'groups')179:                 if (substr($table_name[1], -6) == 'groups')


a/include/email.php b/include/email.php
229:     $from = '"'.encode_mail_text($from_name).'" <'.$from_email.'>';229:     $from = '"'.encode_mail_text($from_name).'" <'.$from_email.'>';
230:     $subject = encode_mail_text($subject);230:     $subject = encode_mail_text($subject);
231: 231: 
232:     $headers = 'From: '.$from.PHP_EOL.'Date: '.gmdate('r').PHP_EOL.'MIME-Version: 1.0'.PHP_EOL.'Content-transfer-encoding: 8bit'.PHP_EOL.'Content-type: text/plain; charset=utf-8'.PHP_EOL.'X-Mailer: FluxBB Mailer';232:     $headers = 'From: '.$from."\r\n".'Date: '.gmdate('r')."\r\n".'MIME-Version: 1.0'."\r\n".'Content-transfer-encoding: 8bit'."\r\n".'Content-type: text/plain; charset=utf-8'."\r\n".'X-Mailer: FluxBB Mailer';
233: 233: 
234:     // If we specified a reply-to email, we deal with it here234:     // If we specified a reply-to email, we deal with it here
235:     if (!empty($reply_to_email))235:     if (!empty($reply_to_email))
236:     {236:     {
237:         $reply_to = '"'.encode_mail_text($reply_to_name).'" <'.$reply_to_email.'>';237:         $reply_to = '"'.encode_mail_text($reply_to_name).'" <'.$reply_to_email.'>';
238: 238: 
239:         $headers .= PHP_EOL.'Reply-To: '.$reply_to;239:         $headers .= "\r\n".'Reply-To: '.$reply_to;
240:     }240:     }
241: 241: 
242:     // Make sure all linebreaks are LF in message (and strip out any NULL bytes)242:     // Make sure all linebreaks are LF in message (and strip out any NULL bytes)


a/include/functions.php b/include/functions.php
215:     return $protocol;215:     return $protocol;
216: }216: }
217: 217: 
 218: 
218: //219: //
219: // Fetch the base_url, optionally support HTTPS and HTTP220: // Fetch the base_url, optionally support HTTPS and HTTP
220: //221: //
237: 238: 
238: 239: 
239: //240: //
 241: // Fetch admin IDs
 242: //
 243: function get_admin_ids()
 244: {
 245:     if (file_exists(FORUM_CACHE_DIR.'cache_admins.php'))
 246:         include FORUM_CACHE_DIR.'cache_admins.php';
 247: 
 248:     if (!defined('PUN_ADMINS_LOADED'))
 249:     {
 250:         if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
 251:             require PUN_ROOT.'include/cache.php';
 252: 
 253:         generate_admins_cache();
 254:         require FORUM_CACHE_DIR.'cache_admins.php';
 255:     }
 256: 
 257:     return $pun_admins;
 258: }
 259: 
 260: 
 261: //
240: // Fill $pun_user with default values (for guests)262: // Fill $pun_user with default values (for guests)
241: //263: //
242: function set_default_user()264: function set_default_user()
339: //361: //
340: function forum_setcookie($name, $value, $expire)362: function forum_setcookie($name, $value, $expire)
341: {363: {
342:     global $cookie_path, $cookie_domain, $cookie_secure;364:     global $cookie_path, $cookie_domain, $cookie_secure, $pun_config;
 365: 
 366:     if ($expire - time() - $pun_config['o_timeout_visit'] < 1)
 367:         $expire = 0;
343: 368: 
344:     // Enable sending of a P3P header369:     // Enable sending of a P3P header
345:     header('P3P: CP="CUR ADM"');370:     header('P3P: CP="CUR ADM"');
407:         if ($is_banned)432:         if ($is_banned)
408:         {433:         {
409:             $db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($pun_user['username']).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());434:             $db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($pun_user['username']).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
410:             message($lang_common['Ban message'].' '.(($cur_ban['expire'] != '') ? $lang_common['Ban message 2'].' '.strtolower(format_time($cur_ban['expire'], true)).'. ' : '').(($cur_ban['message'] != '') ? $lang_common['Ban message 3'].'<br /><br /><strong>'.pun_htmlspecialchars($cur_ban['message']).'</strong><br /><br />' : '<br /><br />').$lang_common['Ban message 4'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);435:             message($lang_common['Ban message'].' '.(($cur_ban['expire'] != '') ? $lang_common['Ban message 2'].' '.strtolower(format_time($cur_ban['expire'], true)).'. ' : '').(($cur_ban['message'] != '') ? $lang_common['Ban message 3'].'<br /><br /><strong>'.pun_htmlspecialchars($cur_ban['message']).'</strong><br /><br />' : '<br /><br />').$lang_common['Ban message 4'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.', true);
411:         }436:         }
412:     }437:     }
413: 438: 
1290:     // If the delay is 0 seconds, we might as well skip the redirect all together1315:     // If the delay is 0 seconds, we might as well skip the redirect all together
1291:     if ($pun_config['o_redirect_delay'] == '0')1316:     if ($pun_config['o_redirect_delay'] == '0')
1292:     {1317:     {
 1318:         $db->end_transaction();
 1319:         $db->close();
 1320: 
1293:         header('Location: '.str_replace('&amp;', '&', $destination_url));1321:         header('Location: '.str_replace('&amp;', '&', $destination_url));
1294:         exit;1322:         exit;
1295:     }1323:     }
1922: //1950: //
1923: // This function takes care of possibly disabled unicode properties in PCRE builds1951: // This function takes care of possibly disabled unicode properties in PCRE builds
1924: //1952: //
1925: function ucp_preg_replace($pattern, $replace, $subject)1953: function ucp_preg_replace($pattern, $replace, $subject, $callback = false)
1926: {1954: {
1927:     $replaced = preg_replace($pattern, $replace, $subject);1955:     if($callback) 
 1956:         $replaced = preg_replace_callback($pattern, create_function('$matches', 'return '.$replace.';'), $subject);
 1957:     else
 1958:         $replaced = preg_replace($pattern, $replace, $subject);
1928: 1959: 
1929:     // If preg_replace() returns false, this probably means unicode support is not built-in, so we need to modify the pattern a little1960:     // If preg_replace() returns false, this probably means unicode support is not built-in, so we need to modify the pattern a little
1930:     if ($replaced === false)1961:     if ($replaced === false)
1944: }1975: }
1945: 1976: 
1946: //1977: //
 1978: // A wrapper for ucp_preg_replace
 1979: //
 1980: function ucp_preg_replace_callback($pattern, $replace, $subject)
 1981: {
 1982:     return ucp_preg_replace($pattern, $replace, $subject, true);
 1983: }
 1984: 
 1985: //
1947: // Replace four-byte characters with a question mark1986: // Replace four-byte characters with a question mark
1948: //1987: //
1949: // As MySQL cannot properly handle four-byte characters with the default utf-81988: // As MySQL cannot properly handle four-byte characters with the default utf-8


a/include/parser.php b/include/parser.php
 36: )                     # end capturing contents of LIST tag into group 2 36: )                     # end capturing contents of LIST tag into group 2
 37: \[/list\]             # match outermost closing LIST tag 37: \[/list\]             # match outermost closing LIST tag
 38: %iex' */ 38: %iex' */
 39: $re_list = '%\[list(?:=([1a*]))?+\]((?:[^\[]*+(?:(?!\[list(?:=[1a*])?+\]|\[/list\])\[[^\[]*+)*+|(?R))*)\[/list\]%ie'; 39: $re_list = '%\[list(?:=([1a*]))?+\]((?:[^\[]*+(?:(?!\[list(?:=[1a*])?+\]|\[/list\])\[[^\[]*+)*+|(?R))*)\[/list\]%i';
 40:  40: 
 41: // Here you can add additional smilies if you like (please note that you must escape single quote and backslash) 41: // Here you can add additional smilies if you like (please note that you must escape single quote and backslash)
 42: $smilies = array( 42: $smilies = array(
 95:         list($inside, $text) = extract_blocks($text, '[code]', '[/code]'); 95:         list($inside, $text) = extract_blocks($text, '[code]', '[/code]');
 96:  96: 
 97:     // Tidy up lists 97:     // Tidy up lists
 98:     $temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $text); 98:     $temp = preg_replace_callback($re_list, create_function('$matches', 'return preparse_list_tag($matches[2], $matches[1]);'), $text);
 99:  99: 
100:     // If the regex failed100:     // If the regex failed
101:     if (is_null($temp))101:     if (is_null($temp))
640: 640: 
641:     if (strpos($content,'[list') !== false)641:     if (strpos($content,'[list') !== false)
642:     {642:     {
643:         $content = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\')', $content);643:         $content = preg_replace_callback($re_list, create_function('$matches', 'return preparse_list_tag($matches[2], $matches[1]);'), $content);
644:     }644:     }
645: 645: 
646:     $items = explode('[*]', str_replace('\"', '"', $content));646:     $items = explode('[*]', str_replace('\"', '"', $content));
734: 734: 
735:     if (strpos($content,'[list') !== false)735:     if (strpos($content,'[list') !== false)
736:     {736:     {
737:         $content = preg_replace($re_list, 'handle_list_tag(\'$2\', \'$1\')', $content);737:         $content = preg_replace_callback($re_list, create_function('$matches', 'return handle_list_tag($matches[2], $matches[1]);'), $content);
738:     }738:     }
739: 739: 
740:     $content = preg_replace('#\s*\[\*\](.*?)\[/\*\]\s*#s', '<li><p>$1</p></li>', pun_trim($content));740:     $content = preg_replace('#\s*\[\*\](.*?)\[/\*\]\s*#s', '<li><p>$1</p></li>', pun_trim($content));
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('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%se', '"</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), \'$2\')." ".$lang_common[\'wrote\']."</cite><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);
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:  
768:     if (!$is_signature)767:     if (!$is_signature)
769:     {768:     {
770:         $pattern[] = $re_list;769:         $pattern_callback[] = $re_list;
771:         $replace[] = 'handle_list_tag(\'$2\', \'$1\')';770:         $replace_callback[] = 'handle_list_tag($matches[2], $matches[1])';
772:     }771:     }
773: 772: 
774:     $pattern[] = '%\[b\](.*?)\[/b\]%ms';773:     $pattern[] = '%\[b\](.*?)\[/b\]%ms';
793: 792: 
794:     if (($is_signature && $pun_config['p_sig_img_tag'] == '1') || (!$is_signature && $pun_config['p_message_img_tag'] == '1'))793:     if (($is_signature && $pun_config['p_sig_img_tag'] == '1') || (!$is_signature && $pun_config['p_message_img_tag'] == '1'))
795:     {794:     {
796:         $pattern[] = '%\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%e';795:         $pattern_callback[] = '%\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%';
797:         $pattern[] = '%\[img=([^\[]*?)\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%e';796:         $pattern_callback[] = '%\[img=([^\[]*?)\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%';
798:         if ($is_signature)797:         if ($is_signature)
799:         {798:         {
800:             $replace[] = 'handle_img_tag(\'$1$3\', true)';799:             $replace_callback[] = 'handle_img_tag($matches[1].$matches[3], true)';
801:             $replace[] = 'handle_img_tag(\'$2$4\', true, \'$1\')';800:             $replace_callback[] = 'handle_img_tag($matches[2].$matches[4], true, $matches[1])';
802:         }801:         }
803:         else802:         else
804:         {803:         {
805:             $replace[] = 'handle_img_tag(\'$1$3\', false)';804:             $replace_callback[] = 'handle_img_tag($matches[1].$matches[3], false)';
806:             $replace[] = 'handle_img_tag(\'$2$4\', false, \'$1\')';805:             $replace_callback[] = 'handle_img_tag($matches[2].$matches[4], false, $matches[1])';
807:         }806:         }
808:     }807:     }
809: 808: 
810:     $pattern[] = '%\[url\]([^\[]*?)\[/url\]%e';809:     $pattern_callback[] = '%\[url\]([^\[]*?)\[/url\]%';
811:     $pattern[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%e';810:     $pattern_callback[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%';
812:     $pattern[] = '%\[email\]([^\[]*?)\[/email\]%';811:     $pattern[] = '%\[email\]([^\[]*?)\[/email\]%';
813:     $pattern[] = '%\[email=([^\[]+?)\](.*?)\[/email\]%';812:     $pattern[] = '%\[email=([^\[]+?)\](.*?)\[/email\]%';
814:     $pattern[] = '%\[topic\]([1-9]\d*)\[/topic\]%e';813:     $pattern_callback[] = '%\[topic\]([1-9]\d*)\[/topic\]%';
815:     $pattern[] = '%\[topic=([1-9]\d*)\](.*?)\[/topic\]%e';814:     $pattern_callback[] = '%\[topic=([1-9]\d*)\](.*?)\[/topic\]%';
816:     $pattern[] = '%\[post\]([1-9]\d*)\[/post\]%e';815:     $pattern_callback[] = '%\[post\]([1-9]\d*)\[/post\]%';
817:     $pattern[] = '%\[post=([1-9]\d*)\](.*?)\[/post\]%e';816:     $pattern_callback[] = '%\[post=([1-9]\d*)\](.*?)\[/post\]%';
818:     $pattern[] = '%\[forum\]([1-9]\d*)\[/forum\]%e';817:     $pattern_callback[] = '%\[forum\]([1-9]\d*)\[/forum\]%';
819:     $pattern[] = '%\[forum=([1-9]\d*)\](.*?)\[/forum\]%e';818:     $pattern_callback[] = '%\[forum=([1-9]\d*)\](.*?)\[/forum\]%';
820:     $pattern[] = '%\[user\]([1-9]\d*)\[/user\]%e';819:     $pattern_callback[] = '%\[user\]([1-9]\d*)\[/user\]%';
821:     $pattern[] = '%\[user=([1-9]\d*)\](.*?)\[/user\]%e';820:     $pattern_callback[] = '%\[user=([1-9]\d*)\](.*?)\[/user\]%';
822: 821: 
823:     $replace[] = 'handle_url_tag(\'$1\')';822:     $replace_callback[] = 'handle_url_tag($matches[1])';
824:     $replace[] = 'handle_url_tag(\'$1\', \'$2\')';823:     $replace_callback[] = 'handle_url_tag($matches[1], $matches[2])';
825:     $replace[] = '<a href="mailto:$1">$1</a>';824:     $replace[] = '<a href="mailto:$1">$1</a>';
826:     $replace[] = '<a href="mailto:$1">$2</a>';825:     $replace[] = '<a href="mailto:$1">$2</a>';
827:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\')';826:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=.$matches[1]\')';
828:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\', \'$2\')';827:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=.$matches[1],$matches[2]\')';
829:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\')';828:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=.$matches[1].#p.$matches[1]\')';
830:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\', \'$2\')';829:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=.$matches[1].#p.$matches[1],$matches[2]\')';
831:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\')';830:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=.$matches[1]\')';
832:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\', \'$2\')';831:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=.$matches[1],$matches[2]\')';
833:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\')';832:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=.$matches[1]\')';
834:     $replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\', \'$2\')';833:     $replace_callback[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=.$matches[1],$matches[2]\')';
835: 834: 
836:     // This thing takes a while! :)835:     // This thing takes a while! :)
837:     $text = preg_replace($pattern, $replace, $text);836:     $text = preg_replace($pattern, $replace, $text);
838: 837:     $count = count($pattern_callback);
 838:     for($i = 0 ; $i < $count ; $i++)
 839:     {
 840:         $text = preg_replace_callback($pattern_callback[$i], create_function('$matches', 'return '.$replace_callback[$i].';'), $text);
 841:     }
839:     return $text;842:     return $text;
840: }843: }
841: 844: 
846: function do_clickable($text)849: function do_clickable($text)
847: {850: {
848:     $text = ' '.$text;851:     $text = ' '.$text;
849: 852:     $text = ucp_preg_replace_callback('%(?<=[\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)\])%ui', 'stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5]."://".$matches[6], $matches[5]."://".$matches[6], true).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text);
850:     $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);853:     $text = ucp_preg_replace_callback('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)+[\p{L}\p{N}]+(:[0-9]+)?(/(?:[^\s\[]*[^\s.,?!\[;:-])?)?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%ui','stripslashes($matches[1].$matches[2].$matches[3].$matches[4]).handle_url_tag($matches[5].".".$matches[6], $matches[5].".".$matches[6], true).stripslashes($matches[4].$matches[10].$matches[11].$matches[12])', $text);
851:     $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); 
852: 854: 
853:     return substr($text, 1);855:     return substr($text, 1);
854: }856: }


a/include/srand.php b/include/srand.php
 45:    $SSLstr = '4'; // http://xkcd.com/221/ 45:    $SSLstr = '4'; // http://xkcd.com/221/
 46:    if (function_exists('openssl_random_pseudo_bytes') &&  46:    if (function_exists('openssl_random_pseudo_bytes') && 
 47:        (version_compare(PHP_VERSION, '5.3.4') >= 0 ||  47:        (version_compare(PHP_VERSION, '5.3.4') >= 0 || 
 48:     substr(PHP_OS, 0, 3) !== 'WIN')) 48:         substr(PHP_OS, 0, 3) !== 'WIN'))
 49:    { 49:    {
 50:       $SSLstr = openssl_random_pseudo_bytes($len, $strong); 50:       $SSLstr = openssl_random_pseudo_bytes($len, $strong);
 51:       if ($strong) 51:       if ($strong) {
 52:          return $SSLstr; 52:          return $SSLstr;
  53:       }
 53:    } 54:    }
 54:  55: 
 55:    /* 56:    /*
 57:     * the operating system's PRNG. This is better than reading /dev/urandom  58:     * the operating system's PRNG. This is better than reading /dev/urandom 
 58:     * directly since it avoids reading larger blocks of data than needed.  59:     * directly since it avoids reading larger blocks of data than needed. 
 59:     * Older versions of mcrypt_create_iv may be broken or take too much time  60:     * Older versions of mcrypt_create_iv may be broken or take too much time 
 60:     * to finish so we only use this function with PHP 5.3 and above. 61:     * to finish so we only use this function with PHP 5.3.7 and above.
  62:     * @see https://bugs.php.net/bug.php?id=55169
 61:     */ 63:     */
 62:    if (function_exists('mcrypt_create_iv') &&  64:    if (function_exists('mcrypt_create_iv') && 
 63:       (version_compare(PHP_VERSION, '5.3.0') >= 0 ||  65:       (version_compare(PHP_VERSION, '5.3.7') >= 0 || 
 64:        substr(PHP_OS, 0, 3) !== 'WIN'))  66:        substr(PHP_OS, 0, 3) !== 'WIN')) {
 65:    { 
 66:       $str = mcrypt_create_iv($len, MCRYPT_DEV_URANDOM); 67:       $str = mcrypt_create_iv($len, MCRYPT_DEV_URANDOM);
 67:       if ($str !== false) 68:       if ($str !== false) {
 68:          return $str;     69:          return $str;
  70:       }
 69:    } 71:    }
 70:  72: 
 71:  73: 
 82:    $hash_len = 20; // SHA-1 Hash length 84:    $hash_len = 20; // SHA-1 Hash length
 83:    $total = $len; // total bytes of entropy to collect 85:    $total = $len; // total bytes of entropy to collect
 84:  86: 
 85:    $handle = @fopen('/dev/urandom', 'rb');    87:    $handle = @fopen('/dev/urandom', 'rb');
 86:    if ($handle && function_exists('stream_set_read_buffer')) 88:    if ($handle && function_exists('stream_set_read_buffer')) {
 87:       @stream_set_read_buffer($handle, 0); 89:       @stream_set_read_buffer($handle, 0);
  90:    }
 88:  91: 
 89:    do 92:    do
 90:    { 93:    {
 94:       //collect any entropy available from the PHP system and filesystem 97:       //collect any entropy available from the PHP system and filesystem
 95:       $entropy = rand() . uniqid(mt_rand(), true) . $SSLstr; 98:       $entropy = rand() . uniqid(mt_rand(), true) . $SSLstr;
 96:       $entropy .= implode('', @fstat(@fopen( __FILE__, 'r'))); 99:       $entropy .= implode('', @fstat(@fopen( __FILE__, 'r')));
 97:       $entropy .= memory_get_usage();100:       $entropy .= memory_get_usage() . getmypid();
 98:       if ($handle) 101:       $entropy .= serialize($_ENV) . serialize($_SERVER);
 99:       {102:       if (function_exists('posix_times')) {
100:          $entropy .= @fread($handle, $bytes);103:         $entropy .= serialize(posix_times());
 104:       }
 105:       if (function_exists('zend_thread_id')) {
 106:         $entropy .= zend_thread_id();
101:       }107:       }
102:       else108:       if ($handle) {
103:       {                   109:          $entropy .= @fread($handle, $bytes);
 110:       } else  {
104:          // Measure the time that the operations will take on average111:          // Measure the time that the operations will take on average
105:          for ($i = 0; $i < 3; $i ++) 112:          for ($i = 0; $i < 3; $i++) 
106:          {113:          {
107:             $c1 = microtime(true);114:             $c1 = get_microtime();
108:             $var = sha1(mt_rand());115:             $var = sha1(mt_rand());
109:             for ($j = 0; $j < 50; $j++)116:             for ($j = 0; $j < 50; $j++) {
110:             { 
111:                $var = sha1($var);117:                $var = sha1($var);
112:             }118:             }
113:             $c2 = microtime(true);119:             $c2 = get_microtime();
114:             $entropy .= $c1 . $c2;120:             $entropy .= $c1 . $c2;
115:          }121:          }
116: 122: 
117:          // Based on the above measurement determine the total rounds123:          // Based on the above measurement determine the total rounds
118:          // in order to bound the total running time.    124:          // in order to bound the total running time.
119:          $rounds = (int)($msec_per_round*50 / (int)(($c2-$c1)*1000000));125:          $rounds = (int) ($msec_per_round * 50 / (int) (($c2 - $c1) * 1000000));
120: 126: 
121:          // Take the additional measurements. On average we can expect127:          // Take the additional measurements. On average we can expect
122:          // at least $bits_per_round bits of entropy from each measurement.128:          // at least $bits_per_round bits of entropy from each measurement.
123:          $iter = $bytes*(int)(ceil(8 / $bits_per_round));129:          $iter = $bytes * (int) (ceil(8 / $bits_per_round));
124:          for ($i = 0; $i < $iter; $i ++)130:          for ($i = 0; $i < $iter; $i++)
125:          {131:          {
126:             $c1 = microtime();132:             $c1 = get_microtime();
127:             $var = sha1(mt_rand());133:             $var = sha1(mt_rand());
128:             for ($j = 0; $j < $rounds; $j++)134:             for ($j = 0; $j < $rounds; $j++) {
129:             { 
130:                $var = sha1($var);135:                $var = sha1($var);
131:             }136:             }
132:             $c2 = microtime();137:             $c2 = get_microtime();
133:             $entropy .= $c1 . $c2;138:             $entropy .= $c1 . $c2;
134:          }139:          }
135:             140: 
136:       } 141:       }
137:       // We assume sha1 is a deterministic extractor for the $entropy variable.142:       // We assume sha1 is a deterministic extractor for the $entropy variable.
138:       $str .= sha1($entropy, true);143:       $str .= sha1($entropy, true);
139:    } while ($len > strlen($str));144:    } while ($len > strlen($str));
140:    145: 
141:    if ($handle) 146:    if ($handle) {
142:       @fclose($handle);147:       @fclose($handle);
143:    148:    }
144:    return substr($str, 0, $len);149:    return substr($str, 0, $len);
145: } 
146: 150: 
 151: }


a/index.php b/index.php
185: }185: }
186: 186: 
187: $result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());187: $result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());
188: list($stats['total_topics'], $stats['total_posts']) = $db->fetch_row($result);188: list($stats['total_topics'], $stats['total_posts']) = array_map('intval', $db->fetch_row($result));
189: 189: 
190: if ($pun_user['g_view_users'] == '1')190: if ($pun_user['g_view_users'] == '1')
191:     $stats['newest_user'] = '<a href="profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a>';191:     $stats['newest_user'] = '<a href="profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a>';


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.3'); 10: define('FORUM_VERSION', '1.5.4');
 11:  11: 
 12: define('FORUM_DB_REVISION', 18); 12: define('FORUM_DB_REVISION', 20);
 13: define('FORUM_SI_REVISION', 2); 13: define('FORUM_SI_REVISION', 2);
 14: define('FORUM_PARSER_REVISION', 2); 14: define('FORUM_PARSER_REVISION', 2);
 15:  15: 
 22:  22: 
 23: define('PUN_ROOT', dirname(__FILE__).'/'); 23: define('PUN_ROOT', dirname(__FILE__).'/');
 24:  24: 
  25: // Send the Content-type header in case the web server is setup to send something else
  26: header('Content-type: text/html; charset=utf-8');
  27: 
 25: // Load the functions script 28: // Load the functions script
 26: require PUN_ROOT.'include/functions.php'; 29: require PUN_ROOT.'include/functions.php';
 27:  30: 
294:     <div class="box">297:     <div class="box">
295:         <div id="brdtitle" class="inbox">298:         <div id="brdtitle" class="inbox">
296:             <h1><span><?php echo $lang_install['FluxBB Installation'] ?></span></h1>299:             <h1><span><?php echo $lang_install['FluxBB Installation'] ?></span></h1>
297:             <div id="brddesc"><p><?php echo $lang_install['Install message'] ?></p><p><?php echo $lang_install['Welcome'] ?></p></div>300:             <div id="brddesc"><p><?php echo $lang_install['Welcome'] ?></p></div>
298:         </div>301:         </div>
299:     </div>302:     </div>
300: </div>303: </div>
359:                 <legend><?php echo $lang_install['Select database'] ?></legend>362:                 <legend><?php echo $lang_install['Select database'] ?></legend>
360:                     <div class="infldset">363:                     <div class="infldset">
361:                         <p><?php echo $lang_install['Info 2'] ?></p>364:                         <p><?php echo $lang_install['Info 2'] ?></p>
362: <?php if ($dual_mysql): ?>                        <p><?php echo $lang_install['Dual MySQL'] ?></p>365:                         <label class="required"><strong><?php echo $lang_install['Database type'] ?> <span><?php echo $lang_install['Required'] ?></span></strong>
363: <?php endif; ?><?php if ($mysql_innodb): ?>                        <p><?php echo $lang_install['InnoDB'] ?></p> 
364: <?php endif; ?>                        <label class="required"><strong><?php echo $lang_install['Database type'] ?> <span><?php echo $lang_install['Required'] ?></span></strong> 
365:                         <br /><select name="req_db_type">366:                         <br /><select name="req_db_type">
366: <?php367: <?php
367: 368: 
423:                     <p><?php echo $lang_install['Info 7'] ?></p>424:                     <p><?php echo $lang_install['Info 7'] ?></p>
424:                 </div>425:                 </div>
425:                 <fieldset>426:                 <fieldset>
426:                     <legend><?php echo $lang_install['Admin enter username'] ?></legend>427:                     <legend><?php echo $lang_install['Administration setup'] ?></legend>
427:                     <div class="infldset">428:                     <div class="infldset">
428:                         <p><?php echo $lang_install['Info 8'] ?></p>429:                         <p><?php echo $lang_install['Info 8'] ?></p>
429:                         <label class="required"><strong><?php echo $lang_install['Administrator username'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="text" name="req_username" value="<?php echo pun_htmlspecialchars($username) ?>" size="25" maxlength="25" /><br /></label>430:                         <label class="required"><strong><?php echo $lang_install['Administrator username'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="text" name="req_username" value="<?php echo pun_htmlspecialchars($username) ?>" size="25" maxlength="25" /><br /></label>
430:                     </div> 
431:                 </fieldset> 
432:             </div> 
433:             <div class="inform"> 
434:                 <fieldset> 
435:                     <legend><?php echo $lang_install['Admin enter password'] ?></legend> 
436:                     <div class="infldset"> 
437:                         <p><?php echo $lang_install['Info 9'] ?></p> 
438:                         <label class="conl required"><strong><?php echo $lang_install['Password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_password1" type="password" name="req_password1" size="16" /><br /></label>431:                         <label class="conl required"><strong><?php echo $lang_install['Password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_password1" type="password" name="req_password1" size="16" /><br /></label>
439:                         <label class="conl required"><strong><?php echo $lang_install['Confirm password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="password" name="req_password2" size="16" /><br /></label>432:                         <label class="conl required"><strong><?php echo $lang_install['Confirm password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="password" name="req_password2" size="16" /><br /></label>
440:                         <div class="clearer"></div>433:                         <div class="clearer"></div>
441:                     </div> 
442:                 </fieldset> 
443:             </div> 
444:             <div class="inform"> 
445:                 <fieldset> 
446:                     <legend><?php echo $lang_install['Admin enter email'] ?></legend> 
447:                     <div class="infldset"> 
448:                         <p><?php echo $lang_install['Info 10'] ?></p> 
449:                         <label class="required"><strong><?php echo $lang_install['Administrator email'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_email" type="text" name="req_email" value="<?php echo pun_htmlspecialchars($email) ?>" size="50" maxlength="80" /><br /></label>434:                         <label class="required"><strong><?php echo $lang_install['Administrator email'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_email" type="text" name="req_email" value="<?php echo pun_htmlspecialchars($email) ?>" size="50" maxlength="80" /><br /></label>
450:                     </div>435:                     </div>
451:                 </fieldset>436:                 </fieldset>
456:                     <p><?php echo $lang_install['Info 11'] ?></p>441:                     <p><?php echo $lang_install['Info 11'] ?></p>
457:                 </div>442:                 </div>
458:                 <fieldset>443:                 <fieldset>
459:                     <legend><?php echo $lang_install['Enter board title'] ?></legend>444:                     <legend><?php echo $lang_install['General information'] ?></legend>
460:                     <div class="infldset">445:                     <div class="infldset">
461:                         <p><?php echo $lang_install['Info 12'] ?></p> 
462:                         <label class="required"><strong><?php echo $lang_install['Board title'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_title" type="text" name="req_title" value="<?php echo pun_htmlspecialchars($title) ?>" size="60" maxlength="255" /><br /></label>446:                         <label class="required"><strong><?php echo $lang_install['Board title'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_title" type="text" name="req_title" value="<?php echo pun_htmlspecialchars($title) ?>" size="60" maxlength="255" /><br /></label>
463:                     </div> 
464:                 </fieldset> 
465:             </div> 
466:             <div class="inform"> 
467:                 <fieldset> 
468:                     <legend><?php echo $lang_install['Enter board description'] ?></legend> 
469:                     <div class="infldset"> 
470:                         <p><?php echo $lang_install['Info 13'] ?></p> 
471:                         <label><?php echo $lang_install['Board description'] ?><br /><input id="desc" type="text" name="desc" value="<?php echo pun_htmlspecialchars($description) ?>" size="60" maxlength="255" /><br /></label>447:                         <label><?php echo $lang_install['Board description'] ?><br /><input id="desc" type="text" name="desc" value="<?php echo pun_htmlspecialchars($description) ?>" size="60" maxlength="255" /><br /></label>
472:                     </div> 
473:                 </fieldset> 
474:             </div> 
475:             <div class="inform"> 
476:                 <fieldset> 
477:                     <legend><?php echo $lang_install['Enter base URL'] ?></legend> 
478:                     <div class="infldset"> 
479:                         <p><?php echo $lang_install['Info 14'] ?></p> 
480:                         <label class="required"><strong><?php echo $lang_install['Base URL'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_base_url" type="text" name="req_base_url" value="<?php echo pun_htmlspecialchars($base_url) ?>" size="60" maxlength="100" /><br /></label>448:                         <label class="required"><strong><?php echo $lang_install['Base URL'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_base_url" type="text" name="req_base_url" value="<?php echo pun_htmlspecialchars($base_url) ?>" size="60" maxlength="100" /><br /></label>
481:                     </div>449:                     </div>
482:                 </fieldset>450:                 </fieldset>
483:             </div>451:             </div>
484:             <div class="inform">452:             <div class="inform">
485:                 <fieldset>453:                 <fieldset>
486:                     <legend><?php echo $lang_install['Choose the default language'] ?></legend>454:                     <legend><?php echo $lang_install['Appearance'] ?></legend>
487:                     <div class="infldset">455:                     <div class="infldset">
488:                         <p><?php echo $lang_install['Info 15'] ?></p>456:                         <p><?php echo $lang_install['Info 15'] ?></p>
489:                         <label class="required"><strong><?php echo $lang_install['Default language'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_lang" name="req_default_lang">457:                         <label class="required"><strong><?php echo $lang_install['Default language'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_lang" name="req_default_lang">
500: 468: 
501: ?>469: ?>
502:                         </select><br /></label>470:                         </select><br /></label>
503:                     </div> 
504:                 </fieldset> 
505:             </div> 
506:             <div class="inform"> 
507:                 <fieldset> 
508:                     <legend><?php echo $lang_install['Choose the default style'] ?></legend> 
509:                     <div class="infldset"> 
510:                         <p><?php echo $lang_install['Info 16'] ?></p> 
511:                         <label class="required"><strong><?php echo $lang_install['Default style'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_style" name="req_default_style">471:                         <label class="required"><strong><?php echo $lang_install['Default style'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_style" name="req_default_style">
512: <?php472: <?php
513: 473: 


a/lang/English/admin_options.php b/lang/English/admin_options.php
 23: 'Board desc help'                    =>    'A short description of this bulletin board (shown at the top of every page). This field may contain HTML.', 23: 'Board desc help'                    =>    'A short description of this bulletin board (shown at the top of every page). This field may contain HTML.',
 24: 'Base URL label'                    =>    'Base URL', 24: 'Base URL label'                    =>    'Base URL',
 25: 'Base URL help'                        =>    'The complete URL of the board without trailing slash (i.e. http://www.mydomain.com/forums). This <strong>must</strong> be correct in order for all admin and moderator features to work. If you get "Bad referer" errors, it\'s probably incorrect.', 25: 'Base URL help'                        =>    'The complete URL of the board without trailing slash (i.e. http://www.mydomain.com/forums). This <strong>must</strong> be correct in order for all admin and moderator features to work. If you get "Bad referer" errors, it\'s probably incorrect.',
  26: 'Base URL problem'          =>  'Your installation does not support automatic conversion of internationalized domain names. As your base URL contains special characters, you <strong>must</strong> use an online converter in order to avoid "Bad referer" errors.',
 26: 'Timezone label'                    =>    'Default time zone', 27: 'Timezone label'                    =>    'Default time zone',
 27: 'Timezone help'                        =>    'The default time zone for guests and users attempting to register for the board.', 28: 'Timezone help'                        =>    'The default time zone for guests and users attempting to register for the board.',
 28: 'DST label'                            =>    'Adjust for DST', 29: 'DST label'                            =>    'Adjust for DST',
115: 116: 
116: // Features section117: // Features section
117: 'Features subhead'                    =>    'Features',118: 'Features subhead'                    =>    'Features',
118: 'Quick post label'                    =>    'Quick post',119: 'Quick post label'                    =>    'Quick reply',
119: 'Quick post help'                    =>    'When enabled, FluxBB will add a quick post form at the bottom of topics. This way users can post directly from the topic view.',120: 'Quick post help'                    =>    'When enabled, FluxBB will add a quick reply form at the bottom of topics. This way users can post directly from the topic view.',
120: 'Users online label'                =>    'Users online',121: 'Users online label'                =>    'Users online',
121: 'Users online help'                    =>    'Display info on the index page about guests and registered users currently browsing the board.',122: 'Users online help'                    =>    'Display info on the index page about guests and registered users currently browsing the board.',
122: 'Censor words label'                =>    'Censor words',123: 'Censor words label'                =>    'Censor words',


a/lang/English/admin_users.php b/lang/English/admin_users.php
 47: 'Website label'                =>    'Website', 47: 'Website label'                =>    'Website',
 48: 'Jabber label'                =>    'Jabber', 48: 'Jabber label'                =>    'Jabber',
 49: 'ICQ label'                    =>    'ICQ', 49: 'ICQ label'                    =>    'ICQ',
 50: 'MSN label'                    =>    'MSN Messenger', 50: 'MSN label'                    =>    'Microsoft Account',
 51: 'AOL label'                    =>    'AOL IM', 51: 'AOL label'                    =>    'AOL IM',
 52: 'Yahoo label'                =>    'Yahoo Messenger', 52: 'Yahoo label'                =>    'Yahoo Messenger',
 53: 'Location label'            =>    'Location', 53: 'Location label'            =>    'Location',


a/lang/English/install.php b/lang/English/install.php
  4:   4: 
  5: $lang_install = array(  5: $lang_install = array(
  6:   6: 
  7: 'Install message'                =>    'The file \'config.php\' doesn\'t exist or is corrupt. This implies that FluxBB has not yet been installed.', 
  8: 'Choose install language'        =>    'Choose the install script language',  7: 'Choose install language'        =>    'Choose the install script language',
  9: 'Choose install language info'    =>    'The language used for this install script. The default language used for the board itself can be set below.',  8: 'Choose install language info'    =>    'The language used for this install script. The default language used for the board itself can be set below.',
 10: 'Install language'                =>    'Install language',  9: 'Install language'                =>    'Install language',
 32: 'Administrator password 2'        =>    'Administrator password 2', 31: 'Administrator password 2'        =>    'Administrator password 2',
 33: 'Administrator email'            =>    'Administrator\'s email', 32: 'Administrator email'            =>    'Administrator\'s email',
 34: 'Board title'                    =>    'Board title', 33: 'Board title'                    =>    'Board title',
 35: 'Base URL'                        =>    'Base URL', 34: 'Base URL'                        =>    'The URL (without trailing slash) of your FluxBB forum. This must be correct.',
 36: 'Required field'                =>    'is a required field in this form.', 35: 'Required field'                =>    'is a required field in this form.',
 37: 'FluxBB Installation'            =>    'FluxBB Installation', 36: 'FluxBB Installation'            =>    'FluxBB Installation',
 38: 'Welcome'                        =>    'You are about to install FluxBB. In order to install FluxBB, you must complete the form set out below. If you encounter any difficulties with the installation, please refer to the documentation.', 37: 'Welcome'                        =>    'You are about to install FluxBB. In order to install FluxBB, you must complete the form set out below. If you encounter any difficulties with the installation, please refer to the documentation.',
 39: 'Install'                        =>    'Install FluxBB %s', 38: 'Install'                        =>    'Install FluxBB %s',
 40: 'Errors'                        =>    'The following errors need to be corrected:', 39: 'Errors'                        =>    'The following errors need to be corrected:',
 41: 'Database setup'                =>    'Database setup', 40: 'Database setup'                =>    'Database setup',
 42: 'Info 1'                        =>    'Please enter the requested information in order to setup your database for FluxBB. You must know all the information asked for before proceeding with the installation.', 41: 'Info 1'                        =>    'All information we need to create a connection with your database.',
 43: 'Select database'                =>    'Select your database type', 42: 'Select database'                =>    'Select your database type',
 44: 'Info 2'                        =>    'FluxBB currently supports MySQL, PostgreSQL and SQLite. If your database of choice is missing from the drop-down menu below, it means this PHP environment does not have support for that particular database. More information regarding support for particular versions of each database can be found in the FAQ.', 43: 'Info 2'                        =>    'Select a database. We support SQLite, MySQL and PostgreSQL.',
 45: 'Dual MySQL'                    =>    'FluxBB has detected that your PHP environment supports two different ways of communicating with MySQL. The two options are called standard and improved. If you are uncertain which one to use, start by trying improved and if that fails, try standard.', 
 46: 'InnoDB'                        =>    'FluxBB has detected that your MySQL server might support <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb.html">InnoDB</a>. This would be a good choice if you are planning to run a large forum. If you are uncertain, it is recommended that you do not use InnoDB.', 
 47: 'Database type'                    =>    'Database type', 44: 'Database type'                    =>    'Database type',
 48: 'Required'                        =>    '(Required)', 45: 'Required'                        =>    '(Required)',
 49: 'Database hostname'                =>    'Enter your database server hostname', 46: 'Database hostname'                =>    'Enter your database server hostname',
 50: 'Info 3'                        =>    'The address of the database server (example: localhost, db.myhost.com or 192.168.0.15). You can specify a custom port number if your database doesn\'t run on the default port (example: localhost:3580). For SQLite support, just enter anything or leave it at \'localhost\'.', 47: 'Info 3'                        =>    'You should be able to get this info from your web host, if <code>localhost</code> does not work.',
 51: 'Database server hostname'        =>'Database server hostname', 48: 'Database server hostname'        =>    'Database server hostname',
 52: 'Database enter name'            =>    'Enter the name of your database', 49: 'Database enter name'            =>    'Enter the name of your database',
 53: 'Info 4'                        =>    'The name of the database that FluxBB will be installed into. The database must exist. For SQLite, this is the relative path to the database file. For security reasons, it is highly recommended to place the SQLite database in a private (not web accessible) directory whenever possible. If the SQLite database file does not exist, FluxBB will attempt to create it.', 50: 'Info 4'                        =>    'The name of the database you want to install FluxBB on.',
 54: 'Database name'                    =>    'Database name', 51: 'Database name'                    =>    'Database name',
 55: 'Database enter informations'    =>    'Enter your database username and password', 52: 'Database enter informations'    =>    'Enter your database username and password',
 56: 'Database username'                =>    'Database username', 53: 'Database username'                =>    'Database username',
 57: 'Info 5'                        =>    'Enter the username and password with which you connect to the database. Ignore for SQLite.', 54: 'Info 5'                        =>    'Your MySQL username and password (ignore of SQLite).',
 58: 'Database password'                =>    'Database password', 55: 'Database password'                =>    'Database password',
 59: 'Database enter prefix'            =>    'Enter database table prefix', 56: 'Database enter prefix'            =>    'Enter database table prefix',
 60: 'Info 6'                        =>    'If you like, you can specify a table prefix. This way you can run multiple copies of FluxBB in the same database (example: foo_).', 57: 'Info 6'                        =>    'If you want to run multiple FluxBB installations in a single database, change this.',
 61: 'Table prefix'                    =>    'Table prefix', 58: 'Table prefix'                    =>    'Table prefix',
 62: 'Administration setup'            =>    'Administration setup', 59: 'Administration setup'            =>    'Administration setup',
 63: 'Info 7'                        =>    'Please enter the requested information in order to setup an administrator for your FluxBB installation.', 60: 'Info 7'                        =>    'Create the very first account on your board.',
 64: 'Admin enter username'            =>    'Enter Administrator\'s username', 61: 'Info 8'                        =>    'Your username should be between 2 and 25 characters long. Your password must be at least 4 characters long. Remember that passwords are case-sensitive.',
 65: 'Info 8'                        =>    'The username of the forum administrator. You can later create more administrators and moderators. Usernames can be between 2 and 25 characters long.', 
 66: 'Admin enter password'            =>    'Enter and confirm Administrator\'s password', 
 67: 'Info 9'                        =>    'Passwords must be at least 4 characters long. Passwords are case sensitive.', 
 68: 'Password'                        =>    'Password', 62: 'Password'                        =>    'Password',
 69: 'Confirm password'                =>    'Confirm password', 63: 'Confirm password'                =>    'Confirm password',
 70: 'Admin enter email'                =>    'Enter Administrator\'s email', 
 71: 'Info 10'                        =>    'The email address of the forum administrator.', 
 72: 'Board setup'                    =>    'Board setup', 64: 'Board setup'                    =>    'Board setup',
 73: 'Info 11'                        =>    'Please enter the requested information in order to setup your FluxBB board.', 65: 'Info 11'                        =>    'Settings for your board. You can change this later.',
 74: 'Enter board title'                =>    'Enter your board\'s title', 66: 'General information'            =>    'Enter your board\'s title and description.',
 75: 'Info 12'                        =>    'The title of this bulletin board (shown at the top of every page).', 67: 'Board description'                =>    'Board description (supports HTML)',
 76: 'Enter board description'        =>    'Enter your board\'s description', 68: 'Info 14'                        =>    'The URL (without trailing slash) of your FluxBB forum (example: http://forum.myhost.com). This must be correct. Please note that the preset value below is just an educated guess by FluxBB.',
 77: 'Info 13'                        =>    'A short description of this bulletin board (shown at the top of every page). This field may contain HTML.', 69: 'Appearance'                    =>    'Appearance',
 78: 'Board description'                =>    'Board description', 70: 'Info 15'                        =>    'Make your forum yours. Choose a language and a style for your board.',
 79: 'Enter base URL'                =>    'Enter the Base URL of your FluxBB installation', 
 80: 'Info 14'                        =>    'The URL (without trailing slash) of your FluxBB forum (example: http://forum.myhost.com or http://myhost.com/~myuser). This <strong>must</strong> be correct, otherwise, administrators and moderators will not be able to submit any forms. Please note that the preset value below is just an educated guess by FluxBB.', 
 81: 'Choose the default language'    =>    'Choose the default language', 
 82: 'Info 15'                        =>    'The default language used for guests and users who haven\'t changed from the default in their profile.', 
 83: 'Default language'                =>    'Default language', 71: 'Default language'                =>    'Default language',
 84: 'Choose the default style'        =>    'Choose the default style', 
 85: 'Info 16'                        =>    'The default style used for guests and users who haven\'t changed from the default in their profile.', 
 86: 'Default style'                    =>    'Default style', 72: 'Default style'                    =>    'Default style',
 87: 'Start install'                    =>    'Start install', 73: 'Start install'                    =>    'Start install',
 88: 'DB type not valid'                =>    '\'%s\' is not a valid database type', 74: 'DB type not valid'                =>    '\'%s\' is not a valid database type',


a/lang/English/profile.php b/lang/English/profile.php
 85: 'Website not allowed'            =>    'You are not allowed to add a website to your profile yet.', 85: 'Website not allowed'            =>    'You are not allowed to add a website to your profile yet.',
 86: 'Jabber'                        =>    'Jabber', 86: 'Jabber'                        =>    'Jabber',
 87: 'ICQ'                            =>    'ICQ', 87: 'ICQ'                            =>    'ICQ',
 88: 'MSN'                            =>    'MSN Messenger', 88: 'MSN'                            =>    'Microsoft Account',
 89: 'AOL IM'                        =>    'AOL IM', 89: 'AOL IM'                        =>    'AOL IM',
 90: 'Yahoo'                            =>    'Yahoo! Messenger', 90: 'Yahoo'                            =>    'Yahoo! Messenger',
 91: 'Avatar'                        =>    'Avatar', 91: 'Avatar'                        =>    'Avatar',


a/lang/English/topic.php b/lang/English/topic.php
 23: 'Is subscribed'        =>    'You are currently subscribed to this topic', 23: 'Is subscribed'        =>    'You are currently subscribed to this topic',
 24: 'Unsubscribe'        =>    'Unsubscribe', 24: 'Unsubscribe'        =>    'Unsubscribe',
 25: 'Subscribe'            =>    'Subscribe to this topic', 25: 'Subscribe'            =>    'Subscribe to this topic',
 26: 'Quick post'        =>    'Quick post', 26: 'Quick post'        =>    'Quick reply',
 27: 'Mod controls'        =>    'Moderator controls', 27: 'Mod controls'        =>    'Moderator controls',
 28: 'New icon'            =>    'New post', 28: 'New icon'            =>    'New post',
 29: 'Re'                =>    'Re:', 29: 'Re'                =>    'Re:',


a/login.php b/login.php
168:                     pun_mail($email, $mail_subject, $cur_mail_message);168:                     pun_mail($email, $mail_subject, $cur_mail_message);
169:                 }169:                 }
170: 170: 
171:                 message($lang_login['Forget mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);171:                 message($lang_login['Forget mail'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.', true);
172:             }172:             }
173:             else173:             else
174:                 $errors[] = $lang_login['No email match'].' '.htmlspecialchars($email).'.';174:                 $errors[] = $lang_login['No email match'].' '.htmlspecialchars($email).'.';


a/misc.php b/misc.php
 99:  99: 
100:     if (isset($_POST['form_sent']))100:     if (isset($_POST['form_sent']))
101:     {101:     {
 102:         confirm_referrer('misc.php');
 103: 
102:         // Clean up message and subject from POST104:         // Clean up message and subject from POST
103:         $subject = pun_trim($_POST['req_subject']);105:         $subject = pun_trim($_POST['req_subject']);
104:         $message = pun_trim($_POST['req_message']);106:         $message = pun_trim($_POST['req_message']);


a/moderate.php b/moderate.php
 90:                 message($lang_common['Bad request']); 90:                 message($lang_common['Bad request']);
 91:  91: 
 92:             // Verify that the post IDs are valid 92:             // Verify that the post IDs are valid
 93:             $result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid) or error('Unable to check posts', __FILE__, __LINE__, $db->error()); 93:             $admins_sql = ($pun_user['g_id'] != PUN_ADMIN) ? ' AND poster_id NOT IN('.implode(',', get_admin_ids()).')' : ''; 
  94:             $result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid.$admins_sql) or error('Unable to check posts', __FILE__, __LINE__, $db->error());
 94:  95: 
 95:             if ($db->num_rows($result) != substr_count($posts, ',') + 1) 96:             if ($db->num_rows($result) != substr_count($posts, ',') + 1)
 96:                 message($lang_common['Bad request']); 97:                 message($lang_common['Bad request']);
666:         if ($db->num_rows($result) != substr_count($topics, ',') + 1)667:         if ($db->num_rows($result) != substr_count($topics, ',') + 1)
667:             message($lang_common['Bad request']);668:             message($lang_common['Bad request']);
668: 669: 
 670:         // Verify that the posts are not by admins
 671:         if ($pun_user['g_id'] != PUN_ADMIN)
 672:         {
 673:             $result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE topic_id IN('.$topics.') AND poster_id IN('.implode(',', get_admin_ids()).')') or error('Unable to check posts', __FILE__, __LINE__, $db->error());
 674:             if ($db->num_rows($result))
 675:                 message($lang_common['No permission'], false, '403 Forbidden');
 676:         }
 677: 
669:         // Delete the topics and any redirect topics678:         // Delete the topics and any redirect topics
670:         $db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topics.') OR moved_to IN('.$topics.')') or error('Unable to delete topic', __FILE__, __LINE__, $db->error());679:         $db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topics.') OR moved_to IN('.$topics.')') or error('Unable to delete topic', __FILE__, __LINE__, $db->error());
671: 680: 


a/profile.php b/profile.php
 52:         $cur_user = $db->fetch_assoc($result); 52:         $cur_user = $db->fetch_assoc($result);
 53:  53: 
 54:         if ($key == '' || $key != $cur_user['activate_key']) 54:         if ($key == '' || $key != $cur_user['activate_key'])
 55:             message($lang_profile['Pass key bad'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.'); 55:             message($lang_profile['Pass key bad'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.');
 56:         else 56:         else
 57:         { 57:         {
 58:             $db->query('UPDATE '.$db->prefix.'users SET password=\''.$cur_user['activate_string'].'\', activate_string=NULL, activate_key=NULL'.(!empty($cur_user['salt']) ? ', salt=NULL' : '').' WHERE id='.$id) or error('Unable to update password', __FILE__, __LINE__, $db->error()); 58:             $db->query('UPDATE '.$db->prefix.'users SET password=\''.$cur_user['activate_string'].'\', activate_string=NULL, activate_key=NULL'.(!empty($cur_user['salt']) ? ', salt=NULL' : '').' WHERE id='.$id) or error('Unable to update password', __FILE__, __LINE__, $db->error());
183:         list($new_email, $new_email_key) = $db->fetch_row($result);183:         list($new_email, $new_email_key) = $db->fetch_row($result);
184: 184: 
185:         if ($key == '' || $key != $new_email_key)185:         if ($key == '' || $key != $new_email_key)
186:             message($lang_profile['Email key bad'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');186:             message($lang_profile['Email key bad'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.');
187:         else187:         else
188:         {188:         {
189:             $db->query('UPDATE '.$db->prefix.'users SET email=activate_string, activate_string=NULL, activate_key=NULL WHERE id='.$id) or error('Unable to update email address', __FILE__, __LINE__, $db->error());189:             $db->query('UPDATE '.$db->prefix.'users SET email=activate_string, activate_string=NULL, activate_key=NULL WHERE id='.$id) or error('Unable to update email address', __FILE__, __LINE__, $db->error());
275: 275: 
276:         pun_mail($new_email, $mail_subject, $mail_message);276:         pun_mail($new_email, $mail_subject, $mail_message);
277: 277: 
278:         message($lang_profile['Activate email sent'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);278:         message($lang_profile['Activate email sent'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.', true);
279:     }279:     }
280: 280: 
281:     $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Change email']);281:     $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Change email']);
368: 368: 
369:             // Move the file to the avatar directory. We do this before checking the width/height to circumvent open_basedir restrictions369:             // Move the file to the avatar directory. We do this before checking the width/height to circumvent open_basedir restrictions
370:             if (!@move_uploaded_file($uploaded_file['tmp_name'], PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp'))370:             if (!@move_uploaded_file($uploaded_file['tmp_name'], PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp'))
371:                 message($lang_profile['Move failed'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');371:                 message($lang_profile['Move failed'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.');
372: 372: 
373:             list($width, $height, $type,) = @getimagesize(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp');373:             list($width, $height, $type,) = @getimagesize(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp');
374: 374: 
458: 458: 
459:     $new_group_id = intval($_POST['group_id']);459:     $new_group_id = intval($_POST['group_id']);
460: 460: 
 461:     $result = $db->query('SELECT group_id FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch user group', __FILE__, __LINE__, $db->error());
 462:     $old_group_id = $db->result($result);
 463: 
461:     $db->query('UPDATE '.$db->prefix.'users SET group_id='.$new_group_id.' WHERE id='.$id) or error('Unable to change user group', __FILE__, __LINE__, $db->error());464:     $db->query('UPDATE '.$db->prefix.'users SET group_id='.$new_group_id.' WHERE id='.$id) or error('Unable to change user group', __FILE__, __LINE__, $db->error());
462: 465: 
463:     // Regenerate the users info cache466:     // Regenerate the users info cache
466: 469: 
467:     generate_users_info_cache();470:     generate_users_info_cache();
468: 471: 
 472:     if ($old_group_id == PUN_ADMIN || $new_group_id == PUN_ADMIN)
 473:         generate_admins_cache();
 474: 
469:     $result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$new_group_id) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());475:     $result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$new_group_id) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());
470:     $new_group_mod = $db->result($result);476:     $new_group_mod = $db->result($result);
471: 477: 
640: 646: 
641:         generate_users_info_cache();647:         generate_users_info_cache();
642: 648: 
 649:         if ($group_id == PUN_ADMIN)
 650:             generate_admins_cache();
 651: 
643:         redirect('index.php', $lang_profile['User delete redirect']);652:         redirect('index.php', $lang_profile['User delete redirect']);
644:     }653:     }
645: 654: 
1041:     }1050:     }
1042: 1051: 
1043:     if ($user['email_setting'] == '0' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')1052:     if ($user['email_setting'] == '0' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
1044:         $email_field = '<a href="mailto:'.$user['email'].'">'.$user['email'].'</a>';1053:         $email_field = '<a href="mailto:'.pun_htmlspecialchars($user['email']).'">'.pun_htmlspecialchars($user['email']).'</a>';
1045:     else if ($user['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')1054:     else if ($user['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
1046:         $email_field = '<a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a>';1055:         $email_field = '<a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a>';
1047:     else1056:     else
1212:             else1221:             else
1213:                 $username_field = '<p>'.sprintf($lang_profile['Username info'], pun_htmlspecialchars($user['username'])).'</p>'."\n";1222:                 $username_field = '<p>'.sprintf($lang_profile['Username info'], pun_htmlspecialchars($user['username'])).'</p>'."\n";
1214: 1223: 
1215:             $email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="80" /><br /></label><p><span class="email"><a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a></span></p>'."\n";1224:             $email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.pun_htmlspecialchars($user['email']).'" size="40" maxlength="80" /><br /></label><p><span class="email"><a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a></span></p>'."\n";
1216:         }1225:         }
1217:         else1226:         else
1218:         {1227:         {
1219:             $username_field = '<p>'.$lang_common['Username'].': '.pun_htmlspecialchars($user['username']).'</p>'."\n";1228:             $username_field = '<p>'.$lang_common['Username'].': '.pun_htmlspecialchars($user['username']).'</p>'."\n";
1220: 1229: 
1221:             if ($pun_config['o_regs_verify'] == '1')1230:             if ($pun_config['o_regs_verify'] == '1')
1222:                 $email_field = '<p>'.sprintf($lang_profile['Email info'], $user['email'].' - <a href="profile.php?action=change_email&amp;id='.$id.'">'.$lang_profile['Change email'].'</a>').'</p>'."\n";1231:                 $email_field = '<p>'.sprintf($lang_profile['Email info'], pun_htmlspecialchars($user['email']).' - <a href="profile.php?action=change_email&amp;id='.$id.'">'.$lang_profile['Change email'].'</a>').'</p>'."\n";
1223:             else1232:             else
1224:                 $email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="80" /><br /></label>'."\n";1233:                 $email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="80" /><br /></label>'."\n";
1225:         }1234:         }


/dev/null b/readme.md
   1: # FluxBB 1.5 Readme
   2: 
   3: ## About
   4: 
   5: FluxBB is an open source forum application released under the GNU General Public
   6: Licence. It is free to download and use and will remain so. FluxBB was conceived and
   7: designed to be fast and light with less of the "not so essential" features that some
   8: of the other forums have whilst not sacrificing essential functionality or usability.
   9: 
  10: ## Requirements
  11: 
  12: * A webserver
  13: * PHP 4.4.0 or later
  14: * A database such as MySQL 4.1.2 or later, PostgreSQL 7.0 or later, or SQLite 2
  15: 
  16: ## Recommendations
  17: 
  18: * Make use of a PHP accelerator such as APC or XCache
  19: * Make sure PHP has the zlib module installed to allow FluxBB to gzip output
  20: 
  21: ## Links
  22: 
  23: * Homepage: http://fluxbb.org
  24: * Documentation: http://fluxbb.org/docs/v1.5
  25: * Community: http://fluxbb.org/forums/
  26: * Resources: http://fluxbb.org/resources/
  27: * IRC: irc://irc.freenode.net/fluxbb
  28: * Development: http://github.com/fluxbb/fluxbb
  0:  29: 


a/register.php b/register.php
240: 240: 
241:             pun_mail($email1, $mail_subject, $mail_message);241:             pun_mail($email1, $mail_subject, $mail_message);
242: 242: 
243:             message($lang_register['Reg email'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);243:             message($lang_register['Reg email'].' <a href="mailto:'.pun_htmlspecialchars($pun_config['o_admin_email']).'">'.pun_htmlspecialchars($pun_config['o_admin_email']).'</a>.', true);
244:         }244:         }
245: 245: 
246:         // Regenerate the users info cache246:         // Regenerate the users info cache


a/style/Air.css b/style/Air.css
964: }964: }
965: 965: 
966: .pun .codebox pre {966: .pun .codebox pre {
967:     overflow-y:hidden;967:     overflow: hidden;
968:     overflow: auto; 
969:     width: 100%;968:     width: 100%;
970:     direction: ltr;969:     direction: ltr;
971:     text-align: left;970:     text-align: left;


a/style/Earth.css b/style/Earth.css
963: }963: }
964: 964: 
965: .pun .codebox pre {965: .pun .codebox pre {
966:     overflow-y:hidden;966:     overflow: hidden;
967:     overflow: auto; 
968:     width: 100%;967:     width: 100%;
969:     direction: ltr;968:     direction: ltr;
970:     text-align: left;969:     text-align: left;


a/style/Fire.css b/style/Fire.css
963: }963: }
964: 964: 
965: .pun .codebox pre {965: .pun .codebox pre {
966:     overflow-y:hidden;966:     overflow: hidden;
967:     overflow: auto; 
968:     width: 100%;967:     width: 100%;
969:     direction: ltr;968:     direction: ltr;
970:     text-align: left;969:     text-align: left;


a/viewtopic.php b/viewtopic.php
 92: // Sort out who the moderators are and if we are currently a moderator (or an admin) 92: // Sort out who the moderators are and if we are currently a moderator (or an admin)
 93: $mods_array = ($cur_topic['moderators'] != '') ? unserialize($cur_topic['moderators']) : array(); 93: $mods_array = ($cur_topic['moderators'] != '') ? unserialize($cur_topic['moderators']) : array();
 94: $is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false; 94: $is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
  95: if ($is_admmod)
  96:     $admin_ids = get_admin_ids();
 95:  97: 
 96: // Can we or can we not post replies? 98: // Can we or can we not post replies?
 97: if ($cur_topic['closed'] == '0') 99: if ($cur_topic['closed'] == '0')
261: 263: 
262:             // Now let's deal with the contact links (Email and URL)264:             // Now let's deal with the contact links (Email and URL)
263:             if ((($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['is_admmod']) && $pun_user['g_send_email'] == '1')265:             if ((($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['is_admmod']) && $pun_user['g_send_email'] == '1')
264:                 $user_contacts[] = '<span class="email"><a href="mailto:'.$cur_post['email'].'">'.$lang_common['Email'].'</a></span>';266:                 $user_contacts[] = '<span class="email"><a href="mailto:'.pun_htmlspecialchars($cur_post['email']).'">'.$lang_common['Email'].'</a></span>';
265:             else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')267:             else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
266:                 $user_contacts[] = '<span class="email"><a href="misc.php?email='.$cur_post['poster_id'].'">'.$lang_common['Email'].'</a></span>';268:                 $user_contacts[] = '<span class="email"><a href="misc.php?email='.$cur_post['poster_id'].'">'.$lang_common['Email'].'</a></span>';
267: 269: 
292:             $user_info[] = '<dd><span><a href="moderate.php?get_host='.$cur_post['id'].'" title="'.pun_htmlspecialchars($cur_post['poster_ip']).'">'.$lang_topic['IP address logged'].'</a></span></dd>';294:             $user_info[] = '<dd><span><a href="moderate.php?get_host='.$cur_post['id'].'" title="'.pun_htmlspecialchars($cur_post['poster_ip']).'">'.$lang_topic['IP address logged'].'</a></span></dd>';
293: 295: 
294:         if ($pun_config['o_show_user_info'] == '1' && $cur_post['poster_email'] != '' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')296:         if ($pun_config['o_show_user_info'] == '1' && $cur_post['poster_email'] != '' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
295:             $user_contacts[] = '<span class="email"><a href="mailto:'.$cur_post['poster_email'].'">'.$lang_common['Email'].'</a></span>';297:             $user_contacts[] = '<span class="email"><a href="mailto:'.pun_htmlspecialchars($cur_post['poster_email']).'">'.$lang_common['Email'].'</a></span>';
296:     }298:     }
297: 299: 
298:     // Generation post action array (quote, edit, delete etc.)300:     // Generation post action array (quote, edit, delete etc.)
318:     else320:     else
319:     {321:     {
320:         $post_actions[] = '<li class="postreport"><span><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a></span></li>';322:         $post_actions[] = '<li class="postreport"><span><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a></span></li>';
321:         $post_actions[] = '<li class="postdelete"><span><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a></span></li>';323:         if ($pun_user['g_id'] == PUN_ADMIN || !in_array($cur_post['poster_id'], $admin_ids))
322:         $post_actions[] = '<li class="postedit"><span><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a></span></li>';324:         {
 325:             $post_actions[] = '<li class="postdelete"><span><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a></span></li>';
 326:             $post_actions[] = '<li class="postedit"><span><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a></span></li>';
 327:         }
323:         $post_actions[] = '<li class="postquote"><span><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a></span></li>';328:         $post_actions[] = '<li class="postquote"><span><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a></span></li>';
324:     }329:     }
325: 330: 


hdiff - version: 2.1.0 (modified)