<?php
define('BB_SCRIPT', 'ajax');
define('IN_AJAX', true);
$ajax = new ajax_common();
require('./common.php');
$ajax->init();
// Init userdata
$user->session_start();
// Exit if board is disabled via ON/OFF trigger or by admin
if ($ajax->action != 'manage_admin')
{
if ($bb_cfg['board_disable'])
{
$ajax->ajax_die($lang['BOARD_DISABLE']);
}
else if (file_exists(BB_DISABLED))
{
$ajax->ajax_die($lang['BOARD_DISABLE_CRON']);
}
}
// Load actions required modules
switch ($ajax->action)
{
case 'chat':
case 'view_post':
require(INC_DIR .'bbcode.php');
break;
case 'update_peers':
require(BB_ROOT .'mult/config.php');
require(BB_ROOT .'mult/func.php');
require(BB_ROOT .'mult/class.remote.php');
require(BB_ROOT .'mult/class.fbenc.php');
require(BB_ROOT .'mult/class.bittorrent.php');
require(BB_ROOT .'mult/class.getpeers.php');
break;
case 'posts':
case 'post_mod_comment':
require(INC_DIR . 'bbcode.php');
require(INC_DIR . 'functions_post.php');
require(INC_DIR . 'functions_admin.php');
break;
case 'view_torrent':
case 'mod_action':
case 'change_tor_status':
case 'gen_passkey':
require(ATTACH_DIR . 'attachment_mod.php');
require(INC_DIR . 'functions_torrent.php');
break;
case 'change_torrent':
require(ATTACH_DIR . 'attachment_mod.php');
require(INC_DIR . 'functions_torrent.php');
break;
case 'user_register':
require(INC_DIR . 'functions_validate.php');
break;
case 'manage_user':
case 'manage_admin':
require(INC_DIR . 'functions_admin.php');
break;
case 'group_membership':
case 'manage_group':
require(INC_DIR . 'functions_group.php');
break;
case 'sitemap';
require(INC_DIR .'class.sitemap.php');
break;
case 'pars':
require(INC_DIR . 'functions_parser.php');
break;
case 'autoparser':
require(INC_DIR .'class.snoopy.php');
break;
}
// Position in $ajax->valid_actions['xxx']
define('AJAX_AUTH', 0); // 'guest', 'user', 'mod', 'admin', 'super_admin'
$ajax->exec();
//
// Ajax
//
class ajax_common
{
var $request = array();
var $response = array();
var $valid_actions = array(
// ACTION NAME AJAX_AUTH
'edit_user_profile' => array('admin'),
'change_user_rank' => array('admin'),
'change_user_opt' => array('admin'),
'manage_user' => array('admin'),
'manage_admin' => array('admin'),
'sitemap' => array('admin'),
'autoparser' => array('admin'),
'mod_action' => array('mod'),
'topic_tpl' => array('mod'),
'group_membership' => array('mod'),
'post_mod_comment' => array('mod'),
'update_peers' => array('mod'),
'avatar' => array('user'),
'gen_passkey' => array('user'),
'change_torrent' => array('user'),
'change_tor_status' => array('user'),
'manage_group' => array('user'),
'pars' => array('user'),
'user_stats' => array('user'),
'users_today' => array('user'),
'view_post' => array('guest'),
'view_torrent' => array('guest'),
'user_register' => array('guest'),
'posts' => array('guest'),
'index_data' => array('guest'),
'chat' => array('guest'),
);
var $action = null;
/**
* Constructor
*/
function ajax_common()
{
ob_start(array(&$this, 'ob_handler'));
header('Content-Type: text/plain');
}
/**
* Perform action
*/
function exec()
{
global $lang;
// Exit if we already have errors
if (!empty($this->response['error_code']))
{
$this->send();
}
// Check that requested action is valid
$action = $this->action;
if (!$action || !is_string($action))
{
$this->ajax_die('no action specified');
}
elseif (!$action_params =& $this->valid_actions[$action])
{
$this->ajax_die('invalid action: ' . $action);
}
// Auth check
switch ($action_params[AJAX_AUTH])
{
// GUEST
case 'guest':
break;
// USER
case 'user':
if (IS_GUEST)
{
$this->ajax_die($lang['NEED_TO_LOGIN_FIRST']);
}
break;
// MOD
case 'mod':
if (!IS_AM)
{
$this->ajax_die($lang['ONLY_FOR_MOD']);
}
$this->check_admin_session();
break;
// ADMIN
case 'admin':
if (!IS_ADMIN)
{
$this->ajax_die($lang['ONLY_FOR_ADMIN']);
}
$this->check_admin_session();
break;
// SUPER_ADMIN
case 'super_admin':
if (!IS_SUPER_ADMIN)
{
$this->ajax_die($lang['ONLY_FOR_SUPER_ADMIN']);
}
$this->check_admin_session();
break;
default:
trigger_error("invalid auth type for $action", E_USER_ERROR);
}
// Run action
$this->$action();
// Send output
$this->send();
}
/**
* Exit on error
*/
function ajax_die($error_msg, $error_code = E_AJAX_GENERAL_ERROR)
{
$this->response['error_code'] = $error_code;
$this->response['error_msg'] = $error_msg;
$this->send();
}
/**
* Initialization
*/
function init()
{
$this->request = $_POST;
$this->action =& $this->request['action'];
}
/**
* Send data
*/
function send()
{
$this->response['action'] = $this->action;
if (DBG_USER && SQL_DEBUG && !empty($_COOKIE['sql_log']))
{
$this->response['sql_log'] = get_sql_log();
}
// sending output will be handled by $this->ob_handler()
exit();
}
/**
* OB Handler
*/
function ob_handler($contents)
{
if (DBG_USER)
{
if ($contents)
{
$this->response['raw_output'] = $contents;
}
}
$response_js = bb_json_encode($this->response);
if (GZIP_OUTPUT_ALLOWED && !defined('NO_GZIP'))
{
if (UA_GZIP_SUPPORTED && strlen($response_js) > 2000)
{
header('Content-Encoding: gzip');
$response_js = gzencode($response_js, 1);
}
}
return $response_js;
}
/**
* Admin session
*/
function check_admin_session()
{
global $user;
if (!$user->data['session_admin'])
{
if (empty($this->request['user_password']))
{
$this->prompt_for_password();
}
else
{
$login_args = array(
'login_username' => $user->data['username'],
'login_password' => $_POST['user_password'],
);
if (!$user->login($login_args, true))
{
$this->ajax_die('Wrong password');
}
}
}
}
/**
* Prompt for password
*/
function prompt_for_password()
{
$this->response['prompt_password'] = 1;
$this->send();
}
/**
* Prompt for confirmation
*/
function prompt_for_confirm($confirm_msg)
{
if (empty($confirm_msg)) $this->ajax_die('false');
$this->response['prompt_confirm'] = 1;
$this->response['confirm_msg'] = $confirm_msg;
$this->send();
}
/**
* Verify mod rights
*/
function verify_mod_rights($forum_id)
{
global $userdata, $lang;
$is_auth = auth(AUTH_MOD, $forum_id, $userdata);
if (!$is_auth['auth_mod'])
{
$this->ajax_die($lang['ONLY_FOR_MOD']);
}
}
function edit_user_profile()
{
require(AJAX_DIR . 'edit_user_profile.php');
}
function change_user_rank()
{
require(AJAX_DIR . 'change_user_rank.php');
}
function change_user_opt()
{
require(AJAX_DIR . 'change_user_opt.php');
}
function gen_passkey()
{
require(AJAX_DIR . 'gen_passkey.php');
}
function group_membership()
{
require(AJAX_DIR . 'group_membership.php');
}
function manage_group()
{
require(AJAX_DIR . 'edit_group_profile.php');
}
function pars()
{
require(AJAX_DIR . 'parser.php');
}
function post_mod_comment()
{
require(AJAX_DIR . 'post_mod_comment.php');
}
function view_post()
{
require(AJAX_DIR . 'view_post.php');
}
function change_tor_status()
{
require(AJAX_DIR . 'change_tor_status.php');
}
function change_torrent()
{
require(AJAX_DIR . 'change_torrent.php');
}
function view_torrent()
{
require(AJAX_DIR . 'view_torrent.php');
}
function user_register()
{
require(AJAX_DIR . 'user_register.php');
}
function mod_action()
{
require(AJAX_DIR . 'mod_action.php');
}
function posts()
{
require(AJAX_DIR . 'posts.php');
}
function manage_user()
{
require(AJAX_DIR . 'manage_user.php');
}
function manage_admin()
{
require(AJAX_DIR . 'manage_admin.php');
}
function topic_tpl()
{
require(AJAX_DIR . 'topic_tpl.php');
}
function index_data()
{
require(AJAX_DIR . 'index_data.php');
}
function avatar()
{
require(AJAX_DIR . 'avatar.php');
}
function sitemap()
{
require(AJAX_DIR .'sitemap.php');
}
function user_stats()
{
global $bb_cfg, $lang;
$user_id = (int) $this->request['user_id'];
$btu = get_bt_userdata($user_id);
$ratio = get_bt_ratio($btu);
$u_up_total = humn_size($btu['u_up_total']);
$u_up_bonus = humn_size($btu['u_up_bonus']);
$u_up_release = humn_size($btu['u_up_release']);
$u_down_total = humn_size($btu['u_down_total']);
if ($btu['u_down_total'] < MIN_DL_FOR_RATIO) $ratio = '---';
############ Закончили ###################
############ Выводим данные ##############
$this->response['post_id'] = (int) $this->request['post_id'];
$this->response['html'] = '
<table class="ratio1 table-wrap bCenter borderless w100" cellspacing="1" style="border-style: inset;">
<tr class="row6 tCenter">
<td colspan="2" class="bold">Статистика</td>
</tr>
<tr class="row5 seed">
<td class="med tLeft"> '.$lang['USER_RATIO'].':</p></td>
<td class="bold tLeft"> '.$ratio.'</td>
</tr>
<tr class="row5 leech">
<td class="med tLeft"> <a class="leechsmall" href="search.php?dlu='.$user_id.'&dlc=1#results">'.$lang['DOWNLOADED'].'</a>: </td>
<td class="bold tLeft"> '.$u_down_total.'</td>
</tr>
<tr class="row1 seed">
<td class="med tLeft"> '.$lang['UPLOADED'].': </p></td>
<td class="bold tLeft"> '.$u_up_total.'</td>
</tr>
<tr class="row5 seed">
<td class="med tLeft"> <i><a class="seedsmall" href="tracker.php?rid='.$user_id.'#results">'.$lang['RELEASED'].'</a>:</i> </td>
<td class="tLeft"> <i>'.$u_up_release.'</i></td>
</tr>
<tr class="row1 dlWill">
<td class="med tLeft"> <i><a class="small dlWill" href="viewtopic.php?t=5">'.$lang['BONUS'].'</a>:</i> </td>
<td class="tLeft"> <i>'.$u_up_bonus.'</i></td>
</tr>
</table>
';
}
function users_today()
{
require(AJAX_DIR .'users_today.php');
}
function update_peers()
{
global $db, $cfg_ann, $lang;
$seed = $leech = 0;
$topic_id = (int) $this->request['topic_id'];
$row = DB()->fetch_row("SELECT info_hash FROM ".BB_BT_TORRENTS." WHERE topic_id = ".$topic_id." LIMIT 1");
if($row && $info_hash = $row['info_hash'])
{
$gp = new getpeers();
$data = $gp->get_peers(1, serialize($cfg_ann), bin2hex($info_hash), false);
foreach($data['peers'] as $announce)
{
$seed = (int) $seed + $announce[0];
$leech = (int) $leech + $announce[1];
}
//DB()->query("UPDATE ".BB_BT_TORRENTS." SET last_update = ".$data['last_update'].", ext_seeder = ".$seed.", ext_leecher = ".$leech." WHERE info_hash = '".DB()->escape($info_hash)."'");
DB()->query("UPDATE ".BB_BT_TORRENTS." SET last_update = ".$data['last_update'].", ext_seeder = ".$seed.", ext_leecher = ".$leech." WHERE topic_id = $topic_id");
$html = '<div class="mrg_4 pad_4">';
$html .= '<span class="seed">'. $lang['SEEDERS'] .': <b>'. $seed .'</b> [ 0 KB/s ]</span> ';
$html .= '<span class="leech">'. $lang['LEECHERS'] .': <b>'. $leech .'</b> [ 0 KB/s ]</span> ';
$html .= '</div>';
}
$this->response['html'] = $html;
$this->response['topic_id'] = $topic_id;
}
function autoparser()
{
global $lang, $bb_cfg;
$mode = (string) $this->request['mode'];
if($mode == 'cookie')
{
$login = (string) DB()->escape($this->request['login']);
@$cookie = (string) urldecode($this->request['cookie']);
$id = (int) $this->request['id'];
$row = DB()->fetch_row("SELECT * FROM parser_users WHERE login = '$login'");
if(!$row) bb_die('Такой учетки нет в базе');
$snoopy = new Snoopy;
$snoopy->host = "rutracker.org";
$snoopy->agent = "opera";
$snoopy->referer = "
";
$snoopy->rawheaders["Pragma"] = "no-cache";
$snoopy->cookies['bb_data'] = $cookie;
$snoopy->fetch("
");
if(preg_match('#privmsg#', $snoopy->results))
{
if($cookie != $row['cookie'])
{
DB()->query("UPDATE parser_users SET cookie = '$cookie', time = ". TIMENOW ." WHERE login = '$login' AND id = $id");
}
$this->response['html'] = '<img src="'. make_url('images/good.gif') .'">';
$this->response['time'] = '<span class="tr_tm">только что</span>';
}
else
{
$this->response['html'] = '<img src="'. make_url('images/bad.gif') .'">';
}
$this->response['cookie'] = $cookie;
$this->response['login'] = $login;
}
elseif($mode == 'pass')
{
$login = (string) DB()->escape($this->request['login']);
$id = (int) $this->request['id'];
$pass = (string) $this->request['pass'];
$row = DB()->fetch_row("SELECT * FROM parser_users WHERE login = '$login' AND id = $id");
if(!$row) $this->ajax_die('Такой учетки нет в базе');
DB()->query("UPDATE parser_users SET pass = '$pass' WHERE login = '$login' AND id = $id");
}
elseif($mode == 'user_del')
{
$login = (string) DB()->escape($this->request['login']);
$id = (int) $this->request['id'];
if(!IS_SUPER_ADMIN) $this->ajax_die($lang['ONLY_FOR_SUPER_ADMIN']);
if (empty($this->request['confirmed'])) $this->prompt_for_confirm($lang['USER_DELETE_CONFIRM']);
DB()->query("DELETE FROM parser_users WHERE login = '$login' AND id = $id");
$this->response['id'] = $id;
}
elseif($mode == 'forum_del')
{
$from_url = (string) urldecode($this->request['from_url']);
DB()->query("DELETE FROM parser_from_urls WHERE from_url = '$from_url'");
}
elseif($mode == 'change_user_id')
{
$new_user = (string) $this->request['user'];
$url = (string) $this->request['url'];
if(!$url || !$new_user) $this->ajax_die('false id');
if(($new_user != BOT_UID) && !$new = get_userdata($new_user)) $this->ajax_die($lang['NO_USER_ID_SPECIFIED']);
if($new) $new_user = $new['user_id'];
DB()->query("UPDATE parser_from_urls SET user_id = $new_user WHERE from_url = '$url'");
$this->response['user'] = ($new) ? profile_url($new) : 'Bot';
$this->response['url'] = md5($url);
}
elseif($mode == 'all_status')
{
$from_url = (string) urldecode($this->request['from_url']);
if(!$from_url) $this->ajax_die('false id');
$row = DB()->fetch_row("SELECT * FROM parser_from_urls WHERE from_url = '$from_url'");
if(!$row) $this->ajax_die('Такой записи нет в базе');
$all_status = (int) !$row['all_status'];
DB()->query("UPDATE parser_from_urls SET all_status = $all_status WHERE from_url = '$from_url'");
}
elseif($mode == 'all_forum')
{
$from_url = (string) urldecode($this->request['from_url']);
if(!$from_url) $this->ajax_die('false id');
$row = DB()->fetch_row("SELECT * FROM parser_from_urls WHERE from_url = '$from_url'");
if(!$row) $this->ajax_die('Такой записи нет в базе');
$all_forum = (int) !$row['all_forum'];
DB()->query("UPDATE parser_from_urls SET all_forum = $all_forum WHERE from_url = '$from_url'");
}
elseif($mode == 'active')
{
$from_url = (string) urldecode($this->request['from_url']);
if(!$from_url) $this->ajax_die('false id');
$row = DB()->fetch_row("SELECT * FROM parser_from_urls WHERE from_url = '$from_url'");
if(!$row) $this->ajax_die('Такой записи нет в базе');
$active = (int) !$row['active'];
DB()->query("UPDATE parser_from_urls SET active = $active WHERE from_url = '$from_url'");
}
$this->response['mode'] = $mode;
}
function chat()
{
require(AJAX_DIR .'chat.php');
}
}