Merge commit 'release-3.0.1-RC1'

This commit is contained in:
Nils Adermann 2010-03-02 01:05:38 +01:00
commit 0434ccf303
156 changed files with 2140 additions and 1370 deletions

View file

@ -45,8 +45,8 @@ define('IN_ADMIN', true);
$phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : './'; $phpbb_admin_path = (defined('PHPBB_ADMIN_PATH')) ? PHPBB_ADMIN_PATH : './';
// Some oft used variables // Some oft used variables
$safe_mode = (@ini_get('safe_mode') || @strtolower(ini_get('safe_mode')) == 'on') ? true : false; $safe_mode = (@ini_get('safe_mode') == '1' || @strtolower(ini_get('safe_mode')) === 'on') ? true : false;
$file_uploads = (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on') ? true : false; $file_uploads = (@ini_get('file_uploads') == '1' || strtolower(@ini_get('file_uploads')) === 'on') ? true : false;
$module_id = request_var('i', ''); $module_id = request_var('i', '');
$mode = request_var('mode', ''); $mode = request_var('mode', '');
@ -184,7 +184,7 @@ function adm_page_footer($copyright_html = true)
{ {
global $base_memory_usage; global $base_memory_usage;
$memory_usage -= $base_memory_usage; $memory_usage -= $base_memory_usage;
$memory_usage = ($memory_usage >= 1048576) ? round((round($memory_usage / 1048576 * 100) / 100), 2) . ' ' . $user->lang['MB'] : (($memory_usage >= 1024) ? round((round($memory_usage / 1024 * 100) / 100), 2) . ' ' . $user->lang['KB'] : $memory_usage . ' ' . $user->lang['BYTES']); $memory_usage = get_formatted_filesize($memory_usage);
$debug_output .= ' | Memory Usage: ' . $memory_usage; $debug_output .= ' | Memory Usage: ' . $memory_usage;
} }
@ -367,33 +367,64 @@ function build_cfg_template($tpl_type, $key, &$new, $config_key, $vars)
} }
/** /**
* Going through a config array and validate values, writing errors to $error. * Going through a config array and validate values, writing errors to $error. The validation method accepts parameters separated by ':' for string and int.
* The first parameter defines the type to be used, the second the lower bound and the third the upper bound. Only the type is required.
*/ */
function validate_config_vars($config_vars, &$cfg_array, &$error) function validate_config_vars($config_vars, &$cfg_array, &$error)
{ {
global $phpbb_root_path, $user; global $phpbb_root_path, $user;
$type = 0;
$min = 1;
$max = 2;
foreach ($config_vars as $config_name => $config_definition) foreach ($config_vars as $config_name => $config_definition)
{ {
if (!isset($cfg_array[$config_name]) || strpos($config_name, 'legend') !== false) if (!isset($cfg_array[$config_name]) || strpos($config_name, 'legend') !== false)
{ {
continue; continue;
} }
if (!isset($config_definition['validate'])) if (!isset($config_definition['validate']))
{ {
continue; continue;
} }
$validator = explode(':', $config_definition['validate']);
// Validate a bit. ;) String is already checked through request_var(), therefore we do not check this again // Validate a bit. ;) (0 = type, 1 = min, 2= max)
switch ($config_definition['validate']) switch ($validator[$type])
{ {
case 'string':
$length = strlen($cfg_array[$config_name]);
// the column is a VARCHAR
$validator[$max] = (isset($validator[$max])) ? min(255, $validator[$max]) : 255;
if (isset($validator[$min]) && $length < $validator[$min])
{
$error[] = sprintf($user->lang['SETTING_TOO_SHORT'], $user->lang[$config_definition['lang']], $validator[$min]);
}
else if (isset($validator[$max]) && $length > $validator[2])
{
$error[] = sprintf($user->lang['SETTING_TOO_LONG'], $user->lang[$config_definition['lang']], $validator[$max]);
}
break;
case 'bool': case 'bool':
$cfg_array[$config_name] = ($cfg_array[$config_name]) ? 1 : 0; $cfg_array[$config_name] = ($cfg_array[$config_name]) ? 1 : 0;
break; break;
case 'int': case 'int':
$cfg_array[$config_name] = (int) $cfg_array[$config_name]; $cfg_array[$config_name] = (int) $cfg_array[$config_name];
if (isset($validator[$min]) && $cfg_array[$config_name] < $validator[$min])
{
$error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$config_definition['lang']], $validator[$min]);
}
else if (isset($validator[$max]) && $cfg_array[$config_name] > $validator[$max])
{
$error[] = sprintf($user->lang['SETTING_TOO_BIG'], $user->lang[$config_definition['lang']], $validator[$max]);
}
break; break;
// Absolute path // Absolute path
@ -508,4 +539,62 @@ function validate_config_vars($config_vars, &$cfg_array, &$error)
return; return;
} }
/**
* Checks whatever or not a variable is OK for use in the Database
* param mixed $value_ary An array of the form array(array('lang' => ..., 'value' => ..., 'column_type' =>))'
* param mixed $error The error array
*/
function validate_range($value_ary, &$error)
{
global $user;
$column_types = array(
'BOOL' => array('php_type' => 'int', 'min' => 0, 'max' => 1),
'USINT' => array('php_type' => 'int', 'min' => 0, 'max' => 65535),
'UINT' => array('php_type' => 'int', 'min' => 0, 'max' => (int) 0x7fffffff),
'INT' => array('php_type' => 'int', 'min' => (int) 0x80000000, 'max' => (int) 0x7fffffff),
'TINT' => array('php_type' => 'int', 'min' => -128, 'max' => 127),
'VCHAR' => array('php_type' => 'string', 'min' => 0, 'max' => 255),
);
foreach ($value_ary as $value)
{
$column = explode(':', $value['column_type']);
$max = $min = 0;
$type = 0;
if (!isset($column_types[$column[0]]))
{
continue;
}
else
{
$type = $column_types[$column[0]];
}
switch ($type['php_type'])
{
case 'string' :
$max = (isset($column[1])) ? min($column[1],$type['max']) : $type['max'];
if (strlen($value['value']) > $max)
{
$error[] = sprintf($user->lang['SETTING_TOO_LONG'], $user->lang[$value['lang']], $max);
}
break;
case 'int':
$min = (isset($column[1])) ? max($column[1],$type['min']) : $type['min'];
$max = (isset($column[2])) ? min($column[2],$type['max']) : $type['max'];
if ($value['value'] < $min)
{
$error[] = sprintf($user->lang['SETTING_TOO_LOW'], $user->lang[$value['lang']], $min);
}
else if ($value['value'] > $max)
{
$error[] = sprintf($user->lang['SETTING_TOO_BIG'], $user->lang[$value['lang']], $max);
}
break;
}
}
}
?> ?>

View file

@ -122,11 +122,11 @@
{ {
if (newimage == 'no_image') if (newimage == 'no_image')
{ {
document.image_upload_icon.src = "{PHPBB_ROOT_PATH}images/spacer.gif"; document.getElementById('image_upload_icon').src = "{PHPBB_ROOT_PATH}images/spacer.gif";
} }
else else
{ {
document.image_upload_icon.src = "{PHPBB_ROOT_PATH}{IMG_PATH}/" + newimage; document.getElementById('image_upload_icon').src = "{PHPBB_ROOT_PATH}{IMG_PATH}/" + newimage;
} }
} }
@ -192,7 +192,7 @@
<dd><select name="upload_icon" id="upload_icon" onchange="update_image(this.options[selectedIndex].value);"> <dd><select name="upload_icon" id="upload_icon" onchange="update_image(this.options[selectedIndex].value);">
<option value="no_image"<!-- IF S_NO_IMAGE --> selected="selected"<!-- ENDIF -->>{L_NO_IMAGE}</option>{S_FILENAME_LIST} <option value="no_image"<!-- IF S_NO_IMAGE --> selected="selected"<!-- ENDIF -->>{L_NO_IMAGE}</option>{S_FILENAME_LIST}
</select></dd> </select></dd>
<dd>&nbsp;<img <!-- IF S_NO_IMAGE -->src="{PHPBB_ROOT_PATH}images/spacer.gif"<!-- ELSE -->src="{UPLOAD_ICON_SRC}"<!-- ENDIF --> name="image_upload_icon" alt="" title="" />&nbsp;</dd> <dd>&nbsp;<img <!-- IF S_NO_IMAGE -->src="{PHPBB_ROOT_PATH}images/spacer.gif"<!-- ELSE -->src="{UPLOAD_ICON_SRC}"<!-- ENDIF --> id="image_upload_icon" alt="" title="" />&nbsp;</dd>
</dl> </dl>
<dl> <dl>
<dt><label for="extgroup_filesize">{L_MAX_EXTGROUP_FILESIZE}:</label></dt> <dt><label for="extgroup_filesize">{L_MAX_EXTGROUP_FILESIZE}:</label></dt>

View file

@ -103,6 +103,10 @@
<td style="text-align: center;">{bbcodes.BBCODE_TAG}</td> <td style="text-align: center;">{bbcodes.BBCODE_TAG}</td>
<td style="text-align: right; width: 40px;"><a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}">{ICON_DELETE}</a></td> <td style="text-align: right; width: 40px;"><a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}">{ICON_DELETE}</a></td>
</tr> </tr>
<!-- BEGINELSE -->
<tr class="row3">
<td colspan="2">{L_ACP_NO_ITEMS}</td>
</tr>
<!-- END bbcodes --> <!-- END bbcodes -->
</tbody> </tbody>
</table> </table>

View file

@ -7,8 +7,9 @@
<p>{L_ACP_RESTORE_EXPLAIN}</p> <p>{L_ACP_RESTORE_EXPLAIN}</p>
<!-- IF .files -->
<form id="acp_backup" method="post" action="{U_ACTION}"> <form id="acp_backup" method="post" action="{U_ACTION}">
<fieldset> <fieldset>
<legend>{L_RESTORE_OPTIONS}</legend> <legend>{L_RESTORE_OPTIONS}</legend>
<dl> <dl>
@ -16,16 +17,19 @@
<dd><select id="file" name="file" size="10"><!-- BEGIN files --><option value="{files.FILE}"<!-- IF files.S_LAST_ROW --> selected="selected"<!-- ENDIF -->>{files.NAME}</option><!-- END files --></select></dd> <dd><select id="file" name="file" size="10"><!-- BEGIN files --><option value="{files.FILE}"<!-- IF files.S_LAST_ROW --> selected="selected"<!-- ENDIF -->>{files.NAME}</option><!-- END files --></select></dd>
</dl> </dl>
<!-- IF .files --> <p class="submit-buttons">
<p class="submit-buttons"> <input class="button1" type="submit" id="submit" name="submit" value="{L_START_RESTORE}" />&nbsp;
<input class="button1" type="submit" id="submit" name="submit" value="{L_START_RESTORE}" />&nbsp; <input class="button2" type="submit" id="delete" name="delete" value="{L_DELETE_BACKUP}" />&nbsp;
<input class="button2" type="submit" id="delete" name="delete" value="{L_DELETE_BACKUP}" />&nbsp; <input class="button2" type="submit" id="download" name="download" value="{L_DOWNLOAD_BACKUP}" />
<input class="button2" type="submit" id="download" name="download" value="{L_DOWNLOAD_BACKUP}" /> </p>
</p> {S_FORM_TOKEN}
<!-- ENDIF -->
{S_FORM_TOKEN}
</fieldset> </fieldset>
</form> </form>
<!-- ELSE -->
<div class="errorbox">
<p>{L_ACP_NO_ITEMS}</p>
</div>
<!-- ENDIF -->
<!-- ELSE --> <!-- ELSE -->
<h1>{L_ACP_BACKUP}</h1> <h1>{L_ACP_BACKUP}</h1>
@ -77,7 +81,7 @@
<option value="{tables.TABLE}">{tables.TABLE}</option> <option value="{tables.TABLE}">{tables.TABLE}</option>
<!-- END tables --> <!-- END tables -->
</select></dd> </select></dd>
<dd><a href="#" onclick="selector(true)">{L_SELECT_ALL}</a> :: <a href="#" onclick="selector(false)">{L_DESELECT_ALL}</a></dd> <dd><a href="#" onclick="selector(true); return false;">{L_SELECT_ALL}</a> :: <a href="#" onclick="selector(false); return false;">{L_DESELECT_ALL}</a></dd>
</dl> </dl>
<p class="submit-buttons"> <p class="submit-buttons">

View file

@ -202,6 +202,11 @@
<dt><label for="forum_status">{L_FORUM_STATUS}:</label></dt> <dt><label for="forum_status">{L_FORUM_STATUS}:</label></dt>
<dd><select id="forum_status" name="forum_status">{S_STATUS_OPTIONS}</select></dd> <dd><select id="forum_status" name="forum_status">{S_STATUS_OPTIONS}</select></dd>
</dl> </dl>
<dl>
<dt><label for="display_subforum_list">{L_LIST_SUBFORUMS}:</label><br /><span>{L_LIST_SUBFORUMS_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="display_subforum_list" value="1"<!-- IF S_DISPLAY_SUBFORUM_LIST --> id="display_subforum_list" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
<label><input type="radio" class="radio" name="display_subforum_list" value="0"<!-- IF not S_DISPLAY_SUBFORUM_LIST --> id="display_subforum_list" checked="checked"<!-- ENDIF --> /> {L_NO}</label></dd>
</dl>
<dl> <dl>
<dt><label for="display_on_index">{L_LIST_INDEX}:</label><br /><span>{L_LIST_INDEX_EXPLAIN}</span></dt> <dt><label for="display_on_index">{L_LIST_INDEX}:</label><br /><span>{L_LIST_INDEX_EXPLAIN}</span></dt>
<dd><label><input type="radio" class="radio" name="display_on_index" value="1"<!-- IF S_DISPLAY_ON_INDEX --> id="display_on_index" checked="checked"<!-- ENDIF --> /> {L_YES}</label> <dd><label><input type="radio" class="radio" name="display_on_index" value="1"<!-- IF S_DISPLAY_ON_INDEX --> id="display_on_index" checked="checked"<!-- ENDIF --> /> {L_YES}</label>
@ -445,7 +450,7 @@
<!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW --> <!-- IF forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
{ICON_MOVE_UP_DISABLED} {ICON_MOVE_UP_DISABLED}
<a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a> <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
<!-- ELSEIF not forums.S_FIRST_ROW && not forums.S_LAST_ROW--> <!-- ELSEIF not forums.S_FIRST_ROW && not forums.S_LAST_ROW -->
<a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a> <a href="{forums.U_MOVE_UP}">{ICON_MOVE_UP}</a>
<a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a> <a href="{forums.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a>
<!-- ELSEIF forums.S_LAST_ROW && not forums.S_FIRST_ROW --> <!-- ELSEIF forums.S_LAST_ROW && not forums.S_FIRST_ROW -->

View file

@ -43,19 +43,19 @@
function toggle_select(icon, display, select) function toggle_select(icon, display, select)
{ {
var disp = document.getElementById('order_disp[' + icon + ']'); var disp = document.getElementById('order_disp_' + select);
var nodisp = document.getElementById('order_no_disp[' + icon + ']'); var nodisp = document.getElementById('order_no_disp_' + select);
disp.disabled = !display; disp.disabled = !display;
nodisp.disabled = display; nodisp.disabled = display;
if (display) if (display)
{ {
document.getElementById(select).selectedIndex = 0; document.getElementById('order_' + select).selectedIndex = 0;
nodisp.className = 'disabled-options'; nodisp.className = 'disabled-options';
disp.className = ''; disp.className = '';
} }
else else
{ {
document.getElementById(select).selectedIndex = {S_ORDER_LIST_DISPLAY_COUNT}; document.getElementById('order_' + select).selectedIndex = {S_ORDER_LIST_DISPLAY_COUNT};
disp.className = 'disabled-options'; disp.className = 'disabled-options';
nodisp.className = ''; nodisp.className = '';
} }
@ -111,15 +111,15 @@
<td><input class="text post" type="text" size="3" name="width[{items.IMG}]" value="{items.WIDTH}" /></td> <td><input class="text post" type="text" size="3" name="width[{items.IMG}]" value="{items.WIDTH}" /></td>
<td><input class="text post" type="text" size="3" name="height[{items.IMG}]" value="{items.HEIGHT}" /></td> <td><input class="text post" type="text" size="3" name="height[{items.IMG}]" value="{items.HEIGHT}" /></td>
<td> <td>
<input type="checkbox" class="radio" name="display_on_posting[{items.IMG}]"{items.POSTING_CHECKED} onclick="toggle_select('{items.A_IMG}', this.checked, 'order[{items.A_IMG}]');"/> <input type="checkbox" class="radio" name="display_on_posting[{items.IMG}]"{items.POSTING_CHECKED} onclick="toggle_select('{items.A_IMG}', this.checked, '{items.S_ROW_COUNT}');"/>
<!-- IF items.S_ID --> <!-- IF items.S_ID -->
<input type="hidden" name="id[{items.IMG}]" value="{items.ID}" /> <input type="hidden" name="id[{items.IMG}]" value="{items.ID}" />
<!-- ENDIF --> <!-- ENDIF -->
</td> </td>
<!-- IF ID or S_ADD --> <!-- IF ID or S_ADD -->
<td><select id="order[{items.IMG}]" name="order[{items.IMG}]"> <td><select id="order_{items.S_ROW_COUNT}" name="order[{items.IMG}]">
<optgroup id="order_disp[{items.IMG}]" label="{L_DISPLAY_POSTING}" <!-- IF not items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_DISPLAY}</optgroup> <optgroup id="order_disp_{items.S_ROW_COUNT}" label="{L_DISPLAY_POSTING}" <!-- IF not items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_DISPLAY}</optgroup>
<optgroup id="order_no_disp[{items.IMG}]" label="{L_DISPLAY_POSTING_NO}" <!-- IF items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_UNDISPLAY}</optgroup> <optgroup id="order_no_disp_{items.S_ROW_COUNT}" label="{L_DISPLAY_POSTING_NO}" <!-- IF items.POSTING_CHECKED -->disabled="disabled" class="disabled-options" <!-- ENDIF -->>{S_ORDER_LIST_UNDISPLAY}</optgroup>
</select></td> </select></td>
<!-- ENDIF --> <!-- ENDIF -->
<!-- IF S_ADD --> <!-- IF S_ADD -->
@ -248,6 +248,10 @@
&nbsp;<a href="{items.U_EDIT}">{ICON_EDIT}</a> <a href="{items.U_DELETE}">{ICON_DELETE}</a> &nbsp;<a href="{items.U_EDIT}">{ICON_EDIT}</a> <a href="{items.U_DELETE}">{ICON_DELETE}</a>
</td> </td>
</tr> </tr>
<!-- BEGINELSE -->
<tr class="row3">
<td colspan="{COLSPAN}">{L_ACP_NO_ITEMS}</td>
</tr>
<!-- END items --> <!-- END items -->
</tbody> </tbody>
</table> </table>

View file

@ -121,9 +121,11 @@
<!--[if lt IE 8]> <!--[if lt IE 8]>
<style type="text/css"> <style type="text/css">
/* <![CDATA[ */
input.langvalue, textarea.langvalue { input.langvalue, textarea.langvalue {
width: 450px; width: 450px;
} }
/* ]]> */
</style> </style>
<![endif]--> <![endif]-->

View file

@ -28,11 +28,11 @@
<p>{L_EXPLAIN}</p> <p>{L_EXPLAIN}</p>
<form id="acp_roles" method="post" action="{U_ACTION}">
<br /> <br />
<a href="#acl">&raquo; {L_SET_ROLE_PERMISSIONS}</a> <a href="#acl">&raquo; {L_SET_ROLE_PERMISSIONS}</a>
<form id="acp_roles" method="post" action="{U_ACTION}">
<fieldset> <fieldset>
<legend>{L_ROLE_DETAILS}</legend> <legend>{L_ROLE_DETAILS}</legend>
<dl> <dl>
@ -46,6 +46,7 @@
<p class="quick"> <p class="quick">
<input type="submit" class="button1" name="submit" value="{L_SUBMIT}" /> <input type="submit" class="button1" name="submit" value="{L_SUBMIT}" />
{S_FORM_TOKEN}
</p> </p>
</fieldset> </fieldset>
@ -57,11 +58,15 @@
<!-- ENDIF --> <!-- ENDIF -->
<p>
<a name="acl"></a> <a name="acl"></a>
<a href="#maincontent">&raquo; {L_BACK_TO_TOP}</a><br /> <a href="#maincontent">&raquo; {L_BACK_TO_TOP}</a><br />
<br /><br /> <br /><br />
</p>
<h1>{L_ACL_TYPE}</h1> <h1>{L_ACL_TYPE}</h1>
<fieldset class="perm nolegend"> <fieldset class="perm nolegend">
@ -107,9 +112,9 @@
<!-- IF auth.mask.S_ROW_COUNT is even --><tr class="row4"><!-- ELSE --><tr class="row3"><!-- ENDIF --> <!-- IF auth.mask.S_ROW_COUNT is even --><tr class="row4"><!-- ELSE --><tr class="row3"><!-- ENDIF -->
<th class="permissions-name<!-- IF auth.mask.S_ROW_COUNT is even --> row4<!-- ELSE --> row3<!-- ENDIF -->">{auth.mask.PERMISSION}</th> <th class="permissions-name<!-- IF auth.mask.S_ROW_COUNT is even --> row4<!-- ELSE --> row3<!-- ENDIF -->">{auth.mask.PERMISSION}</th>
<td class="permissions-yes"><label for="{auth.mask.FIELD_NAME}_y"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting[{auth.mask.FIELD_NAME}]_y" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_YES --> checked="checked"<!-- ENDIF --> value="1" /></label></td> <td class="permissions-yes"><label for="setting_{auth.mask.FIELD_NAME}_y"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting_{auth.mask.FIELD_NAME}_y" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_YES --> checked="checked"<!-- ENDIF --> value="1" /></label></td>
<td class="permissions-no"><label for="{auth.mask.FIELD_NAME}_u"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting[{auth.mask.FIELD_NAME}]_u" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_NO --> checked="checked"<!-- ENDIF --> value="-1" /></label></td> <td class="permissions-no"><label for="setting_{auth.mask.FIELD_NAME}_u"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting_{auth.mask.FIELD_NAME}_u" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_NO --> checked="checked"<!-- ENDIF --> value="-1" /></label></td>
<td class="permissions-never"><label for="{auth.mask.FIELD_NAME}_n"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting[{auth.mask.FIELD_NAME}]_n" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_NEVER --> checked="checked"<!-- ENDIF --> value="0" /></label></td> <td class="permissions-never"><label for="setting_{auth.mask.FIELD_NAME}_n"><input onchange="set_colours('00{auth.S_ROW_COUNT}', false)" id="setting_{auth.mask.FIELD_NAME}_n" name="setting[{auth.mask.FIELD_NAME}]" class="radio" type="radio"<!-- IF auth.mask.S_NEVER --> checked="checked"<!-- ENDIF --> value="0" /></label></td>
</tr> </tr>
<!-- END mask --> <!-- END mask -->
</tbody> </tbody>

View file

@ -44,7 +44,7 @@
<p>{L_LOOK_UP_FORUMS_EXPLAIN}</p> <p>{L_LOOK_UP_FORUMS_EXPLAIN}</p>
<dl> <dl>
<dt><label for="forum">{L_LOOK_UP_FORUM}:</label></dt> <dt><label for="forum">{L_LOOK_UP_FORUM}:</label></dt>
<dd><select name="f[]" multiple="multiple" size="10">{S_FORUM_OPTIONS}</select></dd> <dd><select id="forum" name="f[]" multiple="multiple" size="10">{S_FORUM_OPTIONS}</select></dd>
<dd><label><input type="checkbox" class="radio" name="all_forums" value="1" /> {L_ALL_FORUMS}</label></dd> <dd><label><input type="checkbox" class="radio" name="all_forums" value="1" /> {L_ALL_FORUMS}</label></dd>
</dl> </dl>

View file

@ -459,7 +459,7 @@
</dl> </dl>
<dl> <dl>
<dt><label for="copyright">{L_COPYRIGHT}:</label></dt> <dt><label for="copyright">{L_COPYRIGHT}:</label></dt>
<dd><!-- IF S_INSTALL --><b id="name">{COPYRIGHT}</b><!-- ELSE --><input type="text" id="copyright" name="copyright" value="{COPYRIGHT}" /><!-- ENDIF --></dd> <dd><!-- IF S_INSTALL --><b id="copyright">{COPYRIGHT}</b><!-- ELSE --><input type="text" id="copyright" name="copyright" value="{COPYRIGHT}" /><!-- ENDIF --></dd>
</dl> </dl>
<!-- IF S_STYLE and not S_BASIS --> <!-- IF S_STYLE and not S_BASIS -->
<dl> <dl>

View file

@ -62,6 +62,10 @@
<td style="text-align: center;">{words.REPLACEMENT}</td> <td style="text-align: center;">{words.REPLACEMENT}</td>
<td>&nbsp;<a href="{words.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{words.U_DELETE}">{ICON_DELETE}</a>&nbsp;</td> <td>&nbsp;<a href="{words.U_EDIT}">{ICON_EDIT}</a>&nbsp;&nbsp;<a href="{words.U_DELETE}">{ICON_DELETE}</a>&nbsp;</td>
</tr> </tr>
<!-- BEGINELSE -->
<tr class="row3">
<td colspan="3">{L_ACP_NO_ITEMS}</td>
</tr>
<!-- END words --> <!-- END words -->
</tbody> </tbody>
</table> </table>

View file

@ -8,7 +8,7 @@
<title>{L_COLOUR_SWATCH}</title> <title>{L_COLOUR_SWATCH}</title>
<style type="text/css"> <style type="text/css">
<!-- /* <![CDATA[ */
body { body {
background-color: #404040; background-color: #404040;
color: #fff; color: #fff;
@ -29,7 +29,7 @@
img { img {
border: 0; border: 0;
} }
//--> /* ]]> */
</style> </style>
</head> </head>

View file

@ -32,7 +32,7 @@ function resize_panel()
</script> </script>
<style type="text/css"> <style type="text/css">
<!-- /* <![CDATA[ */
#main { #main {
font-size: 1em; font-size: 1em;
@ -198,7 +198,7 @@ table.hrdiff caption span {
<!-- ENDIF --> <!-- ENDIF -->
//--> /* ]]> */
</style> </style>
</head> </head>

View file

@ -131,7 +131,7 @@ if (!defined('PHPBB_INSTALLED'))
// Redirect the user to the installer // Redirect the user to the installer
// We have to generate a full HTTP/1.1 header here since we can't guarantee to have any of the information // We have to generate a full HTTP/1.1 header here since we can't guarantee to have any of the information
// available as used by the redirect function // available as used by the redirect function
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); $server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
$server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'); $server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
$secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0; $secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
@ -150,7 +150,11 @@ if (!defined('PHPBB_INSTALLED'))
if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80))) if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
{ {
$url .= ':' . $server_port; // HTTP HOST can carry a port number...
if (strpos($server_name, ':') === false)
{
$url .= ':' . $server_port;
}
} }
$url .= $script_path; $url .= $script_path;

View file

@ -1072,6 +1072,7 @@ function get_schema_struct()
'forum_last_poster_name'=> array('VCHAR_UNI', ''), 'forum_last_poster_name'=> array('VCHAR_UNI', ''),
'forum_last_poster_colour'=> array('VCHAR:6', ''), 'forum_last_poster_colour'=> array('VCHAR:6', ''),
'forum_flags' => array('TINT:4', 32), 'forum_flags' => array('TINT:4', 32),
'display_subforum_list' => array('BOOL', 1),
'display_on_index' => array('BOOL', 1), 'display_on_index' => array('BOOL', 1),
'enable_indexing' => array('BOOL', 1), 'enable_indexing' => array('BOOL', 1),
'enable_icons' => array('BOOL', 1), 'enable_icons' => array('BOOL', 1),
@ -1143,7 +1144,7 @@ function get_schema_struct()
), ),
'PRIMARY_KEY' => 'group_id', 'PRIMARY_KEY' => 'group_id',
'KEYS' => array( 'KEYS' => array(
'group_legend' => array('INDEX', 'group_legend'), 'group_legend_name' => array('INDEX', array('group_legend', 'group_name')),
), ),
); );
@ -1519,6 +1520,7 @@ function get_schema_struct()
'COLUMNS' => array( 'COLUMNS' => array(
'session_id' => array('CHAR:32', ''), 'session_id' => array('CHAR:32', ''),
'session_user_id' => array('UINT', 0), 'session_user_id' => array('UINT', 0),
'session_forum_id' => array('UINT', 0),
'session_last_visit' => array('TIMESTAMP', 0), 'session_last_visit' => array('TIMESTAMP', 0),
'session_start' => array('TIMESTAMP', 0), 'session_start' => array('TIMESTAMP', 0),
'session_time' => array('TIMESTAMP', 0), 'session_time' => array('TIMESTAMP', 0),
@ -1534,6 +1536,7 @@ function get_schema_struct()
'KEYS' => array( 'KEYS' => array(
'session_time' => array('INDEX', 'session_time'), 'session_time' => array('INDEX', 'session_time'),
'session_user_id' => array('INDEX', 'session_user_id'), 'session_user_id' => array('INDEX', 'session_user_id'),
'session_forum_id' => array('INDEX', 'session_forum_id'),
), ),
); );

View file

@ -53,6 +53,7 @@
<ol> <ol>
<li><a href="#changelog">Changelog</a> <li><a href="#changelog">Changelog</a>
<ol style="list-style-type: lower-roman;"> <ol style="list-style-type: lower-roman;">
<li><a href="#v300">Changes since 3.0.0</a></li>
<li><a href="#v30rc8">Changes since RC-8</a></li> <li><a href="#v30rc8">Changes since RC-8</a></li>
<li><a href="#v30rc7">Changes since RC-7</a></li> <li><a href="#v30rc7">Changes since RC-7</a></li>
<li><a href="#v30rc6">Changes since RC-6</a></li> <li><a href="#v30rc6">Changes since RC-6</a></li>
@ -70,7 +71,7 @@
<span class="corners-bottom"><span></span></span></div> <span class="corners-bottom"><span></span></span></div>
</div> </div>
<hr /> <hr />
<a name="changelog"></a><h2>1. Changelog</h2> <a name="changelog"></a><h2>1. Changelog</h2>
@ -80,6 +81,75 @@
<div class="content"> <div class="content">
<a name="v300"></a><h3>1.i. Changes since 3.0.0</h3>
<ul>
<li>[Change] Validate birthdays (Bug #15004)</li>
<li>[Fix] Allow correct avatar caching for CGI installations. (thanks wildbill)</li>
<li>[Fix] Fix disabling of word censor, now possible again</li>
<li>[Fix] Allow single quotes in db password to be stored within config.php in installer</li>
<li>[Fix] Correctly quote db password for re-display in installer (Bug #16695 / thanks to m313 for reporting too - #s17235)</li>
<li>[Fix] Correctly handle empty imageset entries (Bug #16865)</li>
<li>[Fix] Correctly check empty subjects/messages (Bug #17915)</li>
<li>[Change] Do not check usernames against word censor list. Disallowed usernames is already checked and word censor belong to posts. (Bug #17745)</li>
<li>[Fix] Additionally include non-postable forums for moderators forums shown within the teams list. (Bug #17265)</li>
<li>[Change] Sped up viewforum considerably (also goes towards mcp_forum)</li>
<li>[Fix] Do not split topic list for topics being promoted to announcements after been moved to another forum (Bug #18635)</li>
<li>[Fix] Allow editing usernames within database_update on username cleanup (Bug #18415)</li>
<li>[Fix] Fixing wrong sync() calls if moving all posts by a member in ACP (Bug #18385)</li>
<li>[Fix] Check entered imagemagick path for trailing slash (Bug #18205)</li>
<li>[Fix] Use proper title on index for new/unread posts (Bug #13101) - patch provided by Pyramide</li>
<li>[Fix] Allow calls to $user->set_cookie() define no cookie time for setting session cookies (Bug #18025)</li>
<li>[Fix] Stricter checks on smilie packs (Bug #19675)</li>
<li>[Fix] Gracefully return from cancelling pm drafts (Bug #19675)</li>
<li>[Fix] Possible login problems with IE7 if browser check is activated (Bug #20135)</li>
<li>[Fix] Fix possible database transaction errors if code returns on error and rollback happened (Bug #17025)</li>
<li>[Change] Allow numbers in permission names for modifications, as well as uppercase letters for the request_ part (Bug #20125)</li>
<li>[Fix] Use HTTP_HOST in favor of SERVER_NAME for determining server url for redirection and installation (Bug #19955)</li>
<li>[Fix] Removing s_watching_img from watch_topic_forum() function (Bug #20445)</li>
<li>[Fix] Changing order for post review if more than one post affected (Bug #15249)</li>
<li>[Fix] Language typos/fixes (Bug #20425, #15719, #15429, #14669, #13479, #20795, #21095, #21405, #21715, #21725, #21755, #21865, #15689)</li>
<li>[Fix] Style/Template fixes (Bug #20065, #19405, #19205, #15028, #14934, #14821, #14752, #14497, #13707, #14738, #19725)</li>
<li>[Fix] Tiny code fixes (Bug #20165, #20025, #19795, #14804)</li>
<li>[Fix] Prepend phpbb_root_path to ranks path for displaying ranks (Bug #19075)</li>
<li>[Fix] Allow forum notifications if topic notifications are disabled but forum notifications enabled (Bug #14765)</li>
<li>[Fix] Fixing realpath issues for provider returning the passed value instead of disabling it. This fixes issues with confirm boxes for those hosted on Network Solutions for example. (Bug #20435)</li>
<li>[Fix] Try to sort last active date on memberlist correctly at least on current page (Bug #18665)</li>
<li>[Fix] Handle generation of form tokens when maximum time is set to -1</li>
<li>[Fix] Correctly delete unapproved posts without deleting the topic (Bug #15120)</li>
<li>[Fix] Respect signature permissions in posting (Bug #16029)</li>
<li>[Fix] Users allowed to resign only from open and freely open groups (Bug #19355)</li>
<li>[Fix] Assign a last viewed date to converted topics (Bug #16565)</li>
<li>[Fix] Many minor and/or cosmetic fixes (Including, but not limited to: #21315, #18575, #18435, #21215)</li>
<li>[Feature] New option to hide the entire list of subforums on listforums</li>
<li>[Fix] Custom BBCode {EMAIL}-Token usage (Bug #21155)</li>
<li>[Fix] Do not rely on parameter returned by unlink() for verifying cache directory write permission (Bug #19565)</li>
<li>[Change] Use correct string for filesize (MiB instead of MB for example)</li>
<li>[Change] Remove left join for query used to retrieve already assigned users and groups within permission panel (Bug #20235)</li>
<li>[Fix] Correctly return sole whitespaces if used with BBCodes (Bug #19535)</li>
<li>[Fix] Quote bbcode parsing adding too much closing tags on special conditions (Bug #20735)</li>
<li>[Change] Added sanity checks to various ACP settings</li>
<li>[Change] Removed minimum form times</li>
<li>[Fix] Check topics_per_page value in acp_forums (Bug #15539)</li>
<li>[Fix] Custom profile fields with date type should be timezone independend (Bug #15003)</li>
<li>[Fix] Fixing some XHTML errors/warnings within the ACP (Bug #22875)</li>
<li>[Fix] Warnings if poll title/options exceed maximum characters per post (Bug #22865)</li>
<li>[Fix] Do not allow selecting non-authorized groups within memberlist by adjusting URL (Bug #22805 - patch provided by ToonArmy)</li>
<li>[Fix] Correctly specify &quot;close report action&quot; (Bug #22685)</li>
<li>[Fix] Display &quot;empty password error&quot; within the login box instead of issuing a general error (Bug #22525)</li>
<li>[Fix] Clean up who is online code in page_header (Bug #22715, thanks HighwayofLife)</li>
<li>[Fix] Pertain select single link on memberlist (Bug #23235 - patch provided by Schumi)</li>
<li>[Fix] Allow &amp; and | in local part of email addresses (Bug #22995)</li>
<li>[Fix] Do not error out if php_uname function disabled / Authenticating on SMTP Server (Bug #22235 - patch by HoL)</li>
<li>[Fix] Correctly obtain to be ignored users within topic/forum notification (Bug #21795 - patch provided by dr.death)</li>
<li>[Fix] Correctly update board statistics for attaching orphaned files to existing posts (Bug #20185)</li>
<li>[Fix] Do not detect the board URL as a link twice in posts (Bug #19215)</li>
<li>[Fix] Set correct error reporting in style.php to avoid blank pages after CSS changes (Bug #23885)</li>
<li>[Fix] If pruning users based on last activity, do not include users never logged in before (Bug #18105)</li>
<li>[Sec] Only allow searching by email address in memberlist for users having the a_user permission (reported by evil&lt;3)</li>
<li>[Sec] Limit private message attachments to be viewable only by the recipient(s)/sender (Report #s23535) - reported by AlleyKat</li>
</ul>
<a name="v30rc8"></a><h3>1.i. Changes since 3.0.RC8</h3> <a name="v30rc8"></a><h3>1.i. Changes since 3.0.RC8</h3>
<ul> <ul>

View file

@ -281,9 +281,9 @@
<a name="update_patch"></a><h3>4.iii. Patch file</h3> <a name="update_patch"></a><h3>4.iii. Patch file</h3>
<p>The patch file package is for those wanting to update through the patch application, and being compfortable with it.</p> <p>The patch file package is for those wanting to update through the patch application, and being comfortable with it.</p>
<p>The patch file is one solution for those with many Modifications (MODs) or other changes who do not want to re-add them back to all the changed files if they use the method explained above. To use this you will need command line access to a standard UNIX type <strong>patch</strong> application. If you do not have access to such an application but still want to use this update approach, we strongly recommend the <a href="update_auto">Automatic update package</a> explained below. It is also the preferred update method.</p> <p>The patch file is one solution for those with many Modifications (MODs) or other changes who do not want to re-add them back to all the changed files if they use the method explained above. To use this you will need command line access to a standard UNIX type <strong>patch</strong> application. If you do not have access to such an application but still want to use this update approach, we strongly recommend the <a href="#update_auto">Automatic update package</a> explained below. It is also the preferred update method.</p>
<p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.0 you need the phpBB-3.0.0_to_3.0.1.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <strong>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</strong> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p> <p>A number of patch files are provided to allow you to update from previous stable releases. Select the correct patch, e.g. if your current version is 3.0.0 you need the phpBB-3.0.0_to_3.0.1.patch file. Place the correct patch in the parent directory containing the phpBB3 core files (i.e. index.php, viewforum.php, etc.). With this done you should run the following command: <strong>patch -cl -d [PHPBB DIRECTORY] -p1 &lt; [PATCH NAME]</strong> (where PHPBB DIRECTORY is the directory name your phpBB Installation resides in, for example phpBB3, and where PATCH NAME is the relevant filename of the selected patch file). This should complete quickly, hopefully without any HUNK FAILED comments.</p>
@ -369,7 +369,7 @@
<p><strong>Password conversion</strong> Due to the utf-8 based handling of passwords in phpBB3, it is not always possible to transfer all passwords. For passwords "lost in translation" the easiest workaround is to use the "forgotten password" function.</p> <p><strong>Password conversion</strong> Due to the utf-8 based handling of passwords in phpBB3, it is not always possible to transfer all passwords. For passwords "lost in translation" the easiest workaround is to use the "forgotten password" function.</p>
<p><strong>Path to your former board</strong> The converter expects the relative path to your old board's files. So, -for instance - if the new board is located at <code>http://www.yourdomain.com/forum</code> and the phpBB3 is located at <code>http://www.yourdomain.com/phpBB3</code>, then the correct value would be <code>../forum</code>. Note that the webserver user must be able to access the source installation's files.</p> <p><strong>Path to your former board</strong> The converter expects the relative path to your old board's files. So, - for instance - if the old board is located at <code>http://www.yourdomain.com/forum</code> and the phpBB3 installation is located at <code>http://www.yourdomain.com/phpBB3</code>, then the correct value would be <code>../forum</code>. Note that the webserver user must be able to access the source installation's files.</p>
<p><strong>Missing images</strong> If your default board language's language pack does not include all images, then some images might be missing in your installation. Always use a complete language pack as default language.</p> <p><strong>Missing images</strong> If your default board language's language pack does not include all images, then some images might be missing in your installation. Always use a complete language pack as default language.</p>

View file

@ -110,7 +110,7 @@
<p>If entered with tabs (replace the {TAB}) both equal signs need to be on the same column.</p> <p>If entered with tabs (replace the {TAB}) both equal signs need to be on the same column.</p>
<h3>Linefeeds:</h3> <h3>Linefeeds:</h3>
<p>Ensure that your editor is saving files in the UNIX format. This means lines are terminated with a newline, not with a CR/LF combo as they are on Win32, or whatever the Mac uses. Any decent editor should be able to do this, but it might not always be the default. Know your editor. If you want advice on Windows text editors, just ask one of the developers. Some of them do their editing on Win32.</p> <p>Ensure that your editor is saving files in the UNIX (LF) line ending format. This means that lines are terminated with a newline, not with Windows Line endings (CR/LF combo) as they are on Win32 or Classic Mac (CR) Line endings. Any decent editor should be able to do this, but it might not always be the default setting. Know your editor. If you want advice for an editor for your Operating System, just ask one of the developers. Some of them do their editing on Win32.
<a name="fileheader"></a><h3>1.ii. File Header</h3> <a name="fileheader"></a><h3>1.ii. File Header</h3>
@ -1059,7 +1059,7 @@ append_sid(&quot;{$phpbb_root_path}memberlist.$phpEx&quot;, 'mode=group&amp;amp;
<span class="comment">&lt;!-- END loopname --&gt;</span> <span class="comment">&lt;!-- END loopname --&gt;</span>
</pre></div> </pre></div>
<p>A bit later loops will be explained further. To not irretate you we will explain conditionals as well as other statements first.</p> <p>A bit later loops will be explained further. To not irritate you we will explain conditionals as well as other statements first.</p>
<h4>Including files</h4> <h4>Including files</h4>
<p>Something that existed in 2.0.x which no longer exists in 3.0.x is the ability to assign a template to a variable. This was used (for example) to output the jumpbox. Instead (perhaps better, perhaps not but certainly more flexible) we now have INCLUDE. This takes the simple form:</p> <p>Something that existed in 2.0.x which no longer exists in 3.0.x is the ability to assign a template to a variable. This was used (for example) to output the jumpbox. Instead (perhaps better, perhaps not but certainly more flexible) we now have INCLUDE. This takes the simple form:</p>

View file

@ -14,7 +14,7 @@
<title>phpBB3 &bull; Hook System</title> <title>phpBB3 &bull; Hook System</title>
<style type="text/css"> <style type="text/css">
<!-- /* <![CDATA[ */
/* /*
The original "prosilver" theme for phpBB3 The original "prosilver" theme for phpBB3
@ -309,7 +309,7 @@ a:active { color: #368AD2; }
margin-left: 25px; margin-left: 25px;
} }
//--> /* ]]> */
</style> </style>
</head> </head>

View file

@ -32,7 +32,7 @@ if (isset($_GET['avatar']))
exit; exit;
} }
unset($dbpasswd); unset($dbpasswd);
// worst-case default // worst-case default
$browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : 'msie 6.0'; $browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : 'msie 6.0';
@ -44,11 +44,11 @@ if (isset($_GET['avatar']))
$avatar_group = true; $avatar_group = true;
$filename = substr($filename, 1); $filename = substr($filename, 1);
} }
// '==' is not a bug - . as the first char is as bad as no dot at all // '==' is not a bug - . as the first char is as bad as no dot at all
if (strpos($filename, '.') == false) if (strpos($filename, '.') == false)
{ {
header('HTTP/1.0 403 forbidden'); header('HTTP/1.0 403 Forbidden');
if (!empty($cache)) if (!empty($cache))
{ {
$cache->unload(); $cache->unload();
@ -56,33 +56,40 @@ if (isset($_GET['avatar']))
$db->sql_close(); $db->sql_close();
exit; exit;
} }
$ext = substr(strrchr($filename, '.'), 1); $ext = substr(strrchr($filename, '.'), 1);
$stamp = (int) substr(stristr($filename, '_'), 1); $stamp = (int) substr(stristr($filename, '_'), 1);
$filename = (int) $filename; $filename = (int) $filename;
// let's see if we have to send the file at all // let's see if we have to send the file at all
$last_load = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime(trim($_SERVER['HTTP_IF_MODIFIED_SINCE'])) : false; $last_load = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime(trim($_SERVER['HTTP_IF_MODIFIED_SINCE'])) : false;
if (strpos(strtolower($browser), 'msie 6.0') === false) if (strpos(strtolower($browser), 'msie 6.0') === false)
{ {
if ($last_load !== false && $last_load <= $stamp) if ($last_load !== false && $last_load <= $stamp)
{ {
header('Not Modified', true, 304); if (@php_sapi_name() === 'CGI')
{
header('Status: 304 Not Modified', true, 304);
}
else
{
header('HTTP/1.0 304 Not Modified', true, 304);
}
// seems that we need those too ... browsers // seems that we need those too ... browsers
header('Pragma: public'); header('Pragma: public');
header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000)); header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000));
exit(); exit();
} }
else else
{ {
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $stamp) . ' GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $stamp) . ' GMT');
} }
} }
if (!in_array($ext, array('png', 'gif', 'jpg', 'jpeg'))) if (!in_array($ext, array('png', 'gif', 'jpg', 'jpeg')))
{ {
// no way such an avatar could exist. They are not following the rules, stop the show. // no way such an avatar could exist. They are not following the rules, stop the show.
header("HTTP/1.0 403 forbidden"); header("HTTP/1.0 403 Forbidden");
if (!empty($cache)) if (!empty($cache))
{ {
$cache->unload(); $cache->unload();
@ -90,11 +97,11 @@ if (isset($_GET['avatar']))
$db->sql_close(); $db->sql_close();
exit; exit;
} }
if (!$filename) if (!$filename)
{ {
// no way such an avatar could exist. They are not following the rules, stop the show. // no way such an avatar could exist. They are not following the rules, stop the show.
header("HTTP/1.0 403 forbidden"); header("HTTP/1.0 403 Forbidden");
if (!empty($cache)) if (!empty($cache))
{ {
$cache->unload(); $cache->unload();
@ -201,8 +208,32 @@ else
$row['forum_id'] = false; $row['forum_id'] = false;
if (!$auth->acl_get('u_pm_download')) if (!$auth->acl_get('u_pm_download'))
{ {
header('HTTP/1.0 403 Forbidden');
trigger_error('SORRY_AUTH_VIEW_ATTACH'); trigger_error('SORRY_AUTH_VIEW_ATTACH');
} }
// Check if the attachment is within the users scope...
$sql = 'SELECT user_id, author_id
FROM ' . PRIVMSGS_TO_TABLE . '
WHERE msg_id = ' . $attachment['post_msg_id'];
$result = $db->sql_query($sql);
$allowed = false;
while ($user_row = $db->sql_fetchrow($result))
{
if ($user->data['user_id'] == $user_row['user_id'] || $user->data['user_id'] == $user_row['author_id'])
{
$allowed = true;
break;
}
}
$db->sql_freeresult($result);
if (!$allowed)
{
header('HTTP/1.0 403 Forbidden');
trigger_error('ERROR_NO_ATTACHMENT');
}
} }
// disallowed? // disallowed?
@ -215,6 +246,7 @@ else
if (!download_allowed()) if (!download_allowed())
{ {
header('HTTP/1.0 403 Forbidden');
trigger_error($user->lang['LINKAGE_FORBIDDEN']); trigger_error($user->lang['LINKAGE_FORBIDDEN']);
} }
@ -273,7 +305,7 @@ else
{ {
trigger_error($user->lang['PHYSICAL_DOWNLOAD_NOT_POSSIBLE']); trigger_error($user->lang['PHYSICAL_DOWNLOAD_NOT_POSSIBLE']);
} }
redirect($phpbb_root_path . $config['upload_path'] . '/' . $attachment['physical_filename']); redirect($phpbb_root_path . $config['upload_path'] . '/' . $attachment['physical_filename']);
exit; exit;
} }
@ -460,7 +492,7 @@ function send_file_to_browser($attachment, $upload_dir, $category)
{ {
header('Content-Disposition: ' . ((strpos($attachment['mimetype'], 'image') === 0) ? 'inline' : 'attachment') . '; ' . header_filename(htmlspecialchars_decode($attachment['real_filename']))); header('Content-Disposition: ' . ((strpos($attachment['mimetype'], 'image') === 0) ? 'inline' : 'attachment') . '; ' . header_filename(htmlspecialchars_decode($attachment['real_filename'])));
} }
if ($size) if ($size)
{ {
header("Content-Length: $size"); header("Content-Length: $size");
@ -549,9 +581,9 @@ function download_allowed()
} }
} }
} }
// Check for own server... // Check for own server...
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); $server_name = $user->host;
// Forcing server vars is the only way to specify/override the protocol // Forcing server vars is the only way to specify/override the protocol
if ($config['force_server_vars'] || !$server_name) if ($config['force_server_vars'] || !$server_name)
@ -563,7 +595,7 @@ function download_allowed()
{ {
$allowed = true; $allowed = true;
} }
// Get IP's and Hostnames // Get IP's and Hostnames
if (!$allowed) if (!$allowed)
{ {
@ -613,7 +645,7 @@ function download_allowed()
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
return $allowed; return $allowed;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 B

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 420 B

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 B

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 427 B

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 B

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 B

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 B

After

Width:  |  Height:  |  Size: 707 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 B

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 B

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 636 B

View file

@ -312,7 +312,7 @@ class acm
if ($var_name[0] == '_') if ($var_name[0] == '_')
{ {
$this->remove_file($this->cache_dir . 'data' . $var_name . ".$phpEx"); $this->remove_file($this->cache_dir . 'data' . $var_name . ".$phpEx", true);
} }
else if (isset($this->vars[$var_name])) else if (isset($this->vars[$var_name]))
{ {
@ -375,7 +375,7 @@ class acm
} }
else if ($expired) else if ($expired)
{ {
$this->remove_file($this->cache_dir . 'sql_' . md5($query) . ".$phpEx"); $this->remove_file($this->cache_dir . 'sql_' . md5($query) . ".$phpEx", true);
return false; return false;
} }
@ -489,13 +489,15 @@ class acm
/** /**
* Removes/unlinks file * Removes/unlinks file
*/ */
function remove_file($filename) function remove_file($filename, $check = false)
{ {
if (!@unlink($filename)) if ($check && !@is_writeable($this->cache_dir))
{ {
// E_USER_ERROR - not using language entry - intended. // E_USER_ERROR - not using language entry - intended.
trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR); trigger_error('Unable to remove files within ' . $this->cache_dir . '. Please check directory permissions.', E_USER_ERROR);
} }
return @unlink($filename);
} }
} }

View file

@ -23,7 +23,7 @@ class acp_attachments
{ {
var $u_action; var $u_action;
var $new_config; var $new_config;
function main($id, $mode) function main($id, $mode)
{ {
global $db, $user, $auth, $template, $cache; global $db, $user, $auth, $template, $cache;
@ -56,7 +56,7 @@ class acp_attachments
case 'ext_groups': case 'ext_groups':
$l_title = 'ACP_EXTENSION_GROUPS'; $l_title = 'ACP_EXTENSION_GROUPS';
break; break;
case 'orphan': case 'orphan':
$l_title = 'ACP_ORPHAN_ATTACHMENTS'; $l_title = 'ACP_ORPHAN_ATTACHMENTS';
break; break;
@ -152,7 +152,7 @@ class acp_attachments
if (in_array($config_name, array('attachment_quota', 'max_filesize', 'max_filesize_pm'))) if (in_array($config_name, array('attachment_quota', 'max_filesize', 'max_filesize_pm')))
{ {
$size_var = request_var($config_name, ''); $size_var = request_var($config_name, '');
$this->new_config[$config_name] = $config_value = ($size_var == 'kb') ? round($config_value * 1024) : (($size_var == 'mb') ? round($config_value * 1048576) : $config_value); $this->new_config[$config_name] = $config_value = ($size_var == 'kb') ? ($config_value << 10) : (($size_var == 'mb') ? ($config_value << 20) : $config_value);
} }
if ($submit) if ($submit)
@ -184,7 +184,18 @@ class acp_attachments
} }
// We strip eventually manual added convert program, we only want the patch // We strip eventually manual added convert program, we only want the patch
$this->new_config['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $this->new_config['img_imagick']); if ($this->new_config['img_imagick'])
{
// Change path separator
$this->new_config['img_imagick'] = str_replace('\\', '/', $this->new_config['img_imagick']);
$this->new_config['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $this->new_config['img_imagick']);
// Check for trailing slash
if (substr($this->new_config['img_imagick'], -1) !== '/')
{
$this->new_config['img_imagick'] .= '/';
}
}
$supported_types = get_supported_image_types(); $supported_types = get_supported_image_types();
@ -201,7 +212,7 @@ class acp_attachments
// Secure Download Options - Same procedure as with banning // Secure Download Options - Same procedure as with banning
$allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED'; $allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED';
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . SITELIST_TABLE; FROM ' . SITELIST_TABLE;
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -271,7 +282,7 @@ class acp_attachments
'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars), 'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars),
) )
); );
unset($display_vars['vars'][$config_key]); unset($display_vars['vars'][$config_key]);
} }
@ -323,7 +334,7 @@ class acp_attachments
FROM ' . EXTENSIONS_TABLE . ' FROM ' . EXTENSIONS_TABLE . '
WHERE ' . $db->sql_in_set('extension_id', $extension_id_list); WHERE ' . $db->sql_in_set('extension_id', $extension_id_list);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$extension_list = ''; $extension_list = '';
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
@ -353,7 +364,7 @@ class acp_attachments
FROM ' . EXTENSIONS_TABLE . " FROM ' . EXTENSIONS_TABLE . "
WHERE extension = '" . $db->sql_escape($add_extension) . "'"; WHERE extension = '" . $db->sql_escape($add_extension) . "'";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
if ($row = $db->sql_fetchrow($result)) if ($row = $db->sql_fetchrow($result))
{ {
$error[] = sprintf($user->lang['EXTENSION_EXIST'], $add_extension); $error[] = sprintf($user->lang['EXTENSION_EXIST'], $add_extension);
@ -489,7 +500,7 @@ class acp_attachments
$allowed_forums = request_var('allowed_forums', array(0)); $allowed_forums = request_var('allowed_forums', array(0));
$allow_in_pm = (isset($_POST['allow_in_pm'])) ? true : false; $allow_in_pm = (isset($_POST['allow_in_pm'])) ? true : false;
$max_filesize = request_var('max_filesize', 0); $max_filesize = request_var('max_filesize', 0);
$max_filesize = ($size_select == 'kb') ? round($max_filesize * 1024) : (($size_select == 'mb') ? round($max_filesize * 1048576) : $max_filesize); $max_filesize = ($size_select == 'kb') ? ($max_filesize << 10) : (($size_select == 'mb') ? ($max_filesize << 20) : $max_filesize);
$allow_group = (isset($_POST['allow_group'])) ? true : false; $allow_group = (isset($_POST['allow_group'])) ? true : false;
if ($max_filesize == $config['max_filesize']) if ($max_filesize == $config['max_filesize'])
@ -592,7 +603,7 @@ class acp_attachments
SET group_id = 0 SET group_id = 0
WHERE group_id = $group_id"; WHERE group_id = $group_id";
$db->sql_query($sql); $db->sql_query($sql);
add_log('admin', 'LOG_ATTACH_EXTGROUP_DEL', $group_name); add_log('admin', 'LOG_ATTACH_EXTGROUP_DEL', $group_name);
$cache->destroy('_extensions'); $cache->destroy('_extensions');
@ -662,8 +673,7 @@ class acp_attachments
} }
$size_format = ($ext_group_row['max_filesize'] >= 1048576) ? 'mb' : (($ext_group_row['max_filesize'] >= 1024) ? 'kb' : 'b'); $size_format = ($ext_group_row['max_filesize'] >= 1048576) ? 'mb' : (($ext_group_row['max_filesize'] >= 1024) ? 'kb' : 'b');
$ext_group_row['max_filesize'] = get_formatted_filesize($ext_group_row['max_filesize'], false);
$ext_group_row['max_filesize'] = ($ext_group_row['max_filesize'] >= 1048576) ? round($ext_group_row['max_filesize'] / 1048576 * 100) / 100 : (($ext_group_row['max_filesize'] >= 1024) ? round($ext_group_row['max_filesize'] / 1024 * 100) / 100 : $ext_group_row['max_filesize']);
$img_path = $config['upload_icons_path']; $img_path = $config['upload_icons_path'];
@ -889,7 +899,7 @@ class acp_attachments
$upload_list = array(); $upload_list = array();
foreach ($add_files as $attach_id) foreach ($add_files as $attach_id)
{ {
if (!in_array($attach_id, array_keys($delete_files)) && !empty($post_ids[$attach_id])) if (!isset($delete_files[$attach_id]) && !empty($post_ids[$attach_id]))
{ {
$upload_list[$attach_id] = $post_ids[$attach_id]; $upload_list[$attach_id] = $post_ids[$attach_id];
} }
@ -930,6 +940,7 @@ class acp_attachments
AND is_orphan = 1'; AND is_orphan = 1';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$files_added = $space_taken = 0;
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$post_row = $post_info[$upload_list[$row['attach_id']]]; $post_row = $post_info[$upload_list[$row['attach_id']]];
@ -969,9 +980,18 @@ class acp_attachments
WHERE topic_id = ' . $post_row['topic_id']; WHERE topic_id = ' . $post_row['topic_id'];
$db->sql_query($sql); $db->sql_query($sql);
$space_taken += $row['filesize'];
$files_added++;
add_log('admin', 'LOG_ATTACH_FILEUPLOAD', $post_row['post_id'], $row['real_filename']); add_log('admin', 'LOG_ATTACH_FILEUPLOAD', $post_row['post_id'], $row['real_filename']);
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($files_added)
{
set_config('upload_dir_size', $config['upload_dir_size'] + $space_taken, true);
set_config('num_files', $config['num_files'] + $files_added, true);
}
} }
} }
@ -989,11 +1009,8 @@ class acp_attachments
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$size_lang = ($row['filesize'] >= 1048576) ? $user->lang['MB'] : (($row['filesize'] >= 1024) ? $user->lang['KB'] : $user->lang['BYTES']);
$row['filesize'] = ($row['filesize'] >= 1048576) ? round((round($row['filesize'] / 1048576 * 100) / 100), 2) : (($row['filesize'] >= 1024) ? round((round($row['filesize'] / 1024 * 100) / 100), 2) : $row['filesize']);
$template->assign_block_vars('orphan', array( $template->assign_block_vars('orphan', array(
'FILESIZE' => $row['filesize'] . ' ' . $size_lang, 'FILESIZE' => get_formatted_filesize($row['filesize']),
'FILETIME' => $user->format_date($row['filetime']), 'FILETIME' => $user->format_date($row['filetime']),
'REAL_FILENAME' => basename($row['real_filename']), 'REAL_FILENAME' => basename($row['real_filename']),
'PHYSICAL_FILENAME' => basename($row['physical_filename']), 'PHYSICAL_FILENAME' => basename($row['physical_filename']),
@ -1039,7 +1056,7 @@ class acp_attachments
ATTACHMENT_CATEGORY_FLASH => $user->lang['CAT_FLASH_FILES'], ATTACHMENT_CATEGORY_FLASH => $user->lang['CAT_FLASH_FILES'],
ATTACHMENT_CATEGORY_QUICKTIME => $user->lang['CAT_QUICKTIME_FILES'], ATTACHMENT_CATEGORY_QUICKTIME => $user->lang['CAT_QUICKTIME_FILES'],
); );
if ($group_id) if ($group_id)
{ {
$sql = 'SELECT cat_id $sql = 'SELECT cat_id
@ -1055,7 +1072,7 @@ class acp_attachments
{ {
$cat_type = ATTACHMENT_CATEGORY_NONE; $cat_type = ATTACHMENT_CATEGORY_NONE;
} }
$group_select = '<select name="' . $select_name . '"' . (($key) ? ' id="' . $key . '"' : '') . '>'; $group_select = '<select name="' . $select_name . '"' . (($key) ? ' id="' . $key . '"' : '') . '>';
foreach ($types as $type => $mode) foreach ($types as $type => $mode)
@ -1075,7 +1092,7 @@ class acp_attachments
function group_select($select_name, $default_group = false, $key = '') function group_select($select_name, $default_group = false, $key = '')
{ {
global $db, $user; global $db, $user;
$group_select = '<select name="' . $select_name . '"' . (($key) ? ' id="' . $key . '"' : '') . '>'; $group_select = '<select name="' . $select_name . '"' . (($key) ? ' id="' . $key . '"' : '') . '>';
$sql = 'SELECT group_id, group_name $sql = 'SELECT group_id, group_name
@ -1093,7 +1110,7 @@ class acp_attachments
$row['group_id'] = 0; $row['group_id'] = 0;
$row['group_name'] = $user->lang['NOT_ASSIGNED']; $row['group_name'] = $user->lang['NOT_ASSIGNED'];
$group_name[] = $row; $group_name[] = $row;
for ($i = 0; $i < sizeof($group_name); $i++) for ($i = 0; $i < sizeof($group_name); $i++)
{ {
if ($default_group === false) if ($default_group === false)
@ -1127,14 +1144,14 @@ class acp_attachments
if (empty($magic_home)) if (empty($magic_home))
{ {
$locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/'); $locations = array('C:/WINDOWS/', 'C:/WINNT/', 'C:/WINDOWS/SYSTEM/', 'C:/WINNT/SYSTEM/', 'C:/WINDOWS/SYSTEM32/', 'C:/WINNT/SYSTEM32/', '/usr/bin/', '/usr/sbin/', '/usr/local/bin/', '/usr/local/sbin/', '/opt/', '/usr/imagemagick/', '/usr/bin/imagemagick/');
$path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH')))); $path_locations = str_replace('\\', '/', (explode(($exe) ? ';' : ':', getenv('PATH'))));
$locations = array_merge($path_locations, $locations); $locations = array_merge($path_locations, $locations);
foreach ($locations as $location) foreach ($locations as $location)
{ {
// The path might not end properly, fudge it // The path might not end properly, fudge it
if (substr($location, -1, 1) !== '/') if (substr($location, -1) !== '/')
{ {
$location .= '/'; $location .= '/';
} }
@ -1341,7 +1358,7 @@ class acp_attachments
$db->sql_query($sql); $db->sql_query($sql);
} }
} }
if (!empty($ip_list_log)) if (!empty($ip_list_log))
{ {
// Update log // Update log
@ -1399,7 +1416,7 @@ class acp_attachments
{ {
// Determine size var and adjust the value accordingly // Determine size var and adjust the value accordingly
$size_var = ($value >= 1048576) ? 'mb' : (($value >= 1024) ? 'kb' : 'b'); $size_var = ($value >= 1048576) ? 'mb' : (($value >= 1024) ? 'kb' : 'b');
$value = ($value >= 1048576) ? round($value / 1048576 * 100) / 100 : (($value >= 1024) ? round($value / 1024 * 100) / 100 : $value); $value = get_formatted_filesize($value, false);
return '<input type="text" id="' . $key . '" size="8" maxlength="15" name="config[' . $key . ']" value="' . $value . '" /> <select name="' . $key . '">' . size_select_options($size_var) . '</select>'; return '<input type="text" id="' . $key . '" size="8" maxlength="15" name="config[' . $key . ']" value="' . $value . '" /> <select name="' . $key . '">' . size_select_options($size_var) . '</select>';
} }

View file

@ -312,7 +312,7 @@ class acp_bbcodes
'!(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')!e' => "\$this->bbcode_specialchars('$1')" '!(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')!e' => "\$this->bbcode_specialchars('$1')"
), ),
'EMAIL' => array( 'EMAIL' => array(
'!([a-z0-9]+[a-z0-9\-\._]*@(?:(?:[0-9]{1,3}\.){3,5}[0-9]{1,3}|[a-z0-9]+[a-z0-9\-\._]*\.[a-z]+))!i' => "\$this->bbcode_specialchars('$1')" '!(' . get_preg_expression('email') . ')!ie' => "\$this->bbcode_specialchars('$1')"
), ),
'TEXT' => array( 'TEXT' => array(
'!(.*?)!es' => "str_replace(array(\"\\r\\n\", '\\\"', '\\'', '(', ')'), array(\"\\n\", '\"', '&#39;', '&#40;', '&#41;'), trim('\$1'))" '!(.*?)!es' => "str_replace(array(\"\\r\\n\", '\\\"', '\\'', '(', ')'), array(\"\\n\", '\"', '&#39;', '&#40;', '&#41;'), trim('\$1'))"
@ -334,7 +334,7 @@ class acp_bbcodes
$sp_tokens = array( $sp_tokens = array(
'URL' => '(?i)((?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))(?-i)', 'URL' => '(?i)((?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('url')) . ')|(?:' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('www_url')) . '))(?-i)',
'LOCAL_URL' => '(?i)(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')(?-i)', 'LOCAL_URL' => '(?i)(' . str_replace(array('!', '\#'), array('\!', '#'), get_preg_expression('relative_url')) . ')(?-i)',
'EMAIL' => '([a-zA-Z0-9]+[a-zA-Z0-9\-\._]*@(?:(?:[0-9]{1,3}\.){3,5}[0-9]{1,3}|[a-zA-Z0-9]+[a-zA-Z0-9\-\._]*\.[a-zA-Z]+))', 'EMAIL' => '(' . get_preg_expression('email') . ')',
'TEXT' => '(.*?)', 'TEXT' => '(.*?)',
'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)', 'SIMPLETEXT' => '([a-zA-Z0-9-+.,_ ]+)',
'IDENTIFIER' => '([a-zA-Z0-9-_]+)', 'IDENTIFIER' => '([a-zA-Z0-9-_]+)',

View file

@ -107,9 +107,9 @@ class acp_board
'allow_avatar_local' => array('lang' => 'ALLOW_LOCAL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'allow_avatar_local' => array('lang' => 'ALLOW_LOCAL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'allow_avatar_remote' => array('lang' => 'ALLOW_REMOTE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_avatar_remote' => array('lang' => 'ALLOW_REMOTE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'allow_avatar_upload' => array('lang' => 'ALLOW_UPLOAD', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'allow_avatar_upload' => array('lang' => 'ALLOW_UPLOAD', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'avatar_filesize' => array('lang' => 'MAX_FILESIZE', 'validate' => 'int', 'type' => 'text:4:10', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']), 'avatar_filesize' => array('lang' => 'MAX_FILESIZE', 'validate' => 'int:0', 'type' => 'text:4:10', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']),
'avatar_min' => array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'avatar_min' => array('lang' => 'MIN_AVATAR_SIZE', 'validate' => 'int:0', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'avatar_max' => array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'avatar_max' => array('lang' => 'MAX_AVATAR_SIZE', 'validate' => 'int:0', 'type' => 'dimension:3:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'avatar_path' => array('lang' => 'AVATAR_STORAGE_PATH', 'validate' => 'rwpath', 'type' => 'text:20:255', 'explain' => true), 'avatar_path' => array('lang' => 'AVATAR_STORAGE_PATH', 'validate' => 'rwpath', 'type' => 'text:20:255', 'explain' => true),
'avatar_gallery_path' => array('lang' => 'AVATAR_GALLERY_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true) 'avatar_gallery_path' => array('lang' => 'AVATAR_GALLERY_PATH', 'validate' => 'rpath', 'type' => 'text:20:255', 'explain' => true)
) )
@ -123,11 +123,11 @@ class acp_board
'vars' => array( 'vars' => array(
'legend1' => 'GENERAL_SETTINGS', 'legend1' => 'GENERAL_SETTINGS',
'allow_privmsg' => array('lang' => 'BOARD_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_privmsg' => array('lang' => 'BOARD_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'pm_max_boxes' => array('lang' => 'BOXES_MAX', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'pm_max_boxes' => array('lang' => 'BOXES_MAX', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'pm_max_msgs' => array('lang' => 'BOXES_LIMIT', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'pm_max_msgs' => array('lang' => 'BOXES_LIMIT', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'full_folder_action' => array('lang' => 'FULL_FOLDER_ACTION', 'validate' => 'int', 'type' => 'select', 'method' => 'full_folder_select', 'explain' => true), 'full_folder_action' => array('lang' => 'FULL_FOLDER_ACTION', 'validate' => 'int', 'type' => 'select', 'method' => 'full_folder_select', 'explain' => true),
'pm_edit_time' => array('lang' => 'PM_EDIT_TIME', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']), 'pm_edit_time' => array('lang' => 'PM_EDIT_TIME', 'validate' => 'int:0', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']),
'legend2' => 'GENERAL_OPTIONS', 'legend2' => 'GENERAL_OPTIONS',
'allow_mass_pm' => array('lang' => 'ALLOW_MASS_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'allow_mass_pm' => array('lang' => 'ALLOW_MASS_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'auth_bbcode_pm' => array('lang' => 'ALLOW_BBCODE_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'auth_bbcode_pm' => array('lang' => 'ALLOW_BBCODE_PM', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
@ -160,21 +160,21 @@ class acp_board
'legend2' => 'POSTING', 'legend2' => 'POSTING',
'bump_type' => false, 'bump_type' => false,
'edit_time' => array('lang' => 'EDIT_TIME', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']), 'edit_time' => array('lang' => 'EDIT_TIME', 'validate' => 'int:0', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']),
'display_last_edited' => array('lang' => 'DISPLAY_LAST_EDITED', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'display_last_edited' => array('lang' => 'DISPLAY_LAST_EDITED', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'flood_interval' => array('lang' => 'FLOOD_INTERVAL', 'validate' => 'int', 'type' => 'text:3:10', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']), 'flood_interval' => array('lang' => 'FLOOD_INTERVAL', 'validate' => 'int:0', 'type' => 'text:3:10', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'bump_interval' => array('lang' => 'BUMP_INTERVAL', 'validate' => 'int', 'type' => 'custom', 'method' => 'bump_interval', 'explain' => true), 'bump_interval' => array('lang' => 'BUMP_INTERVAL', 'validate' => 'int:0', 'type' => 'custom', 'method' => 'bump_interval', 'explain' => true),
'topics_per_page' => array('lang' => 'TOPICS_PER_PAGE', 'validate' => 'int', 'type' => 'text:3:4', 'explain' => false), 'topics_per_page' => array('lang' => 'TOPICS_PER_PAGE', 'validate' => 'int:1', 'type' => 'text:3:4', 'explain' => false),
'posts_per_page' => array('lang' => 'POSTS_PER_PAGE', 'validate' => 'int', 'type' => 'text:3:4', 'explain' => false), 'posts_per_page' => array('lang' => 'POSTS_PER_PAGE', 'validate' => 'int:1', 'type' => 'text:3:4', 'explain' => false),
'hot_threshold' => array('lang' => 'HOT_THRESHOLD', 'validate' => 'int', 'type' => 'text:3:4', 'explain' => true), 'hot_threshold' => array('lang' => 'HOT_THRESHOLD', 'validate' => 'int:0', 'type' => 'text:3:4', 'explain' => true),
'max_poll_options' => array('lang' => 'MAX_POLL_OPTIONS', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => false), 'max_poll_options' => array('lang' => 'MAX_POLL_OPTIONS', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => false),
'max_post_chars' => array('lang' => 'CHAR_LIMIT', 'validate' => 'int', 'type' => 'text:4:6', 'explain' => true), 'max_post_chars' => array('lang' => 'CHAR_LIMIT', 'validate' => 'int:0', 'type' => 'text:4:6', 'explain' => true),
'max_post_smilies' => array('lang' => 'SMILIES_LIMIT', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'max_post_smilies' => array('lang' => 'SMILIES_LIMIT', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'max_post_urls' => array('lang' => 'MAX_POST_URLS', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true), 'max_post_urls' => array('lang' => 'MAX_POST_URLS', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true),
'max_post_font_size' => array('lang' => 'MAX_POST_FONT_SIZE', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' %'), 'max_post_font_size' => array('lang' => 'MAX_POST_FONT_SIZE', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' %'),
'max_quote_depth' => array('lang' => 'QUOTE_DEPTH_LIMIT', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'max_quote_depth' => array('lang' => 'QUOTE_DEPTH_LIMIT', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'max_post_img_width' => array('lang' => 'MAX_POST_IMG_WIDTH', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'max_post_img_width' => array('lang' => 'MAX_POST_IMG_WIDTH', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'max_post_img_height' => array('lang' => 'MAX_POST_IMG_HEIGHT', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'max_post_img_height' => array('lang' => 'MAX_POST_IMG_HEIGHT', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
) )
); );
break; break;
@ -192,12 +192,12 @@ class acp_board
'allow_sig_links' => array('lang' => 'ALLOW_SIG_LINKS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_sig_links' => array('lang' => 'ALLOW_SIG_LINKS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend2' => 'GENERAL_SETTINGS', 'legend2' => 'GENERAL_SETTINGS',
'max_sig_chars' => array('lang' => 'MAX_SIG_LENGTH', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true), 'max_sig_chars' => array('lang' => 'MAX_SIG_LENGTH', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true),
'max_sig_urls' => array('lang' => 'MAX_SIG_URLS', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true), 'max_sig_urls' => array('lang' => 'MAX_SIG_URLS', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true),
'max_sig_font_size' => array('lang' => 'MAX_SIG_FONT_SIZE', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' %'), 'max_sig_font_size' => array('lang' => 'MAX_SIG_FONT_SIZE', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' %'),
'max_sig_smilies' => array('lang' => 'MAX_SIG_SMILIES', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true), 'max_sig_smilies' => array('lang' => 'MAX_SIG_SMILIES', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true),
'max_sig_img_width' => array('lang' => 'MAX_SIG_IMG_WIDTH', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'max_sig_img_width' => array('lang' => 'MAX_SIG_IMG_WIDTH', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
'max_sig_img_height' => array('lang' => 'MAX_SIG_IMG_HEIGHT', 'validate' => 'int', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']), 'max_sig_img_height' => array('lang' => 'MAX_SIG_IMG_HEIGHT', 'validate' => 'int:0', 'type' => 'text:5:4', 'explain' => true, 'append' => ' ' . $user->lang['PIXEL']),
) )
); );
break; break;
@ -207,24 +207,22 @@ class acp_board
'title' => 'ACP_REGISTER_SETTINGS', 'title' => 'ACP_REGISTER_SETTINGS',
'vars' => array( 'vars' => array(
'legend1' => 'GENERAL_SETTINGS', 'legend1' => 'GENERAL_SETTINGS',
'max_name_chars' => false, 'max_name_chars' => array('lang' => 'USERNAME_LENGTH', 'validate' => 'int:8:180', 'type' => false, 'method' => false, 'explain' => false,),
'max_pass_chars' => false, 'max_pass_chars' => array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int:8:255', 'type' => false, 'method' => false, 'explain' => false,),
'require_activation' => array('lang' => 'ACC_ACTIVATION', 'validate' => 'int', 'type' => 'custom', 'method' => 'select_acc_activation', 'explain' => true), 'require_activation' => array('lang' => 'ACC_ACTIVATION', 'validate' => 'int', 'type' => 'custom', 'method' => 'select_acc_activation', 'explain' => true),
'min_name_chars' => array('lang' => 'USERNAME_LENGTH', 'validate' => 'int', 'type' => 'custom', 'method' => 'username_length', 'explain' => true), 'min_name_chars' => array('lang' => 'USERNAME_LENGTH', 'validate' => 'int:1', 'type' => 'custom:5:180', 'method' => 'username_length', 'explain' => true),
'min_pass_chars' => array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int', 'type' => 'custom', 'method' => 'password_length', 'explain' => true), 'min_pass_chars' => array('lang' => 'PASSWORD_LENGTH', 'validate' => 'int:1', 'type' => 'custom', 'method' => 'password_length', 'explain' => true),
'allow_name_chars' => array('lang' => 'USERNAME_CHARS', 'validate' => 'string', 'type' => 'select', 'method' => 'select_username_chars', 'explain' => true), 'allow_name_chars' => array('lang' => 'USERNAME_CHARS', 'validate' => 'string', 'type' => 'select', 'method' => 'select_username_chars', 'explain' => true),
'pass_complex' => array('lang' => 'PASSWORD_TYPE', 'validate' => 'string', 'type' => 'select', 'method' => 'select_password_chars', 'explain' => true), 'pass_complex' => array('lang' => 'PASSWORD_TYPE', 'validate' => 'string', 'type' => 'select', 'method' => 'select_password_chars', 'explain' => true),
'chg_passforce' => array('lang' => 'FORCE_PASS_CHANGE', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']), 'chg_passforce' => array('lang' => 'FORCE_PASS_CHANGE', 'validate' => 'int:0', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']),
'legend2' => 'GENERAL_OPTIONS', 'legend2' => 'GENERAL_OPTIONS',
'allow_namechange' => array('lang' => 'ALLOW_NAME_CHANGE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'allow_namechange' => array('lang' => 'ALLOW_NAME_CHANGE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'allow_emailreuse' => array('lang' => 'ALLOW_EMAIL_REUSE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_emailreuse' => array('lang' => 'ALLOW_EMAIL_REUSE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'enable_confirm' => array('lang' => 'VISUAL_CONFIRM_REG', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'enable_confirm' => array('lang' => 'VISUAL_CONFIRM_REG', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'max_login_attempts' => array('lang' => 'MAX_LOGIN_ATTEMPTS', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true), 'max_login_attempts' => array('lang' => 'MAX_LOGIN_ATTEMPTS', 'validate' => 'int:0', 'type' => 'text:3:3', 'explain' => true),
'max_reg_attempts' => array('lang' => 'REG_LIMIT', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'max_reg_attempts' => array('lang' => 'REG_LIMIT', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'min_time_reg' => array('lang' => 'MIN_TIME_REG', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'min_time_terms' => array('lang' => 'MIN_TIME_TERMS', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'legend3' => 'COPPA', 'legend3' => 'COPPA',
'coppa_enable' => array('lang' => 'ENABLE_COPPA', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'coppa_enable' => array('lang' => 'ENABLE_COPPA', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
@ -253,9 +251,9 @@ class acp_board
'vars' => array( 'vars' => array(
'legend1' => 'GENERAL_SETTINGS', 'legend1' => 'GENERAL_SETTINGS',
'limit_load' => array('lang' => 'LIMIT_LOAD', 'validate' => 'string', 'type' => 'text:4:4', 'explain' => true), 'limit_load' => array('lang' => 'LIMIT_LOAD', 'validate' => 'string', 'type' => 'text:4:4', 'explain' => true),
'session_length' => array('lang' => 'SESSION_LENGTH', 'validate' => 'int', 'type' => 'text:5:10', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']), 'session_length' => array('lang' => 'SESSION_LENGTH', 'validate' => 'int:60', 'type' => 'text:5:10', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'active_sessions' => array('lang' => 'LIMIT_SESSIONS', 'validate' => 'int', 'type' => 'text:4:4', 'explain' => true), 'active_sessions' => array('lang' => 'LIMIT_SESSIONS', 'validate' => 'int:0', 'type' => 'text:4:4', 'explain' => true),
'load_online_time' => array('lang' => 'ONLINE_LENGTH', 'validate' => 'int', 'type' => 'text:4:3', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']), 'load_online_time' => array('lang' => 'ONLINE_LENGTH', 'validate' => 'int:0', 'type' => 'text:4:3', 'explain' => true, 'append' => ' ' . $user->lang['MINUTES']),
'legend2' => 'GENERAL_OPTIONS', 'legend2' => 'GENERAL_OPTIONS',
'load_db_track' => array('lang' => 'YES_POST_MARKING', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_db_track' => array('lang' => 'YES_POST_MARKING', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
@ -269,7 +267,7 @@ class acp_board
'load_jumpbox' => array('lang' => 'YES_JUMPBOX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'load_jumpbox' => array('lang' => 'YES_JUMPBOX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_user_activity' => array('lang' => 'LOAD_USER_ACTIVITY', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_user_activity' => array('lang' => 'LOAD_USER_ACTIVITY', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'load_tplcompile' => array('lang' => 'RECOMPILE_STYLES', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'legend3' => 'CUSTOM_PROFILE_FIELDS', 'legend3' => 'CUSTOM_PROFILE_FIELDS',
'load_cpf_memberlist' => array('lang' => 'LOAD_CPF_MEMBERLIST', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'load_cpf_memberlist' => array('lang' => 'LOAD_CPF_MEMBERLIST', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
'load_cpf_viewprofile' => array('lang' => 'LOAD_CPF_VIEWPROFILE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false), 'load_cpf_viewprofile' => array('lang' => 'LOAD_CPF_VIEWPROFILE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => false),
@ -305,7 +303,7 @@ class acp_board
'force_server_vars' => array('lang' => 'FORCE_SERVER_VARS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'force_server_vars' => array('lang' => 'FORCE_SERVER_VARS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'server_protocol' => array('lang' => 'SERVER_PROTOCOL', 'validate' => 'string', 'type' => 'text:10:10', 'explain' => true), 'server_protocol' => array('lang' => 'SERVER_PROTOCOL', 'validate' => 'string', 'type' => 'text:10:10', 'explain' => true),
'server_name' => array('lang' => 'SERVER_NAME', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true), 'server_name' => array('lang' => 'SERVER_NAME', 'validate' => 'string', 'type' => 'text:40:255', 'explain' => true),
'server_port' => array('lang' => 'SERVER_PORT', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true), 'server_port' => array('lang' => 'SERVER_PORT', 'validate' => 'int:0', 'type' => 'text:5:5', 'explain' => true),
'script_path' => array('lang' => 'SCRIPT_PATH', 'validate' => 'script_path', 'type' => 'text::255', 'explain' => true), 'script_path' => array('lang' => 'SCRIPT_PATH', 'validate' => 'script_path', 'type' => 'text::255', 'explain' => true),
) )
); );
@ -317,18 +315,17 @@ class acp_board
'vars' => array( 'vars' => array(
'legend1' => 'ACP_SECURITY_SETTINGS', 'legend1' => 'ACP_SECURITY_SETTINGS',
'allow_autologin' => array('lang' => 'ALLOW_AUTOLOGIN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'allow_autologin' => array('lang' => 'ALLOW_AUTOLOGIN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'max_autologin_time' => array('lang' => 'AUTOLOGIN_LENGTH', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']), 'max_autologin_time' => array('lang' => 'AUTOLOGIN_LENGTH', 'validate' => 'int:0', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']),
'ip_check' => array('lang' => 'IP_VALID', 'validate' => 'int', 'type' => 'custom', 'method' => 'select_ip_check', 'explain' => true), 'ip_check' => array('lang' => 'IP_VALID', 'validate' => 'int', 'type' => 'custom', 'method' => 'select_ip_check', 'explain' => true),
'browser_check' => array('lang' => 'BROWSER_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'browser_check' => array('lang' => 'BROWSER_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'forwarded_for_check' => array('lang' => 'FORWARDED_FOR_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'forwarded_for_check' => array('lang' => 'FORWARDED_FOR_VALID', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'check_dnsbl' => array('lang' => 'CHECK_DNSBL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'check_dnsbl' => array('lang' => 'CHECK_DNSBL', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'email_check_mx' => array('lang' => 'EMAIL_CHECK_MX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'email_check_mx' => array('lang' => 'EMAIL_CHECK_MX', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'pass_complex' => array('lang' => 'PASSWORD_TYPE', 'validate' => 'string', 'type' => 'select', 'method' => 'select_password_chars', 'explain' => true), 'pass_complex' => array('lang' => 'PASSWORD_TYPE', 'validate' => 'string', 'type' => 'select', 'method' => 'select_password_chars', 'explain' => true),
'chg_passforce' => array('lang' => 'FORCE_PASS_CHANGE', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']), 'chg_passforce' => array('lang' => 'FORCE_PASS_CHANGE', 'validate' => 'int:0', 'type' => 'text:3:3', 'explain' => true, 'append' => ' ' . $user->lang['DAYS']),
'max_login_attempts' => array('lang' => 'MAX_LOGIN_ATTEMPTS', 'validate' => 'int', 'type' => 'text:3:3', 'explain' => true), 'max_login_attempts' => array('lang' => 'MAX_LOGIN_ATTEMPTS', 'validate' => 'int:0', 'type' => 'text:3:3', 'explain' => true),
'tpl_allow_php' => array('lang' => 'TPL_ALLOW_PHP', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'tpl_allow_php' => array('lang' => 'TPL_ALLOW_PHP', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'form_token_lifetime' => array('lang' => 'FORM_TIME_MAX', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']), 'form_token_lifetime' => array('lang' => 'FORM_TIME_MAX', 'validate' => 'int:-1', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'form_token_mintime' => array('lang' => 'FORM_TIME_MIN', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true, 'append' => ' ' . $user->lang['SECONDS']),
'form_token_sid_guests' => array('lang' => 'FORM_SID_GUESTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'form_token_sid_guests' => array('lang' => 'FORM_SID_GUESTS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
) )
@ -343,7 +340,7 @@ class acp_board
'email_enable' => array('lang' => 'ENABLE_EMAIL', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true), 'email_enable' => array('lang' => 'ENABLE_EMAIL', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'board_email_form' => array('lang' => 'BOARD_EMAIL_FORM', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true), 'board_email_form' => array('lang' => 'BOARD_EMAIL_FORM', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true),
'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true), 'email_function_name' => array('lang' => 'EMAIL_FUNCTION_NAME', 'validate' => 'string', 'type' => 'text:20:50', 'explain' => true),
'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int', 'type' => 'text:5:5', 'explain' => true), 'email_package_size' => array('lang' => 'EMAIL_PACKAGE_SIZE', 'validate' => 'int:0', 'type' => 'text:5:5', 'explain' => true),
'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'string', 'type' => 'text:25:100', 'explain' => true), 'board_contact' => array('lang' => 'CONTACT_EMAIL', 'validate' => 'string', 'type' => 'text:25:100', 'explain' => true),
'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'string', 'type' => 'text:25:100', 'explain' => true), 'board_email' => array('lang' => 'ADMIN_EMAIL', 'validate' => 'string', 'type' => 'text:25:100', 'explain' => true),
'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true), 'board_email_sig' => array('lang' => 'EMAIL_SIG', 'validate' => 'string', 'type' => 'textarea:5:30', 'explain' => true),
@ -352,7 +349,7 @@ class acp_board
'legend2' => 'SMTP_SETTINGS', 'legend2' => 'SMTP_SETTINGS',
'smtp_delivery' => array('lang' => 'USE_SMTP', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true), 'smtp_delivery' => array('lang' => 'USE_SMTP', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
'smtp_host' => array('lang' => 'SMTP_SERVER', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => false), 'smtp_host' => array('lang' => 'SMTP_SERVER', 'validate' => 'string', 'type' => 'text:25:50', 'explain' => false),
'smtp_port' => array('lang' => 'SMTP_PORT', 'validate' => 'int', 'type' => 'text:4:5', 'explain' => true), 'smtp_port' => array('lang' => 'SMTP_PORT', 'validate' => 'int:0', 'type' => 'text:4:5', 'explain' => true),
'smtp_auth_method' => array('lang' => 'SMTP_AUTH_METHOD', 'validate' => 'string', 'type' => 'select', 'method' => 'mail_auth_select', 'explain' => true), 'smtp_auth_method' => array('lang' => 'SMTP_AUTH_METHOD', 'validate' => 'string', 'type' => 'select', 'method' => 'mail_auth_select', 'explain' => true),
'smtp_username' => array('lang' => 'SMTP_USERNAME', 'validate' => 'string', 'type' => 'text:25:255', 'explain' => true), 'smtp_username' => array('lang' => 'SMTP_USERNAME', 'validate' => 'string', 'type' => 'text:25:255', 'explain' => true),
'smtp_password' => array('lang' => 'SMTP_PASSWORD', 'validate' => 'string', 'type' => 'password:25:255', 'explain' => true) 'smtp_password' => array('lang' => 'SMTP_PASSWORD', 'validate' => 'string', 'type' => 'password:25:255', 'explain' => true)
@ -555,7 +552,14 @@ class acp_board
{ {
$l_explain = (isset($user->lang[$vars['lang'] . '_EXPLAIN'])) ? $user->lang[$vars['lang'] . '_EXPLAIN'] : ''; $l_explain = (isset($user->lang[$vars['lang'] . '_EXPLAIN'])) ? $user->lang[$vars['lang'] . '_EXPLAIN'] : '';
} }
$content = build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars);
if (empty($content))
{
continue;
}
$template->assign_block_vars('options', array( $template->assign_block_vars('options', array(
'KEY' => $config_key, 'KEY' => $config_key,
'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'], 'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'],
@ -564,7 +568,7 @@ class acp_board
'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars), 'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars),
) )
); );
unset($display_vars['vars'][$config_key]); unset($display_vars['vars'][$config_key]);
} }
@ -795,7 +799,7 @@ class acp_board
} }
$dateformat_options .= '<option value="custom"'; $dateformat_options .= '<option value="custom"';
if (!in_array($value, array_keys($user->lang['dateformats']))) if (!isset($user->lang['dateformats'][$value]))
{ {
$dateformat_options .= ' selected="selected"'; $dateformat_options .= ' selected="selected"';
} }

View file

@ -132,6 +132,7 @@ class acp_forums
'forum_rules_link' => request_var('forum_rules_link', ''), 'forum_rules_link' => request_var('forum_rules_link', ''),
'forum_image' => request_var('forum_image', ''), 'forum_image' => request_var('forum_image', ''),
'forum_style' => request_var('forum_style', 0), 'forum_style' => request_var('forum_style', 0),
'display_subforum_list' => request_var('display_subforum_list', false),
'display_on_index' => request_var('display_on_index', false), 'display_on_index' => request_var('display_on_index', false),
'forum_topics_per_page' => request_var('topics_per_page', 0), 'forum_topics_per_page' => request_var('topics_per_page', 0),
'enable_indexing' => request_var('enable_indexing', true), 'enable_indexing' => request_var('enable_indexing', true),
@ -471,6 +472,7 @@ class acp_forums
'forum_rules_link' => '', 'forum_rules_link' => '',
'forum_image' => '', 'forum_image' => '',
'forum_style' => 0, 'forum_style' => 0,
'display_subforum_list' => true,
'display_on_index' => false, 'display_on_index' => false,
'forum_topics_per_page' => 0, 'forum_topics_per_page' => 0,
'enable_indexing' => true, 'enable_indexing' => true,
@ -670,6 +672,7 @@ class acp_forums
'S_FORUM_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false, 'S_FORUM_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false,
'S_ENABLE_INDEXING' => ($forum_data['enable_indexing']) ? true : false, 'S_ENABLE_INDEXING' => ($forum_data['enable_indexing']) ? true : false,
'S_TOPIC_ICONS' => ($forum_data['enable_icons']) ? true : false, 'S_TOPIC_ICONS' => ($forum_data['enable_icons']) ? true : false,
'S_DISPLAY_SUBFORUM_LIST' => ($forum_data['display_subforum_list']) ? true : false,
'S_DISPLAY_ON_INDEX' => ($forum_data['display_on_index']) ? true : false, 'S_DISPLAY_ON_INDEX' => ($forum_data['display_on_index']) ? true : false,
'S_PRUNE_ENABLE' => ($forum_data['enable_prune']) ? true : false, 'S_PRUNE_ENABLE' => ($forum_data['enable_prune']) ? true : false,
'S_FORUM_LINK_TRACK' => ($forum_data['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? true : false, 'S_FORUM_LINK_TRACK' => ($forum_data['forum_flags'] & FORUM_FLAG_LINK_TRACK) ? true : false,
@ -915,6 +918,13 @@ class acp_forums
$forum_data['prune_days'] = $forum_data['prune_viewed'] = $forum_data['prune_freq'] = 0; $forum_data['prune_days'] = $forum_data['prune_viewed'] = $forum_data['prune_freq'] = 0;
$errors[] = $user->lang['FORUM_DATA_NEGATIVE']; $errors[] = $user->lang['FORUM_DATA_NEGATIVE'];
} }
$range_test_ary = array(
array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data['forum_topics_per_page'], 'column_type' => 'TINT:0'),
);
validate_range($range_test_ary, $errors);
// Set forum flags // Set forum flags
// 1 = link tracking // 1 = link tracking

View file

@ -337,11 +337,16 @@ class acp_icons
} }
$icons_updated = 0; $icons_updated = 0;
$errors = array();
foreach ($images as $image) foreach ($images as $image)
{ {
if (($mode == 'smilies' && ($image_emotion[$image] == '' || $image_code[$image] == '')) || if ($mode == 'smilies' && ($image_emotion[$image] == '' || $image_code[$image] == ''))
($action == 'create' && !isset($image_add[$image])))
{ {
$errors[$image] = 'SMILIE_NO_' . (($image_emotion[$image] == '') ? 'EMOTION' : 'CODE');
}
else if ($action == 'create' && !isset($image_add[$image]))
{
// skip images where add wasn't checked
} }
else else
{ {
@ -431,13 +436,18 @@ class acp_icons
default: default:
$suc_lang = $lang; $suc_lang = $lang;
} }
$errormsgs = '<br />';
foreach ($errors as $img => $error)
{
$errormsgs .= '<br />' . sprintf($user->lang[$error], $img);
}
if ($action == 'modify') if ($action == 'modify')
{ {
trigger_error($user->lang[$suc_lang . '_EDITED'] . adm_back_link($this->u_action), $level); trigger_error($user->lang[$suc_lang . '_EDITED'] . $errormsgs . adm_back_link($this->u_action), $level);
} }
else else
{ {
trigger_error($user->lang[$suc_lang . '_ADDED'] . adm_back_link($this->u_action), $level); trigger_error($user->lang[$suc_lang . '_ADDED'] . $errormsgs .adm_back_link($this->u_action), $level);
} }
break; break;
@ -462,7 +472,7 @@ class acp_icons
if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data)) if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data))
{ {
if ((sizeof($data[1]) != 4 && $mode == 'icons') || if ((sizeof($data[1]) != 4 && $mode == 'icons') ||
(sizeof($data[1]) != 6 && $mode == 'smilies')) ((sizeof($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' ))
{ {
trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING);
} }

View file

@ -310,8 +310,8 @@ class acp_main
$users_per_day = sprintf('%.2f', $total_users / $boarddays); $users_per_day = sprintf('%.2f', $total_users / $boarddays);
$files_per_day = sprintf('%.2f', $total_files / $boarddays); $files_per_day = sprintf('%.2f', $total_files / $boarddays);
$upload_dir_size = ($config['upload_dir_size'] >= 1048576) ? sprintf('%.2f ' . $user->lang['MB'], ($config['upload_dir_size'] / 1048576)) : (($config['upload_dir_size'] >= 1024) ? sprintf('%.2f ' . $user->lang['KB'], ($config['upload_dir_size'] / 1024)) : sprintf('%.2f ' . $user->lang['BYTES'], $config['upload_dir_size'])); $upload_dir_size = get_formatted_filesize($config['upload_dir_size']);
$avatar_dir_size = 0; $avatar_dir_size = 0;
if ($avatar_dir = @opendir($phpbb_root_path . $config['avatar_path'])) if ($avatar_dir = @opendir($phpbb_root_path . $config['avatar_path']))
@ -325,10 +325,7 @@ class acp_main
} }
closedir($avatar_dir); closedir($avatar_dir);
// This bit of code translates the avatar directory size into human readable format $avatar_dir_size = get_formatted_filesize($avatar_dir_size);
// Borrowed the code from the PHP.net annoted manual, origanally written by:
// Jesse (jesse@jess.on.ca)
$avatar_dir_size = ($avatar_dir_size >= 1048576) ? sprintf('%.2f ' . $user->lang['MB'], ($avatar_dir_size / 1048576)) : (($avatar_dir_size >= 1024) ? sprintf('%.2f ' . $user->lang['KB'], ($avatar_dir_size / 1024)) : sprintf('%.2f ' . $user->lang['BYTES'], $avatar_dir_size));
} }
else else
{ {
@ -392,7 +389,7 @@ class acp_main
'DATABASE_INFO' => $db->sql_server_info(), 'DATABASE_INFO' => $db->sql_server_info(),
'BOARD_VERSION' => $config['version'], 'BOARD_VERSION' => $config['version'],
'U_ACTION' => append_sid("{$phpbb_admin_path}index.$phpEx"), 'U_ACTION' => $this->u_action,
'U_ADMIN_LOG' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=logs&amp;mode=admin'), 'U_ADMIN_LOG' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=logs&amp;mode=admin'),
'U_INACTIVE_USERS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=inactive&amp;mode=list'), 'U_INACTIVE_USERS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=inactive&amp;mode=list'),

View file

@ -48,7 +48,7 @@ class acp_permissions
$this->tpl_name = 'permission_trace'; $this->tpl_name = 'permission_trace';
if ($user_id && isset($auth_admin->option_ids[$permission]) && $auth->acl_get('a_viewauth')) if ($user_id && isset($auth_admin->acl_options['id'][$permission]) && $auth->acl_get('a_viewauth'))
{ {
$this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $user->lang['acl_' . $permission]['lang']); $this->page_title = sprintf($user->lang['TRACE_PERMISSION'], $user->lang['acl_' . $permission]['lang']);
$this->permission_trace($user_id, $forum_id, $permission); $this->permission_trace($user_id, $forum_id, $permission);
@ -124,7 +124,7 @@ class acp_permissions
$forum_id = array(); $forum_id = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$forum_id[] = $row['forum_id']; $forum_id[] = (int) $row['forum_id'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
@ -133,7 +133,7 @@ class acp_permissions
$forum_id = array(); $forum_id = array();
foreach (get_forum_branch($subforum_id, 'children') as $row) foreach (get_forum_branch($subforum_id, 'children') as $row)
{ {
$forum_id[] = $row['forum_id']; $forum_id[] = (int) $row['forum_id'];
} }
} }
@ -598,7 +598,7 @@ class acp_permissions
$ids = array(); $ids = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$ids[] = $row[$sql_id]; $ids[] = (int) $row[$sql_id];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
@ -1117,31 +1117,51 @@ class acp_permissions
global $db, $user; global $db, $user;
$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0'); $sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
$sql_permission_option = ' AND o.auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
$sql = $db->sql_build_query('SELECT_DISTINCT', array(
'SELECT' => 'u.username, u.username_clean, u.user_regdate, u.user_id',
'FROM' => array( // Permission options are only able to be a permission set... therefore we will pre-fetch the possible options and also the possible roles
USERS_TABLE => 'u', $option_ids = $role_ids = array();
ACL_OPTIONS_TABLE => 'o',
ACL_USERS_TABLE => 'a'
),
'LEFT_JOIN' => array( $sql = 'SELECT auth_option_id
array( FROM ' . ACL_OPTIONS_TABLE . '
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'), WHERE auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
'ON' => 'a.auth_role_id = r.role_id' $result = $db->sql_query($sql);
)
),
'WHERE' => "(a.auth_option_id = o.auth_option_id OR r.auth_option_id = o.auth_option_id) while ($row = $db->sql_fetchrow($result))
$sql_permission_option {
$option_ids[] = (int) $row['auth_option_id'];
}
$db->sql_freeresult($result);
if (sizeof($option_ids))
{
$sql = 'SELECT DISTINCT role_id
FROM ' . ACL_ROLES_DATA_TABLE . '
WHERE ' . $db->sql_in_set('auth_option_id', $option_ids);
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$role_ids[] = (int) $row['role_id'];
}
$db->sql_freeresult($result);
}
if (sizeof($option_ids) && sizeof($role_ids))
{
$sql_where = 'AND (' . $db->sql_in_set('a.auth_option_id', $option_ids) . ' OR ' . $db->sql_in_set('a.auth_role_id', $role_ids) . ')';
}
else
{
$sql_where = 'AND ' . $db->sql_in_set('a.auth_option_id', $option_ids);
}
// Not ideal, due to the filesort, non-use of indexes, etc.
$sql = 'SELECT DISTINCT u.user_id, u.username
FROM ' . USERS_TABLE . ' u, ' . ACL_USERS_TABLE . " a
WHERE u.user_id = a.user_id
$sql_forum_id $sql_forum_id
AND u.user_id = a.user_id", $sql_where
ORDER BY u.username_clean, u.user_regdate ASC";
'ORDER_BY' => 'u.username_clean, u.user_regdate ASC'
));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$s_defined_user_options = ''; $s_defined_user_options = '';
@ -1153,29 +1173,12 @@ class acp_permissions
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$sql = $db->sql_build_query('SELECT_DISTINCT', array( $sql = 'SELECT DISTINCT g.group_type, g.group_name, g.group_id
'SELECT' => 'g.group_type, g.group_name, g.group_id', FROM ' . GROUPS_TABLE . ' g, ' . ACL_GROUPS_TABLE . " a
WHERE g.group_id = a.group_id
'FROM' => array(
GROUPS_TABLE => 'g',
ACL_OPTIONS_TABLE => 'o',
ACL_GROUPS_TABLE => 'a'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'a.auth_role_id = r.role_id'
)
),
'WHERE' => "(a.auth_option_id = o.auth_option_id OR r.auth_option_id = o.auth_option_id)
$sql_permission_option
$sql_forum_id $sql_forum_id
AND g.group_id = a.group_id", $sql_where
ORDER BY g.group_type DESC, g.group_name ASC";
'ORDER_BY' => 'g.group_type DESC, g.group_name ASC'
));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$s_defined_group_options = ''; $s_defined_group_options = '';

View file

@ -405,7 +405,15 @@ class acp_prune
$where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : ''; $where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : '';
$where_sql .= (sizeof($joined)) ? " AND user_regdate " . $key_match[$joined_select] . ' ' . gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]) : ''; $where_sql .= (sizeof($joined)) ? " AND user_regdate " . $key_match[$joined_select] . ' ' . gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]) : '';
$where_sql .= ($count !== '') ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : ''; $where_sql .= ($count !== '') ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
$where_sql .= (sizeof($active)) ? " AND user_lastvisit " . $key_match[$active_select] . " " . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) : '';
if (sizeof($active) && $active_select != 'lt')
{
$where_sql .= ' AND user_lastvisit ' . $key_match[$active_select] . ' ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]);
}
else if (sizeof($active))
{
$where_sql .= ' AND (user_lastvisit > 0 AND user_lastvisit < ' . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) . ')';
}
} }
// Protect the admin, do not prune if no options are given... // Protect the admin, do not prune if no options are given...

View file

@ -183,6 +183,26 @@ class acp_search
} }
} }
$search = null;
$error = false;
if (!$this->init_search($config['search_type'], $search, $error))
{
if ($updated)
{
if (method_exists($search, 'config_updated'))
{
if ($search->config_updated())
{
trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
}
}
}
}
else
{
trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
}
trigger_error($user->lang['CONFIG_UPDATED'] . $extra_message . adm_back_link($this->u_action)); trigger_error($user->lang['CONFIG_UPDATED'] . $extra_message . adm_back_link($this->u_action));
} }
unset($cfg_array); unset($cfg_array);
@ -518,9 +538,9 @@ class acp_search
function close_popup_js() function close_popup_js()
{ {
return "<script type=\"text/javascript\">\n" . return "<script type=\"text/javascript\">\n" .
"<!--\n" . "// <![CDATA[\n" .
" close_waitscreen = 1;\n" . " close_waitscreen = 1;\n" .
"//-->\n" . "// ]]>\n" .
"</script>\n"; "</script>\n";
} }

View file

@ -1003,7 +1003,7 @@ parse_css_file = {PARSE_CSS_FILE}
'CACHED' => $user->format_date(filemtime("{$phpbb_root_path}cache/$filename")), 'CACHED' => $user->format_date(filemtime("{$phpbb_root_path}cache/$filename")),
'FILENAME' => $file, 'FILENAME' => $file,
'FILESIZE' => sprintf('%.1f KB', filesize("{$phpbb_root_path}cache/$filename") / 1024), 'FILESIZE' => sprintf('%.1f ' . $user->lang['KIB'], filesize("{$phpbb_root_path}cache/$filename") / 1024),
'MODIFIED' => $user->format_date((!$template_row['template_storedb']) ? filemtime("{$phpbb_root_path}styles/{$template_row['template_path']}/template/$tpl_file.html") : $filemtime[$file . '.html'])) 'MODIFIED' => $user->format_date((!$template_row['template_storedb']) ? filemtime("{$phpbb_root_path}styles/{$template_row['template_path']}/template/$tpl_file.html") : $filemtime[$file . '.html']))
); );
} }

View file

@ -411,7 +411,7 @@ class acp_users
$sql = 'UPDATE ' . USERS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " $sql = 'UPDATE ' . USERS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
WHERE user_id = $user_id"; WHERE user_id = $user_id";
$db->sql_query($sql); $db->sql_query($sql);
add_log('admin', 'LOG_USER_DEL_SIG', $user_row['username']); add_log('admin', 'LOG_USER_DEL_SIG', $user_row['username']);
add_log('user', $user_id, 'LOG_USER_DEL_SIG_USER'); add_log('user', $user_id, 'LOG_USER_DEL_SIG_USER');
@ -492,9 +492,9 @@ class acp_users
'update' => true)) 'update' => true))
); );
} }
break; break;
case 'moveposts': case 'moveposts':
if (!check_form_key($form_name)) if (!check_form_key($form_name))
@ -630,7 +630,7 @@ class acp_users
} }
$forum_id_ary = array_unique($forum_id_ary); $forum_id_ary = array_unique($forum_id_ary);
$topic_id_ary = array_unique(array_merge($topic_id_ary, $new_topic_id_ary)); $topic_id_ary = array_unique(array_merge(array_keys($topic_id_ary), $new_topic_id_ary));
if (sizeof($topic_id_ary)) if (sizeof($topic_id_ary))
{ {
@ -835,9 +835,9 @@ class acp_users
{ {
$quick_tool_ary += array('active' => (($user_row['user_type'] == USER_INACTIVE) ? 'ACTIVATE' : 'DEACTIVATE')); $quick_tool_ary += array('active' => (($user_row['user_type'] == USER_INACTIVE) ? 'ACTIVATE' : 'DEACTIVATE'));
} }
$quick_tool_ary += array('delsig' => 'DEL_SIG', 'delavatar' => 'DEL_AVATAR', 'moveposts' => 'MOVE_POSTS', 'delposts' => 'DEL_POSTS', 'delattach' => 'DEL_ATTACH'); $quick_tool_ary += array('delsig' => 'DEL_SIG', 'delavatar' => 'DEL_AVATAR', 'moveposts' => 'MOVE_POSTS', 'delposts' => 'DEL_POSTS', 'delattach' => 'DEL_ATTACH');
if ($config['email_enable'] && ($user_row['user_type'] == USER_NORMAL || $user_row['user_type'] == USER_INACTIVE)) if ($config['email_enable'] && ($user_row['user_type'] == USER_NORMAL || $user_row['user_type'] == USER_INACTIVE))
{ {
$quick_tool_ary['reactivate'] = 'FORCE'; $quick_tool_ary['reactivate'] = 'FORCE';
@ -923,7 +923,7 @@ class acp_users
case 'feedback': case 'feedback':
$user->add_lang('mcp'); $user->add_lang('mcp');
// Set up general vars // Set up general vars
$start = request_var('start', 0); $start = request_var('start', 0);
$deletemark = (isset($_POST['delmarked'])) ? true : false; $deletemark = (isset($_POST['delmarked'])) ? true : false;
@ -980,7 +980,7 @@ class acp_users
trigger_error($user->lang['USER_FEEDBACK_ADDED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id)); trigger_error($user->lang['USER_FEEDBACK_ADDED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
} }
// Sorting // Sorting
$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']); $limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
$sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']); $sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
@ -1060,9 +1060,11 @@ class acp_users
list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']); list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']);
} }
$data['bday_day'] = request_var('bday_day', $data['bday_day']); $data['bday_day'] = request_var('bday_day', $data['bday_day']);
$data['bday_month'] = request_var('bday_month', $data['bday_month']); $data['bday_month'] = request_var('bday_month', $data['bday_month']);
$data['bday_year'] = request_var('bday_year', $data['bday_year']); $data['bday_year'] = request_var('bday_year', $data['bday_year']);
$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
if ($submit) if ($submit)
{ {
@ -1085,6 +1087,7 @@ class acp_users
'bday_day' => array('num', true, 1, 31), 'bday_day' => array('num', true, 1, 31),
'bday_month' => array('num', true, 1, 12), 'bday_month' => array('num', true, 1, 12),
'bday_year' => array('num', true, 1901, gmdate('Y', time())), 'bday_year' => array('num', true, 1901, gmdate('Y', time())),
'user_birthday' => array('date', true),
)); ));
// validate custom profile fields // validate custom profile fields
@ -1111,7 +1114,7 @@ class acp_users
'user_from' => $data['location'], 'user_from' => $data['location'],
'user_occ' => $data['occupation'], 'user_occ' => $data['occupation'],
'user_interests'=> $data['interests'], 'user_interests'=> $data['interests'],
'user_birthday' => sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']), 'user_birthday' => $data['user_birthday'],
); );
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
@ -1213,7 +1216,7 @@ class acp_users
'S_BIRTHDAY_DAY_OPTIONS' => $s_birthday_day_options, 'S_BIRTHDAY_DAY_OPTIONS' => $s_birthday_day_options,
'S_BIRTHDAY_MONTH_OPTIONS' => $s_birthday_month_options, 'S_BIRTHDAY_MONTH_OPTIONS' => $s_birthday_month_options,
'S_BIRTHDAY_YEAR_OPTIONS' => $s_birthday_year_options, 'S_BIRTHDAY_YEAR_OPTIONS' => $s_birthday_year_options,
'S_PROFILE' => true) 'S_PROFILE' => true)
); );
@ -1344,7 +1347,7 @@ class acp_users
$s_custom = false; $s_custom = false;
$dateformat_options .= '<option value="custom"'; $dateformat_options .= '<option value="custom"';
if (!in_array($data['dateformat'], array_keys($user->lang['dateformats']))) if (!isset($user->lang['dateformats'][$data['dateformat']]))
{ {
$dateformat_options .= ' selected="selected"'; $dateformat_options .= ' selected="selected"';
$s_custom = true; $s_custom = true;
@ -1392,7 +1395,7 @@ class acp_users
$template->assign_vars(array( $template->assign_vars(array(
'S_PREFS' => true, 'S_PREFS' => true,
'S_JABBER_DISABLED' => ($config['jab_enable'] && $user_row['user_jabber'] && @extension_loaded('xml')) ? false : true, 'S_JABBER_DISABLED' => ($config['jab_enable'] && $user_row['user_jabber'] && @extension_loaded('xml')) ? false : true,
'VIEW_EMAIL' => $data['viewemail'], 'VIEW_EMAIL' => $data['viewemail'],
'MASS_EMAIL' => $data['massemail'], 'MASS_EMAIL' => $data['massemail'],
'ALLOW_PM' => $data['allowpm'], 'ALLOW_PM' => $data['allowpm'],
@ -1413,7 +1416,7 @@ class acp_users
'VIEW_SIGS' => $data['view_sigs'], 'VIEW_SIGS' => $data['view_sigs'],
'VIEW_AVATARS' => $data['view_avatars'], 'VIEW_AVATARS' => $data['view_avatars'],
'VIEW_WORDCENSOR' => $data['view_wordcensor'], 'VIEW_WORDCENSOR' => $data['view_wordcensor'],
'S_TOPIC_SORT_DAYS' => $s_limit_topic_days, 'S_TOPIC_SORT_DAYS' => $s_limit_topic_days,
'S_TOPIC_SORT_KEY' => $s_sort_topic_key, 'S_TOPIC_SORT_KEY' => $s_sort_topic_key,
'S_TOPIC_SORT_DIR' => $s_sort_topic_dir, 'S_TOPIC_SORT_DIR' => $s_sort_topic_dir,
@ -1506,7 +1509,7 @@ class acp_users
trigger_error($user->lang['USER_RANK_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id)); trigger_error($user->lang['USER_RANK_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
} }
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . RANKS_TABLE . ' FROM ' . RANKS_TABLE . '
WHERE rank_special = 1 WHERE rank_special = 1
@ -1528,9 +1531,9 @@ class acp_users
); );
break; break;
case 'sig': case 'sig':
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx); include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx);
@ -1549,7 +1552,7 @@ class acp_users
// Allowing Quote BBCode // Allowing Quote BBCode
$message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig'); $message_parser->parse($enable_bbcode, $enable_urls, $enable_smilies, $config['allow_sig_img'], $config['allow_sig_flash'], true, $config['allow_sig_links'], true, 'sig');
if (sizeof($message_parser->warn_msg)) if (sizeof($message_parser->warn_msg))
{ {
$error[] = implode('<br />', $message_parser->warn_msg); $error[] = implode('<br />', $message_parser->warn_msg);
@ -1575,13 +1578,13 @@ class acp_users
trigger_error($user->lang['USER_SIG_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id)); trigger_error($user->lang['USER_SIG_UPDATED'] . adm_back_link($this->u_action . '&amp;u=' . $user_id));
} }
// Replace "error" strings with their real, localised form // Replace "error" strings with their real, localised form
$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
} }
$signature_preview = ''; $signature_preview = '';
if ($preview) if ($preview)
{ {
// Now parse it for displaying // Now parse it for displaying
@ -1744,7 +1747,7 @@ class acp_users
'REAL_FILENAME' => $row['real_filename'], 'REAL_FILENAME' => $row['real_filename'],
'COMMENT' => nl2br($row['attach_comment']), 'COMMENT' => nl2br($row['attach_comment']),
'EXTENSION' => $row['extension'], 'EXTENSION' => $row['extension'],
'SIZE' => ($row['filesize'] >= 1048576) ? ($row['filesize'] >> 20) . ' ' . $user->lang['MB'] : (($row['filesize'] >= 1024) ? ($row['filesize'] >> 10) . ' ' . $user->lang['KB'] : $row['filesize'] . ' ' . $user->lang['BYTES']), 'SIZE' => get_formatted_filesize($row['filesize']),
'DOWNLOAD_COUNT' => $row['download_count'], 'DOWNLOAD_COUNT' => $row['download_count'],
'POST_TIME' => $user->format_date($row['filetime']), 'POST_TIME' => $user->format_date($row['filetime']),
'TOPIC_TITLE' => ($row['in_message']) ? $row['message_title'] : $row['topic_title'], 'TOPIC_TITLE' => ($row['in_message']) ? $row['message_title'] : $row['topic_title'],
@ -1752,7 +1755,7 @@ class acp_users
'ATTACH_ID' => $row['attach_id'], 'ATTACH_ID' => $row['attach_id'],
'POST_ID' => $row['post_msg_id'], 'POST_ID' => $row['post_msg_id'],
'TOPIC_ID' => $row['topic_id'], 'TOPIC_ID' => $row['topic_id'],
'S_IN_MESSAGE' => $row['in_message'], 'S_IN_MESSAGE' => $row['in_message'],
'U_DOWNLOAD' => append_sid("{$phpbb_root_path}download/file.$phpEx", 'mode=view&amp;id=' . $row['attach_id']), 'U_DOWNLOAD' => append_sid("{$phpbb_root_path}download/file.$phpEx", 'mode=view&amp;id=' . $row['attach_id']),
@ -1760,7 +1763,7 @@ class acp_users
); );
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$template->assign_vars(array( $template->assign_vars(array(
'S_ATTACHMENTS' => true, 'S_ATTACHMENTS' => true,
'S_ON_PAGE' => on_page($num_attachments, $config['topics_per_page'], $start), 'S_ON_PAGE' => on_page($num_attachments, $config['topics_per_page'], $start),
@ -1771,14 +1774,14 @@ class acp_users
); );
break; break;
case 'groups': case 'groups':
include($phpbb_root_path . 'includes/functions_user.' . $phpEx); include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
$user->add_lang(array('groups', 'acp/groups')); $user->add_lang(array('groups', 'acp/groups'));
$group_id = request_var('g', 0); $group_id = request_var('g', 0);
if ($group_id) if ($group_id)
{ {
// Check the founder only entry for this group to make sure everything is well // Check the founder only entry for this group to make sure everything is well
@ -1788,7 +1791,7 @@ class acp_users
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$founder_manage = (int) $db->sql_fetchfield('group_founder_manage'); $founder_manage = (int) $db->sql_fetchfield('group_founder_manage');
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($user->data['user_type'] != USER_FOUNDER && $founder_manage) if ($user->data['user_type'] != USER_FOUNDER && $founder_manage)
{ {
trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING); trigger_error($user->lang['NOT_ALLOWED_MANAGE_GROUP'] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
@ -1798,7 +1801,7 @@ class acp_users
{ {
$founder_manage = 0; $founder_manage = 0;
} }
switch ($action) switch ($action)
{ {
case 'demote': case 'demote':
@ -1829,7 +1832,7 @@ class acp_users
{ {
trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING); trigger_error($user->lang[$error] . adm_back_link($this->u_action . '&amp;u=' . $user_id), E_USER_WARNING);
} }
$error = array(); $error = array();
} }
else else
@ -1842,7 +1845,7 @@ class acp_users
'g' => $group_id)) 'g' => $group_id))
); );
} }
break; break;
} }
@ -1977,7 +1980,7 @@ class acp_users
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$hold_ary = array(); $hold_ary = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$hold_ary = $auth_admin->get_mask('view', $user_id, false, false, $row['auth_option'], 'global', ACL_NEVER); $hold_ary = $auth_admin->get_mask('view', $user_id, false, false, $row['auth_option'], 'global', ACL_NEVER);
@ -2017,7 +2020,7 @@ class acp_users
'U_USER_PERMISSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx" ,'i=permissions&amp;mode=setting_user_global&amp;user_id[]=' . $user_id), 'U_USER_PERMISSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx" ,'i=permissions&amp;mode=setting_user_global&amp;user_id[]=' . $user_id),
'U_USER_FORUM_PERMISSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions&amp;mode=setting_user_local&amp;user_id[]=' . $user_id)) 'U_USER_FORUM_PERMISSIONS' => append_sid("{$phpbb_admin_path}index.$phpEx", 'i=permissions&amp;mode=setting_user_local&amp;user_id[]=' . $user_id))
); );
break; break;
} }

View file

@ -22,8 +22,6 @@ if (!defined('IN_PHPBB'))
*/ */
class auth_admin extends auth class auth_admin extends auth
{ {
var $option_ids = array();
/** /**
* Init auth settings * Init auth settings
*/ */
@ -33,7 +31,7 @@ class auth_admin extends auth
if (($this->acl_options = $cache->get('_acl_options')) === false) if (($this->acl_options = $cache->get('_acl_options')) === false)
{ {
$sql = 'SELECT auth_option, is_global, is_local $sql = 'SELECT auth_option_id, auth_option, is_global, is_local
FROM ' . ACL_OPTIONS_TABLE . ' FROM ' . ACL_OPTIONS_TABLE . '
ORDER BY auth_option_id'; ORDER BY auth_option_id';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -51,25 +49,14 @@ class auth_admin extends auth
{ {
$this->acl_options['local'][$row['auth_option']] = $local++; $this->acl_options['local'][$row['auth_option']] = $local++;
} }
$this->acl_options['id'][$row['auth_option']] = (int) $row['auth_option_id'];
$this->acl_options['option'][(int) $row['auth_option_id']] = $row['auth_option'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$cache->put('_acl_options', $this->acl_options); $cache->put('_acl_options', $this->acl_options);
} }
if (!sizeof($this->option_ids))
{
$sql = 'SELECT auth_option_id, auth_option
FROM ' . ACL_OPTIONS_TABLE;
$result = $db->sql_query($sql);
$this->option_ids = array();
while ($row = $db->sql_fetchrow($result))
{
$this->option_ids[$row['auth_option']] = $row['auth_option_id'];
}
$db->sql_freeresult($result);
}
} }
/** /**
@ -126,7 +113,7 @@ class auth_admin extends auth
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$forum_ids[] = $row['forum_id']; $forum_ids[] = (int) $row['forum_id'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
@ -778,6 +765,10 @@ class auth_admin extends auth
$cache->destroy('_acl_options'); $cache->destroy('_acl_options');
$this->acl_clear_prefetch(); $this->acl_clear_prefetch();
// Because we just changed the options and also purged the options cache, we instantly update/regenerate it for later calls to succeed.
$this->acl_options = array();
$this->auth_admin();
return true; return true;
} }
@ -813,7 +804,7 @@ class auth_admin extends auth
$flag = substr($flag, 0, strpos($flag, '_') + 1); $flag = substr($flag, 0, strpos($flag, '_') + 1);
// This ID (the any-flag) is set if one or more permissions are true... // This ID (the any-flag) is set if one or more permissions are true...
$any_option_id = (int) $this->option_ids[$flag]; $any_option_id = (int) $this->acl_options['id'][$flag];
// Remove any-flag from auth ary // Remove any-flag from auth ary
if (isset($auth[$flag])) if (isset($auth[$flag]))
@ -825,7 +816,7 @@ class auth_admin extends auth
$auth_option_ids = array((int)$any_option_id); $auth_option_ids = array((int)$any_option_id);
foreach ($auth as $auth_option => $auth_setting) foreach ($auth as $auth_option => $auth_setting)
{ {
$auth_option_ids[] = (int) $this->option_ids[$auth_option]; $auth_option_ids[] = (int) $this->acl_options['id'][$auth_option];
} }
$sql = "DELETE FROM $table $sql = "DELETE FROM $table
@ -888,7 +879,7 @@ class auth_admin extends auth
{ {
foreach ($auth as $auth_option => $setting) foreach ($auth as $auth_option => $setting)
{ {
$auth_option_id = (int) $this->option_ids[$auth_option]; $auth_option_id = (int) $this->acl_options['id'][$auth_option];
if ($setting != ACL_NO) if ($setting != ACL_NO)
{ {
@ -944,7 +935,7 @@ class auth_admin extends auth
$sql_ary = array(); $sql_ary = array();
foreach ($auth as $auth_option => $setting) foreach ($auth as $auth_option => $setting)
{ {
$auth_option_id = (int) $this->option_ids[$auth_option]; $auth_option_id = (int) $this->acl_options['id'][$auth_option];
if ($setting != ACL_NO) if ($setting != ACL_NO)
{ {
@ -961,7 +952,7 @@ class auth_admin extends auth
{ {
$sql_ary[] = array( $sql_ary[] = array(
'role_id' => (int) $role_id, 'role_id' => (int) $role_id,
'auth_option_id' => (int) $this->option_ids[$flag], 'auth_option_id' => (int) $this->acl_options['id'][$flag],
'auth_setting' => ACL_NEVER 'auth_setting' => ACL_NEVER
); );
} }
@ -1238,13 +1229,8 @@ class auth_admin extends auth
return false; return false;
} }
$hold_ary = $this->acl_raw_data($from_user_id, false, false); $hold_ary = $this->acl_raw_data_single_user($from_user_id);
if (isset($hold_ary[$from_user_id]))
{
$hold_ary = $hold_ary[$from_user_id];
}
// Key 0 in $hold_ary are global options, all others are forum_ids // Key 0 in $hold_ary are global options, all others are forum_ids
// We disallow copying admin permissions // We disallow copying admin permissions
@ -1252,12 +1238,12 @@ class auth_admin extends auth
{ {
if (strpos($opt, 'a_') === 0) if (strpos($opt, 'a_') === 0)
{ {
$hold_ary[0][$opt] = ACL_NEVER; $hold_ary[0][$this->acl_options['id'][$opt]] = ACL_NEVER;
} }
} }
// Force a_switchperm to be allowed // Force a_switchperm to be allowed
$hold_ary[0]['a_switchperm'] = ACL_YES; $hold_ary[0][$this->acl_options['id']['a_switchperm']] = ACL_YES;
$user_permissions = $this->build_bitstring($hold_ary); $user_permissions = $this->build_bitstring($hold_ary);

View file

@ -39,7 +39,7 @@ class auth
if (($this->acl_options = $cache->get('_acl_options')) === false) if (($this->acl_options = $cache->get('_acl_options')) === false)
{ {
$sql = 'SELECT auth_option, is_global, is_local $sql = 'SELECT auth_option_id, auth_option, is_global, is_local
FROM ' . ACL_OPTIONS_TABLE . ' FROM ' . ACL_OPTIONS_TABLE . '
ORDER BY auth_option_id'; ORDER BY auth_option_id';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
@ -57,6 +57,9 @@ class auth
{ {
$this->acl_options['local'][$row['auth_option']] = $local++; $this->acl_options['local'][$row['auth_option']] = $local++;
} }
$this->acl_options['id'][$row['auth_option']] = (int) $row['auth_option_id'];
$this->acl_options['option'][(int) $row['auth_option_id']] = $row['auth_option'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -302,7 +305,14 @@ class auth
*/ */
function acl_get_list($user_id = false, $opts = false, $forum_id = false) function acl_get_list($user_id = false, $opts = false, $forum_id = false)
{ {
$hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id); if ($user_id !== false && !is_array($user_id) && $opts === false && $forum_id === false)
{
$hold_ary = array($user_id => $this->acl_raw_data_single_user($user_id));
}
else
{
$hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id);
}
$auth_ary = array(); $auth_ary = array();
foreach ($hold_ary as $user_id => $forum_ary) foreach ($hold_ary as $user_id => $forum_ary)
@ -332,12 +342,7 @@ class auth
// Empty user_permissions // Empty user_permissions
$userdata['user_permissions'] = ''; $userdata['user_permissions'] = '';
$hold_ary = $this->acl_raw_data($userdata['user_id'], false, false); $hold_ary = $this->acl_raw_data_single_user($userdata['user_id']);
if (isset($hold_ary[$userdata['user_id']]))
{
$hold_ary = $hold_ary[$userdata['user_id']];
}
// Key 0 in $hold_ary are global options, all others are forum_ids // Key 0 in $hold_ary are global options, all others are forum_ids
@ -348,42 +353,11 @@ class auth
{ {
if (strpos($opt, 'a_') === 0) if (strpos($opt, 'a_') === 0)
{ {
$hold_ary[0][$opt] = ACL_YES; $hold_ary[0][$this->acl_options['id'][$opt]] = ACL_YES;
} }
} }
} }
// Sometimes, it can happen $hold_ary holding forums which do not exist.
// Since this function is not called that often (we are caching the data) we check for this inconsistency.
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', array_keys($hold_ary), false, true);
$result = $db->sql_query($sql);
$forum_ids = (isset($hold_ary[0])) ? array(0) : array();
while ($row = $db->sql_fetchrow($result))
{
$forum_ids[] = $row['forum_id'];
}
$db->sql_freeresult($result);
// Now determine forums which do not exist and remove the unneeded information (for modding purposes it is clearly the wrong place. ;))
$missing_forums = array_diff(array_keys($hold_ary), $forum_ids);
if (sizeof($missing_forums))
{
foreach ($missing_forums as $forum_id)
{
unset($hold_ary[$forum_id]);
}
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
$db->sql_query($sql);
}
$hold_str = $this->build_bitstring($hold_ary); $hold_str = $this->build_bitstring($hold_ary);
if ($hold_str) if ($hold_str)
@ -420,15 +394,15 @@ class auth
$bitstring = array(); $bitstring = array();
foreach ($this->acl_options[$ary_key] as $opt => $id) foreach ($this->acl_options[$ary_key] as $opt => $id)
{ {
if (isset($auth_ary[$opt])) if (isset($auth_ary[$this->acl_options['id'][$opt]]))
{ {
$bitstring[$id] = $auth_ary[$opt]; $bitstring[$id] = $auth_ary[$this->acl_options['id'][$opt]];
$option_key = substr($opt, 0, strpos($opt, '_') + 1); $option_key = substr($opt, 0, strpos($opt, '_') + 1);
// If one option is allowed, the global permission for this option has to be allowed too // If one option is allowed, the global permission for this option has to be allowed too
// example: if the user has the a_ permission this means he has one or more a_* permissions // example: if the user has the a_ permission this means he has one or more a_* permissions
if ($auth_ary[$opt] == ACL_YES && (!isset($bitstring[$this->acl_options[$ary_key][$option_key]]) || $bitstring[$this->acl_options[$ary_key][$option_key]] == ACL_NEVER)) if ($auth_ary[$this->acl_options['id'][$opt]] == ACL_YES && (!isset($bitstring[$this->acl_options[$ary_key][$option_key]]) || $bitstring[$this->acl_options[$ary_key][$option_key]] == ACL_NEVER))
{ {
$bitstring[$this->acl_options[$ary_key][$option_key]] = ACL_YES; $bitstring[$this->acl_options[$ary_key][$option_key]] = ACL_YES;
} }
@ -466,8 +440,31 @@ class auth
*/ */
function acl_clear_prefetch($user_id = false) function acl_clear_prefetch($user_id = false)
{ {
global $db; global $db, $cache;
// Rebuild options cache
$cache->destroy('_role_cache');
$sql = 'SELECT *
FROM ' . ACL_ROLES_DATA_TABLE . '
ORDER BY role_id ASC';
$result = $db->sql_query($sql);
$this->role_cache = array();
while ($row = $db->sql_fetchrow($result))
{
$this->role_cache[$row['role_id']][$row['auth_option_id']] = (int) $row['auth_setting'];
}
$db->sql_freeresult($result);
foreach ($this->role_cache as $role_id => $role_options)
{
$this->role_cache[$role_id] = serialize($role_options);
}
$cache->put('_role_cache', $this->role_cache);
// Now empty user permissions
$where_sql = ''; $where_sql = '';
if ($user_id !== false) if ($user_id !== false)
@ -528,103 +525,35 @@ class auth
$sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : ''; $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : '';
$sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
$sql_opts = ''; $sql_opts = $sql_opts_select = $sql_opts_from = '';
$hold_ary = array();
if ($opts !== false) if ($opts !== false)
{ {
$sql_opts_select = ', ao.auth_option';
$sql_opts_from = ', ' . ACL_OPTIONS_TABLE . ' ao';
$this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
} }
$hold_ary = array(); $sql_ary = array();
// First grab user settings ... each user has only one setting for each // Grab non-role settings - user-specific
// option ... so we shouldn't need any ACL_NEVER checks ... he says ... $sql_ary[] = 'SELECT a.user_id, a.forum_id, a.auth_setting, a.auth_option_id' . $sql_opts_select . '
// Grab assigned roles... FROM ' . ACL_USERS_TABLE . ' a' . $sql_opts_from . '
$sql = $db->sql_build_query('SELECT', array( WHERE a.auth_role_id = 0 ' .
'SELECT' => 'ao.auth_option, a.auth_role_id, r.auth_setting as role_auth_setting, a.user_id, a.forum_id, a.auth_setting', (($sql_opts_from) ? 'AND a.auth_option_id = ao.auth_option_id ' : '') .
(($sql_user) ? 'AND a.' . $sql_user : '') . "
'FROM' => array(
ACL_OPTIONS_TABLE => 'ao',
ACL_USERS_TABLE => 'a'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'a.auth_role_id = r.role_id'
)
),
'WHERE' => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
' . (($sql_user) ? 'AND a.' . $sql_user : '') . "
$sql_forum $sql_forum
$sql_opts", $sql_opts";
));
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) // Now the role settings - user-specific
{ $sql_ary[] = 'SELECT a.user_id, a.forum_id, r.auth_option_id, r.auth_setting, r.auth_option_id' . $sql_opts_select . '
$setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r' . $sql_opts_from . '
$hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting; WHERE a.auth_role_id = r.role_id ' .
} (($sql_opts_from) ? 'AND r.auth_option_id = ao.auth_option_id ' : '') .
$db->sql_freeresult($result); (($sql_user) ? 'AND a.' . $sql_user : '') . "
// Now grab group settings ... ACL_NEVER overrides ACL_YES so act appropriatley
$sql_ary[] = $db->sql_build_query('SELECT', array(
'SELECT' => 'ug.user_id, ao.auth_option, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting',
'FROM' => array(
USER_GROUP_TABLE => 'ug',
ACL_OPTIONS_TABLE => 'ao',
ACL_GROUPS_TABLE => 'a'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'a.auth_role_id = r.role_id'
)
),
'WHERE' => 'ao.auth_option_id = a.auth_option_id
AND a.group_id = ug.group_id
AND ug.user_pending = 0
' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
$sql_forum $sql_forum
$sql_opts" $sql_opts";
));
$sql_ary[] = $db->sql_build_query('SELECT', array(
'SELECT' => 'ug.user_id, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting, ao.auth_option' ,
'FROM' => array(
ACL_OPTIONS_TABLE => 'ao'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'r.auth_option_id = ao.auth_option_id'
),
array(
'FROM' => array(ACL_GROUPS_TABLE => 'a'),
'ON' => 'a.auth_role_id = r.role_id'
),
array(
'FROM' => array(USER_GROUP_TABLE => 'ug'),
'ON' => 'ug.group_id = a.group_id'
)
),
'WHERE' => 'ug.user_pending = 0
' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
$sql_forum
$sql_opts"
));
foreach ($sql_ary as $sql) foreach ($sql_ary as $sql)
{ {
@ -632,24 +561,62 @@ class auth
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) && $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] != ACL_NEVER)) $option = ($sql_opts_select) ? $row['auth_option'] : $this->acl_options['option'][$row['auth_option_id']];
$hold_ary[$row['user_id']][$row['forum_id']][$option] = $row['auth_setting'];
}
$db->sql_freeresult($result);
}
$sql_ary = array();
// Now grab group settings - non-role specific...
$sql_ary[] = 'SELECT ug.user_id, a.forum_id, a.auth_setting, a.auth_option_id' . $sql_opts_select . '
FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug' . $sql_opts_from . '
WHERE a.auth_role_id = 0 ' .
(($sql_opts_from) ? 'AND a.auth_option_id = ao.auth_option_id ' : '') . '
AND a.group_id = ug.group_id
AND ug.user_pending = 0
' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
$sql_forum
$sql_opts";
// Now grab group settings - role specific...
$sql_ary[] = 'SELECT ug.user_id, a.forum_id, r.auth_setting, r.auth_option_id' . $sql_opts_select . '
FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug, ' . ACL_ROLES_DATA_TABLE . ' r' . $sql_opts_from . '
WHERE a.auth_role_id = r.role_id ' .
(($sql_opts_from) ? 'AND r.auth_option_id = ao.auth_option_id ' : '') . '
AND a.group_id = ug.group_id
AND ug.user_pending = 0
' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
$sql_forum
$sql_opts";
foreach ($sql_ary as $sql)
{
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$option = ($sql_opts_select) ? $row['auth_option'] : $this->acl_options['option'][$row['auth_option_id']];
if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$option]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$option]) && $hold_ary[$row['user_id']][$row['forum_id']][$option] != ACL_NEVER))
{ {
$setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; $hold_ary[$row['user_id']][$row['forum_id']][$option] = $row['auth_setting'];
$hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting;
// If we detect ACL_NEVER, we will unset the flag option (within building the bitstring it is correctly set again)
// Check for existence of ACL_YES if an option got set to ACL_NEVER if ($row['auth_setting'] == ACL_NEVER)
if ($setting == ACL_NEVER)
{ {
$flag = substr($row['auth_option'], 0, strpos($row['auth_option'], '_') + 1); $flag = substr($option, 0, strpos($option, '_') + 1);
if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES) if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES)
{ {
unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]); unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]);
if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']])) /* if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']]))
{ {
$hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES; $hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES;
} }
*/
} }
} }
} }
@ -671,45 +638,43 @@ class auth
$sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
$sql_opts = ''; $sql_opts = '';
$hold_ary = $sql_ary = array();
if ($opts !== false) if ($opts !== false)
{ {
$this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
} }
$hold_ary = array(); // Grab user settings - non-role specific...
$sql_ary[] = 'SELECT a.user_id, a.forum_id, a.auth_setting, a.auth_option_id, ao.auth_option
// Grab user settings... FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . ' ao
$sql = $db->sql_build_query('SELECT', array( WHERE a.auth_role_id = 0
'SELECT' => 'ao.auth_option, a.auth_role_id, r.auth_setting as role_auth_setting, a.user_id, a.forum_id, a.auth_setting', AND a.auth_option_id = ao.auth_option_id ' .
(($sql_user) ? 'AND a.' . $sql_user : '') . "
'FROM' => array(
ACL_OPTIONS_TABLE => 'ao',
ACL_USERS_TABLE => 'a'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'a.auth_role_id = r.role_id'
),
),
'WHERE' => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
' . (($sql_user) ? 'AND a.' . $sql_user : '') . "
$sql_forum $sql_forum
$sql_opts", $sql_opts
ORDER BY a.forum_id, ao.auth_option";
'ORDER_BY' => 'a.forum_id, ao.auth_option' // Now the role settings - user-specific
)); $sql_ary[] = 'SELECT a.user_id, a.forum_id, r.auth_option_id, r.auth_setting, r.auth_option_id, ao.auth_option
$result = $db->sql_query($sql); FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r, ' . ACL_OPTIONS_TABLE . ' ao
WHERE a.auth_role_id = r.role_id
AND r.auth_option_id = ao.auth_option_id ' .
(($sql_user) ? 'AND a.' . $sql_user : '') . "
$sql_forum
$sql_opts
ORDER BY a.forum_id, ao.auth_option";
while ($row = $db->sql_fetchrow($result)) foreach ($sql_ary as $sql)
{ {
$setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; $result = $db->sql_query($sql);
$hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting;
while ($row = $db->sql_fetchrow($result))
{
$hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting'];
}
$db->sql_freeresult($result);
} }
$db->sql_freeresult($result);
return $hold_ary; return $hold_ary;
} }
@ -725,49 +690,158 @@ class auth
$sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : ''; $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
$sql_opts = ''; $sql_opts = '';
$hold_ary = $sql_ary = array();
if ($opts !== false) if ($opts !== false)
{ {
$this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts); $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
} }
// Grab group settings - non-role specific...
$sql_ary[] = 'SELECT a.group_id, a.forum_id, a.auth_setting, a.auth_option_id, ao.auth_option
FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . ' ao
WHERE a.auth_role_id = 0
AND a.auth_option_id = ao.auth_option_id ' .
(($sql_group) ? 'AND a.' . $sql_group : '') . "
$sql_forum
$sql_opts
ORDER BY a.forum_id, ao.auth_option";
// Now grab group settings - role specific...
$sql_ary[] = 'SELECT a.group_id, a.forum_id, r.auth_setting, r.auth_option_id, ao.auth_option
FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_ROLES_DATA_TABLE . ' r, ' . ACL_OPTIONS_TABLE . ' ao
WHERE a.auth_role_id = r.role_id
AND r.auth_option_id = ao.auth_option_id ' .
(($sql_group) ? 'AND a.' . $sql_group : '') . "
$sql_forum
$sql_opts
ORDER BY a.forum_id, ao.auth_option";
foreach ($sql_ary as $sql)
{
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $row['auth_setting'];
}
$db->sql_freeresult($result);
}
return $hold_ary;
}
/**
* Get raw acl data based on user for caching user_permissions
* This function returns the same data as acl_raw_data(), but without the user id as the first key within the array.
*/
function acl_raw_data_single_user($user_id)
{
global $db, $cache;
// Check if the role-cache is there
if (($this->role_cache = $cache->get('_role_cache')) === false)
{
$this->role_cache = array();
// We pre-fetch roles
$sql = 'SELECT *
FROM ' . ACL_ROLES_DATA_TABLE . '
ORDER BY role_id ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$this->role_cache[$row['role_id']][$row['auth_option_id']] = (int) $row['auth_setting'];
}
$db->sql_freeresult($result);
foreach ($this->role_cache as $role_id => $role_options)
{
$this->role_cache[$role_id] = serialize($role_options);
}
$cache->put('_role_cache', $this->role_cache);
}
$hold_ary = array(); $hold_ary = array();
// Grab group settings... // Grab user-specific permission settings
$sql = $db->sql_build_query('SELECT', array( $sql = 'SELECT forum_id, auth_option_id, auth_role_id, auth_setting
'SELECT' => 'a.group_id, ao.auth_option, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting', FROM ' . ACL_USERS_TABLE . '
WHERE user_id = ' . $user_id;
'FROM' => array(
ACL_OPTIONS_TABLE => 'ao',
ACL_GROUPS_TABLE => 'a'
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
'ON' => 'a.auth_role_id = r.role_id'
),
),
'WHERE' => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
' . (($sql_group) ? 'AND a.' . $sql_group : '') . "
$sql_forum
$sql_opts",
'ORDER_BY' => 'a.forum_id, ao.auth_option'
));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting']; // If a role is assigned, assign all options included within this role. Else, only set this one option.
$hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $setting; if ($row['auth_role_id'])
{
$hold_ary[$row['forum_id']] = (empty($hold_ary[$row['forum_id']])) ? unserialize($this->role_cache[$row['auth_role_id']]) : $hold_ary[$row['forum_id']] + unserialize($this->role_cache[$row['auth_role_id']]);
}
else
{
$hold_ary[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting'];
}
}
$db->sql_freeresult($result);
// Now grab group-specific permission settings
$sql = 'SELECT a.forum_id, a.auth_option_id, a.auth_role_id, a.auth_setting
FROM ' . ACL_GROUPS_TABLE . ' a, ' . USER_GROUP_TABLE . ' ug
WHERE a.group_id = ug.group_id
AND ug.user_pending = 0
AND ug.user_id = ' . $user_id;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
if (!$row['auth_role_id'])
{
$this->_set_group_hold_ary($hold_ary[$row['forum_id']], $row['auth_option_id'], $row['auth_setting']);
}
else
{
foreach (unserialize($this->role_cache[$row['auth_role_id']]) as $option_id => $setting)
{
$this->_set_group_hold_ary($hold_ary[$row['forum_id']], $option_id, $setting);
}
}
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
return $hold_ary; return $hold_ary;
} }
/**
* Private function snippet for setting a specific piece of the hold_ary
*/
function _set_group_hold_ary(&$hold_ary, $option_id, $setting)
{
if (!isset($hold_ary[$option_id]) || (isset($hold_ary[$option_id]) && $hold_ary[$option_id] != ACL_NEVER))
{
$hold_ary[$option_id] = $setting;
// If we detect ACL_NEVER, we will unset the flag option (within building the bitstring it is correctly set again)
if ($setting == ACL_NEVER)
{
$flag = substr($this->acl_options['option'][$option_id], 0, strpos($this->acl_options['option'][$option_id], '_') + 1);
$flag = (int) $this->acl_options['id'][$flag];
if (isset($hold_ary[$flag]) && $hold_ary[$flag] == ACL_YES)
{
unset($hold_ary[$flag]);
/* This is uncommented, because i suspect this being slightly wrong due to mixed permission classes being possible
if (in_array(ACL_YES, $hold_ary))
{
$hold_ary[$flag] = ACL_YES;
}*/
}
}
}
}
/** /**
* Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him. * Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him.
*/ */

View file

@ -48,8 +48,18 @@ function login_apache(&$username, &$password)
if (!$password) if (!$password)
{ {
return array( return array(
'status' => LOGIN_BREAK, 'status' => LOGIN_ERROR_PASSWORD,
'error_msg' => 'NO_PASSWORD_SUPPLIED', 'error_msg' => 'NO_PASSWORD_SUPPLIED',
'user_row' => array('user_id' => ANONYMOUS),
);
}
if (!$username)
{
return array(
'status' => LOGIN_ERROR_USERNAME,
'error_msg' => 'LOGIN_ERROR_USERNAME',
'user_row' => array('user_id' => ANONYMOUS),
); );
} }

View file

@ -32,8 +32,18 @@ function login_db(&$username, &$password)
if (!$password) if (!$password)
{ {
return array( return array(
'status' => LOGIN_BREAK, 'status' => LOGIN_ERROR_PASSWORD,
'error_msg' => 'NO_PASSWORD_SUPPLIED', 'error_msg' => 'NO_PASSWORD_SUPPLIED',
'user_row' => array('user_id' => ANONYMOUS),
);
}
if (!$username)
{
return array(
'status' => LOGIN_ERROR_USERNAME,
'error_msg' => 'LOGIN_ERROR_USERNAME',
'user_row' => array('user_id' => ANONYMOUS),
); );
} }

View file

@ -104,8 +104,18 @@ function login_ldap(&$username, &$password)
if (!$password) if (!$password)
{ {
return array( return array(
'status' => LOGIN_BREAK, 'status' => LOGIN_ERROR_PASSWORD,
'error_msg' => 'NO_PASSWORD_SUPPLIED', 'error_msg' => 'NO_PASSWORD_SUPPLIED',
'user_row' => array('user_id' => ANONYMOUS),
);
}
if (!$username)
{
return array(
'status' => LOGIN_ERROR_USERNAME,
'error_msg' => 'LOGIN_ERROR_USERNAME',
'user_row' => array('user_id' => ANONYMOUS),
); );
} }

View file

@ -173,7 +173,7 @@ define('FIELD_DATE', 6);
// Additional constants // Additional constants
define('VOTE_CONVERTED', 9999); define('VOTE_CONVERTED', 127);
// Table names // Table names
define('ACL_GROUPS_TABLE', $table_prefix . 'acl_groups'); define('ACL_GROUPS_TABLE', $table_prefix . 'acl_groups');

View file

@ -45,7 +45,9 @@ class dbal
// Holding the last sql query on sql error // Holding the last sql query on sql error
var $sql_error_sql = ''; var $sql_error_sql = '';
// Holding the error information - only populated if sql_error_triggered is set
var $sql_error_returned = array();
// Holding transaction count // Holding transaction count
var $transactions = 0; var $transactions = 0;
@ -262,6 +264,13 @@ class dbal
return true; return true;
} }
// Check if there is a transaction (no transaction can happen if there was an error, with a combined rollback and error returning enabled)
// This implies we have transaction always set for autocommit db's
if (!$this->transaction)
{
return false;
}
$result = $this->_sql_transaction('commit'); $result = $this->_sql_transaction('commit');
if (!$result) if (!$result)
@ -537,11 +546,11 @@ class dbal
$this->sql_error_triggered = true; $this->sql_error_triggered = true;
$this->sql_error_sql = $sql; $this->sql_error_sql = $sql;
$error = $this->_sql_error(); $this->sql_error_returned = $this->_sql_error();
if (!$this->return_on_error) if (!$this->return_on_error)
{ {
$message = 'SQL ERROR [ ' . $this->sql_layer . ' ]<br /><br />' . $error['message'] . ' [' . $error['code'] . ']'; $message = 'SQL ERROR [ ' . $this->sql_layer . ' ]<br /><br />' . $this->sql_error_returned['message'] . ' [' . $this->sql_error_returned['code'] . ']';
// Show complete SQL error and path to administrators only // Show complete SQL error and path to administrators only
// Additionally show complete error on installation or if extended debug mode is enabled // Additionally show complete error on installation or if extended debug mode is enabled
@ -598,7 +607,7 @@ class dbal
$this->sql_transaction('rollback'); $this->sql_transaction('rollback');
} }
return $error; return $this->sql_error_returned;
} }
/** /**

View file

@ -301,7 +301,7 @@ class diff_renderer_unified extends diff_renderer
{ {
return '<pre class="diff context">' . htmlspecialchars($this->_lines($lines, ' ')) . '<br /></pre>'; return '<pre class="diff context">' . htmlspecialchars($this->_lines($lines, ' ')) . '<br /></pre>';
} }
function _added($lines) function _added($lines)
{ {
return '<pre class="diff added">' . htmlspecialchars($this->_lines($lines, '+')) . '<br /></pre>'; return '<pre class="diff added">' . htmlspecialchars($this->_lines($lines, '+')) . '<br /></pre>';
@ -448,7 +448,7 @@ class diff_renderer_inline extends diff_renderer
// Therefore we split on words, but include all blocks of whitespace in the wordlist. // Therefore we split on words, but include all blocks of whitespace in the wordlist.
$splitted_text_1 = $this->_split_on_words($text1, $nl); $splitted_text_1 = $this->_split_on_words($text1, $nl);
$splitted_text_2 = $this->_split_on_words($text2, $nl); $splitted_text_2 = $this->_split_on_words($text2, $nl);
$diff = &new diff($splitted_text_1, $splitted_text_2); $diff = &new diff($splitted_text_1, $splitted_text_2);
unset($splitted_text_1, $splitted_text_2); unset($splitted_text_1, $splitted_text_2);
@ -463,7 +463,7 @@ class diff_renderer_inline extends diff_renderer
{ {
// Ignore \0; otherwise the while loop will never finish. // Ignore \0; otherwise the while loop will never finish.
$string = str_replace("\0", '', $string); $string = str_replace("\0", '', $string);
$words = array(); $words = array();
$length = strlen($string); $length = strlen($string);
$pos = 0; $pos = 0;
@ -537,7 +537,7 @@ class diff_renderer_raw extends diff_renderer
{ {
return $this->_lines($lines, ' '); return $this->_lines($lines, ' ');
} }
function _added($lines) function _added($lines)
{ {
return $this->_lines($lines, '+'); return $this->_lines($lines, '+');
@ -603,7 +603,7 @@ class diff_renderer_side_by_side extends diff_renderer
// Iterate through every header block of changes // Iterate through every header block of changes
foreach ($this->lines as $header) foreach ($this->lines as $header)
{ {
$output .= '<tr><th>Line ' . $header['oldline'] . '</th><th>' . $user->lang['LINE'] . ' ' . $header['newline'] . '</th></tr>'; $output .= '<tr><th>' . $user->lang['LINE'] . ' ' . $header['oldline'] . '</th><th>' . $user->lang['LINE'] . ' ' . $header['newline'] . '</th></tr>';
// Each header block consists of a number of changes (add, remove, change). // Each header block consists of a number of changes (add, remove, change).
$current_context = ''; $current_context = '';

File diff suppressed because it is too large Load diff

View file

@ -196,7 +196,7 @@ function size_select_options($size_compare)
{ {
global $user; global $user;
$size_types_text = array($user->lang['BYTES'], $user->lang['KB'], $user->lang['MB']); $size_types_text = array($user->lang['BYTES'], $user->lang['KIB'], $user->lang['MIB']);
$size_types = array('b', 'kb', 'mb'); $size_types = array('b', 'kb', 'mb');
$s_size_options = ''; $s_size_options = '';
@ -2878,14 +2878,7 @@ function get_database_size()
break; break;
} }
if ($database_size !== false) $database_size = ($database_size !== false) ? get_formatted_filesize($database_size) : $user->lang['NOT_AVAILABLE'];
{
$database_size = ($database_size >= 1048576) ? sprintf('%.2f ' . $user->lang['MB'], ($database_size / 1048576)) : (($database_size >= 1024) ? sprintf('%.2f ' . $user->lang['KB'], ($database_size / 1024)) : sprintf('%.2f ' . $user->lang['BYTES'], $database_size));
}
else
{
$database_size = $user->lang['NOT_AVAILABLE'];
}
return $database_size; return $database_size;
} }
@ -2998,6 +2991,29 @@ function tidy_database()
{ {
global $db; global $db;
// Here we check permission consistency
// Sometimes, it can happen permission tables having forums listed which do not exist
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE;
$result = $db->sql_query($sql);
$forum_ids = array(0);
while ($row = $db->sql_fetchrow($result))
{
$forum_ids[] = $row['forum_id'];
}
$db->sql_freeresult($result);
// Delete those rows from the acl tables not having listed the forums above
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids, true);
$db->sql_query($sql);
set_config('database_last_gc', time(), true); set_config('database_last_gc', time(), true);
} }

View file

@ -67,7 +67,7 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key,
$sort_dir = key($sort_dir_text); $sort_dir = key($sort_dir_text);
} }
$s_limit_days = '<select name="st">'; $s_limit_days = '<select name="st" id="st">';
foreach ($limit_days as $day => $text) foreach ($limit_days as $day => $text)
{ {
$selected = ($sort_days == $day) ? ' selected="selected"' : ''; $selected = ($sort_days == $day) ? ' selected="selected"' : '';
@ -75,7 +75,7 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key,
} }
$s_limit_days .= '</select>'; $s_limit_days .= '</select>';
$s_sort_key = '<select name="sk">'; $s_sort_key = '<select name="sk" id="sk">';
foreach ($sort_by_text as $key => $text) foreach ($sort_by_text as $key => $text)
{ {
$selected = ($sort_key == $key) ? ' selected="selected"' : ''; $selected = ($sort_key == $key) ? ' selected="selected"' : '';
@ -83,7 +83,7 @@ function gen_sort_selects(&$limit_days, &$sort_by_text, &$sort_days, &$sort_key,
} }
$s_sort_key .= '</select>'; $s_sort_key .= '</select>';
$s_sort_dir = '<select name="sd">'; $s_sort_dir = '<select name="sd" id="sd">';
foreach ($sort_dir_text as $key => $value) foreach ($sort_dir_text as $key => $value)
{ {
$selected = ($sort_dir == $key) ? ' selected="selected"' : ''; $selected = ($sort_dir == $key) ? ' selected="selected"' : '';
@ -382,7 +382,7 @@ function strip_bbcode(&$text, $uid = '')
$match = get_preg_expression('bbcode_htm'); $match = get_preg_expression('bbcode_htm');
$replace = array('\1', '\1', '\2', '\1', '', ''); $replace = array('\1', '\1', '\2', '\1', '', '');
$text = preg_replace($match, $replace, $text); $text = preg_replace($match, $replace, $text);
} }
@ -418,7 +418,7 @@ function generate_text_for_display($text, $uid, $bitfield, $flags)
{ {
$bbcode->bbcode($bitfield); $bbcode->bbcode($bitfield);
} }
$bbcode->bbcode_second_pass($text, $uid); $bbcode->bbcode_second_pass($text, $uid);
} }
@ -492,6 +492,7 @@ function generate_text_for_edit($text, $uid, $flags)
*/ */
function make_clickable_callback($type, $whitespace, $url, $relative_url, $class) function make_clickable_callback($type, $whitespace, $url, $relative_url, $class)
{ {
$orig_url = $url . $relative_url;
$append = ''; $append = '';
$url = htmlspecialchars_decode($url); $url = htmlspecialchars_decode($url);
$relative_url = htmlspecialchars_decode($relative_url); $relative_url = htmlspecialchars_decode($relative_url);
@ -558,29 +559,39 @@ function make_clickable_callback($type, $whitespace, $url, $relative_url, $class
break; break;
} }
$short_url = (strlen($url) > 55) ? substr($url, 0, 39) . ' ... ' . substr($url, -10) : $url;
switch ($type) switch ($type)
{ {
case MAGIC_URL_LOCAL: case MAGIC_URL_LOCAL:
$tag = 'l'; $tag = 'l';
$relative_url = preg_replace('/[&?]sid=[0-9a-f]{32}$/', '', preg_replace('/([&?])sid=[0-9a-f]{32}&/', '$1', $relative_url)); $relative_url = preg_replace('/[&?]sid=[0-9a-f]{32}$/', '', preg_replace('/([&?])sid=[0-9a-f]{32}&/', '$1', $relative_url));
$url = $url . '/' . $relative_url; $url = $url . '/' . $relative_url;
$text = ($relative_url) ? $relative_url : $url; $text = $relative_url;
// this url goes to http://domain.tld/path/to/board/ which
// would result in an empty link if treated as local so
// don't touch it and let MAGIC_URL_FULL take care of it.
if (!$relative_url)
{
return $orig_url . '/'; // slash is taken away by relative url pattern
}
break; break;
case MAGIC_URL_FULL: case MAGIC_URL_FULL:
$tag = 'm'; $tag = 'm';
$text = (strlen($url) > 55) ? substr($url, 0, 39) . ' ... ' . substr($url, -10) : $url; $text = $short_url;
break; break;
case MAGIC_URL_WWW: case MAGIC_URL_WWW:
$tag = 'w'; $tag = 'w';
$url = 'http://' . $url; $url = 'http://' . $url;
$text = (strlen($url) > 55) ? substr($url, 0, 39) . ' ... ' . substr($url, -10) : $url; $text = $short_url;
break; break;
case MAGIC_URL_EMAIL: case MAGIC_URL_EMAIL:
$tag = 'e'; $tag = 'e';
$text = (strlen($url) > 55) ? substr($url, 0, 39) . ' ... ' . substr($url, -10) : $url; $text = $short_url;
$url = 'mailto:' . $url; $url = 'mailto:' . $url;
break; break;
} }
@ -647,12 +658,21 @@ function make_clickable($text, $server_url = false, $class = 'postlink')
function censor_text($text) function censor_text($text)
{ {
static $censors; static $censors;
global $cache;
// We moved the word censor checks in here because we call this function quite often - and then only need to do the check once
if (!isset($censors) || !is_array($censors)) if (!isset($censors) || !is_array($censors))
{ {
// obtain_word_list is taking care of the users censor option and the board-wide option global $config, $user, $auth, $cache;
$censors = $cache->obtain_word_list();
// We check here if the user is having viewing censors disabled (and also allowed to do so).
if (!$user->optionget('viewcensors') && $config['allow_nocensors'] && $auth->acl_get('u_chgcensors'))
{
$censors = array();
}
else
{
$censors = $cache->obtain_word_list();
}
} }
if (sizeof($censors)) if (sizeof($censors))
@ -792,7 +812,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
$template->destroy_block_vars('_file'); $template->destroy_block_vars('_file');
$block_array = array(); $block_array = array();
// Some basics... // Some basics...
$attachment['extension'] = strtolower(trim($attachment['extension'])); $attachment['extension'] = strtolower(trim($attachment['extension']));
$filename = $phpbb_root_path . $config['upload_path'] . '/' . basename($attachment['physical_filename']); $filename = $phpbb_root_path . $config['upload_path'] . '/' . basename($attachment['physical_filename']);
@ -813,8 +833,8 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
} }
$filesize = $attachment['filesize']; $filesize = $attachment['filesize'];
$size_lang = ($filesize >= 1048576) ? $user->lang['MB'] : ( ($filesize >= 1024) ? $user->lang['KB'] : $user->lang['BYTES'] ); $size_lang = ($filesize >= 1048576) ? $user->lang['MIB'] : (($filesize >= 1024) ? $user->lang['KIB'] : $user->lang['BYTES']);
$filesize = ($filesize >= 1048576) ? round((round($filesize / 1048576 * 100) / 100), 2) : (($filesize >= 1024) ? round((round($filesize / 1024 * 100) / 100), 2) : $filesize); $filesize = get_formatted_filesize($filesize, false);
$comment = bbcode_nl2br(censor_text($attachment['attach_comment'])); $comment = bbcode_nl2br(censor_text($attachment['attach_comment']));
@ -1074,7 +1094,7 @@ function truncate_string($string, $max_length = 60, $allow_reply = true, $append
{ {
$string = 'Re: ' . $string; $string = 'Re: ' . $string;
} }
if ($append != '' && $stripped) if ($append != '' && $stripped)
{ {
$string = $string . $append; $string = $string . $append;
@ -1193,7 +1213,7 @@ class bitfield
if (strlen($this->data) >= $byte + 1) if (strlen($this->data) >= $byte + 1)
{ {
$c = $this->data[$byte]; $c = $this->data[$byte];
// Lookup the ($n % 8)th bit of the byte // Lookup the ($n % 8)th bit of the byte
$bit = 7 - ($n & 7); $bit = 7 - ($n & 7);
return (bool) (ord($c) & (1 << $bit)); return (bool) (ord($c) & (1 << $bit));

View file

@ -1282,7 +1282,7 @@ function restore_config($schema)
// Most are... // Most are...
if (is_string($config_value)) if (is_string($config_value))
{ {
$config_value = utf8_htmlspecialchars($config_value); $config_value = truncate_string(utf8_htmlspecialchars($config_value), 255, false);
} }
set_config($config_name, $config_value); set_config($config_name, $config_value);

View file

@ -27,7 +27,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array(); $forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
$parent_id = $visible_forums = 0; $parent_id = $visible_forums = 0;
$sql_from = ''; $sql_from = '';
// Mark forums read? // Mark forums read?
$mark_read = request_var('mark', ''); $mark_read = request_var('mark', '');
@ -371,7 +371,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$s_subforums_list = array(); $s_subforums_list = array();
foreach ($subforums_list as $subforum) foreach ($subforums_list as $subforum)
{ {
$s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '">' . $subforum['name'] . '</a>'; $s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['NEW_POSTS'] : $user->lang['NO_NEW_POSTS']) . '">' . $subforum['name'] . '</a>';
} }
$s_subforums_list = (string) implode(', ', $s_subforums_list); $s_subforums_list = (string) implode(', ', $s_subforums_list);
$catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false; $catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
@ -400,6 +400,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false, 'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false,
'S_UNREAD_FORUM' => $forum_unread, 'S_UNREAD_FORUM' => $forum_unread,
'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false, 'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false, 'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false,
'FORUM_ID' => $row['forum_id'], 'FORUM_ID' => $row['forum_id'],
@ -409,6 +410,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$l_post_click_count => $post_click_count, $l_post_click_count => $post_click_count,
'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt), 'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt),
'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'), 'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'),
'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
'FORUM_IMAGE' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '', 'FORUM_IMAGE' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '', 'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
'LAST_POST_SUBJECT' => censor_text($last_post_subject), 'LAST_POST_SUBJECT' => censor_text($last_post_subject),
@ -437,7 +439,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'S_UNREAD' => $subforum['unread']) 'S_UNREAD' => $subforum['unread'])
); );
} }
$last_catless = $catless; $last_catless = $catless;
} }
@ -979,7 +981,7 @@ function display_user_activity(&$userdata)
/** /**
* Topic and forum watching common code * Topic and forum watching common code
*/ */
function watch_topic_forum($mode, &$s_watching, &$s_watching_img, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0) function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0)
{ {
global $template, $db, $user, $phpEx, $start, $phpbb_root_path; global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
@ -1101,7 +1103,7 @@ function watch_topic_forum($mode, &$s_watching, &$s_watching_img, $user_id, $for
*/ */
function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src) function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank_img_src)
{ {
global $ranks, $config; global $ranks, $config, $phpbb_root_path;
if (empty($ranks)) if (empty($ranks))
{ {
@ -1112,8 +1114,8 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
if (!empty($user_rank)) if (!empty($user_rank))
{ {
$rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : ''; $rank_title = (isset($ranks['special'][$user_rank]['rank_title'])) ? $ranks['special'][$user_rank]['rank_title'] : '';
$rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : ''; $rank_img = (!empty($ranks['special'][$user_rank]['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] . '" alt="' . $ranks['special'][$user_rank]['rank_title'] . '" title="' . $ranks['special'][$user_rank]['rank_title'] . '" />' : '';
$rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : ''; $rank_img_src = (!empty($ranks['special'][$user_rank]['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $ranks['special'][$user_rank]['rank_image'] : '';
} }
else else
{ {
@ -1124,8 +1126,8 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
if ($user_posts >= $rank['rank_min']) if ($user_posts >= $rank['rank_min'])
{ {
$rank_title = $rank['rank_title']; $rank_title = $rank['rank_title'];
$rank_img = (!empty($rank['rank_image'])) ? '<img src="' . $config['ranks_path'] . '/' . $rank['rank_image'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : ''; $rank_img = (!empty($rank['rank_image'])) ? '<img src="' . $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] . '" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" />' : '';
$rank_img_src = (!empty($rank['rank_image'])) ? $config['ranks_path'] . '/' . $rank['rank_image'] : ''; $rank_img_src = (!empty($rank['rank_image'])) ? $phpbb_root_path . $config['ranks_path'] . '/' . $rank['rank_image'] : '';
break; break;
} }
} }

View file

@ -20,11 +20,11 @@ if (!defined('IN_PHPBB'))
* *
* Jabber class from Flyspray project * Jabber class from Flyspray project
* *
* @version class.jabber2.php 1306 2007-06-21 * @version class.jabber2.php 1488 2007-11-25
* @copyright 2006 Flyspray.org * @copyright 2006 Flyspray.org
* @author Florian Schmitz (floele) * @author Florian Schmitz (floele)
* *
* Modified by Acyd Burn * Only slightly modified by Acyd Burn
* *
* @package phpBB3 * @package phpBB3
*/ */
@ -286,7 +286,7 @@ class jabber
$read = trim(fread($this->connection, 4096)); $read = trim(fread($this->connection, 4096));
$data .= $read; $data .= $read;
} }
while (time() <= $start + $timeout && ($wait || $data == '' || $read != '' || (substr(rtrim($data), -1) != '>'))); while (time() <= $start + $timeout && !feof($this->connection) && ($wait || $data == '' || $read != '' || (substr(rtrim($data), -1) != '>')));
if ($data != '') if ($data != '')
{ {
@ -385,7 +385,6 @@ class jabber
{ {
case 'stream:stream': case 'stream:stream':
// Connection initialised (or after authentication). Not much to do here... // Connection initialised (or after authentication). Not much to do here...
$this->session['id'] = $xml['stream:stream'][0]['@']['id'];
if (isset($xml['stream:stream'][0]['#']['stream:features'])) if (isset($xml['stream:stream'][0]['#']['stream:features']))
{ {
@ -397,6 +396,16 @@ class jabber
$this->features = $this->listen(); $this->features = $this->listen();
} }
$second_time = isset($this->session['id']);
$this->session['id'] = $xml['stream:stream'][0]['@']['id'];
if ($second_time)
{
// If we are here for the second time after TLS, we need to continue logging in
$this->login();
return;
}
// go on with authentication? // go on with authentication?
if (isset($this->features['stream:features'][0]['#']['bind']) || !empty($this->session['tls'])) if (isset($this->features['stream:features'][0]['#']['bind']) || !empty($this->session['tls']))
{ {
@ -519,9 +528,10 @@ class jabber
'response' => $this->encrypt_password(array_merge($decoded, array('nc' => '00000001'))), 'response' => $this->encrypt_password(array_merge($decoded, array('nc' => '00000001'))),
'charset' => 'utf-8', 'charset' => 'utf-8',
'nc' => '00000001', 'nc' => '00000001',
'qop' => 'auth', // only auth being supported
); );
foreach (array('nonce', 'qop', 'digest-uri', 'realm', 'cnonce') as $key) foreach (array('nonce', 'digest-uri', 'realm', 'cnonce') as $key)
{ {
if (isset($decoded[$key])) if (isset($decoded[$key]))
{ {

View file

@ -1056,8 +1056,7 @@ class smtp_class
global $user; global $user;
$err_msg = ''; $err_msg = '';
$local_host = php_uname('n'); $local_host = (function_exists('php_uname')) ? php_uname('n') : $user->host;
$local_host = (empty($local_host)) ? 'localhost' : $local_host;
// If we are authenticating through pop-before-smtp, we // If we are authenticating through pop-before-smtp, we
// have to login ones before we get authenticated // have to login ones before we get authenticated
@ -1332,7 +1331,7 @@ class smtp_class
// Realm // Realm
if (empty($tokens['realm'])) if (empty($tokens['realm']))
{ {
$tokens['realm'] = php_uname('n'); $tokens['realm'] = (function_exists('php_uname')) ? php_uname('n') : $user->host;
} }
// Maxbuf // Maxbuf

View file

@ -59,7 +59,7 @@ class p_master
WHERE module_class = '" . $db->sql_escape($this->p_class) . "' WHERE module_class = '" . $db->sql_escape($this->p_class) . "'
ORDER BY left_id ASC"; ORDER BY left_id ASC";
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$rows = array(); $rows = array();
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
@ -114,7 +114,7 @@ class p_master
unset($this->module_cache['modules'][$key]); unset($this->module_cache['modules'][$key]);
continue; continue;
} }
$right_id = false; $right_id = false;
} }
@ -147,7 +147,7 @@ class p_master
{ {
continue; continue;
} }
$right_id = false; $right_id = false;
} }
@ -194,7 +194,7 @@ class p_master
$custom_func = '_module_' . $row['module_basename']; $custom_func = '_module_' . $row['module_basename'];
$names[$row['module_basename'] . '_' . $row['module_mode']][] = true; $names[$row['module_basename'] . '_' . $row['module_mode']][] = true;
$module_row = array( $module_row = array(
'depth' => $depth, 'depth' => $depth,
@ -209,7 +209,7 @@ class p_master
'display' => (int) $row['module_display'], 'display' => (int) $row['module_display'],
'url_extra' => (function_exists($url_func)) ? $url_func($row['module_mode'], $row) : '', 'url_extra' => (function_exists($url_func)) ? $url_func($row['module_mode'], $row) : '',
'lang' => ($row['module_basename'] && function_exists($lang_func)) ? $lang_func($row['module_mode'], $row['module_langname']) : ((!empty($user->lang[$row['module_langname']])) ? $user->lang[$row['module_langname']] : $row['module_langname']), 'lang' => ($row['module_basename'] && function_exists($lang_func)) ? $lang_func($row['module_mode'], $row['module_langname']) : ((!empty($user->lang[$row['module_langname']])) ? $user->lang[$row['module_langname']] : $row['module_langname']),
'langname' => $row['module_langname'], 'langname' => $row['module_langname'],
@ -309,7 +309,7 @@ class p_master
break; break;
default: default:
if (!preg_match('#(?:acl_([a-z_]+)(,\$id)?)|(?:\$id)|(?:aclf_([a-z_]+))|(?:cfg_([a-z_]+))|(?:request_([a-z_]+))#', $token)) if (!preg_match('#(?:acl_([a-z0-9_]+)(,\$id)?)|(?:\$id)|(?:aclf_([a-z0-9_]+))|(?:cfg_([a-z0-9_]+))|(?:request_([a-zA-Z0-9_]+))#', $token))
{ {
$token = ''; $token = '';
} }
@ -325,7 +325,7 @@ class p_master
$forum_id = ($forum_id === false) ? $this->acl_forum_id : $forum_id; $forum_id = ($forum_id === false) ? $this->acl_forum_id : $forum_id;
$is_auth = false; $is_auth = false;
eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z_]+)(,\$id)?#', '#\$id#', '#aclf_([a-z_]+)#', '#cfg_([a-z_]+)#', '#request_([a-z_]+)#'), array('(int) $auth->acl_get(\'\\1\'\\2)', '(int) $forum_id', '(int) $auth->acl_getf_global(\'\\1\')', '(int) $config[\'\\1\']', '!empty($_REQUEST[\'\\1\'])'), $module_auth) . ');'); eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z0-9_]+)(,\$id)?#', '#\$id#', '#aclf_([a-z0-9_]+)#', '#cfg_([a-z0-9_]+)#', '#request_([a-zA-Z0-9_]+)#'), array('(int) $auth->acl_get(\'\\1\'\\2)', '(int) $forum_id', '(int) $auth->acl_getf_global(\'\\1\')', '(int) $config[\'\\1\']', '!empty($_REQUEST[\'\\1\'])'), $module_auth) . ');');
return $is_auth; return $is_auth;
} }
@ -677,7 +677,7 @@ class p_master
} }
// Select first id we can get // Select first id we can get
if (!$current_id && (in_array($item_ary['id'], array_keys($this->module_cache['parents'])) || $item_ary['id'] == $this->p_id)) if (!$current_id && (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id))
{ {
$current_id = $item_ary['id']; $current_id = $item_ary['id'];
} }
@ -710,7 +710,7 @@ class p_master
$tpl_ary = array( $tpl_ary = array(
'L_TITLE' => $item_ary['lang'], 'L_TITLE' => $item_ary['lang'],
'S_SELECTED' => (in_array($item_ary['id'], array_keys($this->module_cache['parents'])) || $item_ary['id'] == $this->p_id) ? true : false, 'S_SELECTED' => (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id) ? true : false,
'U_TITLE' => $u_title 'U_TITLE' => $u_title
); );
@ -719,7 +719,7 @@ class p_master
$tpl_ary = array( $tpl_ary = array(
'L_TITLE' => $item_ary['lang'], 'L_TITLE' => $item_ary['lang'],
'S_SELECTED' => (in_array($item_ary['id'], array_keys($this->module_cache['parents'])) || $item_ary['id'] == $this->p_id) ? true : false, 'S_SELECTED' => (isset($this->module_cache['parents'][$item_ary['id']]) || $item_ary['id'] == $this->p_id) ? true : false,
'U_TITLE' => $u_title 'U_TITLE' => $u_title
); );

View file

@ -267,7 +267,7 @@ function posting_gen_topic_icons($mode, $icon_id)
'ICON_IMG' => $phpbb_root_path . $config['icons_path'] . '/' . $data['img'], 'ICON_IMG' => $phpbb_root_path . $config['icons_path'] . '/' . $data['img'],
'ICON_WIDTH' => $data['width'], 'ICON_WIDTH' => $data['width'],
'ICON_HEIGHT' => $data['height'], 'ICON_HEIGHT' => $data['height'],
'S_CHECKED' => ($id == $icon_id) ? true : false, 'S_CHECKED' => ($id == $icon_id) ? true : false,
'S_ICON_CHECKED' => ($id == $icon_id) ? ' checked="checked"' : '') 'S_ICON_CHECKED' => ($id == $icon_id) ? ' checked="checked"' : '')
); );
@ -323,7 +323,7 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
$topic_type_array $topic_type_array
); );
foreach ($topic_type_array as $array) foreach ($topic_type_array as $array)
{ {
$template->assign_block_vars('topic_type', $array); $template->assign_block_vars('topic_type', $array);
@ -618,6 +618,11 @@ function create_thumbnail($source, $destination, $mimetype)
// Only use imagemagick if defined and the passthru function not disabled // Only use imagemagick if defined and the passthru function not disabled
if ($config['img_imagick'] && function_exists('passthru')) if ($config['img_imagick'] && function_exists('passthru'))
{ {
if (substr($config['img_imagick'], -1) !== '/')
{
$config['img_imagick'] .= '/';
}
@passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"'); @passthru(escapeshellcmd($config['img_imagick']) . 'convert' . ((defined('PHP_OS') && preg_match('#^win#i', PHP_OS)) ? '.exe' : '') . ' -quality 85 -antialias -sample ' . $new_width . 'x' . $new_height . ' "' . str_replace('\\', '/', $source) . '" +profile "*" "' . str_replace('\\', '/', $destination) . '"');
if (file_exists($destination)) if (file_exists($destination))
@ -934,7 +939,8 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
WHERE p.topic_id = $topic_id WHERE p.topic_id = $topic_id
" . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . ' " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . '
' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . ' ' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '
ORDER BY p.post_time DESC'; ORDER BY p.post_time ';
$sql .= ($mode == 'post_review') ? 'ASC' : 'DESC';
$result = $db->sql_query_limit($sql, $config['posts_per_page']); $result = $db->sql_query_limit($sql, $config['posts_per_page']);
$post_list = array(); $post_list = array();
@ -1105,7 +1111,7 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id
trigger_error('WRONG_NOTIFICATION_MODE'); trigger_error('WRONG_NOTIFICATION_MODE');
} }
if (!$config['allow_topic_notify']) if (($topic_notification && !$config['allow_topic_notify']) || ($forum_notification && !$config['allow_forum_notify']))
{ {
return; return;
} }
@ -1115,16 +1121,15 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id
// Get banned User ID's // Get banned User ID's
$sql = 'SELECT ban_userid $sql = 'SELECT ban_userid
FROM ' . BANLIST_TABLE; FROM ' . BANLIST_TABLE . '
WHERE ban_userid <> 0
AND ban_exclude <> 1';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$sql_ignore_users = ANONYMOUS . ', ' . $user->data['user_id']; $sql_ignore_users = ANONYMOUS . ', ' . $user->data['user_id'];
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if (isset($row['ban_userid'])) $sql_ignore_users .= ', ' . (int) $row['ban_userid'];
{
$sql_ignore_users .= ', ' . $row['ban_userid'];
}
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -1326,9 +1331,21 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
global $config, $phpEx, $phpbb_root_path; global $config, $phpEx, $phpbb_root_path;
// Specify our post mode // Specify our post mode
$post_mode = ($data['topic_first_post_id'] == $data['topic_last_post_id']) ? 'delete_topic' : (($data['topic_first_post_id'] == $post_id) ? 'delete_first_post' : (($data['topic_last_post_id'] == $post_id) ? 'delete_last_post' : 'delete')); $post_mode = 'delete';
if (($data['topic_first_post_id'] === $data['topic_last_post_id']) && $data['topic_replies_real'] == 0)
{
$post_mode = 'delete_topic';
}
else if ($data['topic_first_post_id'] == $post_id)
{
$post_mode = 'delete_first_post';
}
else if ($data['topic_last_post_id'] == $post_id)
{
$post_mode = 'delete_last_post';
}
$sql_data = array(); $sql_data = array();
$next_post_id = 0; $next_post_id = false;
include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx); include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
@ -1717,7 +1734,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
} }
$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id'])) ? ', user_posts = user_posts + 1' : ''); $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id'])) ? ', user_posts = user_posts + 1' : '');
if ($topic_type != POST_GLOBAL) if ($topic_type != POST_GLOBAL)
{ {
if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) if ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))
@ -1940,7 +1957,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
} }
$sql_insert_ary = array(); $sql_insert_ary = array();
for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++) for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++)
{ {
if (strlen(trim($poll['poll_options'][$i]))) if (strlen(trim($poll['poll_options'][$i])))
@ -2013,7 +2030,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
foreach ($data['attachment_data'] as $pos => $attach_row) foreach ($data['attachment_data'] as $pos => $attach_row)
{ {
if ($attach_row['is_orphan'] && !in_array($attach_row['attach_id'], array_keys($orphan_rows))) if ($attach_row['is_orphan'] && !isset($orphan_rows[$attach_row['attach_id']]))
{ {
continue; continue;
} }

View file

@ -276,7 +276,7 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
case ACTION_PLACE_INTO_FOLDER: case ACTION_PLACE_INTO_FOLDER:
return array('action' => $rule_row['rule_action'], 'folder_id' => $rule_row['rule_folder_id']); return array('action' => $rule_row['rule_action'], 'folder_id' => $rule_row['rule_folder_id']);
break; break;
case ACTION_MARK_AS_READ: case ACTION_MARK_AS_READ:
case ACTION_MARK_AS_IMPORTANT: case ACTION_MARK_AS_IMPORTANT:
return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']); return array('action' => $rule_row['rule_action'], 'pm_unread' => $message_row['pm_unread'], 'pm_marked' => $message_row['pm_marked']);
@ -304,7 +304,7 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
return false; return false;
break; break;
default: default:
return false; return false;
} }
@ -606,7 +606,7 @@ function place_pm_into_folder(&$global_privmsgs_rules, $release = false)
unset($sql_folder); unset($sql_folder);
if (in_array(PRIVMSGS_INBOX, array_keys($move_into_folder))) if (isset($move_into_folder[PRIVMSGS_INBOX]))
{ {
$sql = 'SELECT COUNT(msg_id) as num_messages $sql = 'SELECT COUNT(msg_id) as num_messages
FROM ' . PRIVMSGS_TO_TABLE . " FROM ' . PRIVMSGS_TO_TABLE . "
@ -892,7 +892,7 @@ function handle_mark_actions($user_id, $mark_action)
if (confirm_box(true)) if (confirm_box(true))
{ {
delete_pm($user_id, $msg_ids, $cur_folder_id); delete_pm($user_id, $msg_ids, $cur_folder_id);
$success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED'; $success_msg = (sizeof($msg_ids) == 1) ? 'MESSAGE_DELETED' : 'MESSAGES_DELETED';
$redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $cur_folder_id); $redirect = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;folder=' . $cur_folder_id);
@ -1034,8 +1034,8 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$user->data['user_new_privmsg'] -= $num_new; $user->data['user_new_privmsg'] -= $num_new;
$user->data['user_unread_privmsg'] -= $num_unread; $user->data['user_unread_privmsg'] -= $num_unread;
} }
// Now we have to check which messages we can delete completely // Now we have to check which messages we can delete completely
$sql = 'SELECT msg_id $sql = 'SELECT msg_id
FROM ' . PRIVMSGS_TO_TABLE . ' FROM ' . PRIVMSGS_TO_TABLE . '
WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows)); WHERE ' . $db->sql_in_set('msg_id', array_keys($delete_rows));
@ -1157,7 +1157,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
FROM ' . GROUPS_TABLE . ' FROM ' . GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('group_id', $g); WHERE ' . $db->sql_in_set('group_id', $g);
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id']) if ($check_type == 'to' || $author_id == $user->data['user_id'] || $row['user_id'] == $user->data['user_id'])
@ -1175,7 +1175,7 @@ function write_pm_addresses($check_ary, $author_id, $plaintext = false)
AND g.group_id = ug.group_id AND g.group_id = ug.group_id
AND ug.user_pending = 0'; AND ug.user_pending = 0';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
if (!isset($address['group'][$row['group_id']])) if (!isset($address['group'][$row['group_id']]))
@ -1331,7 +1331,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
AND u.user_id = ug.user_id AND u.user_id = ug.user_id
AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')'; AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')';
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc'; $field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc';
@ -1506,7 +1506,7 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
foreach ($data['attachment_data'] as $pos => $attach_row) foreach ($data['attachment_data'] as $pos => $attach_row)
{ {
if ($attach_row['is_orphan'] && !in_array($attach_row['attach_id'], array_keys($orphan_rows))) if ($attach_row['is_orphan'] && !isset($orphan_rows[$attach_row['attach_id']]))
{ {
continue; continue;
} }

View file

@ -488,7 +488,8 @@ class custom_profile
else if ($day && $month && $year) else if ($day && $month && $year)
{ {
global $user; global $user;
return $user->format_date(mktime(0, 0, 0, $month, $day, $year), $user->lang['DATE_FORMAT'], true); // d/m/y 00:00 GMT isn't necessarily on the same d/m/y in the user's timezone, so add the timezone seconds
return $user->format_date(gmmktime(0, 0, 0, $month, $day, $year) + $user->timezone + $user->dst, $user->lang['DATE_FORMAT'], true);
} }
return $value; return $value;
@ -666,7 +667,7 @@ class custom_profile
} }
$profile_row['s_year_options'] = '<option value="0"' . ((!$year) ? ' selected="selected"' : '') . '>--</option>'; $profile_row['s_year_options'] = '<option value="0"' . ((!$year) ? ' selected="selected"' : '') . '>--</option>';
for ($i = $now['year'] - 100; $i <= $now['year']; $i++) for ($i = $now['year'] - 100; $i <= $now['year'] + 100; $i++)
{ {
$profile_row['s_year_options'] .= '<option value="' . $i . '"' . (($i == $year) ? ' selected="selected"' : '') . ">$i</option>"; $profile_row['s_year_options'] .= '<option value="' . $i . '"' . (($i == $year) ? ' selected="selected"' : '') . ">$i</option>";
} }
@ -871,13 +872,13 @@ class custom_profile
} }
else else
{ {
$var = request_var($var_name, $profile_row['field_default_value']); $var = request_var($var_name, (int) $profile_row['field_default_value']);
} }
break; break;
case FIELD_STRING: case FIELD_STRING:
case FIELD_TEXT: case FIELD_TEXT:
$var = utf8_normalize_nfc(request_var($var_name, $profile_row['field_default_value'], true)); $var = utf8_normalize_nfc(request_var($var_name, (string) $profile_row['field_default_value'], true));
break; break;
case FIELD_INT: case FIELD_INT:
@ -887,10 +888,14 @@ class custom_profile
} }
else else
{ {
$var = request_var($var_name, $profile_row['field_default_value']); $var = request_var($var_name, (int) $profile_row['field_default_value']);
} }
break; break;
case FIELD_DROPDOWN:
$var = request_var($var_name, (int) $profile_row['field_default_value']);
break;
default: default:
$var = request_var($var_name, $profile_row['field_default_value']); $var = request_var($var_name, $profile_row['field_default_value']);
break; break;

View file

@ -386,8 +386,8 @@ class filespec
// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form // Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
if ($this->upload->max_filesize && ($this->get('filesize') > $this->upload->max_filesize || $this->filesize == 0)) if ($this->upload->max_filesize && ($this->get('filesize') > $this->upload->max_filesize || $this->filesize == 0))
{ {
$size_lang = ($this->upload->max_filesize >= 1048576) ? $user->lang['MB'] : (($this->upload->max_filesize >= 1024) ? $user->lang['KB'] : $user->lang['BYTES'] ); $size_lang = ($this->upload->max_filesize >= 1048576) ? $user->lang['MIB'] : (($this->upload->max_filesize >= 1024) ? $user->lang['KIB'] : $user->lang['BYTES'] );
$max_filesize = ($this->upload->max_filesize >= 1048576) ? round($this->upload->max_filesize / 1048576 * 100) / 100 : (($this->upload->max_filesize >= 1024) ? round($this->upload->max_filesize / 1024 * 100) / 100 : $this->upload->max_filesize); $max_filesize = get_formatted_filesize($this->upload->max_filesize, false);
$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang); $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang);
@ -777,8 +777,8 @@ class fileupload
break; break;
case 2: case 2:
$size_lang = ($this->max_filesize >= 1048576) ? $user->lang['MB'] : (($this->max_filesize >= 1024) ? $user->lang['KB'] : $user->lang['BYTES'] ); $size_lang = ($this->max_filesize >= 1048576) ? $user->lang['MIB'] : (($this->max_filesize >= 1024) ? $user->lang['KIB'] : $user->lang['BYTES']);
$max_filesize = ($this->max_filesize >= 1048576) ? round($this->max_filesize / 1048576 * 100) / 100 : (($this->max_filesize >= 1024) ? round($this->max_filesize / 1024 * 100) / 100 : $this->max_filesize); $max_filesize = get_formatted_filesize($this->max_filesize, false);
$error = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang); $error = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang);
break; break;
@ -813,8 +813,8 @@ class fileupload
// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form // Filesize is too big or it's 0 if it was larger than the maxsize in the upload form
if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0)) if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0))
{ {
$size_lang = ($this->max_filesize >= 1048576) ? $user->lang['MB'] : (($this->max_filesize >= 1024) ? $user->lang['KB'] : $user->lang['BYTES'] ); $size_lang = ($this->max_filesize >= 1048576) ? $user->lang['MIB'] : (($this->max_filesize >= 1024) ? $user->lang['KIB'] : $user->lang['BYTES']);
$max_filesize = ($this->max_filesize >= 1048576) ? round($this->max_filesize / 1048576 * 100) / 100 : (($this->max_filesize >= 1024) ? round($this->max_filesize / 1024 * 100) / 100 : $this->max_filesize); $max_filesize = get_formatted_filesize($this->max_filesize, false);
$file->error[] = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang); $file->error[] = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize, $size_lang);
} }

View file

@ -137,10 +137,17 @@ function user_update_name($old_name, $new_name)
{ {
set_config('newest_username', $new_name, true); set_config('newest_username', $new_name, true);
} }
// Because some tables/caches use username-specific data we need to purge this here.
$cache->destroy('sql', MODERATOR_CACHE_TABLE);
} }
/** /**
* Add User * Adds an user
*
* @param mixed $user_row An array containing the following keys (and the appropriate values): username, group_id (the group to place the user in), user_email and the user_type(usually 0). Additional entries not overridden by defaults will be forwarded.
* @param string $cp_data custom profile fields, see custom_profile::build_insert_sql_array
* @return: the new user's ID.
*/ */
function user_add($user_row, $cp_data = false) function user_add($user_row, $cp_data = false)
{ {
@ -216,7 +223,7 @@ function user_add($user_row, $cp_data = false)
'user_sig' => '', 'user_sig' => '',
'user_sig_bbcode_uid' => '', 'user_sig_bbcode_uid' => '',
'user_sig_bbcode_bitfield' => '', 'user_sig_bbcode_bitfield' => '',
'user_form_salt' => unique_id(), 'user_form_salt' => unique_id(),
); );
@ -278,7 +285,7 @@ function user_add($user_row, $cp_data = false)
$sql = 'SELECT group_colour $sql = 'SELECT group_colour
FROM ' . GROUPS_TABLE . ' FROM ' . GROUPS_TABLE . '
WHERE group_id = ' . $user_row['group_id']; WHERE group_id = ' . (int) $user_row['group_id'];
$result = $db->sql_query_limit($sql, 1); $result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -374,7 +381,7 @@ function user_delete($mode, $user_id, $post_username = false)
{ {
avatar_delete('user', $user_row); avatar_delete('user', $user_row);
} }
switch ($mode) switch ($mode)
{ {
case 'retain': case 'retain':
@ -982,7 +989,7 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
'ban_give_reason' => (string) $ban_give_reason, 'ban_give_reason' => (string) $ban_give_reason,
); );
} }
$db->sql_multi_insert(BANLIST_TABLE, $sql_ary); $db->sql_multi_insert(BANLIST_TABLE, $sql_ary);
// If we are banning we want to logout anyone matching the ban // If we are banning we want to logout anyone matching the ban
@ -1260,6 +1267,45 @@ function validate_num($num, $optional = false, $min = 0, $max = 1E99)
return false; return false;
} }
/**
* Validate Date
* @param String $string a date in the dd-mm-yyyy format
* @return boolean
*/
function validate_date($date_string, $optional = false)
{
$date = explode('-', $date_string);
if ((empty($date) || sizeof($date) != 3) && $optional)
{
return false;
}
else if ($optional)
{
for ($field = 0; $field <= 1; $field++)
{
$date[$field] = (int) $date[$field];
if (empty($date[$field]))
{
$date[$field] = 1;
}
}
$date[2] = (int) $date[2];
// assume an arbitrary leap year
if (empty($date[2]))
{
$date[2] = 1980;
}
}
if (sizeof($date) != 3 || !checkdate($date[1], $date[0], $date[2]))
{
return 'INVALID';
}
return false;
}
/** /**
* Validate Match * Validate Match
* *
@ -1433,20 +1479,6 @@ function validate_username($username, $allowed_username = false)
} }
} }
$sql = 'SELECT word
FROM ' . WORDS_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
if (preg_match('#(' . str_replace('\*', '.*?', preg_quote($row['word'], '#')) . ')#i', $username))
{
$db->sql_freeresult($result);
return 'USERNAME_DISALLOWED';
}
}
$db->sql_freeresult($result);
return false; return false;
} }
@ -1819,7 +1851,7 @@ function avatar_delete($mode, $row, $clean_db = false)
return false; return false;
} }
} }
if ($clean_db) if ($clean_db)
{ {
avatar_remove_db($row[$mode . '_avatar']); avatar_remove_db($row[$mode . '_avatar']);
@ -1931,7 +1963,7 @@ function avatar_upload($data, &$error)
{ {
$file = $upload->remote_upload($data['uploadurl']); $file = $upload->remote_upload($data['uploadurl']);
} }
$prefix = $config['avatar_salt'] . '_'; $prefix = $config['avatar_salt'] . '_';
$file->clean_filename('avatar', $prefix, $data['user_id']); $file->clean_filename('avatar', $prefix, $data['user_id']);
@ -1968,7 +2000,7 @@ function get_avatar_filename($avatar_entry)
{ {
global $config; global $config;
if ($avatar_entry[0] === 'g') if ($avatar_entry[0] === 'g')
{ {
$avatar_group = true; $avatar_group = true;
@ -2014,7 +2046,7 @@ function avatar_gallery($category, $avatar_select, $items_per_column, $block_var
if ($file[0] != '.' && preg_match('#^[^&"\'<>]+$#i', $file) && is_dir("$path/$file")) if ($file[0] != '.' && preg_match('#^[^&"\'<>]+$#i', $file) && is_dir("$path/$file"))
{ {
$avatar_row_count = $avatar_col_count = 0; $avatar_row_count = $avatar_col_count = 0;
if ($dp2 = @opendir("$path/$file")) if ($dp2 = @opendir("$path/$file"))
{ {
while (($sub_file = readdir($dp2)) !== false) while (($sub_file = readdir($dp2)) !== false)
@ -2094,7 +2126,7 @@ function avatar_gallery($category, $avatar_select, $items_per_column, $block_var
function avatar_get_dimensions($avatar, $avatar_type, &$error, $current_x = 0, $current_y = 0) function avatar_get_dimensions($avatar, $avatar_type, &$error, $current_x = 0, $current_y = 0)
{ {
global $config, $phpbb_root_path, $user; global $config, $phpbb_root_path, $user;
switch ($avatar_type) switch ($avatar_type)
{ {
case AVATAR_REMOTE : case AVATAR_REMOTE :
@ -2103,7 +2135,7 @@ function avatar_get_dimensions($avatar, $avatar_type, &$error, $current_x = 0, $
case AVATAR_UPLOAD : case AVATAR_UPLOAD :
$avatar = $phpbb_root_path . $config['avatar_path'] . '/' . get_avatar_filename($avatar); $avatar = $phpbb_root_path . $config['avatar_path'] . '/' . get_avatar_filename($avatar);
break; break;
case AVATAR_GALLERY : case AVATAR_GALLERY :
$avatar = $phpbb_root_path . $config['avatar_gallery_path'] . '/' . $avatar ; $avatar = $phpbb_root_path . $config['avatar_gallery_path'] . '/' . $avatar ;
break; break;
@ -2121,7 +2153,7 @@ function avatar_get_dimensions($avatar, $avatar_type, &$error, $current_x = 0, $
$error[] = $user->lang['AVATAR_NO_SIZE']; $error[] = $user->lang['AVATAR_NO_SIZE'];
return false; return false;
} }
// try to maintain ratio // try to maintain ratio
if (!(empty($current_x) && empty($current_y))) if (!(empty($current_x) && empty($current_y)))
{ {
@ -2220,7 +2252,7 @@ function avatar_process_user(&$error, $custom_userdata = false)
else if (!empty($userdata['user_avatar'])) else if (!empty($userdata['user_avatar']))
{ {
// Only update the dimensions // Only update the dimensions
if (empty($data['width']) || empty($data['height'])) if (empty($data['width']) || empty($data['height']))
{ {
if ($dims = avatar_get_dimensions($userdata['user_avatar'], $userdata['user_avatar_type'], $error, $data['width'], $data['height'])) if ($dims = avatar_get_dimensions($userdata['user_avatar'], $userdata['user_avatar_type'], $error, $data['width'], $data['height']))
@ -2326,13 +2358,13 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
{ {
$error[] = (!utf8_strlen($name)) ? $user->lang['GROUP_ERR_USERNAME'] : $user->lang['GROUP_ERR_USER_LONG']; $error[] = (!utf8_strlen($name)) ? $user->lang['GROUP_ERR_USERNAME'] : $user->lang['GROUP_ERR_USER_LONG'];
} }
$err = group_validate_groupname($group_id, $name); $err = group_validate_groupname($group_id, $name);
if (!empty($err)) if (!empty($err))
{ {
$error[] = $user->lang[$err]; $error[] = $user->lang[$err];
} }
if (!in_array($type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN, GROUP_SPECIAL, GROUP_FREE))) if (!in_array($type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN, GROUP_SPECIAL, GROUP_FREE)))
{ {
$error[] = $user->lang['GROUP_ERR_TYPE']; $error[] = $user->lang['GROUP_ERR_TYPE'];
@ -2466,7 +2498,7 @@ function group_correct_avatar($group_id, $old_entry)
$old_filename = get_avatar_filename($old_entry); $old_filename = get_avatar_filename($old_entry);
$new_filename = $config['avatar_salt'] . "_g$group_id.$ext"; $new_filename = $config['avatar_salt'] . "_g$group_id.$ext";
$new_entry = 'g' . $group_id . '_' . substr(time(), -5) . ".$ext"; $new_entry = 'g' . $group_id . '_' . substr(time(), -5) . ".$ext";
$avatar_path = $phpbb_root_path . $config['avatar_path']; $avatar_path = $phpbb_root_path . $config['avatar_path'];
if (@rename($avatar_path . '/'. $old_filename, $avatar_path . '/' . $new_filename)) if (@rename($avatar_path . '/'. $old_filename, $avatar_path . '/' . $new_filename))
{ {
@ -2484,7 +2516,7 @@ function group_correct_avatar($group_id, $old_entry)
function avatar_remove_db($avatar_name) function avatar_remove_db($avatar_name)
{ {
global $config, $db; global $config, $db;
$sql = 'UPDATE ' . USERS_TABLE . " $sql = 'UPDATE ' . USERS_TABLE . "
SET user_avatar = '', SET user_avatar = '',
user_avatar_type = 0 user_avatar_type = 0
@ -2814,7 +2846,7 @@ function remove_default_avatar($group_id, $user_ids)
return false; return false;
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
$sql = 'UPDATE ' . USERS_TABLE . " $sql = 'UPDATE ' . USERS_TABLE . "
SET user_avatar = '', SET user_avatar = '',
user_avatar_type = 0, user_avatar_type = 0,
@ -2823,7 +2855,7 @@ function remove_default_avatar($group_id, $user_ids)
WHERE group_id = " . (int) $group_id . " WHERE group_id = " . (int) $group_id . "
AND user_avatar = '" . $db->sql_escape($row['group_avatar']) . "' AND user_avatar = '" . $db->sql_escape($row['group_avatar']) . "'
AND " . $db->sql_in_set('user_id', $user_ids); AND " . $db->sql_in_set('user_id', $user_ids);
$db->sql_query($sql); $db->sql_query($sql);
} }
@ -3025,7 +3057,7 @@ function group_validate_groupname($group_id, $group_name)
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
if ($row) if ($row)
{ {
return 'GROUP_NAME_TAKEN'; return 'GROUP_NAME_TAKEN';
@ -3088,7 +3120,7 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
} }
// Before we update the user attributes, we will make a list of those having now the group avatar assigned // Before we update the user attributes, we will make a list of those having now the group avatar assigned
if (in_array('user_avatar', array_keys($sql_ary))) if (isset($sql_ary['user_avatar']))
{ {
// Ok, get the original avatar data from users having an uploaded one (we need to remove these from the filesystem) // Ok, get the original avatar data from users having an uploaded one (we need to remove these from the filesystem)
$sql = 'SELECT user_id, group_id, user_avatar $sql = 'SELECT user_id, group_id, user_avatar
@ -3114,7 +3146,7 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
WHERE ' . $db->sql_in_set('user_id', $user_id_ary); WHERE ' . $db->sql_in_set('user_id', $user_id_ary);
$db->sql_query($sql); $db->sql_query($sql);
if (in_array('user_colour', array_keys($sql_ary))) if (isset($sql_ary['user_colour']))
{ {
// Update any cached colour information for these users // Update any cached colour information for these users
$sql = 'UPDATE ' . FORUMS_TABLE . " SET forum_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "' $sql = 'UPDATE ' . FORUMS_TABLE . " SET forum_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'

View file

@ -146,8 +146,8 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$read_tracking_join = $read_tracking_select = ''; $read_tracking_join = $read_tracking_select = '';
} }
$sql = "SELECT t.*$read_tracking_select $sql = "SELECT t.topic_id
FROM " . TOPICS_TABLE . " t $read_tracking_join FROM " . TOPICS_TABLE . " t
WHERE t.forum_id IN($forum_id, 0) WHERE t.forum_id IN($forum_id, 0)
" . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1') . " " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1') . "
$limit_time_sql $limit_time_sql
@ -155,10 +155,21 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$result = $db->sql_query_limit($sql, $topics_per_page, $start); $result = $db->sql_query_limit($sql, $topics_per_page, $start);
$topic_list = $topic_tracking_info = array(); $topic_list = $topic_tracking_info = array();
while ($row = $db->sql_fetchrow($result))
{
$topic_list[] = $row['topic_id'];
}
$db->sql_freeresult($result);
$sql = "SELECT t.*$read_tracking_select
FROM " . TOPICS_TABLE . " t $read_tracking_join
WHERE " . $db->sql_in_set('t.topic_id', $topic_list);
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result)) while ($row = $db->sql_fetchrow($result))
{ {
$topic_rows[$row['topic_id']] = $row; $topic_rows[$row['topic_id']] = $row;
$topic_list[] = $row['topic_id'];
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -181,10 +192,12 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
} }
} }
foreach ($topic_rows as $topic_id => $row) foreach ($topic_list as $topic_id)
{ {
$topic_title = ''; $topic_title = '';
$row = &$topic_rows[$topic_id];
$replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies']; $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
if ($row['topic_status'] == ITEM_MOVED) if ($row['topic_status'] == ITEM_MOVED)

View file

@ -186,7 +186,7 @@ class mcp_reports
$template->assign_vars(array( $template->assign_vars(array(
'S_MCP_REPORT' => true, 'S_MCP_REPORT' => true,
'S_CLOSE_ACTION' => $this->u_action . '&amp;p=' . $post_id . '&amp;f=' . $forum_id, 'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']), 'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'], 'S_POST_REPORTED' => $post_info['post_reported'],
'S_POST_UNAPPROVED' => !$post_info['post_approved'], 'S_POST_UNAPPROVED' => !$post_info['post_approved'],

View file

@ -198,7 +198,7 @@ class bbcode_firstpass extends bbcode
if (!$this->check_bbcode('size', $in)) if (!$this->check_bbcode('size', $in))
{ {
return ''; return $in;
} }
if ($config['max_' . $this->mode . '_font_size'] && $config['max_' . $this->mode . '_font_size'] < $stx) if ($config['max_' . $this->mode . '_font_size'] && $config['max_' . $this->mode . '_font_size'] < $stx)
@ -224,7 +224,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('color', $in)) if (!$this->check_bbcode('color', $in))
{ {
return ''; return $in;
} }
return '[color=' . $stx . ':' . $this->bbcode_uid . ']' . $in . '[/color:' . $this->bbcode_uid . ']'; return '[color=' . $stx . ':' . $this->bbcode_uid . ']' . $in . '[/color:' . $this->bbcode_uid . ']';
@ -237,7 +237,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('u', $in)) if (!$this->check_bbcode('u', $in))
{ {
return ''; return $in;
} }
return '[u:' . $this->bbcode_uid . ']' . $in . '[/u:' . $this->bbcode_uid . ']'; return '[u:' . $this->bbcode_uid . ']' . $in . '[/u:' . $this->bbcode_uid . ']';
@ -250,7 +250,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('b', $in)) if (!$this->check_bbcode('b', $in))
{ {
return ''; return $in;
} }
return '[b:' . $this->bbcode_uid . ']' . $in . '[/b:' . $this->bbcode_uid . ']'; return '[b:' . $this->bbcode_uid . ']' . $in . '[/b:' . $this->bbcode_uid . ']';
@ -263,7 +263,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('i', $in)) if (!$this->check_bbcode('i', $in))
{ {
return ''; return $in;
} }
return '[i:' . $this->bbcode_uid . ']' . $in . '[/i:' . $this->bbcode_uid . ']'; return '[i:' . $this->bbcode_uid . ']' . $in . '[/i:' . $this->bbcode_uid . ']';
@ -278,7 +278,7 @@ class bbcode_firstpass extends bbcode
if (!$this->check_bbcode('img', $in)) if (!$this->check_bbcode('img', $in))
{ {
return ''; return $in;
} }
$in = trim($in); $in = trim($in);
@ -340,7 +340,7 @@ class bbcode_firstpass extends bbcode
if (!$this->check_bbcode('flash', $in)) if (!$this->check_bbcode('flash', $in))
{ {
return ''; return $in;
} }
$in = trim($in); $in = trim($in);
@ -377,7 +377,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('attachment', $in)) if (!$this->check_bbcode('attachment', $in))
{ {
return ''; return $in;
} }
return '[attachment=' . $stx . ':' . $this->bbcode_uid . ']<!-- ia' . $stx . ' -->' . trim($in) . '<!-- ia' . $stx . ' -->[/attachment:' . $this->bbcode_uid . ']'; return '[attachment=' . $stx . ':' . $this->bbcode_uid . ']<!-- ia' . $stx . ' -->' . trim($in) . '<!-- ia' . $stx . ' -->[/attachment:' . $this->bbcode_uid . ']';
@ -457,7 +457,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('code', $in)) if (!$this->check_bbcode('code', $in))
{ {
return ''; return $in;
} }
// We remove the hardcoded elements from the code block here because it is not used in code blocks // We remove the hardcoded elements from the code block here because it is not used in code blocks
@ -550,7 +550,7 @@ class bbcode_firstpass extends bbcode
{ {
if (!$this->check_bbcode('list', $in)) if (!$this->check_bbcode('list', $in))
{ {
return ''; return $in;
} }
// $tok holds characters to stop at. Since the string starts with a '[' we'll get everything up to the first ']' which should be the opening [list] tag // $tok holds characters to stop at. Since the string starts with a '[' we'll get everything up to the first ']' which should be the opening [list] tag
@ -684,7 +684,8 @@ class bbcode_firstpass extends bbcode
* #14667 - [quote]test[/quote] test ] and [ test [quote]test[/quote] (correct: parsed) * #14667 - [quote]test[/quote] test ] and [ test [quote]test[/quote] (correct: parsed)
* #14770 - [quote="["]test[/quote] (correct: parsed) * #14770 - [quote="["]test[/quote] (correct: parsed)
* [quote="[i]test[/i]"]test[/quote] (correct: parsed) * [quote="[i]test[/i]"]test[/quote] (correct: parsed)
* [quote="[quote]test[/quote]"]test[/quote] (correct: NOT parsed) * [quote="[quote]test[/quote]"]test[/quote] (correct: parsed - Username displayed as [quote]test[/quote])
* #20735 - [quote]test[/[/b]quote] test [/quote][/quote] test - (correct: quoted: "test[/[/b]quote] test" / non-quoted: "[/quote] test" - also failed if layout distorted)
*/ */
$in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); $in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in)));
@ -737,7 +738,7 @@ class bbcode_firstpass extends bbcode
$out .= ' '; $out .= ' ';
}*/ }*/
} }
else if (preg_match('#^quote(?:=&quot;(.*?)&quot;)?$#is', $buffer, $m)) else if (preg_match('#^quote(?:=&quot;(.*?)&quot;)?$#is', $buffer, $m) && substr($out, -1, 1) == '[')
{ {
$this->parsed_items['quote']++; $this->parsed_items['quote']++;
@ -913,9 +914,14 @@ class bbcode_firstpass extends bbcode
$url = ($var1) ? $var1 : $var2; $url = ($var1) ? $var1 : $var2;
if (!$url || ($var1 && !$var2)) if ($var1 && !$var2)
{ {
return ''; $var2 = $var1;
}
if (!$url)
{
return '[url' . (($var1) ? '=' . $var1 : '') . ']' . $var2 . '[/url]';
} }
$valid = false; $valid = false;
@ -978,7 +984,7 @@ class bbcode_firstpass extends bbcode
// Is the user trying to link to a php file in this domain and script path? // Is the user trying to link to a php file in this domain and script path?
if (strpos($url, ".{$phpEx}") !== false && strpos($url, $check_path) !== false) if (strpos($url, ".{$phpEx}") !== false && strpos($url, $check_path) !== false)
{ {
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); $server_name = $user->host;
// Forcing server vars is the only way to specify/override the protocol // Forcing server vars is the only way to specify/override the protocol
if ($config['force_server_vars'] || !$server_name) if ($config['force_server_vars'] || !$server_name)
@ -1079,19 +1085,19 @@ class parse_message extends bbcode_firstpass
if ($config['max_' . $mode . '_chars'] > 0) if ($config['max_' . $mode . '_chars'] > 0)
{ {
$msg_len = ($mode == 'post') ? utf8_strlen($this->message) : utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message)); $msg_len = ($mode == 'post') ? utf8_strlen($this->message) : utf8_strlen(preg_replace('#\[\/?[a-z\*\+\-]+(=[\S]+)?\]#ius', ' ', $this->message));
if ((!$msg_len && $mode !== 'sig') || $config['max_' . $mode . '_chars'] && $msg_len > $config['max_' . $mode . '_chars']) if ((!$msg_len && $mode !== 'sig') || $config['max_' . $mode . '_chars'] && $msg_len > $config['max_' . $mode . '_chars'])
{ {
$this->warn_msg[] = (!$msg_len) ? $user->lang['TOO_FEW_CHARS'] : sprintf($user->lang['TOO_MANY_CHARS_' . strtoupper($mode)], $msg_len, $config['max_' . $mode . '_chars']); $this->warn_msg[] = (!$msg_len) ? $user->lang['TOO_FEW_CHARS'] : sprintf($user->lang['TOO_MANY_CHARS_' . strtoupper($mode)], $msg_len, $config['max_' . $mode . '_chars']);
return $this->warn_msg; return (!$update_this_message) ? $return_message : $this->warn_msg;
} }
} }
// Check for "empty" message // Check for "empty" message
if ($mode !== 'sig' && !utf8_clean_string($this->message)) if ($mode !== 'sig' && utf8_clean_string($this->message) === '')
{ {
$this->warn_msg[] = $user->lang['TOO_FEW_CHARS']; $this->warn_msg[] = $user->lang['TOO_FEW_CHARS'];
return $this->warn_msg; return (!$update_this_message) ? $return_message : $this->warn_msg;
} }
// Prepare BBcode (just prepares some tags for better parsing) // Prepare BBcode (just prepares some tags for better parsing)
@ -1140,7 +1146,7 @@ class parse_message extends bbcode_firstpass
if ($config['max_' . $mode . '_urls'] && $num_urls > $config['max_' . $mode . '_urls']) if ($config['max_' . $mode . '_urls'] && $num_urls > $config['max_' . $mode . '_urls'])
{ {
$this->warn_msg[] = sprintf($user->lang['TOO_MANY_URLS'], $config['max_' . $mode . '_urls']); $this->warn_msg[] = sprintf($user->lang['TOO_MANY_URLS'], $config['max_' . $mode . '_urls']);
return $this->warn_msg; return (!$update_this_message) ? $return_message : $this->warn_msg;
} }
if (!$update_this_message) if (!$update_this_message)
@ -1249,7 +1255,7 @@ class parse_message extends bbcode_firstpass
$match = $replace = array(); $match = $replace = array();
// NOTE: obtain_* function? chaching the table contents? // NOTE: obtain_* function? chaching the table contents?
// For now setting the ttl to 10 minutes // For now setting the ttl to 10 minutes
switch ($db->sql_layer) switch ($db->sql_layer)
{ {
@ -1259,7 +1265,7 @@ class parse_message extends bbcode_firstpass
FROM ' . SMILIES_TABLE . ' FROM ' . SMILIES_TABLE . '
ORDER BY LEN(code) DESC'; ORDER BY LEN(code) DESC';
break; break;
case 'firebird': case 'firebird':
$sql = 'SELECT * $sql = 'SELECT *
FROM ' . SMILIES_TABLE . ' FROM ' . SMILIES_TABLE . '
@ -1597,7 +1603,6 @@ class parse_message extends bbcode_firstpass
$this->message = $poll['poll_option_text']; $this->message = $poll['poll_option_text'];
$bbcode_bitfield = $this->bbcode_bitfield; $bbcode_bitfield = $this->bbcode_bitfield;
$poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false); $poll['poll_option_text'] = $this->parse($poll['enable_bbcode'], ($config['allow_post_links']) ? $poll['enable_urls'] : false, $poll['enable_smilies'], $poll['img_status'], false, false, $config['allow_post_links'], false);
$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield)); $bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));

View file

@ -129,7 +129,8 @@ class session
'script_path' => str_replace(' ', '%20', htmlspecialchars($script_path)), 'script_path' => str_replace(' ', '%20', htmlspecialchars($script_path)),
'root_script_path' => str_replace(' ', '%20', htmlspecialchars($root_script_path)), 'root_script_path' => str_replace(' ', '%20', htmlspecialchars($root_script_path)),
'page' => $page 'page' => $page,
'forum' => (isset($_REQUEST['f']) && $_REQUEST['f'] > 0) ? (int) $_REQUEST['f'] : 0,
); );
return $page_array; return $page_array;
@ -158,7 +159,7 @@ class session
$this->update_session_page = $update_session_page; $this->update_session_page = $update_session_page;
$this->browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : ''; $this->browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : '';
$this->forwarded_for = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? (string) $_SERVER['HTTP_X_FORWARDED_FOR'] : ''; $this->forwarded_for = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? (string) $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
$this->host = (!empty($_SERVER['HTTP_HOST'])) ? (string) $_SERVER['HTTP_HOST'] : 'localhost'; $this->host = (!empty($_SERVER['HTTP_HOST'])) ? (string) strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
$this->page = $this->extract_current_page($phpbb_root_path); $this->page = $this->extract_current_page($phpbb_root_path);
// if the forwarded for header shall be checked we have to validate its contents // if the forwarded for header shall be checked we have to validate its contents
@ -179,9 +180,10 @@ class session
} }
} }
} }
else
// Add forum to the page for tracking online users - also adding a "x" to the end to properly identify the number {
$this->page['page'] .= (isset($_REQUEST['f'])) ? ((strpos($this->page['page'], '?') !== false) ? '&' : '?') . '_f_=' . (int) $_REQUEST['f'] . 'x' : ''; $this->forwarded_for = '';
}
if (isset($_COOKIE[$config['cookie_name'] . '_sid']) || isset($_COOKIE[$config['cookie_name'] . '_u'])) if (isset($_COOKIE[$config['cookie_name'] . '_sid']) || isset($_COOKIE[$config['cookie_name'] . '_u']))
{ {
@ -256,8 +258,8 @@ class session
$u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check'])); $u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check']));
} }
$s_browser = ($config['browser_check']) ? strtolower(substr($this->data['session_browser'], 0, 149)) : ''; $s_browser = ($config['browser_check']) ? trim(strtolower(substr($this->data['session_browser'], 0, 149))) : '';
$u_browser = ($config['browser_check']) ? strtolower(substr($this->browser, 0, 149)) : ''; $u_browser = ($config['browser_check']) ? trim(strtolower(substr($this->browser, 0, 149))) : '';
$s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : ''; $s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : '';
$u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : ''; $u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : '';
@ -306,6 +308,7 @@ class session
if ($this->update_session_page) if ($this->update_session_page)
{ {
$sql_ary['session_page'] = substr($this->page['page'], 0, 199); $sql_ary['session_page'] = substr($this->page['page'], 0, 199);
$sql_ary['session_forum_id'] = $this->page['forum'];
} }
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
@ -526,8 +529,8 @@ class session
$u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check'])); $u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check']));
} }
$s_browser = ($config['browser_check']) ? strtolower(substr($this->data['session_browser'], 0, 149)) : ''; $s_browser = ($config['browser_check']) ? trim(strtolower(substr($this->data['session_browser'], 0, 149))) : '';
$u_browser = ($config['browser_check']) ? strtolower(substr($this->browser, 0, 149)) : ''; $u_browser = ($config['browser_check']) ? trim(strtolower(substr($this->browser, 0, 149))) : '';
$s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : ''; $s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : '';
$u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : ''; $u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : '';
@ -546,6 +549,7 @@ class session
if ($this->update_session_page) if ($this->update_session_page)
{ {
$sql_ary['session_page'] = substr($this->page['page'], 0, 199); $sql_ary['session_page'] = substr($this->page['page'], 0, 199);
$sql_ary['session_forum_id'] = $this->page['forum'];
} }
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
@ -579,7 +583,7 @@ class session
'session_start' => (int) $this->time_now, 'session_start' => (int) $this->time_now,
'session_last_visit' => (int) $this->data['session_last_visit'], 'session_last_visit' => (int) $this->data['session_last_visit'],
'session_time' => (int) $this->time_now, 'session_time' => (int) $this->time_now,
'session_browser' => (string) substr($this->browser, 0, 149), 'session_browser' => (string) trim(substr($this->browser, 0, 149)),
'session_forwarded_for' => (string) $this->forwarded_for, 'session_forwarded_for' => (string) $this->forwarded_for,
'session_ip' => (string) $this->ip, 'session_ip' => (string) $this->ip,
'session_autologin' => ($session_autologin) ? 1 : 0, 'session_autologin' => ($session_autologin) ? 1 : 0,
@ -590,6 +594,7 @@ class session
if ($this->update_session_page) if ($this->update_session_page)
{ {
$sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199); $sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199);
$sql_ary['session_forum_id'] = $this->page['forum'];
} }
$db->sql_return_on_error(true); $db->sql_return_on_error(true);
@ -604,6 +609,8 @@ class session
// Limit new sessions in 1 minute period (if required) // Limit new sessions in 1 minute period (if required)
if (empty($this->data['session_time']) && $config['active_sessions']) if (empty($this->data['session_time']) && $config['active_sessions'])
{ {
// $db->sql_return_on_error(false);
$sql = 'SELECT COUNT(session_id) AS sessions $sql = 'SELECT COUNT(session_id) AS sessions
FROM ' . SESSIONS_TABLE . ' FROM ' . SESSIONS_TABLE . '
WHERE session_time >= ' . ($this->time_now - 60); WHERE session_time >= ' . ($this->time_now - 60);
@ -619,10 +626,15 @@ class session
} }
} }
// Since we re-create the session id here, the inserted row must be unique. Therefore, we display potential errors.
// Commented out because it will not allow forums to update correctly
// $db->sql_return_on_error(false);
$this->session_id = $this->data['session_id'] = md5(unique_id()); $this->session_id = $this->data['session_id'] = md5(unique_id());
$sql_ary['session_id'] = (string) $this->session_id; $sql_ary['session_id'] = (string) $this->session_id;
$sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199); $sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199);
$sql_ary['session_forum_id'] = $this->page['forum'];
$sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql); $db->sql_query($sql);
@ -649,11 +661,11 @@ class session
$this->set_cookie('sid', $this->session_id, $cookie_expire); $this->set_cookie('sid', $this->session_id, $cookie_expire);
unset($cookie_expire); unset($cookie_expire);
$sql = 'SELECT COUNT(session_id) AS sessions $sql = 'SELECT COUNT(session_id) AS sessions
FROM ' . SESSIONS_TABLE . ' FROM ' . SESSIONS_TABLE . '
WHERE session_user_id = ' . (int) $this->data['user_id'] . ' WHERE session_user_id = ' . (int) $this->data['user_id'] . '
AND session_time >= ' . ($this->time_now - $config['form_token_lifetime']); AND session_time >= ' . (int) ($this->time_now - (max($config['session_length'], $config['form_token_lifetime'])));
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
@ -777,7 +789,7 @@ class session
global $db, $config; global $db, $config;
$batch_size = 10; $batch_size = 10;
if (!$this->time_now) if (!$this->time_now)
{ {
$this->time_now = time(); $this->time_now = time();
@ -825,7 +837,7 @@ class session
// Less than 10 users, update gc timer ... else we want gc // Less than 10 users, update gc timer ... else we want gc
// called again to delete other sessions // called again to delete other sessions
set_config('session_last_gc', $this->time_now, true); set_config('session_last_gc', $this->time_now, true);
if ($config['max_autologin_time']) if ($config['max_autologin_time'])
{ {
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
@ -834,14 +846,14 @@ class session
} }
$this->confirm_gc(); $this->confirm_gc();
} }
return; return;
} }
function confirm_gc($type = 0) function confirm_gc($type = 0)
{ {
global $db, $config; global $db, $config;
$sql = 'SELECT DISTINCT c.session_id $sql = 'SELECT DISTINCT c.session_id
FROM ' . CONFIRM_TABLE . ' c FROM ' . CONFIRM_TABLE . ' c
LEFT JOIN ' . SESSIONS_TABLE . ' s ON (c.session_id = s.session_id) LEFT JOIN ' . SESSIONS_TABLE . ' s ON (c.session_id = s.session_id)
@ -867,12 +879,16 @@ class session
} }
$db->sql_freeresult($result); $db->sql_freeresult($result);
} }
/** /**
* Sets a cookie * Sets a cookie
* *
* Sets a cookie of the given name with the specified data for the given length of time. * Sets a cookie of the given name with the specified data for the given length of time. If no time is specified, a session cookie will be set.
*
* @param string $name Name of the cookie, will be automatically prefixed with the phpBB cookie name. track becomes [cookie_name]_track then.
* @param string $cookiedata The data to hold within the cookie
* @param int $cookietime The expiration time as UNIX timestamp. If 0 is provided, a session cookie is set.
*/ */
function set_cookie($name, $cookiedata, $cookietime) function set_cookie($name, $cookiedata, $cookietime)
{ {
@ -882,7 +898,7 @@ class session
$expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime); $expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);
$domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain']; $domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain'];
header('Set-Cookie: ' . $name_data . '; expires=' . $expire . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false); header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);
} }
/** /**
@ -1477,6 +1493,7 @@ class user extends session
$sql = 'SELECT image_name, image_filename, image_lang, image_height, image_width $sql = 'SELECT image_name, image_filename, image_lang, image_height, image_width
FROM ' . STYLES_IMAGESET_DATA_TABLE . ' FROM ' . STYLES_IMAGESET_DATA_TABLE . '
WHERE imageset_id = ' . $this->theme['imageset_id'] . " WHERE imageset_id = ' . $this->theme['imageset_id'] . "
AND image_filename <> ''
AND image_lang IN ('" . $db->sql_escape($this->img_lang) . "', '')"; AND image_lang IN ('" . $db->sql_escape($this->img_lang) . "', '')";
$result = $db->sql_query($sql, 3600); $result = $db->sql_query($sql, 3600);

View file

@ -150,7 +150,7 @@ class ucp_attachments
'FILENAME' => $row['real_filename'], 'FILENAME' => $row['real_filename'],
'COMMENT' => bbcode_nl2br($row['attach_comment']), 'COMMENT' => bbcode_nl2br($row['attach_comment']),
'EXTENSION' => $row['extension'], 'EXTENSION' => $row['extension'],
'SIZE' => ($row['filesize'] >= 1048576) ? ($row['filesize'] >> 20) . ' ' . $user->lang['MB'] : (($row['filesize'] >= 1024) ? ($row['filesize'] >> 10) . ' ' . $user->lang['KB'] : $row['filesize'] . ' ' . $user->lang['BYTES']), 'SIZE' => get_formatted_filesize($row['filesize']),
'DOWNLOAD_COUNT' => $row['download_count'], 'DOWNLOAD_COUNT' => $row['download_count'],
'POST_TIME' => $user->format_date($row['filetime']), 'POST_TIME' => $user->format_date($row['filetime']),
'TOPIC_TITLE' => ($row['in_message']) ? $row['message_title'] : $row['topic_title'], 'TOPIC_TITLE' => ($row['in_message']) ? $row['message_title'] : $row['topic_title'],

View file

@ -127,6 +127,18 @@ class ucp_groups
} }
list(, $row) = each($row); list(, $row) = each($row);
$sql = 'SELECT group_type
FROM ' . GROUPS_TABLE . '
WHERE group_id = ' . $group_id;
$result = $db->sql_query($sql);
$group_type = (int) $db->sql_fetchfield('group_type');
$db->sql_freeresult($result);
if ($group_type != GROUP_OPEN && $group_type != GROUP_FREE)
{
trigger_error($user->lang['CANNOT_RESIGN_GROUP'] . $return_page);
}
if (confirm_box(true)) if (confirm_box(true))
{ {
group_user_del($group_id, $user->data['user_id']); group_user_del($group_id, $user->data['user_id']);
@ -697,8 +709,8 @@ class ucp_groups
'U_SWATCH' => append_sid("{$phpbb_root_path}adm/swatch.$phpEx", 'form=ucp&amp;name=group_colour'), 'U_SWATCH' => append_sid("{$phpbb_root_path}adm/swatch.$phpEx", 'form=ucp&amp;name=group_colour'),
'S_UCP_ACTION' => $this->u_action . "&amp;action=$action&amp;g=$group_id", 'S_UCP_ACTION' => $this->u_action . "&amp;action=$action&amp;g=$group_id",
'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024))) 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
); ));
break; break;
@ -1002,6 +1014,8 @@ class ucp_groups
{ {
trigger_error($user->lang[$error] . $return_page); trigger_error($user->lang[$error] . $return_page);
} }
trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));
} }
else else
{ {
@ -1016,7 +1030,7 @@ class ucp_groups
confirm_box(false, sprintf($user->lang['GROUP_CONFIRM_ADD_USER' . ((sizeof($name_ary) == 1) ? '' : 'S')], implode(', ', $name_ary)), build_hidden_fields($s_hidden_fields)); confirm_box(false, sprintf($user->lang['GROUP_CONFIRM_ADD_USER' . ((sizeof($name_ary) == 1) ? '' : 'S')], implode(', ', $name_ary)), build_hidden_fields($s_hidden_fields));
} }
trigger_error($user->lang['GROUP_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>')); trigger_error($user->lang['NO_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));
break; break;

View file

@ -92,7 +92,7 @@ class ucp_pm
{ {
if ($user->data['user_new_privmsg']) if ($user->data['user_new_privmsg'])
{ {
$l_new_message = ($user->data['user_new_privmsg'] == 1 ) ? $user->lang['YOU_NEW_PM'] : $user->lang['YOU_NEW_PMS']; $l_new_message = ($user->data['user_new_privmsg'] == 1) ? $user->lang['YOU_NEW_PM'] : $user->lang['YOU_NEW_PMS'];
} }
else else
{ {

View file

@ -465,7 +465,8 @@ function compose_pm($id, $mode, $action)
'forum_id' => 0, 'forum_id' => 0,
'save_time' => $current_time, 'save_time' => $current_time,
'draft_subject' => $subject, 'draft_subject' => $subject,
'draft_message' => $message) 'draft_message' => $message
)
); );
$db->sql_query($sql); $db->sql_query($sql);
@ -488,18 +489,20 @@ function compose_pm($id, $mode, $action)
'g' => $to_group_id, 'g' => $to_group_id,
'p' => $msg_id) 'p' => $msg_id)
); );
$s_hidden_fields .= build_address_field($address_list);
confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields); confirm_box(false, 'SAVE_DRAFT', $s_hidden_fields);
} }
} }
else else
{ {
if (!$subject || !utf8_clean_string($subject)) if (utf8_clean_string($subject) === '')
{ {
$error[] = $user->lang['EMPTY_MESSAGE_SUBJECT']; $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
} }
if (!$message) if (utf8_clean_string($message) === '')
{ {
$error[] = $user->lang['TOO_FEW_CHARS']; $error[] = $user->lang['TOO_FEW_CHARS'];
} }
@ -541,7 +544,7 @@ function compose_pm($id, $mode, $action)
if ($submit || $preview || $refresh) if ($submit || $preview || $refresh)
{ {
if (!check_form_key('ucp_pm_compose')) if (($submit || $preview) && !check_form_key('ucp_pm_compose'))
{ {
$error[] = $user->lang['FORM_INVALID']; $error[] = $user->lang['FORM_INVALID'];
} }
@ -600,7 +603,7 @@ function compose_pm($id, $mode, $action)
// Subject defined // Subject defined
if ($submit) if ($submit)
{ {
if (!$subject || !utf8_clean_string($subject)) if (utf8_clean_string($subject) === '')
{ {
$error[] = $user->lang['EMPTY_MESSAGE_SUBJECT']; $error[] = $user->lang['EMPTY_MESSAGE_SUBJECT'];
} }
@ -888,15 +891,9 @@ function compose_pm($id, $mode, $action)
} }
// Build hidden address list // Build hidden address list
$s_hidden_address_field = ''; $s_hidden_address_field = build_address_field($address_list);
foreach ($address_list as $type => $adr_ary)
{
foreach ($adr_ary as $id => $field)
{
$s_hidden_address_field .= '<input type="hidden" name="address_list[' . (($type == 'u') ? 'u' : 'g') . '][' . (int) $id . ']" value="' . (($field == 'to') ? 'to' : 'bcc') . '" />';
}
}
$bbcode_checked = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1); $bbcode_checked = (isset($enable_bbcode)) ? !$enable_bbcode : (($config['allow_bbcode'] && $auth->acl_get('u_pm_bbcode')) ? !$user->optionget('bbcode') : 1);
$smilies_checked = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1); $smilies_checked = (isset($enable_smilies)) ? !$enable_smilies : (($config['allow_smilies'] && $auth->acl_get('u_pm_smilies')) ? !$user->optionget('smilies') : 1);
$urls_checked = (isset($enable_urls)) ? !$enable_urls : 0; $urls_checked = (isset($enable_urls)) ? !$enable_urls : 0;
@ -1117,6 +1114,22 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
} }
} }
/**
* Build the hidden field for the recipients. Needed, as the variable is not read via request_var.
*/
function build_address_field($address_list)
{
$s_hidden_address_field = '';
foreach ($address_list as $type => $adr_ary)
{
foreach ($adr_ary as $id => $field)
{
$s_hidden_address_field .= '<input type="hidden" name="address_list[' . (($type == 'u') ? 'u' : 'g') . '][' . (int) $id . ']" value="' . (($field == 'to') ? 'to' : 'bcc') . '" />';
}
}
return $s_hidden_address_field;
}
/** /**
* Return number of private message recipients * Return number of private message recipients
*/ */

View file

@ -114,7 +114,7 @@ class ucp_prefs
$s_custom = false; $s_custom = false;
$dateformat_options .= '<option value="custom"'; $dateformat_options .= '<option value="custom"';
if (!in_array($data['dateformat'], array_keys($user->lang['dateformats']))) if (!isset($user->lang['dateformats'][$data['dateformat']]))
{ {
$dateformat_options .= ' selected="selected"'; $dateformat_options .= ' selected="selected"';
$s_custom = true; $s_custom = true;

View file

@ -295,6 +295,7 @@ class ucp_profile
$data['bday_day'] = request_var('bday_day', $data['bday_day']); $data['bday_day'] = request_var('bday_day', $data['bday_day']);
$data['bday_month'] = request_var('bday_month', $data['bday_month']); $data['bday_month'] = request_var('bday_month', $data['bday_month']);
$data['bday_year'] = request_var('bday_year', $data['bday_year']); $data['bday_year'] = request_var('bday_year', $data['bday_year']);
$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
} }
add_form_key('ucp_profile_info'); add_form_key('ucp_profile_info');
@ -325,6 +326,7 @@ class ucp_profile
'bday_day' => array('num', true, 1, 31), 'bday_day' => array('num', true, 1, 31),
'bday_month' => array('num', true, 1, 12), 'bday_month' => array('num', true, 1, 12),
'bday_year' => array('num', true, 1901, gmdate('Y', time()) + 50), 'bday_year' => array('num', true, 1901, gmdate('Y', time()) + 50),
'user_birthday' => array('date', true),
)); ));
} }
@ -359,7 +361,7 @@ class ucp_profile
if ($config['allow_birthdays']) if ($config['allow_birthdays'])
{ {
$sql_ary['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']); $sql_ary['user_birthday'] = $data['user_birthday'];
} }
$sql = 'UPDATE ' . USERS_TABLE . ' $sql = 'UPDATE ' . USERS_TABLE . '
@ -592,8 +594,8 @@ class ucp_profile
'S_FORM_ENCTYPE' => ($can_upload) ? ' enctype="multipart/form-data"' : '', 'S_FORM_ENCTYPE' => ($can_upload) ? ' enctype="multipart/form-data"' : '',
'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)),) 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
); ));
if ($display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) if ($display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local'])
{ {

View file

@ -43,14 +43,6 @@ class ucp_register
$submit = (isset($_POST['submit'])) ? true : false; $submit = (isset($_POST['submit'])) ? true : false;
$change_lang = request_var('change_lang', ''); $change_lang = request_var('change_lang', '');
$user_lang = request_var('lang', $user->lang_name); $user_lang = request_var('lang', $user->lang_name);
// not so fast, buddy
if (($submit && !check_form_key('ucp_register', false, '', false, $config['min_time_reg']))
|| (!$submit && !check_form_key('ucp_register_terms', false, '', false, $config['min_time_terms'])))
{
$agreed = false;
}
if ($agreed) if ($agreed)
{ {
@ -92,7 +84,7 @@ class ucp_register
$error = $cp_data = $cp_error = array(); $error = $cp_data = $cp_error = array();
//
if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable'])) if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
{ {
$add_lang = ($change_lang) ? '&amp;change_lang=' . urlencode($change_lang) : ''; $add_lang = ($change_lang) ? '&amp;change_lang=' . urlencode($change_lang) : '';
@ -103,12 +95,13 @@ class ucp_register
// If we change the language, we want to pass on some more possible parameter. // If we change the language, we want to pass on some more possible parameter.
if ($change_lang) if ($change_lang)
{ {
// We do not include the password! // We do not include the password
$s_hidden_fields = array_merge($s_hidden_fields, array( $s_hidden_fields = array_merge($s_hidden_fields, array(
'username' => utf8_normalize_nfc(request_var('username', '', true)), 'username' => utf8_normalize_nfc(request_var('username', '', true)),
'email' => strtolower(request_var('email', '')), 'email' => strtolower(request_var('email', '')),
'email_confirm' => strtolower(request_var('email_confirm', '')), 'email_confirm' => strtolower(request_var('email_confirm', '')),
'confirm_code' => request_var('confirm_code', ''), 'confirm_code' => request_var('confirm_code', ''),
'confirm_id' => request_var('confirm_id', ''),
'lang' => $user->lang_name, 'lang' => $user->lang_name,
'tz' => request_var('tz', (float) $config['board_timezone']), 'tz' => request_var('tz', (float) $config['board_timezone']),
)); ));
@ -141,7 +134,6 @@ class ucp_register
'S_REGISTRATION' => true, 'S_REGISTRATION' => true,
'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields), 'S_HIDDEN_FIELDS' => build_hidden_fields($s_hidden_fields),
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang . $add_coppa), 'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register' . $add_lang . $add_coppa),
'S_TIME' => 1000 * ((int) $config['min_time_terms']),
) )
); );
} }
@ -200,7 +192,10 @@ class ucp_register
'tz' => array('num', false, -14, 14), 'tz' => array('num', false, -14, 14),
'lang' => array('match', false, '#^[a-z_\-]{2,}$#i'), 'lang' => array('match', false, '#^[a-z_\-]{2,}$#i'),
)); ));
if (!check_form_key('ucp_register'))
{
$error[] = $user->lang['FORM_INVALID'];
}
// Replace "error" strings with their real, localised form // Replace "error" strings with their real, localised form
$error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error); $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
@ -451,13 +446,32 @@ class ucp_register
$confirm_image = ''; $confirm_image = '';
// Visual Confirmation - Show images // Visual Confirmation - Show images
if ($config['enable_confirm']) if ($config['enable_confirm'])
{ {
$str = ''; if ($change_lang)
if (!$change_lang) {
$str = '&amp;change_lang=' . $change_lang;
$sql = 'SELECT code
FROM ' . CONFIRM_TABLE . "
WHERE confirm_id = '" . $db->sql_escape($confirm_id) . "'
AND session_id = '" . $db->sql_escape($user->session_id) . "'
AND confirm_type = " . CONFIRM_REG;
$result = $db->sql_query($sql);
if (!$row = $db->sql_fetchrow($result))
{
$confirm_id = '';
}
$db->sql_freeresult($result);
}
else
{
$str = '';
}
if (!$change_lang || !$confirm_id)
{ {
$user->confirm_gc(CONFIRM_REG); $user->confirm_gc(CONFIRM_REG);
$sql = 'SELECT COUNT(session_id) AS attempts $sql = 'SELECT COUNT(session_id) AS attempts
FROM ' . CONFIRM_TABLE . " FROM ' . CONFIRM_TABLE . "
WHERE session_id = '" . $db->sql_escape($user->session_id) . "' WHERE session_id = '" . $db->sql_escape($user->session_id) . "'
@ -487,11 +501,6 @@ class ucp_register
); );
$db->sql_query($sql); $db->sql_query($sql);
} }
else
{
$str .= '&amp;change_lang=' . $change_lang;
}
$confirm_image = '<img src="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=confirm&amp;id=' . $confirm_id . '&amp;type=' . CONFIRM_REG . $str) . '" alt="" title="" />'; $confirm_image = '<img src="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=confirm&amp;id=' . $confirm_id . '&amp;type=' . CONFIRM_REG . $str) . '" alt="" title="" />';
$s_hidden_fields .= '<input type="hidden" name="confirm_id" value="' . $confirm_id . '" />'; $s_hidden_fields .= '<input type="hidden" name="confirm_id" value="' . $confirm_id . '" />';
} }
@ -529,7 +538,6 @@ class ucp_register
'S_COPPA' => $coppa, 'S_COPPA' => $coppa,
'S_HIDDEN_FIELDS' => $s_hidden_fields, 'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'), 'S_UCP_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
'S_TIME' => 1000 * ((int) $config['min_time_reg']),
) )
); );

View file

@ -482,14 +482,16 @@ if (!$get_info)
array('topic_moved_id', 0, ''), array('topic_moved_id', 0, ''),
array('topic_type', 'topics.topic_type', 'phpbb_convert_topic_type'), array('topic_type', 'topics.topic_type', 'phpbb_convert_topic_type'),
array('topic_first_post_id', 'topics.topic_first_post_id', ''), array('topic_first_post_id', 'topics.topic_first_post_id', ''),
array('topic_last_view_time', 'posts.post_time', ''),
array('poll_title', 'vote_desc.vote_text', array('function1' => 'null_to_str', 'function2' => 'phpbb_set_encoding', 'function3' => 'utf8_htmlspecialchars')), array('poll_title', 'vote_desc.vote_text', array('function1' => 'null_to_str', 'function2' => 'phpbb_set_encoding', 'function3' => 'utf8_htmlspecialchars')),
array('poll_start', 'vote_desc.vote_start', 'null_to_zero'), array('poll_start', 'vote_desc.vote_start', 'null_to_zero'),
array('poll_length', 'vote_desc.vote_length', 'null_to_zero'), array('poll_length', 'vote_desc.vote_length', 'null_to_zero'),
array('poll_max_options', 1, ''), array('poll_max_options', 1, ''),
array('poll_vote_change', 0, ''), array('poll_vote_change', 0, ''),
'left_join' => 'topics LEFT JOIN vote_desc ON topics.topic_id = vote_desc.topic_id AND topics.topic_vote = 1', 'left_join' => array ( 'topics LEFT JOIN vote_desc ON topics.topic_id = vote_desc.topic_id AND topics.topic_vote = 1',
'topics LEFT JOIN posts ON topics.topic_last_post_id = posts.post_id',
),
'where' => 'topics.topic_moved_id = 0', 'where' => 'topics.topic_moved_id = 0',
), ),

View file

@ -455,7 +455,7 @@ function phpbb_get_birthday($birthday = '')
{ {
$birthday = (int) $birthday; $birthday = (int) $birthday;
if (!$birthday || $birthday == 999999 || $birthday < 0) if (!$birthday || $birthday == 999999 || ((version_compare(PHP_VERSION, '5.1.0') < 0) && $birthday < 0))
{ {
return ' 0- 0- 0'; return ' 0- 0- 0';
} }

View file

@ -8,9 +8,9 @@
* *
*/ */
$updates_to_version = '3.0.0'; $updates_to_version = '3.0.1-RC1';
// Return if we "just include it" to find out for which version the database update is responsuble for // Return if we "just include it" to find out for which version the database update is responsible for
if (defined('IN_PHPBB') && defined('IN_INSTALL')) if (defined('IN_PHPBB') && defined('IN_INSTALL'))
{ {
return; return;
@ -473,6 +473,29 @@ $database_update_info = array(
), ),
), ),
), ),
// Changes from 3.0.0 to the next version
'3.0.0' => array(
// Add the following columns
'add_columns' => array(
FORUMS_TABLE => array(
'display_subforum_list' => array('BOOL', 1),
),
SESSIONS_TABLE => array(
'session_forum_id' => array('UINT', 0),
),
),
'add_index' => array(
SESSIONS_TABLE => array(
'session_forum_id' => array('session_forum_id'),
),
GROUPS_TABLE => array(
'group_legend_name' => array('group_legend', 'group_name'),
),
),
'drop_keys' => array(
GROUPS_TABLE => array('group_legend'),
),
),
); );
// Determine mapping database type // Determine mapping database type
@ -616,6 +639,9 @@ if (version_compare($current_version, '3.0.RC8', '<='))
$modify_users = request_var('modify_users', array(0 => '')); $modify_users = request_var('modify_users', array(0 => ''));
$new_usernames = request_var('new_usernames', array(0 => ''), true); $new_usernames = request_var('new_usernames', array(0 => ''), true);
// We need this file if someone wants to edit usernames.
include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
if (!class_exists('utf_new_normalizer')) if (!class_exists('utf_new_normalizer'))
{ {
if (!file_exists($phpbb_root_path . 'install/data/new_normalizer.' . $phpEx)) if (!file_exists($phpbb_root_path . 'install/data/new_normalizer.' . $phpEx))
@ -1547,6 +1573,34 @@ if (version_compare($current_version, '3.0.RC5', '<='))
$no_updates = false; $no_updates = false;
} }
if (version_compare($current_version, '3.0.0', '<='))
{
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_last_view_time = topic_last_post_time
WHERE topic_last_view_time = 0";
_sql($sql, $errored, $error_ary);
// Update smiley sizes
$smileys = array('icon_e_surprised.gif', 'icon_eek.gif', 'icon_cool.gif', 'icon_lol.gif', 'icon_mad.gif', 'icon_razz.gif', 'icon_redface.gif', 'icon_cry.gif', 'icon_evil.gif', 'icon_twisted.gif', 'icon_rolleyes.gif', 'icon_exclaim.gif', 'icon_question.gif', 'icon_idea.gif', 'icon_arrow.gif', 'icon_neutral.gif', 'icon_mrgreen.gif', 'icon_e_ugeek.gif');
foreach ($smileys as $smiley)
{
if (file_exists($phpbb_root_path . 'images/smilies/' . $smiley))
{
list($width, $height) = getimagesize($phpbb_root_path . 'images/smilies/' . $smiley);
$sql = 'UPDATE ' . SMILIES_TABLE . '
SET smiley_width = ' . $width . ', smiley_height = ' . $height . "
WHERE smiley_url = '" . $db->sql_escape($smiley) . "'";
_sql($sql, $errored, $error_ary);
}
}
// TODO: remove all form token min times
$no_updates = false;
}
_write_result($no_updates, $errored, $error_ary); _write_result($no_updates, $errored, $error_ary);
$error_ary = array(); $error_ary = array();

View file

@ -450,7 +450,7 @@ class module
global $db, $template; global $db, $template;
$template->display('body'); $template->display('body');
// Close our DB connection. // Close our DB connection.
if (!empty($db) && is_object($db)) if (!empty($db) && is_object($db))
{ {
@ -493,7 +493,8 @@ class module
*/ */
function redirect($page) function redirect($page)
{ {
$server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); // HTTP_HOST is having the correct browser url in most cases...
$server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
$server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'); $server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
$secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0; $secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
@ -511,7 +512,11 @@ class module
if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80))) if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
{ {
$url .= ':' . $server_port; // HTTP HOST can carry a port number...
if (strpos($server_name, ':') === false)
{
$url .= ':' . $server_port;
}
} }
$url .= $script_path . '/' . $page; $url .= $script_path . '/' . $page;
@ -535,7 +540,7 @@ class module
$l_cat = (!empty($lang['CAT_' . $cat])) ? $lang['CAT_' . $cat] : preg_replace('#_#', ' ', $cat); $l_cat = (!empty($lang['CAT_' . $cat])) ? $lang['CAT_' . $cat] : preg_replace('#_#', ' ', $cat);
$cat = strtolower($cat); $cat = strtolower($cat);
$url = $this->module_url . "?mode=$cat&amp;language=$language"; $url = $this->module_url . "?mode=$cat&amp;language=$language";
if ($this->mode == $cat) if ($this->mode == $cat)
{ {
$template->assign_block_vars('t_block1', array( $template->assign_block_vars('t_block1', array(

View file

@ -407,7 +407,7 @@ class install_convert extends module
$error = array(); $error = array();
if ($submit) if ($submit)
{ {
if (!file_exists('./../' . $forum_path . '/' . $test_file)) if (!@file_exists('./../' . $forum_path . '/' . $test_file))
{ {
$error[] = sprintf($lang['COULD_NOT_FIND_PATH'], $forum_path); $error[] = sprintf($lang['COULD_NOT_FIND_PATH'], $forum_path);
} }
@ -422,8 +422,7 @@ class install_convert extends module
} }
else else
{ {
$src_dbpasswd = htmlspecialchars_decode($src_dbpasswd); $connect_test = connect_check_db(true, $error, $available_dbms[$src_dbms], $src_table_prefix, $src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, true, ($src_dbms == $dbms) ? false : true, false);
$connect_test = connect_check_db(true, $error, $available_dbms[$src_dbms], $src_table_prefix, $src_dbhost, $src_dbuser, $src_dbpasswd, $src_dbname, $src_dbport, true, ($src_dbms == $dbms) ? false : true, false);
} }
// The forum prefix of the old and the new forum can only be the same if two different databases are used. // The forum prefix of the old and the new forum can only be the same if two different databases are used.
@ -443,7 +442,7 @@ class install_convert extends module
{ {
$sql_db = 'dbal_' . $src_dbms; $sql_db = 'dbal_' . $src_dbms;
$src_db = new $sql_db(); $src_db = new $sql_db();
$src_db->sql_connect($src_dbhost, $src_dbuser, $src_dbpasswd, $src_dbname, $src_dbport, false, true); $src_db->sql_connect($src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd), $src_dbname, $src_dbport, false, true);
$same_db = false; $same_db = false;
} }
else else
@ -666,7 +665,7 @@ class install_convert extends module
} }
$sql_db = 'dbal_' . $convert->src_dbms; $sql_db = 'dbal_' . $convert->src_dbms;
$src_db = new $sql_db(); $src_db = new $sql_db();
$src_db->sql_connect($convert->src_dbhost, $convert->src_dbuser, $convert->src_dbpasswd, $convert->src_dbname, $convert->src_dbport, false, true); $src_db->sql_connect($convert->src_dbhost, $convert->src_dbuser, htmlspecialchars_decode($convert->src_dbpasswd), $convert->src_dbname, $convert->src_dbport, false, true);
$same_db = false; $same_db = false;
} }
else else
@ -1219,7 +1218,7 @@ class install_convert extends module
$template->assign_block_vars('checks', array( $template->assign_block_vars('checks', array(
'TITLE' => "skip_rows = $skip_rows", 'TITLE' => "skip_rows = $skip_rows",
'RESULT' => $rows . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' KB' : ''), 'RESULT' => $rows . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] : ''),
)); ));
$mtime = explode(' ', microtime()); $mtime = explode(' ', microtime());
@ -1490,7 +1489,7 @@ class install_convert extends module
sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true); sync('topic', 'range', 'topic_id BETWEEN ' . $sync_batch . ' AND ' . $end, true, true);
$template->assign_block_vars('checks', array( $template->assign_block_vars('checks', array(
'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' KB]' : ''), 'TITLE' => sprintf($user->lang['SYNC_TOPIC_ID'], $sync_batch, ($sync_batch + $batch_size)) . ((defined('DEBUG_EXTRA') && function_exists('memory_get_usage')) ? ' [' . ceil(memory_get_usage()/1024) . ' ' . $user->lang['KIB'] . ']' : ''),
'RESULT' => $user->lang['DONE'], 'RESULT' => $user->lang['DONE'],
)); ));

View file

@ -77,7 +77,7 @@ class install_install extends module
case 'database': case 'database':
$this->obtain_database_settings($mode, $sub); $this->obtain_database_settings($mode, $sub);
break; break;
case 'administrator': case 'administrator':
@ -87,7 +87,7 @@ class install_install extends module
case 'config_file': case 'config_file':
$this->create_config_file($mode, $sub); $this->create_config_file($mode, $sub);
break; break;
case 'advanced': case 'advanced':
@ -105,7 +105,7 @@ class install_install extends module
$this->add_language($mode, $sub); $this->add_language($mode, $sub);
$this->add_bots($mode, $sub); $this->add_bots($mode, $sub);
$this->email_admin($mode, $sub); $this->email_admin($mode, $sub);
// Remove the lock file // Remove the lock file
@unlink($phpbb_root_path . 'cache/install_lock'); @unlink($phpbb_root_path . 'cache/install_lock');
@ -151,7 +151,7 @@ class install_install extends module
// We also give feedback on whether we're running in safe mode // We also give feedback on whether we're running in safe mode
$result = '<strong style="color:green">' . $lang['YES']; $result = '<strong style="color:green">' . $lang['YES'];
if (@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'on') if (@ini_get('safe_mode') == '1' || strtolower(@ini_get('safe_mode')) == 'on')
{ {
$result .= ', ' . $lang['PHP_SAFE_MODE']; $result .= ', ' . $lang['PHP_SAFE_MODE'];
} }
@ -184,8 +184,8 @@ class install_install extends module
'S_EXPLAIN' => true, 'S_EXPLAIN' => true,
'S_LEGEND' => false, 'S_LEGEND' => false,
)); ));
// Check for url_fopen // Check for url_fopen
if (@ini_get('allow_url_fopen') == '1' || strtolower(@ini_get('allow_url_fopen')) == 'on') if (@ini_get('allow_url_fopen') == '1' || strtolower(@ini_get('allow_url_fopen')) == 'on')
{ {
@ -204,8 +204,8 @@ class install_install extends module
'S_EXPLAIN' => true, 'S_EXPLAIN' => true,
'S_LEGEND' => false, 'S_LEGEND' => false,
)); ));
// Check for getimagesize // Check for getimagesize
if (@function_exists('getimagesize')) if (@function_exists('getimagesize'))
{ {
@ -551,7 +551,7 @@ class install_install extends module
} }
else else
{ {
$connect_test = connect_check_db(true, $error, $available_dbms[$data['dbms']], $data['table_prefix'], $data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport']); $connect_test = connect_check_db(true, $error, $available_dbms[$data['dbms']], $data['table_prefix'], $data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport']);
} }
$template->assign_block_vars('checks', array( $template->assign_block_vars('checks', array(
@ -802,7 +802,7 @@ class install_install extends module
$s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />'; $s_hidden_fields .= '<input type="hidden" name="' . $config_key . '" value="' . $data[$config_key] . '" />';
} }
} }
$s_hidden_fields .= ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; $s_hidden_fields .= ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
$s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
@ -884,21 +884,30 @@ class install_install extends module
// Time to convert the data provided into a config file // Time to convert the data provided into a config file
$config_data = "<?php\n"; $config_data = "<?php\n";
$config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n"; $config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n";
$config_data .= "\$dbms = '" . $available_dbms[$data['dbms']]['DRIVER'] . "';\n";
$config_data .= "\$dbhost = '{$data['dbhost']}';\n"; $config_data_array = array(
$config_data .= "\$dbport = '{$data['dbport']}';\n"; 'dbms' => $available_dbms[$data['dbms']]['DRIVER'],
$config_data .= "\$dbname = '{$data['dbname']}';\n"; 'dbhost' => $data['dbhost'],
$config_data .= "\$dbuser = '{$data['dbuser']}';\n"; 'dbport' => $data['dbport'],
$config_data .= "\$dbpasswd = '{$data['dbpasswd']}';\n\n"; 'dbname' => $data['dbname'],
$config_data .= "\$table_prefix = '{$data['table_prefix']}';\n"; 'dbuser' => $data['dbuser'],
// $config_data .= "\$acm_type = '" . (($acm_type) ? $acm_type : 'file') . "';\n"; 'dbpasswd' => htmlspecialchars_decode($data['dbpasswd']),
$config_data .= "\$acm_type = 'file';\n"; 'table_prefix' => $data['table_prefix'],
$config_data .= "\$load_extensions = '$load_extensions';\n\n"; 'acm_type' => 'file',
$config_data .= "@define('PHPBB_INSTALLED', true);\n"; 'load_extensions' => $load_extensions,
);
foreach ($config_data_array as $key => $value)
{
$config_data .= "\${$key} = '" . str_replace("'", "\\'", str_replace('\\', '\\\\', $value)) . "';\n";
}
unset($config_data_array);
$config_data .= "\n@define('PHPBB_INSTALLED', true);\n";
$config_data .= "// @define('DEBUG', true);\n"; $config_data .= "// @define('DEBUG', true);\n";
$config_data .= "// @define('DEBUG_EXTRA', true);\n"; $config_data .= "// @define('DEBUG_EXTRA', true);\n";
$config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused! $config_data .= '?' . '>'; // Done this to prevent highlighting editors getting confused!
// Attempt to write out the config file directly. If it works, this is the easiest way to do it ... // Attempt to write out the config file directly. If it works, this is the easiest way to do it ...
if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && is_writable($phpbb_root_path . 'config.' . $phpEx)) || is_writable($phpbb_root_path)) if ((file_exists($phpbb_root_path . 'config.' . $phpEx) && is_writable($phpbb_root_path . 'config.' . $phpEx)) || is_writable($phpbb_root_path))
{ {
@ -1009,8 +1018,11 @@ class install_install extends module
$s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : ''; $s_hidden_fields = ($data['img_imagick']) ? '<input type="hidden" name="img_imagick" value="' . addslashes($data['img_imagick']) . '" />' : '';
$s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />'; $s_hidden_fields .= '<input type="hidden" name="language" value="' . $data['language'] . '" />';
// HTTP_HOST is having the correct browser url in most cases...
$server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
$data['email_enable'] = ($data['email_enable'] !== '') ? $data['email_enable'] : true; $data['email_enable'] = ($data['email_enable'] !== '') ? $data['email_enable'] : true;
$data['server_name'] = ($data['server_name'] !== '') ? $data['server_name'] : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME')); $data['server_name'] = ($data['server_name'] !== '') ? $data['server_name'] : $server_name;
$data['server_port'] = ($data['server_port'] !== '') ? $data['server_port'] : ((!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT')); $data['server_port'] = ($data['server_port'] !== '') ? $data['server_port'] : ((!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT'));
$data['server_protocol'] = ($data['server_protocol'] !== '') ? $data['server_protocol'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://'); $data['server_protocol'] = ($data['server_protocol'] !== '') ? $data['server_protocol'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://');
$data['cookie_secure'] = ($data['cookie_secure'] !== '') ? $data['cookie_secure'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? true : false); $data['cookie_secure'] = ($data['cookie_secure'] !== '') ? $data['cookie_secure'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? true : false);
@ -1100,7 +1112,9 @@ class install_install extends module
$this->p_master->redirect("index.$phpEx?mode=install"); $this->p_master->redirect("index.$phpEx?mode=install");
} }
$cookie_domain = ($data['server_name'] != '') ? $data['server_name'] : (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'); // HTTP_HOST is having the correct browser url in most cases...
$server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
$cookie_domain = ($data['server_name'] != '') ? $data['server_name'] : $server_name;
// Try to come up with the best solution for cookie domain... // Try to come up with the best solution for cookie domain...
if (strpos($cookie_domain, 'www.') === 0) if (strpos($cookie_domain, 'www.') === 0)
@ -1124,7 +1138,7 @@ class install_install extends module
// Instantiate the database // Instantiate the database
$db = new $sql_db(); $db = new $sql_db();
$db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false); $db->sql_connect($data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport'], false, false);
// NOTE: trigger_error does not work here. // NOTE: trigger_error does not work here.
$db->sql_return_on_error(true); $db->sql_return_on_error(true);
@ -1305,11 +1319,11 @@ class install_install extends module
'UPDATE ' . $data['table_prefix'] . "config 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . $db->sql_escape($data['admin_name']) . "' SET config_value = '" . $db->sql_escape($data['admin_name']) . "'
WHERE config_name = 'newest_username'", WHERE config_name = 'newest_username'",
'UPDATE ' . $data['table_prefix'] . "config 'UPDATE ' . $data['table_prefix'] . "config
SET config_value = '" . md5(mt_rand()) . "' SET config_value = '" . md5(mt_rand()) . "'
WHERE config_name = 'avatar_salt'", WHERE config_name = 'avatar_salt'",
'UPDATE ' . $data['table_prefix'] . "users 'UPDATE ' . $data['table_prefix'] . "users
SET username = '" . $db->sql_escape($data['admin_name']) . "', user_password='" . $db->sql_escape(md5($data['admin_pass1'])) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($data['default_lang']) . "', user_email='" . $db->sql_escape($data['board_email1']) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . (crc32($data['board_email1']) . strlen($data['board_email1'])) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($data['admin_name'])) . "' SET username = '" . $db->sql_escape($data['admin_name']) . "', user_password='" . $db->sql_escape(md5($data['admin_pass1'])) . "', user_ip = '" . $db->sql_escape($user_ip) . "', user_lang = '" . $db->sql_escape($data['default_lang']) . "', user_email='" . $db->sql_escape($data['board_email1']) . "', user_dateformat='" . $db->sql_escape($lang['default_dateformat']) . "', user_email_hash = " . (crc32($data['board_email1']) . strlen($data['board_email1'])) . ", username_clean = '" . $db->sql_escape(utf8_clean_string($data['admin_name'])) . "'
WHERE username = 'Admin'", WHERE username = 'Admin'",
@ -1408,7 +1422,7 @@ class install_install extends module
// Instantiate the database // Instantiate the database
$db = new $sql_db(); $db = new $sql_db();
$db->sql_connect($data['dbhost'], $data['dbuser'], $data['dbpasswd'], $data['dbname'], $data['dbport'], false, false); $db->sql_connect($data['dbhost'], $data['dbuser'], htmlspecialchars_decode($data['dbpasswd']), $data['dbname'], $data['dbport'], false, false);
// NOTE: trigger_error does not work here. // NOTE: trigger_error does not work here.
$db->sql_return_on_error(true); $db->sql_return_on_error(true);
@ -1568,7 +1582,7 @@ class install_install extends module
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 4); $_module->move_module_by($row, 'move_up', 4);
// Move permissions intro screen module 4 up... // Move permissions intro screen module 4 up...
@ -1580,7 +1594,7 @@ class install_install extends module
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 4); $_module->move_module_by($row, 'move_up', 4);
// Move manage users screen module 5 up... // Move manage users screen module 5 up...
@ -1592,7 +1606,7 @@ class install_install extends module
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 5); $_module->move_module_by($row, 'move_up', 5);
} }
@ -1607,7 +1621,7 @@ class install_install extends module
$result = $db->sql_query($sql); $result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result); $row = $db->sql_fetchrow($result);
$db->sql_freeresult($result); $db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 4); $_module->move_module_by($row, 'move_down', 4);
} }
@ -1688,7 +1702,7 @@ class install_install extends module
if (is_dir($path) && file_exists($path . '/iso.txt')) if (is_dir($path) && file_exists($path . '/iso.txt'))
{ {
$lang_file = file("{$phpbb_root_path}language/$path/iso.txt"); $lang_file = file("$path/iso.txt");
$lang_pack = array( $lang_pack = array(
'lang_iso' => basename($path), 'lang_iso' => basename($path),
@ -1832,7 +1846,7 @@ class install_install extends module
'user_dateformat' => $lang['default_dateformat'], 'user_dateformat' => $lang['default_dateformat'],
'user_allow_massemail' => 0, 'user_allow_massemail' => 0,
); );
$user_id = user_add($user_row); $user_id = user_add($user_row);
if (!$user_id) if (!$user_id)
@ -1948,7 +1962,7 @@ class install_install extends module
'dbhost' => request_var('dbhost', ''), 'dbhost' => request_var('dbhost', ''),
'dbport' => request_var('dbport', ''), 'dbport' => request_var('dbport', ''),
'dbuser' => request_var('dbuser', ''), 'dbuser' => request_var('dbuser', ''),
'dbpasswd' => htmlspecialchars_decode(request_var('dbpasswd', '', true)), 'dbpasswd' => request_var('dbpasswd', '', true),
'dbname' => request_var('dbname', ''), 'dbname' => request_var('dbname', ''),
'table_prefix' => request_var('table_prefix', ''), 'table_prefix' => request_var('table_prefix', ''),
'default_lang' => basename(request_var('default_lang', '')), 'default_lang' => basename(request_var('default_lang', '')),

View file

@ -53,7 +53,7 @@ class install_update extends module
{ {
var $p_master; var $p_master;
var $update_info; var $update_info;
var $old_location; var $old_location;
var $new_location; var $new_location;
var $latest_version; var $latest_version;
@ -764,7 +764,7 @@ class install_update extends module
{ {
continue; continue;
} }
$methods[] = $type; $methods[] = $type;
} }
@ -1490,7 +1490,7 @@ class install_update extends module
return; return;
} }
if (in_array($file, array_keys($this->update_info['custom']))) if (isset($this->update_info['custom'][$file]))
{ {
foreach ($this->update_info['custom'][$file] as $_file) foreach ($this->update_info['custom'][$file] as $_file)
{ {

View file

@ -362,6 +362,7 @@ CREATE TABLE phpbb_forums (
forum_last_poster_name VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE, forum_last_poster_name VARCHAR(255) CHARACTER SET UTF8 DEFAULT '' NOT NULL COLLATE UNICODE,
forum_last_poster_colour VARCHAR(6) CHARACTER SET NONE DEFAULT '' NOT NULL, forum_last_poster_colour VARCHAR(6) CHARACTER SET NONE DEFAULT '' NOT NULL,
forum_flags INTEGER DEFAULT 32 NOT NULL, forum_flags INTEGER DEFAULT 32 NOT NULL,
display_subforum_list INTEGER DEFAULT 1 NOT NULL,
display_on_index INTEGER DEFAULT 1 NOT NULL, display_on_index INTEGER DEFAULT 1 NOT NULL,
enable_indexing INTEGER DEFAULT 1 NOT NULL, enable_indexing INTEGER DEFAULT 1 NOT NULL,
enable_icons INTEGER DEFAULT 1 NOT NULL, enable_icons INTEGER DEFAULT 1 NOT NULL,
@ -444,7 +445,7 @@ CREATE TABLE phpbb_groups (
ALTER TABLE phpbb_groups ADD PRIMARY KEY (group_id);; ALTER TABLE phpbb_groups ADD PRIMARY KEY (group_id);;
CREATE INDEX phpbb_groups_group_legend ON phpbb_groups(group_legend);; CREATE INDEX phpbb_groups_group_legend_name ON phpbb_groups(group_legend, group_name);;
CREATE GENERATOR phpbb_groups_gen;; CREATE GENERATOR phpbb_groups_gen;;
SET GENERATOR phpbb_groups_gen TO 0;; SET GENERATOR phpbb_groups_gen TO 0;;
@ -959,6 +960,7 @@ CREATE INDEX phpbb_search_wordmatch_post_id ON phpbb_search_wordmatch(post_id);;
CREATE TABLE phpbb_sessions ( CREATE TABLE phpbb_sessions (
session_id CHAR(32) CHARACTER SET NONE DEFAULT '' NOT NULL, session_id CHAR(32) CHARACTER SET NONE DEFAULT '' NOT NULL,
session_user_id INTEGER DEFAULT 0 NOT NULL, session_user_id INTEGER DEFAULT 0 NOT NULL,
session_forum_id INTEGER DEFAULT 0 NOT NULL,
session_last_visit INTEGER DEFAULT 0 NOT NULL, session_last_visit INTEGER DEFAULT 0 NOT NULL,
session_start INTEGER DEFAULT 0 NOT NULL, session_start INTEGER DEFAULT 0 NOT NULL,
session_time INTEGER DEFAULT 0 NOT NULL, session_time INTEGER DEFAULT 0 NOT NULL,
@ -975,6 +977,7 @@ ALTER TABLE phpbb_sessions ADD PRIMARY KEY (session_id);;
CREATE INDEX phpbb_sessions_session_time ON phpbb_sessions(session_time);; CREATE INDEX phpbb_sessions_session_time ON phpbb_sessions(session_time);;
CREATE INDEX phpbb_sessions_session_user_id ON phpbb_sessions(session_user_id);; CREATE INDEX phpbb_sessions_session_user_id ON phpbb_sessions(session_user_id);;
CREATE INDEX phpbb_sessions_session_forum_id ON phpbb_sessions(session_forum_id);;
# Table: 'phpbb_sessions_keys' # Table: 'phpbb_sessions_keys'
CREATE TABLE phpbb_sessions_keys ( CREATE TABLE phpbb_sessions_keys (

View file

@ -438,6 +438,7 @@ CREATE TABLE [phpbb_forums] (
[forum_last_poster_name] [varchar] (255) DEFAULT ('') NOT NULL , [forum_last_poster_name] [varchar] (255) DEFAULT ('') NOT NULL ,
[forum_last_poster_colour] [varchar] (6) DEFAULT ('') NOT NULL , [forum_last_poster_colour] [varchar] (6) DEFAULT ('') NOT NULL ,
[forum_flags] [int] DEFAULT (32) NOT NULL , [forum_flags] [int] DEFAULT (32) NOT NULL ,
[display_subforum_list] [int] DEFAULT (1) NOT NULL ,
[display_on_index] [int] DEFAULT (1) NOT NULL , [display_on_index] [int] DEFAULT (1) NOT NULL ,
[enable_indexing] [int] DEFAULT (1) NOT NULL , [enable_indexing] [int] DEFAULT (1) NOT NULL ,
[enable_icons] [int] DEFAULT (1) NOT NULL , [enable_icons] [int] DEFAULT (1) NOT NULL ,
@ -555,7 +556,7 @@ ALTER TABLE [phpbb_groups] WITH NOCHECK ADD
) ON [PRIMARY] ) ON [PRIMARY]
GO GO
CREATE INDEX [group_legend] ON [phpbb_groups]([group_legend]) ON [PRIMARY] CREATE INDEX [group_legend_name] ON [phpbb_groups]([group_legend], [group_name]) ON [PRIMARY]
GO GO
@ -1152,6 +1153,7 @@ GO
CREATE TABLE [phpbb_sessions] ( CREATE TABLE [phpbb_sessions] (
[session_id] [char] (32) DEFAULT ('') NOT NULL , [session_id] [char] (32) DEFAULT ('') NOT NULL ,
[session_user_id] [int] DEFAULT (0) NOT NULL , [session_user_id] [int] DEFAULT (0) NOT NULL ,
[session_forum_id] [int] DEFAULT (0) NOT NULL ,
[session_last_visit] [int] DEFAULT (0) NOT NULL , [session_last_visit] [int] DEFAULT (0) NOT NULL ,
[session_start] [int] DEFAULT (0) NOT NULL , [session_start] [int] DEFAULT (0) NOT NULL ,
[session_time] [int] DEFAULT (0) NOT NULL , [session_time] [int] DEFAULT (0) NOT NULL ,
@ -1178,6 +1180,9 @@ GO
CREATE INDEX [session_user_id] ON [phpbb_sessions]([session_user_id]) ON [PRIMARY] CREATE INDEX [session_user_id] ON [phpbb_sessions]([session_user_id]) ON [PRIMARY]
GO GO
CREATE INDEX [session_forum_id] ON [phpbb_sessions]([session_forum_id]) ON [PRIMARY]
GO
/* /*
Table: 'phpbb_sessions_keys' Table: 'phpbb_sessions_keys'

View file

@ -248,6 +248,7 @@ CREATE TABLE phpbb_forums (
forum_last_poster_name blob NOT NULL, forum_last_poster_name blob NOT NULL,
forum_last_poster_colour varbinary(6) DEFAULT '' NOT NULL, forum_last_poster_colour varbinary(6) DEFAULT '' NOT NULL,
forum_flags tinyint(4) DEFAULT '32' NOT NULL, forum_flags tinyint(4) DEFAULT '32' NOT NULL,
display_subforum_list tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
display_on_index tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, display_on_index tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
enable_indexing tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, enable_indexing tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
enable_icons tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, enable_icons tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
@ -313,7 +314,7 @@ CREATE TABLE phpbb_groups (
group_message_limit mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, group_message_limit mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
group_legend tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, group_legend tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
PRIMARY KEY (group_id), PRIMARY KEY (group_id),
KEY group_legend (group_legend) KEY group_legend_name (group_legend, group_name(255))
); );
@ -659,6 +660,7 @@ CREATE TABLE phpbb_search_wordmatch (
CREATE TABLE phpbb_sessions ( CREATE TABLE phpbb_sessions (
session_id binary(32) DEFAULT '' NOT NULL, session_id binary(32) DEFAULT '' NOT NULL,
session_user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, session_user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_last_visit int(11) UNSIGNED DEFAULT '0' NOT NULL, session_last_visit int(11) UNSIGNED DEFAULT '0' NOT NULL,
session_start int(11) UNSIGNED DEFAULT '0' NOT NULL, session_start int(11) UNSIGNED DEFAULT '0' NOT NULL,
session_time int(11) UNSIGNED DEFAULT '0' NOT NULL, session_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
@ -671,7 +673,8 @@ CREATE TABLE phpbb_sessions (
session_admin tinyint(1) UNSIGNED DEFAULT '0' NOT NULL, session_admin tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (session_id), PRIMARY KEY (session_id),
KEY session_time (session_time), KEY session_time (session_time),
KEY session_user_id (session_user_id) KEY session_user_id (session_user_id),
KEY session_forum_id (session_forum_id)
); );

View file

@ -248,6 +248,7 @@ CREATE TABLE phpbb_forums (
forum_last_poster_name varchar(255) DEFAULT '' NOT NULL, forum_last_poster_name varchar(255) DEFAULT '' NOT NULL,
forum_last_poster_colour varchar(6) DEFAULT '' NOT NULL, forum_last_poster_colour varchar(6) DEFAULT '' NOT NULL,
forum_flags tinyint(4) DEFAULT '32' NOT NULL, forum_flags tinyint(4) DEFAULT '32' NOT NULL,
display_subforum_list tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
display_on_index tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, display_on_index tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
enable_indexing tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, enable_indexing tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
enable_icons tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, enable_icons tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
@ -313,7 +314,7 @@ CREATE TABLE phpbb_groups (
group_message_limit mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, group_message_limit mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
group_legend tinyint(1) UNSIGNED DEFAULT '1' NOT NULL, group_legend tinyint(1) UNSIGNED DEFAULT '1' NOT NULL,
PRIMARY KEY (group_id), PRIMARY KEY (group_id),
KEY group_legend (group_legend) KEY group_legend_name (group_legend, group_name)
) CHARACTER SET `utf8` COLLATE `utf8_bin`; ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
@ -659,6 +660,7 @@ CREATE TABLE phpbb_search_wordmatch (
CREATE TABLE phpbb_sessions ( CREATE TABLE phpbb_sessions (
session_id char(32) DEFAULT '' NOT NULL, session_id char(32) DEFAULT '' NOT NULL,
session_user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL, session_user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
session_last_visit int(11) UNSIGNED DEFAULT '0' NOT NULL, session_last_visit int(11) UNSIGNED DEFAULT '0' NOT NULL,
session_start int(11) UNSIGNED DEFAULT '0' NOT NULL, session_start int(11) UNSIGNED DEFAULT '0' NOT NULL,
session_time int(11) UNSIGNED DEFAULT '0' NOT NULL, session_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
@ -671,7 +673,8 @@ CREATE TABLE phpbb_sessions (
session_admin tinyint(1) UNSIGNED DEFAULT '0' NOT NULL, session_admin tinyint(1) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (session_id), PRIMARY KEY (session_id),
KEY session_time (session_time), KEY session_time (session_time),
KEY session_user_id (session_user_id) KEY session_user_id (session_user_id),
KEY session_forum_id (session_forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`; ) CHARACTER SET `utf8` COLLATE `utf8_bin`;

View file

@ -505,6 +505,7 @@ CREATE TABLE phpbb_forums (
forum_last_poster_name varchar2(765) DEFAULT '' , forum_last_poster_name varchar2(765) DEFAULT '' ,
forum_last_poster_colour varchar2(6) DEFAULT '' , forum_last_poster_colour varchar2(6) DEFAULT '' ,
forum_flags number(4) DEFAULT '32' NOT NULL, forum_flags number(4) DEFAULT '32' NOT NULL,
display_subforum_list number(1) DEFAULT '1' NOT NULL,
display_on_index number(1) DEFAULT '1' NOT NULL, display_on_index number(1) DEFAULT '1' NOT NULL,
enable_indexing number(1) DEFAULT '1' NOT NULL, enable_indexing number(1) DEFAULT '1' NOT NULL,
enable_icons number(1) DEFAULT '1' NOT NULL, enable_icons number(1) DEFAULT '1' NOT NULL,
@ -606,7 +607,7 @@ CREATE TABLE phpbb_groups (
) )
/ /
CREATE INDEX phpbb_groups_group_legend ON phpbb_groups (group_legend) CREATE INDEX phpbb_groups_group_legend_name ON phpbb_groups (group_legend, group_name)
/ /
CREATE SEQUENCE phpbb_groups_seq CREATE SEQUENCE phpbb_groups_seq
@ -1280,6 +1281,7 @@ CREATE INDEX phpbb_search_wordmatch_post_id ON phpbb_search_wordmatch (post_id)
CREATE TABLE phpbb_sessions ( CREATE TABLE phpbb_sessions (
session_id char(32) DEFAULT '' , session_id char(32) DEFAULT '' ,
session_user_id number(8) DEFAULT '0' NOT NULL, session_user_id number(8) DEFAULT '0' NOT NULL,
session_forum_id number(8) DEFAULT '0' NOT NULL,
session_last_visit number(11) DEFAULT '0' NOT NULL, session_last_visit number(11) DEFAULT '0' NOT NULL,
session_start number(11) DEFAULT '0' NOT NULL, session_start number(11) DEFAULT '0' NOT NULL,
session_time number(11) DEFAULT '0' NOT NULL, session_time number(11) DEFAULT '0' NOT NULL,
@ -1298,6 +1300,8 @@ CREATE INDEX phpbb_sessions_session_time ON phpbb_sessions (session_time)
/ /
CREATE INDEX phpbb_sessions_session_user_id ON phpbb_sessions (session_user_id) CREATE INDEX phpbb_sessions_session_user_id ON phpbb_sessions (session_user_id)
/ /
CREATE INDEX phpbb_sessions_session_forum_id ON phpbb_sessions (session_forum_id)
/
/* /*
Table: 'phpbb_sessions_keys' Table: 'phpbb_sessions_keys'

Some files were not shown because too many files have changed in this diff Show more