mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-08 12:28:52 +00:00
This commit should increase the total number of BBCodes from 31 to 2040. Some things to watch out for: Each database likes to deal with binary data in its own, special way. They are, quite frankly, too cool for school. MySQL, MSSQL and Oracle all allow me to send in a default value for their binary column using a hex number. However, MSSQL forces me to send the specific data as a hex number and thus we must CAST it. PostgreSQL allows me to set a binary column, but with a twist. It demands that the default be in _octal_ and its datatype allows somewhere around a gigabyte's worth of BBCodes ( PGSQL users, we shut you down to 2040 for your own good! ) Firebird has no decent mechanism for allowing me to shuttle in binary data so I must force my way in. By virtue of triggers and a UDF, we ram in our default values. SQLite is the most bizarre of them all. They have no mechanism for turning an ASCII code into a ASCII character. Because of this, we have a trigger and a UDF (just like Firebird!) but with a twist! The UDF is defined on the PHP side of things instead of SQL. SQLite also demands that it's data be encoded before being sent off. Other notes: - SQLite installs again :D - Firebird nearly installs again :P - Database backup is not screwed up :P P.S. I hope nothing broke :D git-svn-id: file:///svn/phpbb/trunk@6209 89ea8834-ac86-4346-8a33-228a782c2dd0
2045 lines
No EOL
58 KiB
PHP
2045 lines
No EOL
58 KiB
PHP
<?php
|
|
/**
|
|
*
|
|
* @package phpBB3
|
|
* @version $Id$
|
|
* @copyright (c) 2005 phpBB Group
|
|
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* Fill smiley templates (or just the variables) with smileys, either in a window or inline
|
|
*/
|
|
function generate_smilies($mode, $forum_id)
|
|
{
|
|
global $auth, $db, $user, $config, $template;
|
|
global $phpEx, $phpbb_root_path;
|
|
|
|
if ($mode == 'window')
|
|
{
|
|
if ($forum_id)
|
|
{
|
|
$sql = 'SELECT forum_style
|
|
FROM ' . FORUMS_TABLE . "
|
|
WHERE forum_id = $forum_id";
|
|
$result = $db->sql_query_limit($sql, 1);
|
|
$row = $db->sql_fetchrow($result);
|
|
$db->sql_freeresult($result);
|
|
|
|
$user->setup('posting', (int) $row['forum_style']);
|
|
}
|
|
else
|
|
{
|
|
$user->setup('posting');
|
|
}
|
|
|
|
page_header($user->lang['SMILIES']);
|
|
|
|
$template->set_filenames(array(
|
|
'body' => 'posting_smilies.html')
|
|
);
|
|
}
|
|
|
|
$display_link = false;
|
|
if ($mode == 'inline')
|
|
{
|
|
$sql = 'SELECT smiley_id
|
|
FROM ' . SMILIES_TABLE . '
|
|
WHERE display_on_posting = 0';
|
|
$result = $db->sql_query_limit($sql, 1, 0, 3600);
|
|
|
|
if ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$display_link = true;
|
|
}
|
|
$db->sql_freeresult($result);
|
|
}
|
|
|
|
$last_url = '';
|
|
|
|
$sql = 'SELECT *
|
|
FROM ' . SMILIES_TABLE .
|
|
(($mode == 'inline') ? ' WHERE display_on_posting = 1 ' : '') . '
|
|
ORDER BY smiley_order';
|
|
$result = $db->sql_query($sql, 3600);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if ($row['smiley_url'] !== $last_url)
|
|
{
|
|
$template->assign_block_vars('smiley', array(
|
|
'SMILEY_CODE' => $row['code'],
|
|
'A_SMILEY_CODE' => addslashes($row['code']),
|
|
'SMILEY_IMG' => $phpbb_root_path . $config['smilies_path'] . '/' . $row['smiley_url'],
|
|
'SMILEY_WIDTH' => $row['smiley_width'],
|
|
'SMILEY_HEIGHT' => $row['smiley_height'],
|
|
'SMILEY_DESC' => $row['emotion'])
|
|
);
|
|
}
|
|
$last_url = $row['smiley_url'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
if ($mode == 'inline' && $display_link)
|
|
{
|
|
$template->assign_vars(array(
|
|
'S_SHOW_SMILEY_LINK' => true,
|
|
'U_MORE_SMILIES' => append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&f=' . $forum_id))
|
|
);
|
|
}
|
|
|
|
if ($mode == 'window')
|
|
{
|
|
page_footer();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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, $return_update_sql = false)
|
|
{
|
|
global $db;
|
|
|
|
if (!is_array($ids))
|
|
{
|
|
$ids = array($ids);
|
|
}
|
|
|
|
$update_sql = $empty_forums = array();
|
|
|
|
$sql = 'SELECT ' . $type . '_id, MAX(post_id) as last_post_id
|
|
FROM ' . POSTS_TABLE . "
|
|
WHERE post_approved = 1
|
|
AND {$type}_id IN (" . implode(', ', $ids) . ")
|
|
GROUP BY {$type}_id";
|
|
$result = $db->sql_query($sql);
|
|
|
|
$last_post_ids = array();
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if ($type == 'forum')
|
|
{
|
|
$empty_forums[] = $row['forum_id'];
|
|
}
|
|
|
|
$last_post_ids[] = $row['last_post_id'];
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
if ($type == 'forum')
|
|
{
|
|
$empty_forums = array_diff($ids, $empty_forums);
|
|
|
|
foreach ($empty_forums as $void => $forum_id)
|
|
{
|
|
$update_sql[$forum_id][] = 'forum_last_post_id = 0';
|
|
$update_sql[$forum_id][] = 'forum_last_post_time = 0';
|
|
$update_sql[$forum_id][] = 'forum_last_poster_id = 0';
|
|
$update_sql[$forum_id][] = "forum_last_poster_name = ''";
|
|
}
|
|
}
|
|
|
|
if (sizeof($last_post_ids))
|
|
{
|
|
$sql = 'SELECT p.' . $type . '_id, p.post_id, p.post_time, p.poster_id, p.post_username, u.user_id, u.username
|
|
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
|
|
WHERE p.poster_id = u.user_id
|
|
AND p.post_id IN (' . implode(', ', $last_post_ids) . ')';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$update_sql[$row["{$type}_id"]][] = $type . '_last_post_id = ' . (int) $row['post_id'];
|
|
$update_sql[$row["{$type}_id"]][] = $type . '_last_post_time = ' . (int) $row['post_time'];
|
|
$update_sql[$row["{$type}_id"]][] = $type . '_last_poster_id = ' . (int) $row['poster_id'];
|
|
$update_sql[$row["{$type}_id"]][] = "{$type}_last_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "'";
|
|
}
|
|
$db->sql_freeresult($result);
|
|
}
|
|
unset($empty_forums, $ids, $last_post_ids);
|
|
|
|
if ($return_update_sql || !sizeof($update_sql))
|
|
{
|
|
return $update_sql;
|
|
}
|
|
|
|
$table = ($type == 'forum') ? FORUMS_TABLE : TOPICS_TABLE;
|
|
|
|
foreach ($update_sql as $update_id => $update_sql_ary)
|
|
{
|
|
$sql = "UPDATE $table
|
|
SET " . implode(', ', $update_sql_ary) . "
|
|
WHERE {$type}_id = $update_id";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
/**
|
|
* 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
|
|
*/
|
|
function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false)
|
|
{
|
|
global $auth, $user, $config, $db, $cache;
|
|
global $phpbb_root_path, $phpEx;
|
|
|
|
$filedata = array(
|
|
'error' => array()
|
|
);
|
|
|
|
include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
|
|
$upload = new fileupload();
|
|
|
|
if (!$local)
|
|
{
|
|
$filedata['post_attach'] = ($upload->is_valid($form_name)) ? true : false;
|
|
}
|
|
else
|
|
{
|
|
$filedata['post_attach'] = true;
|
|
}
|
|
|
|
if (!$filedata['post_attach'])
|
|
{
|
|
$filedata['error'][] = 'No filedata found';
|
|
return $filedata;
|
|
}
|
|
|
|
$extensions = array();
|
|
$cache->obtain_attach_extensions($extensions, $forum_id);
|
|
|
|
$upload->set_allowed_extensions(array_keys($extensions['_allowed_']));
|
|
|
|
$file = ($local) ? $upload->local_upload($local_storage) : $upload->form_upload($form_name);
|
|
|
|
if ($file->init_error)
|
|
{
|
|
$filedata['post_attach'] = false;
|
|
return $filedata;
|
|
}
|
|
|
|
$cat_id = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] : ATTACHMENT_CATEGORY_NONE;
|
|
|
|
// Do we have to create a thumbnail?
|
|
$filedata['thumbnail'] = ($cat_id == ATTACHMENT_CATEGORY_IMAGE && $config['img_create_thumbnail']) ? 1 : 0;
|
|
|
|
// Check Image Size, if it is an image
|
|
if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id) && $cat_id == ATTACHMENT_CATEGORY_IMAGE)
|
|
{
|
|
$file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']);
|
|
}
|
|
|
|
// Admins and mods are allowed to exceed the allowed filesize
|
|
if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id))
|
|
{
|
|
if (!empty($extensions[$file->get('extension')]['max_filesize']))
|
|
{
|
|
$allowed_filesize = $extensions[$file->get('extension')]['max_filesize'];
|
|
}
|
|
else
|
|
{
|
|
$allowed_filesize = ($is_message) ? $config['max_filesize_pm'] : $config['max_filesize'];
|
|
}
|
|
|
|
$file->upload->set_max_filesize($allowed_filesize);
|
|
}
|
|
|
|
$file->clean_filename('unique', $user->data['user_id'] . '_');
|
|
$file->move_file($config['upload_path']);
|
|
|
|
if (sizeof($file->error))
|
|
{
|
|
$file->remove();
|
|
$filedata['error'] = array_merge($filedata['error'], $file->error);
|
|
$filedata['post_attach'] = false;
|
|
|
|
return $filedata;
|
|
}
|
|
|
|
$filedata['filesize'] = $file->get('filesize');
|
|
$filedata['mimetype'] = $file->get('mimetype');
|
|
$filedata['extension'] = $file->get('extension');
|
|
$filedata['physical_filename'] = $file->get('realname');
|
|
$filedata['real_filename'] = $file->get('uploadname');
|
|
$filedata['filetime'] = time();
|
|
|
|
// Check our complete quota
|
|
if ($config['attachment_quota'])
|
|
{
|
|
if ($config['upload_dir_size'] + $file->get('filesize') > $config['attachment_quota'])
|
|
{
|
|
$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
|
|
$filedata['post_attach'] = false;
|
|
|
|
$file->remove();
|
|
|
|
return $filedata;
|
|
}
|
|
}
|
|
|
|
// Check free disk space
|
|
if ($free_space = @disk_free_space($phpbb_root_path . $config['upload_path']))
|
|
{
|
|
if ($free_space <= $file->get('filesize'))
|
|
{
|
|
$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED'];
|
|
$filedata['post_attach'] = false;
|
|
|
|
$file->remove();
|
|
|
|
return $filedata;
|
|
}
|
|
}
|
|
|
|
// Create Thumbnail
|
|
if ($filedata['thumbnail'])
|
|
{
|
|
$source = $file->get('destination_file');
|
|
$destination = $file->get('destination_path') . '/thumb_' . $file->get('realname');
|
|
|
|
if (!create_thumbnail($source, $destination, $file->get('mimetype')))
|
|
{
|
|
$filedata['thumbnail'] = 0;
|
|
}
|
|
}
|
|
|
|
return $filedata;
|
|
}
|
|
|
|
/**
|
|
* Calculate the needed size for Thumbnail
|
|
*/
|
|
function get_img_size_format($width, $height)
|
|
{
|
|
// Maximum Width the Image can take
|
|
$max_width = 400;
|
|
|
|
if ($width > $height)
|
|
{
|
|
return array(
|
|
round($width * ($max_width / $width)),
|
|
round($height * ($max_width / $width))
|
|
);
|
|
}
|
|
else
|
|
{
|
|
return array(
|
|
round($width * ($max_width / $height)),
|
|
round($height * ($max_width / $height))
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return supported image types
|
|
*/
|
|
function get_supported_image_types($type = false)
|
|
{
|
|
if (@extension_loaded('gd'))
|
|
{
|
|
$format = imagetypes();
|
|
$new_type = 0;
|
|
|
|
if ($type !== false)
|
|
{
|
|
switch ($type)
|
|
{
|
|
// GIF
|
|
case 1:
|
|
$new_type = ($format & IMG_GIF) ? IMG_GIF : false;
|
|
break;
|
|
|
|
// JPG, JPC, JP2
|
|
case 2:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
$new_type = ($format & IMG_JPG) ? IMG_JPG : false;
|
|
break;
|
|
|
|
// PNG
|
|
case 3:
|
|
$new_type = ($format & IMG_PNG) ? IMG_PNG : false;
|
|
break;
|
|
|
|
// BMP, WBMP
|
|
case 6:
|
|
case 15:
|
|
$new_type = ($format & IMG_WBMP) ? IMG_WBMP : false;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$new_type = array();
|
|
$go_through_types = array(IMG_GIF, IMG_JPG, IMG_PNG, IMG_WBMP);
|
|
|
|
foreach ($go_through_types as $check_type)
|
|
{
|
|
if ($format & $check_type)
|
|
{
|
|
$new_type[] = $check_type;
|
|
}
|
|
}
|
|
}
|
|
|
|
return array(
|
|
'gd' => ($new_type) ? true : false,
|
|
'format' => $new_type,
|
|
'version' => (function_exists('imagecreatetruecolor')) ? 2 : 1
|
|
);
|
|
}
|
|
|
|
return array('gd' => false);
|
|
}
|
|
|
|
/**
|
|
* Create Thumbnail
|
|
*/
|
|
function create_thumbnail($source, $destination, $mimetype)
|
|
{
|
|
global $config;
|
|
|
|
$min_filesize = (int) $config['img_min_thumb_filesize'];
|
|
$img_filesize = (file_exists($source)) ? @filesize($source) : false;
|
|
|
|
if (!$img_filesize || $img_filesize <= $min_filesize)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
list($width, $height, $type, ) = @getimagesize($source);
|
|
|
|
if (!$width || !$height)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
list($new_width, $new_height) = get_img_size_format($width, $height);
|
|
|
|
$used_imagick = false;
|
|
|
|
// Only use imagemagick if defined and the passthru function not disabled
|
|
if ($config['img_imagick'] && function_exists('passthru'))
|
|
{
|
|
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))
|
|
{
|
|
$used_imagick = true;
|
|
}
|
|
}
|
|
|
|
if (!$used_imagick)
|
|
{
|
|
$type = get_supported_image_types($type);
|
|
|
|
if ($type['gd'])
|
|
{
|
|
// If the type is not supported, we are not able to create a thumbnail
|
|
if ($type['format'] === false)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
switch ($type['format'])
|
|
{
|
|
case IMG_GIF:
|
|
$image = @imagecreatefromgif($source);
|
|
break;
|
|
|
|
case IMG_JPG:
|
|
$image = @imagecreatefromjpeg($source);
|
|
break;
|
|
|
|
case IMG_PNG:
|
|
$image = @imagecreatefrompng($source);
|
|
break;
|
|
|
|
case IMG_WBMP:
|
|
$image = @imagecreatefromwbmp($source);
|
|
break;
|
|
}
|
|
|
|
if ($type['version'] == 1)
|
|
{
|
|
$new_image = imagecreate($new_width, $new_height);
|
|
imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
|
|
}
|
|
else
|
|
{
|
|
$new_image = imagecreatetruecolor($new_width, $new_height);
|
|
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
|
|
}
|
|
|
|
switch ($type['format'])
|
|
{
|
|
case IMG_GIF:
|
|
imagegif($new_image, $destination);
|
|
break;
|
|
|
|
case IMG_JPG:
|
|
imagejpeg($new_image, $destination, 90);
|
|
break;
|
|
|
|
case IMG_PNG:
|
|
imagepng($new_image, $destination);
|
|
break;
|
|
|
|
case IMG_WBMP:
|
|
imagewbmp($new_image, $destination);
|
|
break;
|
|
}
|
|
|
|
imagedestroy($new_image);
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!file_exists($destination))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
@chmod($destination, 0666);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Assign Inline attachments (build option fields)
|
|
*/
|
|
function posting_gen_inline_attachments(&$attachment_data)
|
|
{
|
|
global $template;
|
|
|
|
if (sizeof($attachment_data))
|
|
{
|
|
$s_inline_attachment_options = '';
|
|
|
|
foreach ($attachment_data as $i => $attachment)
|
|
{
|
|
$s_inline_attachment_options .= '<option value="' . $i . '">' . $attachment['real_filename'] . '</option>';
|
|
}
|
|
|
|
$template->assign_var('S_INLINE_ATTACHMENT_OPTIONS', $s_inline_attachment_options);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Generate inline attachment entry
|
|
*/
|
|
function posting_gen_attachment_entry(&$attachment_data, &$filename_data)
|
|
{
|
|
global $template, $config, $phpbb_root_path, $phpEx;
|
|
|
|
$template->assign_vars(array(
|
|
'S_SHOW_ATTACH_BOX' => true)
|
|
);
|
|
|
|
if (sizeof($attachment_data))
|
|
{
|
|
$template->assign_vars(array(
|
|
'S_HAS_ATTACHMENTS' => true)
|
|
);
|
|
|
|
$count = 0;
|
|
foreach ($attachment_data as $attach_row)
|
|
{
|
|
$hidden = '';
|
|
$attach_row['real_filename'] = basename($attach_row['real_filename']);
|
|
|
|
foreach ($attach_row as $key => $value)
|
|
{
|
|
$hidden .= '<input type="hidden" name="attachment_data[' . $count . '][' . $key . ']" value="' . $value . '" />';
|
|
}
|
|
|
|
$download_link = (!$attach_row['attach_id']) ? $phpbb_root_path . $config['upload_path'] . '/' . basename($attach_row['physical_filename']) : append_sid("{$phpbb_root_path}download.$phpEx", 'id=' . (int) $attach_row['attach_id']);
|
|
|
|
$template->assign_block_vars('attach_row', array(
|
|
'FILENAME' => basename($attach_row['real_filename']),
|
|
'ATTACH_FILENAME' => basename($attach_row['physical_filename']),
|
|
'FILE_COMMENT' => $attach_row['attach_comment'],
|
|
'ATTACH_ID' => $attach_row['attach_id'],
|
|
'ASSOC_INDEX' => $count,
|
|
|
|
'U_VIEW_ATTACHMENT' => $download_link,
|
|
'S_HIDDEN' => $hidden)
|
|
);
|
|
|
|
$count++;
|
|
}
|
|
}
|
|
|
|
$template->assign_vars(array(
|
|
'FILE_COMMENT' => $filename_data['filecomment'],
|
|
'FILESIZE' => $config['max_filesize'])
|
|
);
|
|
|
|
return sizeof($attachment_data);
|
|
}
|
|
|
|
//
|
|
// General Post functions
|
|
//
|
|
|
|
/**
|
|
* Load Drafts
|
|
*/
|
|
function load_drafts($topic_id = 0, $forum_id = 0, $id = 0)
|
|
{
|
|
global $user, $db, $template, $auth;
|
|
global $phpbb_root_path, $phpEx;
|
|
|
|
$topic_ids = $forum_ids = $draft_rows = array();
|
|
|
|
// Load those drafts not connected to forums/topics
|
|
// If forum_id == 0 AND topic_id == 0 then this is a PM draft
|
|
if (!$topic_id && !$forum_id)
|
|
{
|
|
$sql_and = ' AND d.forum_id = 0 AND d.topic_id = 0';
|
|
}
|
|
else
|
|
{
|
|
$sql_and = '';
|
|
$sql_and .= ($forum_id) ? ' AND d.forum_id = ' . (int) $forum_id : '';
|
|
$sql_and .= ($topic_id) ? ' AND d.topic_id = ' . (int) $topic_id : '';
|
|
}
|
|
|
|
$sql = 'SELECT d.*, f.forum_id, f.forum_name
|
|
FROM ' . DRAFTS_TABLE . ' d
|
|
LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = d.forum_id)
|
|
WHERE d.user_id = ' . $user->data['user_id'] . "
|
|
$sql_and
|
|
ORDER BY d.save_time DESC";
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if ($row['topic_id'])
|
|
{
|
|
$topic_ids[] = (int) $row['topic_id'];
|
|
}
|
|
$draft_rows[] = $row;
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
if (!sizeof($draft_rows))
|
|
{
|
|
return;
|
|
}
|
|
|
|
$topic_rows = array();
|
|
if (sizeof($topic_ids))
|
|
{
|
|
$sql = 'SELECT topic_id, forum_id, topic_title
|
|
FROM ' . TOPICS_TABLE . '
|
|
WHERE topic_id IN (' . implode(',', array_unique($topic_ids)) . ')';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$topic_rows[$row['topic_id']] = $row;
|
|
}
|
|
$db->sql_freeresult($result);
|
|
}
|
|
unset($topic_ids);
|
|
|
|
$template->assign_var('S_SHOW_DRAFTS', true);
|
|
|
|
foreach ($draft_rows as $draft)
|
|
{
|
|
$link_topic = $link_forum = $link_pm = false;
|
|
$insert_url = $view_url = $title = '';
|
|
|
|
if (isset($topic_rows[$draft['topic_id']]) && $auth->acl_get('f_read', $topic_rows[$draft['topic_id']]['forum_id']))
|
|
{
|
|
$link_topic = true;
|
|
$view_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $topic_rows[$draft['topic_id']]['forum_id'] . '&t=' . $draft['topic_id']);
|
|
$title = $topic_rows[$draft['topic_id']]['topic_title'];
|
|
|
|
$insert_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'f=' . $topic_rows[$draft['topic_id']]['forum_id'] . '&t=' . $draft['topic_id'] . '&mode=reply&d=' . $draft['draft_id']);
|
|
}
|
|
else if ($draft['forum_id'] && $auth->acl_get('f_read', $draft['forum_id']))
|
|
{
|
|
$link_forum = true;
|
|
$view_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $draft['forum_id']);
|
|
$title = $draft['forum_name'];
|
|
|
|
$insert_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'f=' . $draft['forum_id'] . '&mode=post&d=' . $draft['draft_id']);
|
|
}
|
|
else
|
|
{
|
|
// Either display as PM draft if forum_id and topic_id are empty or if access to the forums has been denied afterwards...
|
|
$link_pm = true;
|
|
$insert_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "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']),
|
|
'DRAFT_SUBJECT' => $draft['draft_subject'],
|
|
|
|
'TITLE' => $title,
|
|
'U_VIEW' => $view_url,
|
|
'U_INSERT' => $insert_url,
|
|
|
|
'S_LINK_PM' => $link_pm,
|
|
'S_LINK_TOPIC' => $link_topic,
|
|
'S_LINK_FORUM' => $link_forum)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Topic Review
|
|
*/
|
|
function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true)
|
|
{
|
|
global $user, $auth, $db, $template, $bbcode;
|
|
global $config, $phpbb_root_path, $phpEx;
|
|
|
|
// Go ahead and pull all data for this topic
|
|
$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
|
|
" . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . '
|
|
' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '
|
|
ORDER BY p.post_time DESC';
|
|
$result = $db->sql_query_limit($sql, $config['posts_per_page']);
|
|
|
|
if (!$row = $db->sql_fetchrow($result))
|
|
{
|
|
$db->sql_freeresult($result);
|
|
return false;
|
|
}
|
|
|
|
$bbcode_bitfield = '';
|
|
do
|
|
{
|
|
$rowset[] = $row;
|
|
$bbcode_bitfield = $bbcode_bitfield | $row['bbcode_bitfield'];
|
|
}
|
|
while ($row = $db->sql_fetchrow($result));
|
|
$db->sql_freeresult($result);
|
|
|
|
// Instantiate BBCode class
|
|
if (!isset($bbcode) && $bbcode_bitfield)
|
|
{
|
|
include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
|
|
$bbcode = new bbcode($bbcode_bitfield);
|
|
}
|
|
|
|
foreach ($rowset as $i => $row)
|
|
{
|
|
$poster_id = $row['user_id'];
|
|
$poster = $row['username'];
|
|
|
|
// Handle anon users posting with usernames
|
|
if ($poster_id == ANONYMOUS)
|
|
{
|
|
$poster = ($row['post_username']) ? $row['post_username'] : $user->lang['GUEST'];
|
|
$poster_rank = ($row['post_username']) ? $user->lang['GUEST'] : '';
|
|
}
|
|
|
|
$post_subject = $row['post_subject'];
|
|
$message = $row['post_text'];
|
|
$decoded_message = false;
|
|
|
|
if ($show_quote_button && $auth->acl_get('f_reply', $forum_id))
|
|
{
|
|
$decoded_message = $message;
|
|
decode_message($decoded_message, $row['bbcode_uid']);
|
|
|
|
$decoded_message = censor_text($decoded_message);
|
|
$decoded_message = str_replace("\n", "<br />", $decoded_message);
|
|
}
|
|
|
|
if ($row['bbcode_bitfield'])
|
|
{
|
|
$bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
|
|
}
|
|
|
|
$message = smiley_text($message, !$row['enable_smilies']);
|
|
|
|
$post_subject = censor_text($post_subject);
|
|
$message = censor_text($message);
|
|
|
|
$template->assign_block_vars($mode . '_row', array(
|
|
'POSTER_NAME' => $poster,
|
|
'POST_SUBJECT' => $post_subject,
|
|
'MINI_POST_IMG' => $user->img('icon_post', $user->lang['POST']),
|
|
'POST_DATE' => $user->format_date($row['post_time']),
|
|
'MESSAGE' => str_replace("\n", '<br />', $message),
|
|
'DECODED_MESSAGE' => $decoded_message,
|
|
|
|
'U_POST_ID' => $row['post_id'],
|
|
'U_MINI_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],
|
|
'U_MCP_DETAILS' => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&mode=post_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '',
|
|
'U_QUOTE' => ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? 'javascript:addquote(' . $row['post_id'] . ", '" . addslashes($poster) . "')" : '')
|
|
);
|
|
unset($rowset[$i]);
|
|
}
|
|
|
|
if ($mode == 'topic_review')
|
|
{
|
|
$template->assign_var('QUOTE_IMG', $user->img('btn_quote', $user->lang['REPLY_WITH_QUOTE']));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* User Notification
|
|
*/
|
|
function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id, $topic_id, $post_id)
|
|
{
|
|
global $db, $user, $config, $phpbb_root_path, $phpEx, $auth;
|
|
|
|
$topic_notification = ($mode == 'reply' || $mode == 'quote');
|
|
$forum_notification = ($mode == 'post');
|
|
|
|
if (!$topic_notification && !$forum_notification)
|
|
{
|
|
trigger_error('WRONG_NOTIFICATION_MODE');
|
|
}
|
|
|
|
if (!$config['allow_topic_notify'])
|
|
{
|
|
return;
|
|
}
|
|
|
|
$topic_title = ($topic_notification) ? $topic_title : $subject;
|
|
$topic_title = censor_text($topic_title);
|
|
|
|
// Get banned User ID's
|
|
$sql = 'SELECT ban_userid
|
|
FROM ' . BANLIST_TABLE;
|
|
$result = $db->sql_query($sql);
|
|
|
|
$sql_ignore_users = ANONYMOUS . ', ' . $user->data['user_id'];
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
if (isset($row['ban_userid']))
|
|
{
|
|
$sql_ignore_users .= ', ' . $row['ban_userid'];
|
|
}
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
$notify_rows = array();
|
|
|
|
// -- get forum_userids || topic_userids
|
|
$sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
|
|
FROM ' . (($topic_notification) ? TOPICS_WATCH_TABLE : FORUMS_WATCH_TABLE) . ' w, ' . USERS_TABLE . ' u
|
|
WHERE w.' . (($topic_notification) ? 'topic_id' : 'forum_id') . ' = ' . (($topic_notification) ? $topic_id : $forum_id) . "
|
|
AND w.user_id NOT IN ($sql_ignore_users)
|
|
AND w.notify_status = 0
|
|
AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
|
|
AND u.user_id = w.user_id';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$notify_rows[$row['user_id']] = array(
|
|
'user_id' => $row['user_id'],
|
|
'username' => $row['username'],
|
|
'user_email' => $row['user_email'],
|
|
'user_jabber' => $row['user_jabber'],
|
|
'user_lang' => $row['user_lang'],
|
|
'notify_type' => ($topic_notification) ? 'topic' : 'forum',
|
|
'template' => ($topic_notification) ? 'topic_notify' : 'newtopic_notify',
|
|
'method' => $row['user_notify_type'],
|
|
'allowed' => false
|
|
);
|
|
}
|
|
$db->sql_freeresult($result);
|
|
|
|
// forum notification is sent to those not already receiving topic notifications
|
|
if ($topic_notification)
|
|
{
|
|
if (sizeof($notify_rows))
|
|
{
|
|
$sql_ignore_users .= ', ' . implode(', ', array_keys($notify_rows));
|
|
}
|
|
|
|
$sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
|
|
FROM ' . FORUMS_WATCH_TABLE . ' fw, ' . USERS_TABLE . " u
|
|
WHERE fw.forum_id = $forum_id
|
|
AND fw.user_id NOT IN ($sql_ignore_users)
|
|
AND fw.notify_status = 0
|
|
AND u.user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')
|
|
AND u.user_id = fw.user_id';
|
|
$result = $db->sql_query($sql);
|
|
|
|
while ($row = $db->sql_fetchrow($result))
|
|
{
|
|
$notify_rows[$row['user_id']] = array(
|
|
'user_id' => $row['user_id'],
|
|
'username' => $row['username'],
|
|
'user_email' => $row['user_email'],
|
|
'user_jabber' => $row['user_jabber'],
|
|
'user_lang' => $row['user_lang'],
|
|
'notify_type' => 'forum',
|
|
'template' => 'forum_notify',
|
|
'method' => $row['user_notify_type'],
|
|
'allowed' => false
|
|
);
|
|
}
|
|
$db->sql_freeresult($result);
|
|
}
|
|
|
|
if (!sizeof($notify_rows))
|
|
{
|
|
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)
|
|
{
|
|
foreach ($user_ary as $user_id)
|
|
{
|
|
$notify_rows[$user_id]['allowed'] = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Now, we have to do a little step before really sending, we need to distinguish our users a little bit. ;)
|
|
$msg_users = $delete_ids = $update_notification = array();
|
|
foreach ($notify_rows as $user_id => $row)
|
|
{
|
|
if (!$row['allowed'] || !trim($row['user_email']))
|
|
{
|
|
$delete_ids[$row['notify_type']][] = $row['user_id'];
|
|
}
|
|
else
|
|
{
|
|
$msg_users[] = $row;
|
|
$update_notification[$row['notify_type']][] = $row['user_id'];
|
|
}
|
|
}
|
|
unset($notify_rows);
|
|
|
|
// Now, we are able to really send out notifications
|
|
if (sizeof($msg_users))
|
|
{
|
|
include_once($phpbb_root_path . 'includes/functions_messenger.'.$phpEx);
|
|
$messenger = new messenger();
|
|
|
|
$email_sig = str_replace('<br />', "\n", "-- \n" . $config['board_email_sig']);
|
|
|
|
$msg_list_ary = array();
|
|
foreach ($msg_users as $row)
|
|
{
|
|
$pos = (!isset($msg_list_ary[$row['template']])) ? 0 : sizeof($msg_list_ary[$row['template']]);
|
|
|
|
$msg_list_ary[$row['template']][$pos]['method'] = $row['method'];
|
|
$msg_list_ary[$row['template']][$pos]['email'] = $row['user_email'];
|
|
$msg_list_ary[$row['template']][$pos]['jabber'] = $row['user_jabber'];
|
|
$msg_list_ary[$row['template']][$pos]['name'] = $row['username'];
|
|
$msg_list_ary[$row['template']][$pos]['lang'] = $row['user_lang'];
|
|
}
|
|
unset($msg_users);
|
|
|
|
foreach ($msg_list_ary as $email_template => $email_list)
|
|
{
|
|
foreach ($email_list as $addr)
|
|
{
|
|
$messenger->template($email_template, $addr['lang']);
|
|
|
|
$messenger->replyto($config['board_email']);
|
|
$messenger->to($addr['email'], $addr['name']);
|
|
$messenger->im($addr['jabber'], $addr['name']);
|
|
|
|
$messenger->assign_vars(array(
|
|
'EMAIL_SIG' => $email_sig,
|
|
'SITENAME' => html_entity_decode($config['sitename']),
|
|
'USERNAME' => html_entity_decode($addr['name']),
|
|
'TOPIC_TITLE' => html_entity_decode($topic_title),
|
|
'FORUM_NAME' => html_entity_decode($forum_name),
|
|
|
|
'U_FORUM' => generate_board_url() . "/viewforum.$phpEx?f=$forum_id&e=0",
|
|
'U_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&e=0",
|
|
'U_NEWEST_POST' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&p=$post_id&e=$post_id",
|
|
'U_STOP_WATCHING_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&unwatch=topic",
|
|
'U_STOP_WATCHING_FORUM' => generate_board_url() . "/viewforum.$phpEx?f=$forum_id&unwatch=forum",
|
|
));
|
|
|
|
$messenger->send($addr['method']);
|
|
$messenger->reset();
|
|
}
|
|
}
|
|
unset($msg_list_ary);
|
|
|
|
$messenger->save_queue();
|
|
}
|
|
|
|
// Handle the DB updates
|
|
$db->sql_transaction('begin');
|
|
|
|
if (!empty($update_notification['topic']))
|
|
{
|
|
$sql = 'UPDATE ' . TOPICS_WATCH_TABLE . "
|
|
SET notify_status = 1
|
|
WHERE topic_id = $topic_id
|
|
AND user_id IN (" . implode(', ', $update_notification['topic']) . ")";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
if (!empty($update_notification['forum']))
|
|
{
|
|
$sql = 'UPDATE ' . FORUMS_WATCH_TABLE . "
|
|
SET notify_status = 1
|
|
WHERE forum_id = $forum_id
|
|
AND user_id IN (" . implode(', ', $update_notification['forum']) . ")";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
// Now delete the user_ids not authorized to receive notifications on this topic/forum
|
|
if (!empty($delete_ids['topic']))
|
|
{
|
|
$sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . "
|
|
WHERE topic_id = $topic_id
|
|
AND user_id IN (" . implode(', ', $delete_ids['topic']) . ")";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
if (!empty($delete_ids['forum']))
|
|
{
|
|
$sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . "
|
|
WHERE forum_id = $forum_id
|
|
AND user_id IN (" . implode(', ', $delete_ids['forum']) . ")";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
$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, $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('begin');
|
|
|
|
if (!delete_posts('post_id', array($post_id), false, 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 information for updating the tables
|
|
$sql_data[FORUMS_TABLE] = '';
|
|
switch ($post_mode)
|
|
{
|
|
case 'delete_topic':
|
|
delete_topics('topic_id', array($topic_id), false);
|
|
|
|
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]);
|
|
}
|
|
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' : '';
|
|
|
|
$db->sql_transaction('begin');
|
|
|
|
$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');
|
|
|
|
// Adjust posted info for this user by looking for a post by him/her within this topic...
|
|
if ($post_mode != 'delete_topic' && $config['load_db_track'] && $user->data['is_registered'])
|
|
{
|
|
$sql = 'SELECT poster_id
|
|
FROM ' . POSTS_TABLE . '
|
|
WHERE topic_id = ' . $topic_id . '
|
|
AND poster_id = ' . $user->data['user_id'];
|
|
$result = $db->sql_query_limit($sql, 1);
|
|
$poster_id = (int) $db->sql_fetchfield('poster_id');
|
|
$db->sql_freeresult($result);
|
|
|
|
// The user is not having any more posts within this topic
|
|
if (!$poster_id)
|
|
{
|
|
$sql = 'DELETE FROM ' . TOPICS_POSTED_TABLE . '
|
|
WHERE topic_id = ' . $topic_id . '
|
|
AND user_id = ' . $user->data['user_id'];
|
|
$db->sql_query($sql);
|
|
}
|
|
}
|
|
|
|
if ($data['post_reported'] && ($post_mode != 'delete_topic'))
|
|
{
|
|
sync('topic_reported', 'topic_id', array($topic_id));
|
|
}
|
|
|
|
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, $template, $phpbb_root_path;
|
|
|
|
// We do not handle erasing posts here
|
|
if ($mode == 'delete')
|
|
{
|
|
return false;
|
|
}
|
|
|
|
$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_noapprove', $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_get('m_edit', $data['forum_id']) || $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_noapprove', $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_noapprove', $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_noapprove', $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_noapprove', $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_noapprove', $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_noapprove', $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_noapprove', $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('begin');
|
|
|
|
// 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'])
|
|
);
|
|
}
|
|
|
|
$query = '';
|
|
|
|
switch (SQL_LAYER)
|
|
{
|
|
case 'mssql':
|
|
case 'mssql_odbc':
|
|
$fields = array();
|
|
foreach ($sql_data[POSTS_TABLE]['sql'] as $key => $var)
|
|
{
|
|
$fields[] = $key;
|
|
|
|
if (is_null($var))
|
|
{
|
|
$values[] = 'NULL';
|
|
}
|
|
else if (is_string($var))
|
|
{
|
|
if ($key !== 'bbcode_bitfield')
|
|
{
|
|
$values[] = "'" . $db->sql_escape($var) . "'";
|
|
}
|
|
else
|
|
{
|
|
$values[] = "CAST('" . $var . "' AS varbinary)";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$values[] = (is_bool($var)) ? intval($var) : $var;
|
|
}
|
|
}
|
|
$query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
|
|
break;
|
|
|
|
case 'sqlite':
|
|
$fields = array();
|
|
foreach ($sql_data[POSTS_TABLE]['sql'] as $key => $var)
|
|
{
|
|
$fields[] = $key;
|
|
|
|
if (is_null($var))
|
|
{
|
|
$values[] = 'NULL';
|
|
}
|
|
else if (is_string($var))
|
|
{
|
|
if ($key !== 'bbcode_bitfield')
|
|
{
|
|
$values[] = "'" . $db->sql_escape($var) . "'";
|
|
}
|
|
else
|
|
{
|
|
$values[] = "'" . sqlite_udf_encode_binary($var) . "'";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$values[] = (is_bool($var)) ? intval($var) : $var;
|
|
}
|
|
}
|
|
$query = ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';
|
|
break;
|
|
|
|
default:
|
|
$query = $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
|
|
break;
|
|
}
|
|
|
|
|
|
$sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $query;
|
|
$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']))
|
|
{
|
|
$sql = 'UPDATE ' . TOPICS_TABLE . '
|
|
SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . '
|
|
WHERE topic_id = ' . $data['topic_id'];
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
// Update the posts table
|
|
if (isset($sql_data[POSTS_TABLE]['sql']))
|
|
{
|
|
switch (SQL_LAYER)
|
|
{
|
|
case 'mssql':
|
|
case 'mssql_odbc':
|
|
$values = array();
|
|
foreach ($sql_data as $key => $var)
|
|
{
|
|
if (is_null($var))
|
|
{
|
|
$values[] = "$key = NULL";
|
|
}
|
|
else if (is_string($var))
|
|
{
|
|
if ($key !== 'bbcode_bitfield')
|
|
{
|
|
$values[] = "$key = '" . $db->sql_escape($var) . "'";
|
|
}
|
|
else
|
|
{
|
|
$values[] = "$key = CAST('" . $var . "' AS varbinary)";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
|
|
}
|
|
}
|
|
$query = implode(', ', $values);
|
|
break;
|
|
|
|
case 'sqlite':
|
|
$values = array();
|
|
foreach ($sql_data as $key => $var)
|
|
{
|
|
if (is_null($var))
|
|
{
|
|
$values[] = "$key = NULL";
|
|
}
|
|
else if (is_string($var))
|
|
{
|
|
if ($key !== 'bbcode_bitfield')
|
|
{
|
|
$values[] = "$key = '" . $db->sql_escape($var) . "'";
|
|
}
|
|
else
|
|
{
|
|
$values[] = "$key ='" . sqlite_udf_encode_binary($var) . "'";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$values[] = (is_bool($var)) ? "$key = " . intval($var) : "$key = $var";
|
|
}
|
|
}
|
|
$query = implode(', ', $values);
|
|
break;
|
|
|
|
default:
|
|
$query = $db->sql_build_array('UPDATE', $sql_data);
|
|
break;
|
|
}
|
|
|
|
$sql = 'UPDATE ' . POSTS_TABLE . '
|
|
SET ' . $query . '
|
|
WHERE post_id = ' . $data['post_id'];
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
// 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 (empty($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 attach_comment = '" . $db->sql_escape($attach_row['attach_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']),
|
|
'attach_comment' => $attach_row['attach_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_noapprove', $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('begin');
|
|
|
|
$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)
|
|
{
|
|
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
|
|
WHERE topic_moved_id = ' . $data['topic_id'];
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
// 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 = basename($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, $user->lang['ENCODING'], $poster_id, ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']);
|
|
}
|
|
|
|
$db->sql_transaction('commit');
|
|
|
|
// Delete draft if post was loaded...
|
|
$draft_id = request_var('draft_loaded', 0);
|
|
if ($draft_id)
|
|
{
|
|
$sql = 'DELETE FROM ' . DRAFTS_TABLE . "
|
|
WHERE draft_id = $draft_id
|
|
AND user_id = {$user->data['user_id']}";
|
|
$db->sql_query($sql);
|
|
}
|
|
|
|
// 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_noapprove', $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_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $data['forum_id'] . '&t=' . $data['topic_id']) : append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $data['forum_id']);
|
|
}
|
|
else
|
|
{
|
|
$url = ($auth->acl_get('f_noapprove', $data['forum_id']) || $auth->acl_get('m_approve', $data['forum_id'])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$data['forum_id']}&t={$data['topic_id']}&p={$data['post_id']}") . "#p{$data['post_id']}" : append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$data['forum_id']}&t={$data['topic_id']}");
|
|
}
|
|
|
|
return $url;
|
|
}
|
|
|
|
?>
|