diff options
Diffstat (limited to 'phpBB/includes')
| -rw-r--r-- | phpBB/includes/acp/acp_attachments.php | 225 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_board.php | 22 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_permissions.php | 8 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_styles.php | 5 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_users.php | 9 | ||||
| -rw-r--r-- | phpBB/includes/captcha/captcha_gd.php | 17 | ||||
| -rw-r--r-- | phpBB/includes/db/dbal.php | 8 | ||||
| -rw-r--r-- | phpBB/includes/db/mssql.php | 23 | ||||
| -rw-r--r-- | phpBB/includes/functions.php | 64 | ||||
| -rw-r--r-- | phpBB/includes/functions_display.php | 4 | ||||
| -rw-r--r-- | phpBB/includes/functions_posting.php | 1052 | ||||
| -rw-r--r-- | phpBB/includes/functions_privmsgs.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/functions_user.php | 15 | ||||
| -rw-r--r-- | phpBB/includes/mcp/mcp_queue.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/message_parser.php | 34 | ||||
| -rw-r--r-- | phpBB/includes/session.php | 18 | ||||
| -rw-r--r-- | phpBB/includes/template.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/ucp/ucp_groups.php | 5 | ||||
| -rw-r--r-- | phpBB/includes/ucp/ucp_pm_compose.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/ucp/ucp_register.php | 13 |
20 files changed, 1233 insertions, 297 deletions
diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index f6bf579ee5..e61fa26988 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -14,6 +14,7 @@ class acp_attachments { var $u_action; + var $new_config; function main($id, $mode) { @@ -63,56 +64,75 @@ class acp_attachments case 'attach': include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); - - $config_sizes = array('max_filesize' => 'size', 'attachment_quota' => 'quota_size', 'max_filesize_pm' => 'pm_size'); - foreach ($config_sizes as $cfg_key => $var) - { - $$var = request_var($var, ''); - } - // Pull all config data - $sql = 'SELECT * - FROM ' . CONFIG_TABLE; + $sql = 'SELECT group_name, cat_id + FROM ' . EXTENSION_GROUPS_TABLE . ' + WHERE cat_id > 0 + ORDER BY cat_id'; $result = $db->sql_query($sql); + $s_assigned_groups = array(); while ($row = $db->sql_fetchrow($result)) { - $config_name = $row['config_name']; - $config_value = $row['config_value']; + $s_assigned_groups[$row['cat_id']][] = $row['group_name']; + } + $db->sql_freeresult($result); + + $l_legend_cat_images = $user->lang['SETTINGS_CAT_IMAGES'] . ' [' . $user->lang['ASSIGNED_GROUP'] . ': ' . ((sizeof($s_assigned_groups[ATTACHMENT_CATEGORY_IMAGE])) ? implode(', ', $s_assigned_groups[ATTACHMENT_CATEGORY_IMAGE]) : $user->lang['NONE']) . ']'; + + $display_vars = array( + 'title' => 'ACP_ATTACHMENT_SETTINGS', + 'vars' => array( + 'img_max_width' => false, 'img_max_height' => false, 'img_link_width' => false, 'img_link_height' => false, + + 'legend1' => 'ACP_ATTACHMENT_SETTINGS', + 'allow_attachments' => array('lang' => 'ALLOW_ATTACHMENTS', 'type' => 'radio:yes_no', 'explain' => false), + 'allow_pm_attach' => array('lang' => 'ALLOW_PM_ATTACHMENTS', 'type' => 'radio:yes_no', 'explain' => false), + 'upload_path' => array('lang' => 'UPLOAD_DIR', 'type' => 'text:25:100', 'explain' => true), + 'display_order' => array('lang' => 'DISPLAY_ORDER', 'type' => 'custom', 'method' => 'display_order', 'explain' => true), + 'attachment_quota' => array('lang' => 'ATTACH_QUOTA', 'type' => 'custom', 'method' => 'max_filesize', 'explain' => true), + 'max_filesize' => array('lang' => 'ATTACH_MAX_FILESIZE', 'type' => 'custom', 'method' => 'max_filesize', 'explain' => true), + 'max_filesize_pm' => array('lang' => 'ATTACH_MAX_PM_FILESIZE','type' => 'custom', 'method' => 'max_filesize', 'explain' => true), + 'max_attachments' => array('lang' => 'MAX_ATTACHMENTS', 'type' => 'text:3:3', 'explain' => false), + 'max_attachments_pm' => array('lang' => 'MAX_ATTACHMENTS_PM', 'type' => 'text:3:3', 'explain' => false), + 'secure_downloads' => array('lang' => 'SECURE_DOWNLOADS', 'type' => 'radio:yes_no', 'explain' => true), + 'secure_allow_deny' => array('lang' => 'SECURE_ALLOW_DENY', 'type' => 'custom', 'method' => 'select_allow_deny', 'explain' => true), + 'secure_allow_empty_referer' => array('lang' => 'SECURE_EMPTY_REFERER', 'type' => 'radio:yes_no', 'explain' => true), + + 'legend2' => $l_legend_cat_images, + 'img_display_inlined' => array('lang' => 'DISPLAY_INLINED', 'type' => 'radio:yes_no', 'explain' => true), + 'img_create_thumbnail' => array('lang' => 'CREATE_THUMBNAIL', 'type' => 'radio:yes_no', 'explain' => true), + 'img_min_thumb_filesize' => array('lang' => 'MIN_THUMB_FILESIZE', 'type' => 'text:7:15', 'explain' => true, 'append' => ' ' . $user->lang['BYTES']), + 'img_imagick' => array('lang' => 'IMAGICK_PATH', 'type' => 'text:20:200', 'explain' => true, 'append' => ' <span>[ <a href="' . $this->u_action . '&action=imgmagick">' . $user->lang['SEARCH_IMAGICK'] . '</a> ]</span>'), + 'img_max' => array('lang' => 'MAX_IMAGE_SIZE', 'type' => 'dimension:3:4', 'explain' => true), + 'img_link' => array('lang' => 'IMAGE_LINK_SIZE', 'type' => 'dimension:3:4', 'explain' => true), + ) + ); - $default_config[$config_name] = $config_value; - $new[$config_name] = request_var($config_name, $default_config[$config_name]); + $this->new_config = $config; + $cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => '')) : $this->new_config; - foreach ($config_sizes as $cfg_key => $var) + // We go through the display_vars to make sure no one is trying to set variables he/she is not allowed to... + foreach ($display_vars['vars'] as $config_name => $null) + { + if (!isset($cfg_array[$config_name]) || strpos($config_name, 'legend') !== false) { - if (empty($$var) && !$submit && $config_name == $cfg_key) - { - $$var = (intval($default_config[$config_name]) >= 1048576) ? 'mb' : ((intval($default_config[$config_name]) >= 1024) ? 'kb' : 'b'); - } + continue; + } - if (!$submit && $config_name == $cfg_key) - { - $new[$config_name] = ($new[$config_name] >= 1048576) ? round($new[$config_name] / 1048576 * 100) / 100 : (($new[$config_name] >= 1024) ? round($new[$config_name] / 1024 * 100) / 100 : $new[$config_name]); - } + $this->new_config[$config_name] = $config_value = $cfg_array[$config_name]; - if ($submit && $config_name == $cfg_key) - { - $old = $new[$config_name]; - $new[$config_name] = ($$var == 'kb') ? round($new[$config_name] * 1024) : (($$var == 'mb') ? round($new[$config_name] * 1048576) : $new[$config_name]); - } - } + if ($config_name == 'attachment_quota') + { + $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); + } if ($submit) { - set_config($config_name, $new[$config_name]); - - if (in_array($config_name, array('max_filesize', 'attachment_quota', 'max_filesize_pm'))) - { - $new[$config_name] = $old; - } + set_config($config_name, $config_value); } } - $db->sql_freeresult($result); $this->perform_site_list(); @@ -121,7 +141,7 @@ class acp_attachments add_log('admin', 'LOG_CONFIG_ATTACH'); // Check Settings - $this->test_upload($error, $new['upload_path'], false); + $this->test_upload($error, $this->new_config['upload_path'], false); if (!sizeof($error)) { @@ -130,74 +150,31 @@ class acp_attachments } $template->assign_var('S_ATTACHMENT_SETTINGS', true); - + if ($action == 'imgmagick') { - $new['img_imagick'] = $this->search_imagemagick(); + $this->new_config['img_imagick'] = $this->search_imagemagick(); } // We strip eventually manual added convert program, we only want the patch - $new['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $new['img_imagick']); - - $s_size_options = size_select_options($size); - $s_quota_size_options = size_select_options($quota_size); - $s_pm_size_options = size_select_options($pm_size); - - $sql = 'SELECT group_name, cat_id - FROM ' . EXTENSION_GROUPS_TABLE . ' - WHERE cat_id > 0 - ORDER BY cat_id'; - $result = $db->sql_query($sql); - - $s_assigned_groups = array(); - while ($row = $db->sql_fetchrow($result)) - { - $s_assigned_groups[$row['cat_id']][] = $row['group_name']; - } - $db->sql_freeresult($result); + $this->new_config['img_imagick'] = str_replace(array('convert', '.exe'), array('', ''), $this->new_config['img_imagick']); $supported_types = get_supported_image_types(); // Check Thumbnail Support - if (!$new['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) + if (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) { - $new['img_create_thumbnail'] = '0'; + $this->new_config['img_create_thumbnail'] = 0; } $template->assign_vars(array( - 'UPLOAD_PATH' => $new['upload_path'], - 'DISPLAY_ORDER' => $new['display_order'], - 'ATTACHMENT_QUOTA' => $new['attachment_quota'], - 'ALLOW_ATTACHMENTS' => $new['allow_attachments'], - 'ALLOW_PM_ATTACH' => $new['allow_pm_attach'], - 'MAX_FILESIZE' => $new['max_filesize'], - 'MAX_PM_FILESIZE' => $new['max_filesize_pm'], - 'MAX_ATTACHMENTS' => $new['max_attachments'], - 'MAX_ATTACHMENTS_PM' => $new['max_attachments_pm'], - 'SECURE_DOWNLOADS' => $new['secure_downloads'], - 'SECURE_ALLOW_DENY' => $new['secure_allow_deny'], - 'ALLOW_EMPTY_REFERER' => $new['secure_allow_empty_referer'], - 'ASSIGNED_GROUPS' => (sizeof($s_assigned_groups[ATTACHMENT_CATEGORY_IMAGE])) ? implode(', ', $s_assigned_groups[ATTACHMENT_CATEGORY_IMAGE]) : $user->lang['NONE'], - 'DISPLAY_INLINED' => $new['img_display_inlined'], - 'CREATE_THUMBNAIL' => $new['img_create_thumbnail'], - 'MIN_THUMB_FILESIZE' => $new['img_min_thumb_filesize'], - 'IMG_IMAGICK' => $new['img_imagick'], - 'MAX_WIDTH' => $new['img_max_width'], - 'MAX_HEIGHT' => $new['img_max_height'], - 'LINK_WIDTH' => $new['img_link_width'], - 'LINK_HEIGHT' => $new['img_link_height'], - 'U_SEARCH_IMAGICK' => $this->u_action . '&action=imgmagick', - - 'S_QUOTA_SIZE_OPTIONS' => $s_quota_size_options, - 'S_MAX_FILESIZE_OPTIONS' => $s_size_options, - 'S_MAX_PM_FILESIZE_OPTIONS' => $s_pm_size_options, - 'S_THUMBNAIL_SUPPORT' => (!$new['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) ? false : true, + 'S_THUMBNAIL_SUPPORT' => (!$this->new_config['img_imagick'] && (!isset($supported_types['format']) || !sizeof($supported_types['format']))) ? false : true, ) ); // Secure Download Options - Same procedure as with banning - $allow_deny = ($new['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED'; + $allow_deny = ($this->new_config['secure_allow_deny']) ? 'ALLOWED' : 'DISALLOWED'; $sql = 'SELECT * FROM ' . SITELIST_TABLE; @@ -218,7 +195,7 @@ class acp_attachments $db->sql_freeresult($result); $template->assign_vars(array( - 'S_SECURE_DOWNLOADS' => $new['secure_downloads'], + 'S_SECURE_DOWNLOADS' => $this->new_config['secure_downloads'], 'S_DEFINED_IPS' => ($defined_ips != '') ? true : false, 'DEFINED_IPS' => $defined_ips, @@ -229,6 +206,48 @@ class acp_attachments ) ); + // Output relevant options + foreach ($display_vars['vars'] as $config_key => $vars) + { + if (!is_array($vars) && strpos($config_key, 'legend') === false) + { + continue; + } + + if (strpos($config_key, 'legend') !== false) + { + $template->assign_block_vars('options', array( + 'S_LEGEND' => true, + 'LEGEND' => (isset($user->lang[$vars])) ? $user->lang[$vars] : $vars) + ); + + continue; + } + + $type = explode(':', $vars['type']); + + $l_explain = ''; + if ($vars['explain'] && isset($vars['lang_explain'])) + { + $l_explain = (isset($user->lang[$vars['lang_explain']])) ? $user->lang[$vars['lang_explain']] : $vars['lang_explain']; + } + else if ($vars['explain']) + { + $l_explain = (isset($user->lang[$vars['lang'] . '_EXPLAIN'])) ? $user->lang[$vars['lang'] . '_EXPLAIN'] : ''; + } + + $template->assign_block_vars('options', array( + 'KEY' => $config_key, + 'TITLE' => $user->lang[$vars['lang']], + 'S_EXPLAIN' => $vars['explain'], + 'TITLE_EXPLAIN' => $l_explain, + 'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars), + ) + ); + + unset($display_vars['vars'][$config_key]); + } + break; case 'extensions': @@ -1410,6 +1429,38 @@ class acp_attachments $cache->put('_extensions', $extensions); } + /** + * Write display_order config field + */ + function display_order($value, $key = '') + { + $radio_ary = array(0 => 'DESCENDING', 1 => 'ASCENDING'); + + return h_radio('config[display_order]', $radio_ary, $value, $key); + } + + /** + * Adjust all three max_filesize config vars for display + */ + function max_filesize($value, $key = '') + { + // Determine size var and adjust the value accordingly + $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); + + return '<input type="text" id="' . $key . '" size="8" maxlength="15" name="config[' . $key . ']" value="' . $value . '" /> <select name="' . $key . '">' . size_select_options($size_var) . '</select>'; + } + + /** + * Write secure_allow_deny config field + */ + function select_allow_deny($value, $key = '') + { + $radio_ary = array(1 => 'ORDER_ALLOW_DENY', 0 => 'ORDER_DENY_ALLOW'); + + return h_radio('config[' . $key . ']', $radio_ary, $value, $key); + } + } ?>
\ No newline at end of file diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index 3942a1b726..9de5d66b11 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -369,13 +369,13 @@ class acp_board continue; } - $config_value = $cfg_array[$config_name]; - $this->new_config[$config_name] = $config_value; + $this->new_config[$config_name] = $config_value = $cfg_array[$config_name]; if ($config_name == 'email_function_name') { $this->new_config['email_function_name'] = trim(str_replace(array('(', ')'), array('', ''), $this->new_config['email_function_name'])); $this->new_config['email_function_name'] = (empty($this->new_config['email_function_name']) || !function_exists($this->new_config['email_function_name'])) ? 'mail' : $this->new_config['email_function_name']; + $config_value = $this->new_config['email_function_name']; } if ($submit) @@ -499,7 +499,7 @@ class acp_board { $template->assign_block_vars('options', array( 'S_LEGEND' => true, - 'LEGEND' => $user->lang[$vars]) + 'LEGEND' => (isset($user->lang[$vars])) ? $user->lang[$vars] : $vars) ); continue; @@ -507,11 +507,21 @@ class acp_board $type = explode(':', $vars['type']); + $l_explain = ''; + if ($vars['explain'] && isset($vars['lang_explain'])) + { + $l_explain = (isset($user->lang[$vars['lang_explain']])) ? $user->lang[$vars['lang_explain']] : $vars['lang_explain']; + } + else if ($vars['explain']) + { + $l_explain = (isset($user->lang[$vars['lang'] . '_EXPLAIN'])) ? $user->lang[$vars['lang'] . '_EXPLAIN'] : ''; + } + $template->assign_block_vars('options', array( 'KEY' => $config_key, - 'TITLE' => $user->lang[$vars['lang']], + 'TITLE' => (isset($user->lang[$vars['lang']])) ? $user->lang[$vars['lang']] : $vars['lang'], 'S_EXPLAIN' => $vars['explain'], - 'TITLE_EXPLAIN' => ($vars['explain']) ? $user->lang[$vars['lang'] . '_EXPLAIN'] : '', + 'TITLE_EXPLAIN' => $l_explain, 'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars), ) ); @@ -591,7 +601,7 @@ class acp_board { global $user; - return '<option value="1"' . (($value == 1) ? ' selected="selected"' : '') . '>' . $user->lang['DELETE_OLDEST_MESSAGES'] . '</option><option value="2"' . (($value == 2) ? ' selected="selected"' : '') . '>' . $user->lang['HOLD_NEW_MESSAGES'] . '</option>'; + return '<option value="1"' . (($value == 1) ? ' selected="selected"' : '') . '>' . $user->lang['DELETE_OLDEST_MESSAGES'] . '</option><option value="2"' . (($value == 2) ? ' selected="selected"' : '') . '>' . $user->lang['HOLD_NEW_MESSAGES_SHORT'] . '</option>'; } function captcha_pixel_noise_select($value, $key = '') diff --git a/phpBB/includes/acp/acp_permissions.php b/phpBB/includes/acp/acp_permissions.php index 1059629863..c794c159b9 100644 --- a/phpBB/includes/acp/acp_permissions.php +++ b/phpBB/includes/acp/acp_permissions.php @@ -384,7 +384,7 @@ class acp_permissions 'FROM' => array( GROUPS_TABLE => 'g', ACL_OPTIONS_TABLE => 'o', - ACL_USERS_TABLE => 'a' + ACL_GROUPS_TABLE => 'a' ), 'LEFT_JOIN' => array( @@ -395,9 +395,9 @@ class acp_permissions ), 'WHERE' => "(a.auth_option_id = o.auth_option_id OR r.auth_option_id = o.auth_option_id) - $sql_permission_option - $sql_forum_id - AND g.group_id = a.group_id", + $sql_permission_option + $sql_forum_id + AND g.group_id = a.group_id", 'ORDER_BY' => 'g.group_type DESC, g.group_name ASC' )); diff --git a/phpBB/includes/acp/acp_styles.php b/phpBB/includes/acp/acp_styles.php index 77e834821c..55efad44ad 100644 --- a/phpBB/includes/acp/acp_styles.php +++ b/phpBB/includes/acp/acp_styles.php @@ -31,6 +31,9 @@ class acp_styles global $db, $user, $auth, $template; global $config, $SID, $phpbb_root_path, $phpbb_admin_path, $phpEx; + // Hardcoded template bitfield to add for new templates + define('TEMPLATE_BITFIELD', 6921); + $user->add_lang('acp/styles'); $this->tpl_name = 'acp_styles'; @@ -2216,7 +2219,9 @@ pagination_sep = \'{PAGINATION_SEP}\' switch ($mode) { case 'template': + // We set a pre-defined bitfield here which we may use further in 3.2 $sql_ary += array( + 'bbcode_bitfield' => TEMPLATE_BITFIELD, $mode . '_storedb' => (!is_writeable("{$phpbb_root_path}styles/$path/$mode")) ? 1 : 0 ); break; diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index cae41e8d25..66fdf40701 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -952,7 +952,14 @@ class acp_users if (!isset($data['bday_day'])) { - list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']); + if ($user_row['user_birthday']) + { + list($data['bday_day'], $data['bday_month'], $data['bday_year']) = explode('-', $user_row['user_birthday']); + } + else + { + $data['bday_day'] = $data['bday_month'] = $data['bday_year'] = 0; + } } $s_birthday_day_options = '<option value="0"' . ((!$data['bday_day']) ? ' selected="selected"' : '') . '>--</option>'; diff --git a/phpBB/includes/captcha/captcha_gd.php b/phpBB/includes/captcha/captcha_gd.php index d49505442c..a1b9325895 100644 --- a/phpBB/includes/captcha/captcha_gd.php +++ b/phpBB/includes/captcha/captcha_gd.php @@ -14,6 +14,21 @@ * Main gd based captcha class * * Thanks to Robert Hetzler (Xore) +* +* @todo see notes in includes/captcha/captcha_gd.php +* +* Within the policy 'policy_occlude' the letters need to have more space in-between of them. +* At the moment it can happen that the letters get overlapped +* +* Completely remove the number 0 +* Make it case-insensitive +* +* The policy_entropy seems to be the best readable, then follows policy_occlude and policy_3dbitmap not readable. +* +* Within the policy 'policy_3dbitmap': +* The 2 and the Z seem to be very similar +* The letters are not distinguishable(?) enough from the background, maybe related to the letters itself +* The colors are generally a bit off making it hard to read... */ class captcha { @@ -24,7 +39,7 @@ class captcha { global $config; - $policy_modules = array('policy_occlude', 'policy_entropy', 'policy_3dbitmap'); + $policy_modules = array('policy_entropy', 'policy_occlude'); // 'policy_3dbitmap' // Remove all disabled policy modules foreach ($policy_modules as $key => $name) diff --git a/phpBB/includes/db/dbal.php b/phpBB/includes/db/dbal.php index 1a8b8a4ddf..a7e582d396 100644 --- a/phpBB/includes/db/dbal.php +++ b/phpBB/includes/db/dbal.php @@ -266,7 +266,9 @@ class dbal $message = '<u>SQL ERROR</u> [ ' . SQL_LAYER . ' ]<br /><br />' . $error['message'] . ' [' . $error['code'] . ']'; // Show complete SQL error and path to administrators only - if ($auth->acl_get('a_') || defined('IN_INSTALL')) + // Additionally show complete error on installation or if extended debug mode is enabled + // The DEBUG_EXTRA constant is for development only! + if ($auth->acl_get('a_') || defined('IN_INSTALL') || defined('DEBUG_EXTRA')) { // Print out a nice backtrace... $backtrace = get_backtrace(); @@ -314,7 +316,7 @@ class dbal */ function sql_report($mode, $query = '') { - global $cache, $starttime, $phpbb_root_path, $user; + global $cache, $starttime, $phpbb_root_path, $user, $SID; if (empty($_GET['explain'])) { @@ -350,7 +352,7 @@ class dbal <body id="errorpage"> <div id="wrap"> <div id="page-header"> - <a href="' . htmlspecialchars(preg_replace('/&explain=([^&]*)/', '', $_SERVER['REQUEST_URI'])) . '">Return to previous page</a> + <a href="' . build_url('explain') . '">Return to previous page</a> </div> <div id="page-body"> <div class="panel"> diff --git a/phpBB/includes/db/mssql.php b/phpBB/includes/db/mssql.php index e1082d282c..5d6095e502 100644 --- a/phpBB/includes/db/mssql.php +++ b/phpBB/includes/db/mssql.php @@ -98,7 +98,6 @@ class dbal_mssql extends dbal { global $cache; - // EXPLAIN only in extra debug mode if (defined('DEBUG_EXTRA')) { @@ -315,17 +314,33 @@ class dbal_mssql extends dbal */ function _sql_error() { - $error = array( 'message' => @mssql_get_last_message($this->db_connect_id), 'code' => '' ); - $result_id = @mssql_query('SELECT @@ERROR as errno', $this->db_connect_id); + // Get error code number + $result_id = @mssql_query('SELECT @@ERROR as code', $this->db_connect_id); if ($result_id) { $row = @mssql_fetch_assoc($result_id); - $error['code'] = $row['errno']; + $error['code'] = $row['code']; + @mssql_free_result($result_id); + } + + // Get full error message if possible + $sql = 'SELECT CAST(description as varchar(255)) as message + FROM master.dbo.sysmessages + WHERE error = ' . $error['code']; + $result_id = @mssql_query($sql); + + if ($result_id) + { + $row = @mssql_fetch_assoc($result_id); + if (!empty($row['message'])) + { + $error['message'] .= '<br />' . $row['message']; + } @mssql_free_result($result_id); } diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index e2844246b0..d46d78a5d0 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -1229,6 +1229,36 @@ function redirect($url) } /** +* Returns url from the session/current page with an re-appended SID with optionally stripping vars from the url +*/ +function build_url($strip_vars = false) +{ + global $user, $phpbb_root_path, $SID; + + // Append SID + $redirect = (($user->page['page_dir']) ? $user->page['page_dir'] . '/' : '') . $user->page['page_name'] . $SID . (($user->page['query_string']) ? "&{$user->page['query_string']}" : ''); + + // Strip vars... + if ($strip_vars !== false) + { + if (!is_array($strip_vars)) + { + $strip_vars = array($strip_vars); + } + + foreach ($strip_vars as $var) + { + if (strpos($redirect, $var) !== false) + { + $redirect = preg_replace('#^(.*?)&?' . preg_quote($var, '#') . '=.*(&?)(.*?)$#', '\1\3', $redirect); + } + } + } + + return $phpbb_root_path . str_replace('&', '&', $redirect); +} + +/** * Meta refresh assignment */ function meta_refresh($time, $url) @@ -1427,7 +1457,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa // Remove previously added sid (should not happen) if (strpos($redirect, '?sid=')) { - $redirect = preg_replace('/\?sid=[a-z0-9]+(&|&)?/', $SID . '\1', $redirect); + $redirect = preg_replace('/\?sid=[a-z0-9]+(&|&)?/', $SID . '\1', $redirect); } else { @@ -1495,7 +1525,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa if (!$redirect) { // We just use what the session code determined... - $redirect = htmlspecialchars($user->page['page_name'] . (($user->page['query_string']) ? '?' . $user->page['query_string'] : '')); + $redirect = $user->page['page_name'] . (($user->page['query_string']) ? '?' . $user->page['query_string'] : ''); } $s_hidden_fields = build_hidden_fields(array('redirect' => $redirect, 'sid' => $user->session_id)); @@ -1530,7 +1560,7 @@ function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = fa /** * Generate forum login box */ -function login_forum_box(&$forum_data) +function login_forum_box($forum_data) { global $db, $config, $user, $template, $phpEx; @@ -1540,15 +1570,15 @@ function login_forum_box(&$forum_data) FROM ' . FORUMS_ACCESS_TABLE . ' WHERE forum_id = ' . $forum_data['forum_id'] . ' AND user_id = ' . $user->data['user_id'] . " - AND session_id = '$user->session_id'"; + AND session_id = '" . $db->sql_escape($user->session_id) . "'"; $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); - if ($row = $db->sql_fetchrow($result)) + if ($row) { - $db->sql_freeresult($result); return true; } - $db->sql_freeresult($result); if ($password) { @@ -1575,9 +1605,13 @@ function login_forum_box(&$forum_data) if ($password == $forum_data['forum_password']) { - $sql = 'INSERT INTO ' . FORUMS_ACCESS_TABLE . ' (forum_id, user_id, session_id) - VALUES (' . $forum_data['forum_id'] . ', ' . $user->data['user_id'] . ", '" . $db->sql_escape($user->session_id) . "')"; - $db->sql_query($sql); + $sql_ary = array( + 'forum_id' => (int) $forum_data['forum_id'], + 'user_id' => (int) $user->data['user_id'], + 'session_id' => (string) $user->session_id, + ); + + $db->sql_query('INSERT INTO ' . FORUMS_ACCESS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); return true; } @@ -1586,9 +1620,11 @@ function login_forum_box(&$forum_data) } page_header(); + $template->set_filenames(array( 'body' => 'login_forum.html') ); + page_footer(); } @@ -2525,7 +2561,7 @@ function page_header($page_title = '') 'SITENAME' => $config['sitename'], 'SITE_DESCRIPTION' => $config['site_desc'], 'PAGE_TITLE' => $page_title, - 'SCRIPT_NAME' => str_replace($phpEx, '', $user->page['page_name']), + 'SCRIPT_NAME' => str_replace('.' . $phpEx, '', $user->page['page_name']), 'LAST_VISIT_DATE' => sprintf($user->lang['YOU_LAST_VISIT'], $s_last_visit), 'CURRENT_TIME' => sprintf($user->lang['CURRENT_TIME'], $user->format_date(time(), false, true)), 'TOTAL_USERS_ONLINE' => $l_online_users, @@ -2640,11 +2676,7 @@ function page_footer() } } - $explain_url = $phpbb_root_path . str_replace('&', '&', $user->page['page']); - $explain_url = (strpos($explain_url, '?') !== false) ? str_replace('?', $SID . '&', $explain_url) : $explain_url . '?' . str_replace('?', '', $SID); - $explain_url .= ((strpos($explain_url, '?') === false) ? '?' : '&') . 'explain=1'; - - $debug_output .= ' | <a href="' . $explain_url . '">Explain</a>'; + $debug_output .= ' | <a href="' . build_url() . '&explain=1">Explain</a>'; } } diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 3292e9a43f..ad3b7a4897 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -193,7 +193,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod // Handle marking posts if ($mark_read == 'forums' || $mark_read == 'all') { - $redirect = (!empty($_SERVER['REQUEST_URI'])) ? preg_replace('#^(.*?)&(amp;)?mark=.*$#', '\1', htmlspecialchars($_SERVER['REQUEST_URI'])) : "index.$phpEx$SID"; + $redirect = build_url('mark'); if ($mark_read == 'all') { @@ -332,7 +332,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod 'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield']), 'TOPICS' => $row['forum_topics'], $l_post_click_count => $post_click_count, - 'FORUM_FOLDER_IMG' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang['folder_alt'] . '" />' : $user->img($folder_image, $folder_alt), + 'FORUM_FOLDER_IMG' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $folder_alt . '" />' : $user->img($folder_image, $folder_alt), 'FORUM_FOLDER_IMG_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : $user->img($folder_image, $folder_alt, false, '', 'src'), 'SUBFORUMS' => $subforums_list, 'LAST_POST_TIME' => $last_post_time, diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 6fdf9a0cc2..558620c3cf 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -98,8 +98,11 @@ function generate_smilies($mode, $forum_id) /** * Update Post Informations (First/Last Post in topic/forum) * Should be used instead of sync() if only the last post informations are out of sync... faster +* +* @param string $type Can be forum|topic +* @param mixed $ids topic/forum ids */ -function update_post_information($type, $ids) +function update_post_information($type, $ids, $return_update_sql = false) { global $db; @@ -161,9 +164,9 @@ function update_post_information($type, $ids) } unset($empty_forums, $ids, $last_post_ids); - if (!sizeof($update_sql)) + if ($return_update_sql || !sizeof($update_sql)) { - return array(); + return $update_sql; } $table = ($type == 'forum') ? FORUMS_TABLE : TOPICS_TABLE; @@ -178,6 +181,108 @@ function update_post_information($type, $ids) } /** +* Generate Topic Icons for display +*/ +function posting_gen_topic_icons($mode, $icon_id) +{ + global $phpbb_root_path, $config, $template, $cache; + + // Grab icons + $icons = array(); + $cache->obtain_icons($icons); + + if (!$icon_id) + { + $template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"'); + } + + if (sizeof($icons)) + { + foreach ($icons as $id => $data) + { + if ($data['display']) + { + $template->assign_block_vars('topic_icon', array( + 'ICON_ID' => $id, + 'ICON_IMG' => $phpbb_root_path . $config['icons_path'] . '/' . $data['img'], + 'ICON_WIDTH' => $data['width'], + 'ICON_HEIGHT' => $data['height'], + + 'S_CHECKED' => ($id == $icon_id) ? true : false, + 'S_ICON_CHECKED' => ($id == $icon_id) ? ' checked="checked"' : '') + ); + } + } + + return true; + } + + return false; +} + +/** +* Build topic types able to be selected +*/ +function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL) +{ + global $auth, $user, $template, $topic_type; + + $toggle = false; + + $topic_types = array( + 'sticky' => array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), + 'announce' => array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), + 'global' => array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL') + ); + + $topic_type_array = array(); + + foreach ($topic_types as $auth_key => $topic_value) + { + // We do not have a special post global announcement permission + $auth_key = ($auth_key == 'global') ? 'announce' : $auth_key; + + if ($auth->acl_get('f_' . $auth_key, $forum_id)) + { + $toggle = true; + + $topic_type_array[] = array( + 'VALUE' => $topic_value['const'], + 'S_CHECKED' => ($cur_topic_type == $topic_value['const'] || ($forum_id == 0 && $topic_value['const'] == POST_GLOBAL)) ? ' checked="checked"' : '', + 'L_TOPIC_TYPE' => $user->lang[$topic_value['lang']] + ); + } + } + + if ($toggle) + { + $topic_type_array = array_merge(array(0 => array( + 'VALUE' => POST_NORMAL, + 'S_CHECKED' => ($topic_type == POST_NORMAL) ? ' checked="checked"' : '', + 'L_TOPIC_TYPE' => $user->lang['POST_NORMAL'])), + + $topic_type_array + ); + + foreach ($topic_type_array as $array) + { + $template->assign_block_vars('topic_type', $array); + } + + $template->assign_vars(array( + 'S_TOPIC_TYPE_STICKY' => ($auth->acl_get('f_sticky', $forum_id)), + 'S_TOPIC_TYPE_ANNOUNCE' => ($auth->acl_get('f_announce', $forum_id))) + ); + } + + return $toggle; +} + +// +// Attachment related functions +// + +/** * Upload Attachment - filedata is generated here * Uses upload class */ @@ -186,8 +291,9 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage global $auth, $user, $config, $db, $cache; global $phpbb_root_path; - $filedata = array(); - $filedata['error'] = array(); + $filedata = array( + 'error' => array() + ); include_once($phpbb_root_path . 'includes/functions_upload.php'); $upload = new fileupload(); @@ -339,21 +445,24 @@ function get_supported_image_types($type = false) { case 1: $new_type = ($format & IMG_GIF) ? IMG_GIF : 0; - break; + break; + case 2: case 9: case 10: case 11: case 12: $new_type = ($format & IMG_JPG) ? IMG_JPG : 0; - break; + break; + case 3: $new_type = ($format & IMG_PNG) ? IMG_PNG : 0; - break; + break; + case 6: case 15: $new_type = ($format & IMG_WBMP) ? IMG_WBMP : 0; - break; + break; } } else @@ -394,7 +503,7 @@ function create_thumbnail($source, $destination, $mimetype) { return false; } - + list($width, $height, $type, ) = getimagesize($source); if (!$width || !$height) @@ -413,28 +522,31 @@ function create_thumbnail($source, $destination, $mimetype) { $used_imagick = true; } - } + } if (!$used_imagick) { $type = get_supported_image_types($type); - + if ($type['gd']) { switch ($type['format']) { case IMG_GIF: $image = imagecreatefromgif($source); - break; + break; + case IMG_JPG: $image = imagecreatefromjpeg($source); - break; + break; + case IMG_PNG: $image = imagecreatefrompng($source); - break; + break; + case IMG_WBMP: $image = imagecreatefromwbmp($source); - break; + break; } if ($type['version'] == 1) @@ -452,16 +564,19 @@ function create_thumbnail($source, $destination, $mimetype) { case IMG_GIF: imagegif($new_image, $destination); - break; + break; + case IMG_JPG: imagejpeg($new_image, $destination, 90); - break; + break; + case IMG_PNG: imagepng($new_image, $destination); - break; + break; + case IMG_WBMP: imagewbmp($new_image, $destination); - break; + break; } imagedestroy($new_image); @@ -479,46 +594,6 @@ function create_thumbnail($source, $destination, $mimetype) } /** -* Generate Topic Icons for display -*/ -function posting_gen_topic_icons($mode, $icon_id) -{ - global $phpbb_root_path, $config, $template, $cache; - - // Grab icons - $icons = array(); - $cache->obtain_icons($icons); - - if (!$icon_id) - { - $template->assign_var('S_NO_ICON_CHECKED', ' checked="checked"'); - } - - if (sizeof($icons)) - { - foreach ($icons as $id => $data) - { - if ($data['display']) - { - $template->assign_block_vars('topic_icon', array( - 'ICON_ID' => $id, - 'ICON_IMG' => $phpbb_root_path . $config['icons_path'] . '/' . $data['img'], - 'ICON_WIDTH' => $data['width'], - 'ICON_HEIGHT' => $data['height'], - - 'S_CHECKED' => ($id == $icon_id) ? true : false, - 'S_ICON_CHECKED' => ($id == $icon_id) ? ' checked="checked"' : '') - ); - } - } - - return true; - } - - return false; -} - -/** * Assign Inline attachments (build option fields) */ function posting_gen_inline_attachments(&$attachment_data) @@ -543,64 +618,6 @@ function posting_gen_inline_attachments(&$attachment_data) } /** -* Build topic types able to be selected -*/ -function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL) -{ - global $auth, $user, $template, $topic_type; - - $toggle = false; - - $topic_types = array( - 'sticky' => array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), - 'announce' => array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), - 'global' => array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL') - ); - - $topic_type_array = array(); - - foreach ($topic_types as $auth_key => $topic_value) - { - // Temp - we do not have a special post global announcement permission - $auth_key = ($auth_key == 'global') ? 'announce' : $auth_key; - - if ($auth->acl_get('f_' . $auth_key, $forum_id)) - { - $toggle = true; - - $topic_type_array[] = array( - 'VALUE' => $topic_value['const'], - 'S_CHECKED' => ($cur_topic_type == $topic_value['const'] || ($forum_id == 0 && $topic_value['const'] == POST_GLOBAL)) ? ' checked="checked"' : '', - 'L_TOPIC_TYPE' => $user->lang[$topic_value['lang']] - ); - } - } - - if ($toggle) - { - $topic_type_array = array_merge(array(0 => array( - 'VALUE' => POST_NORMAL, - 'S_CHECKED' => ($topic_type == POST_NORMAL) ? ' checked="checked"' : '', - 'L_TOPIC_TYPE' => $user->lang['POST_NORMAL'])), - - $topic_type_array - ); - - foreach ($topic_type_array as $array) - { - $template->assign_block_vars('topic_type', $array); - } - - $template->assign_vars(array( - 'S_TOPIC_TYPE_STICKY' => ($auth->acl_get('f_sticky', $forum_id)), - 'S_TOPIC_TYPE_ANNOUNCE' => ($auth->acl_get('f_announce', $forum_id))) - ); - } - - return $toggle; -} - -/** * Generate inline attachment entry */ function posting_gen_attachment_entry(&$attachment_data, &$filename_data) @@ -637,7 +654,7 @@ function posting_gen_attachment_entry(&$attachment_data, &$filename_data) 'ATTACH_ID' => $attach_row['attach_id'], 'ASSOC_INDEX' => $count, - 'U_VIEW_ATTACHMENT' => $download_link, + 'U_VIEW_ATTACHMENT' => $download_link, 'S_HIDDEN' => $hidden) ); @@ -653,12 +670,19 @@ function posting_gen_attachment_entry(&$attachment_data, &$filename_data) return sizeof($attachment_data); } +// +// General Post functions +// + /** * Load Drafts */ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) { - global $user, $db, $template, $phpEx, $SID, $auth; + global $user, $db, $template, $auth; + global $phpbb_root_path, $phpEx, $SID; + + $topic_ids = $draft_rows = array(); // Load those drafts not connected to forums/topics $sql = 'SELECT * @@ -675,7 +699,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) { $topic_ids[] = (int) $row['topic_id']; } - $draftrows[] = $row; + $draft_rows[] = $row; } $db->sql_freeresult($result); @@ -696,16 +720,18 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) { $topic_ids[] = (int) $row['topic_id']; } - $draftrows[] = $row; + $draft_rows[] = $row; } $db->sql_freeresult($result); } - if (!sizeof($draftrows)) + if (!sizeof($draft_rows)) { return; } + $topic_rows = array(); + if (sizeof($topic_ids)) { $sql = 'SELECT topic_id, forum_id, topic_title @@ -723,7 +749,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) $template->assign_var('S_SHOW_DRAFTS', true); - foreach ($draftrows as $draft) + foreach ($draft_rows as $draft) { $link_topic = $link_forum = $link_pm = false; $insert_url = $view_url = $title = ''; @@ -731,25 +757,25 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) if (isset($topic_rows[$draft['topic_id']]) && $auth->acl_get('f_read', $topic_rows[$draft['topic_id']]['forum_id'])) { $link_topic = true; - $view_url = "viewtopic.$phpEx$SID&f=" . $topic_rows[$draft['topic_id']]['forum_id'] . "&t=" . $draft['topic_id']; + $view_url = "{$phpbb_root_path}viewtopic.$phpEx$SID&f=" . $topic_rows[$draft['topic_id']]['forum_id'] . "&t=" . $draft['topic_id']; $title = $topic_rows[$draft['topic_id']]['topic_title']; - $insert_url = "posting.$phpEx$SID&f=" . $topic_rows[$draft['topic_id']]['forum_id'] . '&t=' . $draft['topic_id'] . '&mode=reply&d=' . $draft['draft_id']; + $insert_url = "{$phpbb_root_path}posting.$phpEx$SID&f=" . $topic_rows[$draft['topic_id']]['forum_id'] . '&t=' . $draft['topic_id'] . '&mode=reply&d=' . $draft['draft_id']; } else if ($auth->acl_get('f_read', $draft['forum_id'])) { $link_forum = true; - $view_url = "viewforum.$phpEx$SID&f=" . $draft['forum_id']; + $view_url = "{$phpbb_root_path}viewforum.$phpEx$SID&f=" . $draft['forum_id']; $title = $draft['forum_name']; - $insert_url = "posting.$phpEx$SID&f=" . $draft['forum_id'] . '&mode=post&d=' . $draft['draft_id']; + $insert_url = "{$phpbb_root_path}posting.$phpEx$SID&f=" . $draft['forum_id'] . '&mode=post&d=' . $draft['draft_id']; } else { $link_pm = true; - $insert_url = "ucp.$phpEx$SID&i=$id&mode=compose&d=" . $draft['draft_id']; + $insert_url = "{$phpbb_root_path}ucp.$phpEx$SID&i=$id&mode=compose&d=" . $draft['draft_id']; } - + $template->assign_block_vars('draftrow', array( 'DRAFT_ID' => $draft['draft_id'], 'DATE' => $user->format_date($draft['save_time']), @@ -771,11 +797,11 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0) */ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true) { - global $user, $auth, $db, $template, $bbcode, $template; + global $user, $auth, $db, $template, $bbcode; global $config, $phpbb_root_path, $phpEx, $SID; // Go ahead and pull all data for this topic - $sql = 'SELECT u.username, u.user_id, p.post_id, p.post_username, p.post_subject, p.post_text, p.enable_smilies, p.bbcode_uid, p.bbcode_bitfield, p.post_time + $sql = 'SELECT u.username, u.user_id, p.* FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u WHERE p.topic_id = $topic_id AND p.poster_id = u.user_id @@ -786,6 +812,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id if (!$row = $db->sql_fetchrow($result)) { + $db->sql_freeresult($result); return false; } @@ -914,8 +941,8 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id } $db->sql_freeresult($result); - // forum notification is sent to those not receiving post notification - if ($forum_notification) + // forum notification is sent to those not already receiving topic notifications + if ($topic_notification) { if (sizeof($notify_rows)) { @@ -953,6 +980,7 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id return; } + // Make sure users are allowed to read the forum foreach ($auth->acl_get_list(array_keys($notify_rows), 'f_read', $forum_id) as $forum_id => $forum_ary) { foreach ($forum_ary as $auth_option => $user_ary) @@ -1038,7 +1066,7 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id // Handle the DB updates $db->sql_transaction(); - if (isset($update_notification['topic']) && sizeof($update_notification['topic'])) + if (!empty($update_notification['topic'])) { $db->sql_query('UPDATE ' . TOPICS_WATCH_TABLE . " SET notify_status = 1 @@ -1046,7 +1074,7 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id AND user_id IN (" . implode(', ', $update_notification['topic']) . ")"); } - if (isset($update_notification['forum']) && sizeof($update_notification['forum'])) + if (!empty($update_notification['forum'])) { $db->sql_query('UPDATE ' . FORUMS_WATCH_TABLE . " SET notify_status = 1 @@ -1055,14 +1083,14 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id } // Now delete the user_ids not authorized to receive notifications on this topic/forum - if (isset($delete_ids['topic']) && sizeof($delete_ids['topic'])) + if (!empty($delete_ids['topic'])) { $db->sql_query('DELETE FROM ' . TOPICS_WATCH_TABLE . " WHERE topic_id = $topic_id AND user_id IN (" . implode(', ', $delete_ids['topic']) . ")"); } - if (isset($delete_ids['forum']) && sizeof($delete_ids['forum'])) + if (!empty($delete_ids['forum'])) { $db->sql_query('DELETE FROM ' . FORUMS_WATCH_TABLE . " WHERE forum_id = $forum_id @@ -1072,4 +1100,752 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id $db->sql_transaction('commit'); } +// +// Post handling functions +// + +/** +* Delete Post +*/ +function delete_post($forum_id, $topic_id, $post_id, &$data) +{ + global $db, $user, $auth; + global $config, $phpEx, $SID, $phpbb_root_path; + + // 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')); + $sql_data = array(); + $next_post_id = 0; + + include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx); + + $db->sql_transaction(); + + if (!delete_posts('post_id', array($post_id), false)) + { + // Try to delete topic, we may had an previous error causing inconsistency + if ($post_mode = 'delete_topic') + { + delete_topics('topic_id', array($topic_id), false); + } + trigger_error('ALREADY_DELETED'); + } + + $db->sql_transaction('commit'); + + // Collect the necessary informations for updating the tables + $sql_data[FORUMS_TABLE] = ''; + switch ($post_mode) + { + case 'delete_topic': + delete_topics('topic_id', array($topic_id), false); + set_config('num_topics', $config['num_topics'] - 1, true); + + if ($data['topic_type'] != POST_GLOBAL) + { + $sql_data[FORUMS_TABLE] .= 'forum_posts = forum_posts - 1, forum_topics_real = forum_topics_real - 1'; + $sql_data[FORUMS_TABLE] .= ($data['topic_approved']) ? ', forum_topics = forum_topics - 1' : ''; + } + + $update_sql = update_post_information('forum', $forum_id, true); + if (sizeof($update_sql)) + { + $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : ''; + $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]); + } + + $sql_data[TOPICS_TABLE] = 'topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : ''); + break; + + case 'delete_first_post': + $sql = 'SELECT p.post_id, p.poster_id, p.post_username, u.username + FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u + WHERE p.topic_id = $topic_id + AND p.poster_id = u.user_id + ORDER BY p.post_time ASC"; + $result = $db->sql_query_limit($sql, 1); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if ($data['topic_type'] != POST_GLOBAL) + { + $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1'; + } + + $sql_data[TOPICS_TABLE] = 'topic_first_post_id = ' . intval($row['post_id']) . ", topic_first_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "'"; + $sql_data[TOPICS_TABLE] .= ', topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : ''); + + $next_post_id = (int) $row['post_id']; + break; + + case 'delete_last_post': + if ($data['topic_type'] != POST_GLOBAL) + { + $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1'; + } + + $update_sql = update_post_information('forum', $forum_id, true); + if (sizeof($update_sql)) + { + $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : ''; + $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]); + } + + $sql_data[TOPICS_TABLE] = 'topic_bumped = 0, topic_bumper = 0, topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : ''); + + $update_sql = update_post_information('topic', $topic_id, true); + if (sizeof($update_sql)) + { + $sql_data[TOPICS_TABLE] .= ', ' . implode(', ', $update_sql[$topic_id]); + $next_post_id = (int) str_replace('topic_last_post_id = ', '', $update_sql[$topic_id][0]); + } + else + { + $sql = 'SELECT MAX(post_id) as last_post_id + FROM ' . POSTS_TABLE . " + WHERE topic_id = $topic_id " . + ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : ''); + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + $next_post_id = (int) $row['last_post_id']; + } + break; + + case 'delete': + $sql = 'SELECT post_id + FROM ' . POSTS_TABLE . " + WHERE topic_id = $topic_id " . + ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : '') . ' + AND post_time > ' . $data['post_time'] . ' + ORDER BY post_time ASC'; + $result = $db->sql_query_limit($sql, 1); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + if ($data['topic_type'] != POST_GLOBAL) + { + $sql_data[FORUMS_TABLE] = 'forum_posts = forum_posts - 1'; + } + + $sql_data[TOPICS_TABLE] = 'topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : ''); + $next_post_id = (int) $row['post_id']; + break; + } + + $sql_data[USERS_TABLE] = ($auth->acl_get('f_postcount', $forum_id)) ? 'user_posts = user_posts - 1' : ''; + set_config('num_posts', $config['num_posts'] - 1, true); + + $db->sql_transaction(); + + $where_sql = array( + FORUMS_TABLE => "forum_id = $forum_id", + TOPICS_TABLE => "topic_id = $topic_id", + USERS_TABLE => 'user_id = ' . $data['poster_id'] + ); + + foreach ($sql_data as $table => $update_sql) + { + if ($update_sql) + { + $db->sql_query("UPDATE $table SET $update_sql WHERE " . $where_sql[$table]); + } + } + + $db->sql_transaction('commit'); + + return $next_post_id; +} + +/** +* Submit Post +*/ +function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true) +{ + global $db, $auth, $user, $config, $phpEx, $SID, $template, $phpbb_root_path; + + // We do not handle erasing posts here + if ($mode == 'delete') + { + return; + } + + $current_time = time(); + + if ($mode == 'post') + { + $post_mode = 'post'; + $update_message = true; + } + else if ($mode != 'edit') + { + $post_mode = 'reply'; + $update_message = true; + } + else if ($mode == 'edit') + { + $post_mode = ($data['topic_first_post_id'] == $data['topic_last_post_id']) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit')); + } + + // Collect some basic informations about which tables and which rows to update/insert + $sql_data = array(); + $poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id']; + + // Collect Informations + switch ($post_mode) + { + case 'post': + case 'reply': + $sql_data[POSTS_TABLE]['sql'] = array( + 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'], + 'poster_id' => (int) $user->data['user_id'], + 'icon_id' => $data['icon_id'], + 'poster_ip' => $user->ip, + 'post_time' => $current_time, + 'post_approved' => ($auth->acl_get('f_moderate', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1, + 'enable_bbcode' => $data['enable_bbcode'], + 'enable_smilies' => $data['enable_smilies'], + 'enable_magic_url' => $data['enable_urls'], + 'enable_sig' => $data['enable_sig'], + 'post_username' => (!$user->data['is_registered']) ? $username : '', + 'post_subject' => $subject, + 'post_text' => $data['message'], + 'post_checksum' => $data['message_md5'], + 'post_encoding' => $user->lang['ENCODING'], + 'post_attachment' => (isset($data['filename_data']['physical_filename']) && sizeof($data['filename_data'])) ? 1 : 0, + 'bbcode_bitfield' => $data['bbcode_bitfield'], + 'bbcode_uid' => $data['bbcode_uid'], + 'post_edit_locked' => $data['post_edit_locked'] + ); + break; + + case 'edit_first_post': + case 'edit': + + if (!$auth->acl_gets('m_', 'a_') || $data['post_edit_reason']) + { + $sql_data[POSTS_TABLE]['sql'] = array( + 'post_edit_time' => $current_time + ); + + $sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1'; + } + + // no break + + case 'edit_last_post': + case 'edit_topic': + + if (($post_mode == 'edit_last_post' || $post_mode == 'edit_topic') && $data['post_edit_reason']) + { + $sql_data[POSTS_TABLE]['sql'] = array( + 'post_edit_time' => $current_time + ); + + $sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1'; + } + + if (!isset($sql_data[POSTS_TABLE]['sql'])) + { + $sql_data[POSTS_TABLE]['sql'] = array(); + } + + $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( + 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'], + 'poster_id' => $data['poster_id'], + 'icon_id' => $data['icon_id'], + 'post_approved' => ($auth->acl_get('f_moderate', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1, + 'enable_bbcode' => $data['enable_bbcode'], + 'enable_smilies' => $data['enable_smilies'], + 'enable_magic_url' => $data['enable_urls'], + 'enable_sig' => $data['enable_sig'], + 'post_username' => ($username && $data['poster_id'] == ANONYMOUS) ? $username : '', + 'post_subject' => $subject, + 'post_edit_reason' => $data['post_edit_reason'], + 'post_edit_user' => (int) $data['post_edit_user'], + 'post_checksum' => $data['message_md5'], + 'post_encoding' => $user->lang['ENCODING'], + 'post_attachment' => (isset($data['filename_data']['physical_filename']) && sizeof($data['filename_data'])) ? 1 : 0, + 'bbcode_bitfield' => $data['bbcode_bitfield'], + 'bbcode_uid' => $data['bbcode_uid'], + 'post_edit_locked' => $data['post_edit_locked']) + ); + + if ($update_message) + { + $sql_data[POSTS_TABLE]['sql']['post_text'] = $data['message']; + } + + break; + } + + // And the topic ladies and gentlemen + switch ($post_mode) + { + case 'post': + $sql_data[TOPICS_TABLE]['sql'] = array( + 'topic_poster' => (int) $user->data['user_id'], + 'topic_time' => $current_time, + 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'], + 'icon_id' => $data['icon_id'], + 'topic_approved' => ($auth->acl_get('f_moderate', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1, + 'topic_title' => $subject, + 'topic_first_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''), + 'topic_type' => $topic_type, + 'topic_time_limit' => ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0, + 'topic_attachment' => (isset($data['filename_data']['physical_filename']) && sizeof($data['filename_data'])) ? 1 : 0 + ); + + if (isset($poll['poll_options']) && !empty($poll['poll_options'])) + { + $sql_data[TOPICS_TABLE]['sql'] = array_merge($sql_data[TOPICS_TABLE]['sql'], array( + 'poll_title' => $poll['poll_title'], + 'poll_start' => ($poll['poll_start']) ? $poll['poll_start'] : $current_time, + 'poll_max_options' => $poll['poll_max_options'], + 'poll_length' => ($poll['poll_length'] * 86400), + 'poll_vote_change' => $poll['poll_vote_change']) + ); + } + + $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 (!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) + { + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1'; + } + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . ((!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? ', forum_topics = forum_topics + 1' : ''); + } + break; + + case 'reply': + $sql_data[TOPICS_TABLE]['stat'][] = 'topic_replies_real = topic_replies_real + 1, topic_bumped = 0, topic_bumper = 0' . ((!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? ', topic_replies = topic_replies + 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 ((!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) && $topic_type != POST_GLOBAL) + { + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1'; + } + break; + + case 'edit_topic': + case 'edit_first_post': + + $sql_data[TOPICS_TABLE]['sql'] = array( + 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'], + 'icon_id' => $data['icon_id'], + 'topic_approved' => ($auth->acl_get('f_moderate', $data['forum_id']) && !$auth->acl_get('m_approve', $data['forum_id'])) ? 0 : 1, + 'topic_title' => $subject, + 'topic_first_poster_name' => $username, + 'topic_type' => $topic_type, + 'topic_time_limit' => ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0, + 'poll_title' => (isset($poll['poll_options'])) ? $poll['poll_title'] : '', + 'poll_start' => (isset($poll['poll_options'])) ? (($poll['poll_start']) ? $poll['poll_start'] : $current_time) : 0, + 'poll_max_options' => (isset($poll['poll_options'])) ? $poll['poll_max_options'] : 1, + 'poll_length' => (isset($poll['poll_options'])) ? ($poll['poll_length'] * 86400) : 0, + 'poll_vote_change' => (isset($poll['poll_vote_change'])) ? $poll['poll_vote_change'] : 0, + + 'topic_attachment' => ($post_mode == 'edit_topic') ? ((isset($data['filename_data']['physical_filename']) && sizeof($data['filename_data'])) ? 1 : 0) : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0) + ); + break; + } + + $db->sql_transaction(); + + // Submit new topic + if ($post_mode == 'post') + { + $sql = 'INSERT INTO ' . TOPICS_TABLE . ' ' . + $db->sql_build_array('INSERT', $sql_data[TOPICS_TABLE]['sql']); + $db->sql_query($sql); + + $data['topic_id'] = $db->sql_nextid(); + + $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( + 'topic_id' => $data['topic_id']) + ); + unset($sql_data[TOPICS_TABLE]['sql']); + } + + // Submit new post + if ($post_mode == 'post' || $post_mode == 'reply') + { + if ($post_mode == 'reply') + { + $sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( + 'topic_id' => $data['topic_id']) + ); + } + + $sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . + $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']); + $db->sql_query($sql); + $data['post_id'] = $db->sql_nextid(); + + if ($post_mode == 'post') + { + $sql_data[TOPICS_TABLE]['sql'] = array( + 'topic_first_post_id' => $data['post_id'], + 'topic_last_post_id' => $data['post_id'], + 'topic_last_post_time' => $current_time, + 'topic_last_poster_id' => (int) $user->data['user_id'], + 'topic_last_poster_name'=> (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '') + ); + } + + unset($sql_data[POSTS_TABLE]['sql']); + } + + $make_global = false; + + // Are we globalising or unglobalising? + if ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic') + { + $sql = 'SELECT topic_type, topic_replies_real, topic_approved + FROM ' . TOPICS_TABLE . ' + WHERE topic_id = ' . $data['topic_id']; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + // globalise + if ($row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL) + { + // Decrement topic/post count + $make_global = true; + $sql_data[FORUMS_TABLE]['stat'] = array(); + + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - ' . ($row['topic_replies_real'] + 1); + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real - 1' . (($row['topic_approved']) ? ', forum_topics = forum_topics - 1' : ''); + + // Update forum_ids for all posts + $sql = 'UPDATE ' . POSTS_TABLE . ' + SET forum_id = 0 + WHERE topic_id = ' . $data['topic_id']; + $db->sql_query($sql); + } + // unglobalise + else if ($row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL) + { + // Increment topic/post count + $make_global = true; + $sql_data[FORUMS_TABLE]['stat'] = array(); + + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + ' . ($row['topic_replies_real'] + 1); + $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . (($row['topic_approved']) ? ', forum_topics = forum_topics + 1' : ''); + + // Update forum_ids for all posts + $sql = 'UPDATE ' . POSTS_TABLE . ' + SET forum_id = ' . $data['forum_id'] . ' + WHERE topic_id = ' . $data['topic_id']; + $db->sql_query($sql); + } + } + + // Update the topics table + if (isset($sql_data[TOPICS_TABLE]['sql'])) + { + $db->sql_query('UPDATE ' . TOPICS_TABLE . ' + SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . ' + WHERE topic_id = ' . $data['topic_id']); + } + + // Update the posts table + if (isset($sql_data[POSTS_TABLE]['sql'])) + { + $db->sql_query('UPDATE ' . POSTS_TABLE . ' + SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . ' + WHERE post_id = ' . $data['post_id']); + } + + // Update Poll Tables + if (isset($poll['poll_options']) && !empty($poll['poll_options'])) + { + $cur_poll_options = array(); + + if ($poll['poll_start'] && $mode == 'edit') + { + $sql = 'SELECT * FROM ' . POLL_OPTIONS_TABLE . ' + WHERE topic_id = ' . $data['topic_id'] . ' + ORDER BY poll_option_id'; + $result = $db->sql_query($sql); + + $cur_poll_options = array(); + while ($row = $db->sql_fetchrow($result)) + { + $cur_poll_options[] = $row; + } + $db->sql_freeresult($result); + } + + $sql_insert_ary = array(); + for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++) + { + if (trim($poll['poll_options'][$i])) + { + if (!$cur_poll_options[$i]) + { + $sql_insert_ary[] = array( + 'poll_option_id' => (int) $i, + 'topic_id' => (int) $data['topic_id'], + 'poll_option_text' => (string) $poll['poll_options'][$i] + ); + } + else if ($poll['poll_options'][$i] != $cur_poll_options[$i]) + { + $sql = "UPDATE " . POLL_OPTIONS_TABLE . " + SET poll_option_text = '" . $db->sql_escape($poll['poll_options'][$i]) . "' + WHERE poll_option_id = " . $cur_poll_options[$i]['poll_option_id'] . " + AND topic_id = " . $data['topic_id']; + $db->sql_query($sql); + } + } + } + + if (sizeof($sql_insert_ary)) + { + switch (SQL_LAYER) + { + case 'mysql': + case 'mysql4': + case 'mysqli': + $db->sql_query('INSERT INTO ' . POLL_OPTIONS_TABLE . ' ' . $db->sql_build_array('MULTI_INSERT', $sql_insert_ary)); + break; + + default: + foreach ($sql_insert_ary as $ary) + { + $db->sql_query('INSERT INTO ' . POLL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $ary)); + } + break; + } + } + + if (sizeof($poll['poll_options']) < sizeof($cur_poll_options)) + { + $sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . ' + WHERE poll_option_id >= ' . sizeof($poll['poll_options']) . ' + AND topic_id = ' . $data['topic_id']; + $db->sql_query($sql); + } + } + + // Submit Attachments + if (sizeof($data['attachment_data']) && $data['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit'))) + { + $space_taken = $files_added = 0; + + foreach ($data['attachment_data'] as $pos => $attach_row) + { + if ($attach_row['attach_id']) + { + // update entry in db if attachment already stored in db and filespace + $sql = 'UPDATE ' . ATTACHMENTS_TABLE . " + SET comment = '" . $db->sql_escape($attach_row['comment']) . "' + WHERE attach_id = " . (int) $attach_row['attach_id']; + $db->sql_query($sql); + } + else + { + // insert attachment into db + if (!@file_exists($phpbb_root_path . $config['upload_path'] . '/' . basename($attach_row['physical_filename']))) + { + continue; + } + + $attach_sql = array( + 'post_msg_id' => $data['post_id'], + 'topic_id' => $data['topic_id'], + 'in_message' => 0, + 'poster_id' => $poster_id, + 'physical_filename' => basename($attach_row['physical_filename']), + 'real_filename' => basename($attach_row['real_filename']), + 'comment' => $attach_row['comment'], + 'extension' => $attach_row['extension'], + 'mimetype' => $attach_row['mimetype'], + 'filesize' => $attach_row['filesize'], + 'filetime' => $attach_row['filetime'], + 'thumbnail' => $attach_row['thumbnail'] + ); + + $sql = 'INSERT INTO ' . ATTACHMENTS_TABLE . ' ' . + $db->sql_build_array('INSERT', $attach_sql); + $db->sql_query($sql); + + $space_taken += $attach_row['filesize']; + $files_added++; + } + } + + if (sizeof($data['attachment_data'])) + { + $sql = 'UPDATE ' . POSTS_TABLE . ' + SET post_attachment = 1 + WHERE post_id = ' . $data['post_id']; + $db->sql_query($sql); + + $sql = 'UPDATE ' . TOPICS_TABLE . ' + SET topic_attachment = 1 + WHERE topic_id = ' . $data['topic_id']; + $db->sql_query($sql); + } + + set_config('upload_dir_size', $config['upload_dir_size'] + $space_taken, true); + set_config('num_files', $config['num_files'] + $files_added, true); + } + + $db->sql_transaction('commit'); + + if ($post_mode == 'post' || $post_mode == 'reply' || $post_mode == 'edit_last_post') + { + if ($topic_type != POST_GLOBAL) + { + $update_sql = update_post_information('forum', $data['forum_id'], true); + if (sizeof($update_sql)) + { + $sql_data[FORUMS_TABLE]['stat'][] = implode(', ', $update_sql[$data['forum_id']]); + } + } + + $update_sql = update_post_information('topic', $data['topic_id'], true); + if (sizeof($update_sql)) + { + $sql_data[TOPICS_TABLE]['stat'][] = implode(', ', $update_sql[$data['topic_id']]); + } + } + + if ($make_global) + { + $update_sql = update_post_information('forum', $data['forum_id'], true); + if (sizeof($update_sql)) + { + $sql_data[FORUMS_TABLE]['stat'][] = implode(', ', $update_sql[$data['forum_id']]); + } + } + + if ($post_mode == 'edit_topic') + { + $update_sql = update_post_information('topic', $data['topic_id'], true); + if (sizeof($update_sql)) + { + $sql_data[TOPICS_TABLE]['stat'][] = implode(', ', $update_sql[$data['topic_id']]); + } + } + + // Update total post count, do not consider moderated posts/topics + if (!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) + { + if ($post_mode == 'post') + { + set_config('num_topics', $config['num_topics'] + 1, true); + set_config('num_posts', $config['num_posts'] + 1, true); + } + + if ($post_mode == 'reply') + { + set_config('num_posts', $config['num_posts'] + 1, true); + } + } + + // Update forum stats + $db->sql_transaction(); + + $where_sql = array(POSTS_TABLE => 'post_id = ' . $data['post_id'], TOPICS_TABLE => 'topic_id = ' . $data['topic_id'], FORUMS_TABLE => 'forum_id = ' . $data['forum_id'], USERS_TABLE => 'user_id = ' . $user->data['user_id']); + + foreach ($sql_data as $table => $update_ary) + { + if (isset($update_ary['stat']) && implode('', $update_ary['stat'])) + { + $db->sql_query("UPDATE $table SET " . implode(', ', $update_ary['stat']) . ' WHERE ' . $where_sql[$table]); + } + } + + // Delete topic shadows (if any exist). We do not need a shadow topic for an global announcement + if ($make_global) + { + $db->sql_query('DELETE FROM ' . TOPICS_TABLE . ' + WHERE topic_moved_id = ' . $data['topic_id']); + } + + // Index message contents + if ($update_message && $data['enable_indexing']) + { + // Select the search method and do some additional checks to ensure it can actually be utilised + $search_type = $config['search_type']; + + if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx)) + { + trigger_error('NO_SUCH_SEARCH_MODULE'); + } + + require("{$phpbb_root_path}includes/search/$search_type.$phpEx"); + + $error = false; + $search = new $search_type($error); + + if ($error) + { + trigger_error($error); + } + + $search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id); + } + + $db->sql_transaction('commit'); + + // Delete draft if post was loaded... + $draft_id = request_var('draft_loaded', 0); + if ($draft_id) + { + $db->sql_query('DELETE FROM ' . DRAFTS_TABLE . " WHERE draft_id = $draft_id AND user_id = " . $user->data['user_id']); + } + + // Topic Notification, do not change if moderator is changing other users posts... + if ($user->data['user_id'] == $poster_id) + { + if (!$data['notify_set'] && $data['notify']) + { + $sql = 'INSERT INTO ' . TOPICS_WATCH_TABLE . ' (user_id, topic_id) + VALUES (' . $user->data['user_id'] . ', ' . $data['topic_id'] . ')'; + $db->sql_query($sql); + } + else if ($data['notify_set'] && !$data['notify']) + { + $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . ' + WHERE user_id = ' . $user->data['user_id'] . ' + AND topic_id = ' . $data['topic_id']; + $db->sql_query($sql); + } + } + + if ($mode == 'post' || $mode == 'reply' || $mode == 'quote') + { + // Mark this topic as posted to + markread('post', $data['forum_id'], $data['topic_id'], $data['post_time']); + } + + // Mark this topic as read + // We do not use post_time here, this is intended (post_time can have a date in the past if editing a message) + markread('topic', $data['forum_id'], $data['topic_id'], time()); + + // Send Notifications + if ($mode != 'edit' && $mode != 'delete' && (!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id']))) + { + user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id']); + } + + if ($mode == 'post') + { + $url = (!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? "{$phpbb_root_path}viewtopic.$phpEx$SID&f=" . $data['forum_id'] . '&t=' . $data['topic_id'] : "{$phpbb_root_path}viewforum.$phpEx$SID&f=" . $data['forum_id']; + } + else + { + $url = (!$auth->acl_get('f_moderate', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? "{$phpbb_root_path}viewtopic.$phpEx$SID&f={$data['forum_id']}&t={$data['topic_id']}&p={$data['post_id']}#p{$data['post_id']}" : "{$phpbb_root_path}viewtopic.$phpEx$SID&f={$data['forum_id']}&t={$data['topic_id']}"; + } + + return $url; +} + ?>
\ No newline at end of file diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 8d1ed1f41d..073d434839 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1382,7 +1382,7 @@ function submit_pm($mode, $subject, &$data, $update_message, $put_in_outbox = tr // Send Notifications if ($mode != 'edit') { - pm_notification($mode, stripslashes($data['from_username']), $recipients, stripslashes($subject), stripslashes($data['message'])); + pm_notification($mode, $data['from_username'], $recipients, $subject, $data['message']); } return $data['msg_id']; diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index b722549720..533f7b9ef7 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -139,6 +139,7 @@ function user_delete($mode, $user_id, $post_username = false) GROUP BY topic_id"; $result = $db->sql_query($sql); + $topic_id_ary = array(); while ($row = $db->sql_fetchrow($result)) { $topic_id_ary[$row['topic_id']] = $row['total_posts']; @@ -199,7 +200,7 @@ function user_delete($mode, $user_id, $post_username = false) set_config('newest_user_id', $row['user_id']); set_config('newest_username', $row['username']); } - $db->freeresult($result); + $db->sql_freeresult($result); } set_config('num_users', $config['num_users'] - 1, true); @@ -1226,6 +1227,12 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow { if (isset($group_attributes[$attribute]) && !in_array($attribute, $group_only_ary)) { + // If we are about to set an avatar, we will not overwrite user avatars if no group avatar is set... + if (strpos($attribute, 'group_avatar') === 0 && !$group_attributes[$attribute]) + { + continue; + } + $sql_ary[str_replace('group', 'user', $attribute)] = $group_attributes[$attribute]; } } @@ -1618,6 +1625,12 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal { if (isset($group_attributes[$attribute])) { + // If we are about to set an avatar, we will not overwrite user avatars if no group avatar is set... + if (strpos($attribute, 'group_avatar') === 0 && !$group_attributes[$attribute]) + { + continue; + } + settype($group_attributes[$attribute], $type); $sql_ary[str_replace('group_', 'user_', $attribute)] = $group_attributes[$attribute]; } diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index 2c40e07e64..948d345ea5 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -676,7 +676,7 @@ function disapprove_post($post_id_list, $mode) 'EMAIL_SIG' => $email_sig, 'SITENAME' => $config['sitename'], 'USERNAME' => $post_data['username'], - 'REASON' => stripslashes($disapprove_reason), + 'REASON' => $disapprove_reason, 'POST_SUBJECT' => censor_text($post_data['post_subject']), 'TOPIC_TITLE' => censor_text($post_data['topic_title'])) ); diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index ddb783e4b7..4d940b749e 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -148,6 +148,8 @@ class bbcode_firstpass extends bbcode function check_bbcode($bbcode, &$in) { + // when using the /e modifier, preg_replace slashes double-quotes but does not + // seem to slash anything else $in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); if (!$in) @@ -266,16 +268,10 @@ class bbcode_firstpass extends bbcode // Expects the argument to start right after the opening [code] tag and to end with [/code] function bbcode_code($stx, $in) { - // when using the /e modifier, preg_replace slashes double-quotes but does not - // seem to slash anything else - $in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); - - if (!$in) + if (!$this->check_bbcode('code', $in)) { return ''; } - - $this->parsed_items['code']++; // We remove the hardcoded elements from the code block here because it is not used in code blocks // Having it here saves us one preg_replace per message containing [code] blocks @@ -399,7 +395,6 @@ class bbcode_firstpass extends bbcode return ''; } - $in = str_replace('\"', '"', $in); $out = '['; // Grab item_start with no item_end @@ -489,7 +484,7 @@ class bbcode_firstpass extends bbcode { global $config, $user; - $in = trim($in); + $in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); if (!$in) { @@ -503,7 +498,9 @@ class bbcode_firstpass extends bbcode $in = preg_replace(array('#\[quote(=".*?")?\]([^\n])#is', '#([^\n])\[\/quote\]#is'), array("[quote\\1]\n\\2", "\\1\n[/quote]"), $in); $in = preg_replace(array('#\[quote(=".*?")?\]([^\n])#is', '#([^\n])\[\/quote\]#is'), array("[quote\\1]\n\\2", "\\1\n[/quote]"), $in); - $in = substr(str_replace('\"', '"', $in), 1); + $in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in))); + + $in = substr($in, 1); $close_tags = $error_ary = array(); $buffer = ''; @@ -629,8 +626,11 @@ class bbcode_firstpass extends bbcode function validate_email($var1, $var2) { - $txt = stripslashes($var2); - $email = ($var1) ? stripslashes($var1) : stripslashes($var2); + $var1 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var1))); + $var2 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var2))); + + $txt = $var2; + $email = ($var1) ? $var1 : $var2; $validated = true; @@ -662,10 +662,10 @@ class bbcode_firstpass extends bbcode { global $config; - $var1 = trim($var1); - $var2 = trim($var2); + $var1 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var1))); + $var2 = str_replace("\r\n", "\n", str_replace('\"', '"', trim($var2))); - $url = ($var1) ? stripslashes($var1) : stripslashes($var2); + $url = ($var1) ? $var1 : $var2; $valid = false; if (!$url || ($var1 && !$var2)) @@ -690,10 +690,10 @@ class bbcode_firstpass extends bbcode $url = 'http://' . $url; } - return ($var1) ? '[url=' . str_replace(array(']', '['), array(']', '['), $url) . ':' . $this->bbcode_uid . ']' . stripslashes($var2) . '[/url:' . $this->bbcode_uid . ']' : '[url:' . $this->bbcode_uid . ']' . $url . '[/url:' . $this->bbcode_uid . ']'; + return ($var1) ? '[url=' . str_replace(array(']', '['), array(']', '['), $url) . ':' . $this->bbcode_uid . ']' . $var2 . '[/url:' . $this->bbcode_uid . ']' : '[url:' . $this->bbcode_uid . ']' . $url . '[/url:' . $this->bbcode_uid . ']'; } - return '[url' . (($var1) ? '=' . stripslashes($var1) : '') . ']' . stripslashes($var2) . '[/url]'; + return '[url' . (($var1) ? '=' . $var1 : '') . ']' . $var2 . '[/url]'; } } diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 6571ff1433..73d9c83374 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -139,7 +139,8 @@ class session // Why no forwarded_for et al? Well, too easily spoofed. With the results of my recent requests // it's pretty clear that in the majority of cases you'll at least be left with a proxy/cache ip. $this->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? htmlspecialchars($_SERVER['REMOTE_ADDR']) : ''; - + $this->load = false; + // Load limit check (if applicable) if ($config['limit_load']) { @@ -149,11 +150,6 @@ class session { $this->load = array_slice(explode(' ', $load), 0, 1); $this->load = floatval($this->load[0]); - - if ($config['limit_load'] && $this->load > floatval($config['limit_load'])) - { - trigger_error('BOARD_UNAVAILABLE'); - } } else { @@ -1043,13 +1039,21 @@ class user extends session $this->img_lang = (file_exists($phpbb_root_path . 'styles/' . $this->theme['imageset_path'] . '/imageset/' . $this->lang_name)) ? $this->lang_name : $config['default_lang']; // Is board disabled and user not an admin or moderator? - // @todo new ACL enabling board access while offline? if ($config['board_disable'] && !defined('IN_LOGIN') && !$auth->acl_gets('a_', 'm_')) { $message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE'; trigger_error($message); } + // Is load exceeded? + if ($config['limit_load'] && $this->load !== false) + { + if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN') && !$auth->acl_gets('a_', 'm_')) + { + trigger_error('BOARD_UNAVAILABLE'); + } + } + // Does the user need to change their password? If so, redirect to the // ucp profile reg_details page ... of course do not redirect if we're // already in the ucp diff --git a/phpBB/includes/template.php b/phpBB/includes/template.php index 3ca3a8acbd..9ba7086913 100644 --- a/phpBB/includes/template.php +++ b/phpBB/includes/template.php @@ -126,7 +126,7 @@ class template } /** - * Display the handle and assign the output to a template variable + * Display the handle and assign the output to a template variable or return the content. * @public */ function assign_display($handle, $template_var = '', $return_content = true, $include_once = false) diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php index b8642ca69d..1806fc4d94 100644 --- a/phpBB/includes/ucp/ucp_groups.php +++ b/phpBB/includes/ucp/ucp_groups.php @@ -49,6 +49,7 @@ class ucp_groups while ($row = $db->sql_fetchrow($result)) { + $row['group_name'] = ($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']; $group_row[$row['group_id']] = $row; } $db->sql_freeresult($result); @@ -58,10 +59,6 @@ class ucp_groups trigger_error('GROUP_NOT_EXIST'); } - $group_row[$group_id]['group_name'] = ($group_row[$group_id]['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row[$group_id]['group_name']] : $group_row[$group_id]['group_name']; - $group_row[$user->data['group_id']]['group_name'] = ($group_row[$user->data['group_id']]['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $group_row[$user->data['group_id']]['group_name']] : $group_row[$user->data['group_id']]['group_name']; - - switch ($action) { case 'change_default': diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 45cd22a13c..7c06895494 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -512,7 +512,7 @@ function compose_pm($id, $mode, $action) trigger_error($message); } - $message_subject = stripslashes($subject); + $message_subject = $subject; } // Preview diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php index 9e04caf41f..40d530f808 100644 --- a/phpBB/includes/ucp/ucp_register.php +++ b/phpBB/includes/ucp/ucp_register.php @@ -24,7 +24,7 @@ class ucp_register { trigger_error($user->lang['UCP_REGISTER_DISABLE']); } - +$config['max_reg_attempts'] = 0; include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx); $confirm_id = request_var('confirm_id', ''); @@ -236,6 +236,7 @@ class ucp_register $sql_ary = array( 'username' => $username, + 'user_permissions' => '', 'user_password' => md5($new_password), 'user_email' => $email, 'user_email_hash' => (int) crc32(strtolower($email)) . strlen($email), @@ -248,7 +249,15 @@ class ucp_register 'user_actkey' => $user_actkey, 'user_ip' => $user->ip, 'user_regdate' => time(), - 'user_lastmark' => time(), + + 'user_lastmark' => time(), + 'user_lastvisit' => 0, + 'user_lastpost_time' => 0, + 'user_lastpage' => '', + 'user_posts' => 0, + 'user_dst' => 0, + 'user_colour' => '', + 'user_avatar' => '', ); $sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); |
