<?php
/*******************************************************
* Разработка: Carbofos.
* Оптимизация под WAP: Гутник Игорь ( чел ).
* 2007 год
*******************************************************/
if (!defined('IN_PHPBB'))
{
die('Hacking attempt');
}
if (!empty($images))
{
$warned_img = $lang['Warning'];
$banned_img = $lang['reputation_ban'];
$thumb_up_img = $lang['reputation_approve'];
$thumb_dn_img = $lang['reputation_disapprove'];
}
$current_time = time();
$reputation_auth_keys = array('auth_view_rep', 'auth_view_warns', 'auth_add_rep', 'auth_add_rep_nonpost', 'auth_edit_rep', 'auth_delete_rep', 'auth_warn', 'auth_warn_nonpost', 'auth_ban', 'auth_ban_nonpost', 'auth_edit_warn', 'auth_delete_warn', 'auth_no_limits');
function input_var($name, $default, $required_msg = null)
{
global $HTTP_POST_VARS, $HTTP_GET_VARS;
if (isset($HTTP_POST_VARS[$name]))
{
$var = $HTTP_POST_VARS[$name];
}
elseif (isset($HTTP_GET_VARS[$name]))
{
$var = $HTTP_GET_VARS[$name];
}
elseif ($required_msg)
{
message_die(GENERAL_ERROR, $required_msg);
}
else
{
return addslashes(is_array($default) ? $default[0] : $default);
}
if (is_array($default))
{
settype($var, gettype($default[0]));
if (in_array($var, $default))
{
return $var;
}
return $default[0];
}
return settype($var, gettype($default)) ? $var : $default; // QUESTION: settype never fails?
}
function censor($message, $html = false)
{
static $orig_word = null, $replacement_word = null;
if (is_null($orig_word))
{
if (isset($GLOBALS['orig_word']) && isset($GLOBALS['replacement_word']))
{
$orig_word = $GLOBALS['orig_word'];
$replacement_word = $GLOBALS['replacement_word'];
}
else
{
obtain_word_list($orig_word, $replacement_word);
}
}
if ($orig_word)
{
return $html ? str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1)) : preg_replace($orig_word, $replacement_word, $message);
}
return $message;
}
function prepare_display($message, $bbcode_uid = '', $enable_html = false, $enable_smilies = true, $enable_links = true)
{
global $board_config;
if (!$board_config['allow_html'] && $enable_html)
{
$message = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $message);
}
if ($bbcode_uid)
{
if ($board_config['allow_bbcode'])
{
$message = bbencode_second_pass($message, $bbcode_uid);
}
else
{
$message = preg_replace('/\:[0-9a-z\:]+\]/si', ']', $message);
}
}
if ($enable_links)
{
$message = make_clickable($message);
}
if ($board_config['allow_smilies'] && $enable_smilies)
{
$message = smilies_pass($message);
}
$message = censor($message, true);
return nl2br($message);
}
function reputation_warning_tpl($warning)
{
global $lang, $images, $phpEx, $board_config, $warned_img, $banned_img;
$issuer = '<b><a href="' . append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . '=' . $warning['voter_id']) . '">' . $warning['username'] . '</a></b>';
$temp_url = append_sid("profile.$phpEx?mode=warnings&" . POST_REVIEWS_URL . '=' . $warning['id']) . '#' . $warning['id'];
if ($warning['modification'] == REPUTATION_WARNING || $warning['modification'] == REPUTATION_WARNING_EXPIRED)
{
$icon = '<b>!</b>';
$details = $lang['reputation_post_warning'];
}
else
{
$icon = '<b>#</b>';
$details = $lang['reputation_post_ban'];
}
if ($warning['modification'] == REPUTATION_WARNING_EXPIRED || $warning['modification'] == REPUTATION_BAN_EXPIRED)
{
$expire = $lang['reputation_expired'];
}
else
{
$expire = is_null($warning['expire']) ? $lang['reputation_expire_never'] : create_date($board_config['default_dateformat'], $warning['expire'], $board_config['board_timezone']);;
}
$details = sprintf($details, $issuer, create_date($board_config['default_dateformat'], $warning['date'], $board_config['board_timezone']), $expire);
$message = $warning['text'] ? prepare_display($warning['text'], $warning['bbcode_uid'], true, true) : $lang['None'];
return array('ICON' => $icon, 'DETAILS' => $details, 'MESSAGE' => $message);
}
function html_select($name, $values, $titles, $default = null)
{
global $lang;
$select = '<select name="' . $name . '" onchange="this.form.submit();">';
foreach ($values as $i => $value)
{
$checked = ($value == $default) ? ' selected="selected"' : '';
$select .= "<option value=\"$value\"$checked>" . htmlspecialchars($lang[$titles[$i]]) . '</option>';
}
$select .= '</select>';
return $select;
}
function reputation_display($userdata, $is_auth, $for_post)
{
global $lang, $thumb_up_img, $thumb_dn_img, $board_config, $phpEx;
if ($is_auth['no_rep'])
{
return '';
}
if ($userdata['user_reputation'] || $userdata['user_reputation_plus'])
{
if ($for_post)
{
if ($is_auth['auth_view_rep'])
{
$user_reputation = '<a href="' . append_sid("profile.$phpEx?mode=reputation&" . POST_USERS_URL . '=' . $userdata['user_id']) . '" title="' . $lang['reputation_search_reputation'] . '">' . $lang['Reputation'] . '</a>: ';
}
else
{
$user_reputation = $lang['Reputation'] . ': ';
}
}
else
{
$user_reputation = '';
}
switch ($board_config['reputation_display'])
{
case REPUTATION_SUM:
$user_reputation .= $userdata['user_reputation'] . '' . $lang['reputation_golosov'];
break;
case REPUTATION_PLUSMINUS:
$user_reputation .= ($userdata['user_reputation_plus'] - $userdata['user_reputation']) + $userdata['user_reputation_plus'] . ' ';
if ($userdata['user_reputation_plus'])
{
if ($userdata['user_reputation_plus'] - $userdata['user_reputation'] == 0)
{
$user_reputation .= '(+' . $userdata['user_reputation_plus'] . '/-0)' . $lang['reputation_golosov'];
} else {
$user_reputation .= '(+' . $userdata['user_reputation_plus'];
}
}
if ($reputation_minus = $userdata['user_reputation_plus'] - $userdata['user_reputation'])
{
$user_reputation .= ($userdata['user_reputation_plus'] ? '/' : '(+0/') . '-' . $reputation_minus . ')' . $lang['reputation_golosov'];
}
break;
default:
message_die(GENERAL_ERROR, 'Reputation config is damaged');
}
}
else
{
$user_reputation = $for_post ? ($lang['Reputation'] . ': 0') : '0' . $lang['reputation_golosov'];
}
if ($is_auth['auth_add_rep'])
{
$url_param = $for_post ? (POST_POST_URL . '=' . $userdata['post_id']) : (POST_USERS_URL . '=' . $userdata['user_id']);
$user_reputation .= '<br/>' . $lang['reputation_polezn'] . '<br/><a href="' . append_sid("reputation.$phpEx?mode=inc&$url_param") . '">' . $lang['reputation_za'] . '</a>';
if (!$board_config['reputation_positive_only'])
{
$user_reputation .= ' <a href="' . append_sid("reputation.$phpEx?mode=dec&$url_param") . '">' . $lang['reputation_protiv'] . '</a>';
}
}
return $user_reputation;
}
function reputation_warnings($userdata, $banned, $auth)
{
global $warned_img, $banned_img, $lang, $phpEx;
if ($userdata['user_warnings'])
{
$warnings = str_repeat($warned_img, $banned ? ($userdata['user_warnings'] - 1) : $userdata['user_warnings']) . ($banned ? $banned_img : '');
$title = sprintf($lang['reputation_warnings_to'], $userdata['username']);
if ($auth['auth_view_warns'])
{
return '<a href="' . append_sid("profile.$phpEx?mode=warnings&" . POST_USERS_URL . '=' . $userdata['user_id']) . '" title="' . $title . '" style="color:#FF6600">' . $warnings . '</a>';
}
else
{
return '<span style="color:#FF6600">' . $warnings . '</span>';
}
}
else if ($banned)
{
return '';
}
return '';
}
function cache_set($id, $data = null)
{
global $phpbb_root_path;
$cache_file = $phpbb_root_path . 'cache/' . $id;
if ($data)
{
if ($f = fopen($cache_file, 'wb'))
{
fwrite($f, serialize($data));
fclose($f);
return true;
}
return false;
}
elseif (file_exists($cache_file))
{
@unlink($cache_file);
}
}
function cache_get($id)
{
global $phpbb_root_path;
$cache_file = $phpbb_root_path . 'cache/' . $id;
if (is_readable($cache_file) && ($f = fopen($cache_file, 'rb')))
{
if ($data = fread($f, filesize($cache_file)))
{
$data = unserialize($data);
}
fclose($f);
return $data;
}
return false;
}
function reputation_auth($auth_or_forum_id, $userdata, $subject = null, $quick = false)
{
global $board_config, $reputation_auth_keys;
if (is_array($auth_or_forum_id))
{
$auth = $auth_or_forum_id;
}
elseif ($auth_or_forum_id == NO_ID)
{
$auth = array('auth_read' => true, 'auth_view' => true, 'auth_mod' => ($userdata['user_level'] == MOD || $userdata['user_level'] == ADMIN));
}
else
{
$auth = auth(AUTH_ALL, $auth_or_forum_id, $userdata);
}
if ($auth_or_forum_id == AUTH_LIST_ALL)
{
$auth[NO_ID] = NO_ID;
foreach ($auth as $forum_id => $forum_auth)
{
$auth[$forum_id] = reputation_auth($forum_auth, $userdata, $subject, $quick);
}
return $auth;
}
if (!isset($auth['auth_add_rep']))
{
$admin = ($userdata['user_id'] != ANONYMOUS) && ($userdata['user_level'] == ADMIN);
$moder = ($userdata['user_id'] != ANONYMOUS) && ($userdata['user_level'] == MOD);
$guest = $auth['auth_read'] && $auth['auth_view'];
$reg = ($userdata['user_id'] != ANONYMOUS) && $guest;
foreach ($reputation_auth_keys as $i => $key)
{
switch ($board_config['reputation_perms'][$i])
{
case AUTH_ADMIN:
$auth[$key] = ($userdata['user_level'] == MOD || $userdata['user_level'] == ADMIN);
break;
case AUTH_MOD:
$auth[$key] = ($userdata['user_level'] == MOD || $userdata['user_level'] == ADMIN);
break;
case AUTH_REG:
$auth[$key] = $reg;
break;
case AUTH_ALL:
$auth[$key] = $guest;
break;
default:
message_die(GENERAL_ERROR, 'Reputation config is damaged');
}
}
if ($auth_or_forum_id == NO_ID)
{
$auth['auth_add_rep'] = $auth['auth_add_rep_nonpost'];
$auth['auth_warn'] = $auth['auth_warn_nonpost'];
$auth['auth_ban'] = $auth['auth_ban_nonpost'];
}
}
if (!empty($subject))
{
reputation_auth_personal($auth, $userdata, $subject, $quick);
}
return $auth;
}
function reputation_check_limits($actor, $subject, $quick = false)
{
global $db, $board_config, $lang, $current_time;
if ($actor['user_posts'] < $board_config['reputation_posts_req'])
{
return $lang['reputation_limits_apply'];
}
if (($current_time - $actor['user_regdate']) < $board_config['reputation_days_req'] * 86400)
{
return $lang['reputation_limits_apply'];
}
if ($actor['user_warnings'] > $board_config['reputation_warnings_req'])
{
return $lang['reputation_limits_apply'];
}
if ($actor['user_reputation'] < $board_config['reputation_points_req'])
{
return $lang['reputation_limits_apply'];
}
if (!$quick && ($board_config['reputation_time_limit'] || $board_config['reputation_rotation_limit']))
{
$result = db_query('SELECT id, date FROM {REPUTATION_TABLE}
WHERE voter_id = %d AND user_id = %d
AND (modification = {REPUTATION_INC} OR modification = {REPUTATION_DEC})
ORDER BY id DESC
LIMIT 1', $actor['user_id'], empty($subject['voter_id']) ? $subject['user_id'] : $subject['voter_id']);
if ($row = $db->sql_fetchrow($result))
{
if ($board_config['reputation_time_limit'] && ($current_time < $row['date'] + $board_config['reputation_time_limit'] * 60))
{
return sprintf($lang['reputation_time_limit'], $board_config['reputation_time_limit']);
}
if ($board_config['reputation_rotation_limit'])
{
$result = db_query('SELECT COUNT(*) AS cnt FROM {REPUTATION_TABLE}
WHERE voter_id = %d AND id > %d
AND (modification = {REPUTATION_INC} OR modification = {REPUTATION_DEC})
GROUP BY voter_id',
$actor['user_id'], $row['id']);
if (!($row = $db->sql_fetchrow($result)) || $row['cnt'] < $board_config['reputation_rotation_limit'])
{
return sprintf($lang['reputation_rotation_limit'], $board_config['reputation_rotation_limit']);
}
}
}
}
return false;
}
function reputation_auth_personal(&$auth, $actor, $subject, $quick)
{
global $db, $lang, $board_config;
static $cache = array();
$subject_id = empty($subject['voter_id']) ? $subject['user_id'] : $subject['voter_id']; // voter_id have priopity because reviews may have user_id too
$pair_id = $actor['user_id'] . ',' . $subject_id;
if (isset($cache[$pair_id]))
{
$fix = $cache[$pair_id];
}
else
{
$subject_is_mod = ($subject['user_level'] == ADMIN || $subject['user_level'] == MOD);
$fix = array(
'no_rep' => ($subject['user_id'] == ANONYMOUS || $subject['user_level'] == MOD && $board_config['reputation_mod_norep'] || $subject['user_level'] == ADMIN && $board_config['reputation_admin_norep']),
'no_warn' => ($subject_id == ANONYMOUS || $subject_is_mod),
);
if ($subject_id == ANONYMOUS)
{
$fix['auth_view_rep'] = $fix['auth_add_rep'] = $fix['auth_warn'] = $lang['reputation_anonymous_no_reputation'];
}
elseif ($actor['user_id'] == $subject_id)
{
$fix['auth_add_rep'] = $fix['auth_warn'] = $fix['auth_ban'] = $lang['reputation_self_no_modify'];
}
else
{
if ($fix['no_rep'])
{
$fix['auth_view_rep'] = $fix['auth_add_rep'] = $lang['reputation_not_applicable'];
}
elseif (!$auth['auth_no_limits'])
{
if ($message = reputation_check_limits($actor, $subject, $quick))
{
$fix['auth_add_rep'] = $message;
}
}
if ($subject_is_mod)
{
$fix['auth_view_warns'] = $fix['auth_warn'] = $fix['auth_ban'] = $lang['reputation_cant_warn_mods'];
}
if ($actor['user_level'] == MOD)
{
/*if ($subject_is_mod)
{
$fix['auth_edit_rep'] = $fix['auth_delete_rep'] = $lang['reputation_other_mods_no_edit'];
}*/
}
elseif ($actor['user_level'] != ADMIN)
{
$fix['auth_edit_rep'] = $fix['auth_delete_rep'] = $lang['reputation_others_no_edit'];
}
}
/*if ($subject_is_mod)
{
if ($actor['user_level'] == MOD) // admins are unconstrained, users never have warning perms
{
$fix['auth_edit_warn'] = $fix['auth_delete_warn'] = false;
}
}*/
$cache[$pair_id] = $fix;
}
foreach ($fix as $key => $value)
{
if (!empty($auth[$key]))
{
$auth[$key] = false;
if ($value)
{
$auth[$key . '_msg'] = $value;
}
}
}
$auth['no_rep'] = $fix['no_rep']; $auth['no_warn'] = $fix['no_warn'];
}
function server_url()
{
global $board_config, $phpEx;
if ($script_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($board_config['script_path'])))
{
$script_name .= '/';
}
$server_port = ($board_config['server_port'] != 80) ? (':' . trim($board_config['server_port']) . '/') : '/';
return ($board_config['cookie_secure'] ? 'https://' : 'http://') . trim($board_config['server_name']) . $server_port . $script_name;
}
$board_config['reputation_perms'] = explode(',', $board_config['reputation_perms']);
$board_config['reputation_warning_expire'] = $board_config['reputation_warning_expire'] ? explode(',', $board_config['reputation_warning_expire']) : array();
$board_config['reputation_ban_expire'] = $board_config['reputation_ban_expire'] ? explode(',', $board_config['reputation_ban_expire']) : array();
?>