error_reporting(E_ALL ^ E_NOTICE);
$CURRENTPATH = dirname(__FILE__);
require_once("$CURRENTPATH/config.php");
require_once("$CURRENTPATH/smilies.php");
// defaults....
if (!isset($GLOBALS["usepopup"]))
$GLOBALS["usepopup"]=true;
// default for disabling DHT network
if (!isset($DHT_PRIVATE))
$DHT_PRIVATE=true;
if (!isset($LIVESTATS))
$LIVESTATS=false;
if (!isset($LOG_ACTIVE))
$LOG_ACTIVE=false;
if (!isset($LOG_HISTORY))
$LOG_HISTORY=false;
if (!isset($GZIP_ENABLED))
$GZIP_ENABLED=false;
if (!isset($PRINT_DEBUG))
$PRINT_DEBUG=true;
if (!isset($USE_IMAGECODE))
$USE_IMAGECODE=true;
if (!isset($TRACKER_ANNOUNCEURLS))
{
$TRACKER_ANNOUNCEURLS=array();
$TRACKER_ANNOUNCEURLS[]="$BASEURL/announce.php";
}
function get_microtime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function print_version()
{
GLOBAL $time_start, $gzip, $PRINT_DEBUG;
$time_end=get_microtime();
print("
");
if ($PRINT_DEBUG)
print("[ Script Execution time: ".number_format(($time_end-$time_start),4)." sec. ] - [ GZIP: $gzip ] ");
print("BtitTracker (1.3.1) by Btiteam
");
}
//////////////////////////////////////////////////////////////////
// Worker functions
if (function_exists("bcadd"))
{
function sqlAdd($left, $right)
{
return bcadd($left, $right,0);
}
function sqlSubtract($left, $right)
{
return bcsub($left, $right,0);
}
function sqlMultiply($left, $right)
{
return bcmul($left, $right,0);
}
function sqlDivide($left, $right)
{
return bcdiv($left, $right,0);
}
}
else // BC vs SQL math
{
// Uses the mysql database connection to perform string math. :)
// Used by byte counting functions
// No error handling as we assume nothing can go wrong. :|
function sqlAdd($left, $right)
{
$query = 'SELECT '.$left.'+'.$right;
$results = mysql_query($query) or showError(DATABASE_ERROR);
return mysql_result($results,0,0);
}
// Ditto
function sqlSubtract($left, $right)
{
$query = 'SELECT '.$left.'-'.$right;
$results = mysql_query($query) or showError(DATABASE_ERROR);
return mysql_result($results,0,0);
}
function sqlDivide($left, $right)
{
$query = 'SELECT '.$left.'/'.$right;
$results = mysql_query($query) or showError(DATABASE_ERROR);
return mysql_result($results,0,0);
}
function sqlMultiply($left, $right)
{
$query = 'SELECT '.$left.'*'.$right;
$results = mysql_query($query) or showError(DATABASE_ERROR);
return mysql_result($results,0,0);
}
} // End of BC vs SQL
// Runs a query with no regard for the result
function quickQuery($query)
{
$results = @mysql_query($query);
if (!is_bool($results))
mysql_free_result($results);
else
return $results;
return true;
}
function hex2bin ($input, $assume_safe=true)
{
if ($assume_safe !== true && ! ((strlen($input) % 2) === 0 || preg_match ('/^[0-9a-f]+$/i', $input)))
return "";
return pack('H*', $input );
}
// Reports an error to the client in $message.
// Any other output will confuse the client, so please don't do that.
function showError($message, $log=false)
{
if ($log)
error_log("BtiTracker: ".SENT_ERROR." ($message)");
echo "d14:failure reason".strlen($message).":$message"."e";
exit(0);
}
// Used by newtorrents.php and the dynamic_torrents setting
// Returns true/false, depending on if there were errors.
function makeTorrent($hash, $tolerate = false)
{
if (strlen($hash) != 40)
showError(MKTOR_INVALID_HASH);
$result = true;
// new with domain suffix and client
//$query = "CREATE TABLE x$hash (peer_id char(40) NOT NULL default '', bytes bigint NOT NULL default 0, ip char(50) NOT NULL default 'error.x', port smallint UNSIGNED NOT NULL default \"0\", status enum('leecher','seeder') NOT NULL, lastupdate int unsigned NOT NULL default 0, sequence int unsigned AUTO_INCREMENT NOT NULL, natuser enum('N', 'Y') not null default 'N', client varchar(60) NOT NULL default '', dns varchar(100) NOT NULL default '', uploaded bigint(20) unsigned not null default '0', downloaded bigint(20) unsigned not null default '0', pid char(32) null, primary key(sequence), unique(peer_id))";
//if (!@mysql_query($query))
// $result = false;
if (!$result && !$tolerate)
return false;
if (isset($GLOBALS["peercaching"]) && $GLOBALS["peercaching"])
{
//$query = "CREATE TABLE y$hash (sequence int unsigned NOT NULL default 0, with_peerid char(101) NOT NULL default '', without_peerid char(40) NOT NULL default '', compact char(6) NOT NULL DEFAULT '', unique k (sequence)) DELAY_KEY_WRITE=1 CHECKSUM=0";
//mysql_query($query);
}
$query = "INSERT INTO summary set info_hash=\"".$hash."\", lastSpeedCycle=UNIX_TIMESTAMP()";
if (!@mysql_query($query))
$result = false;
return $result;
}
// Returns true if the torrent exists.
// Currently checks by locating the row in "summary"
// Always returns true if $dynamic_torrents=="1" unless an error occured
function verifyTorrent($hash)
{
// only for internal tracked torrent!
$query = "SELECT COUNT(*) FROM summary INNER JOIN namemap ON namemap.info_hash=summary.info_hash WHERE namemap.external='no' AND summary.info_hash=\"$hash\"";
$results = mysql_query($query);
$res = mysql_result($results,0,0);
if ($res == 1)
return true;
if ($GLOBALS["dynamic_torrents"])
return makeTorrent($hash);
return false;
}
function verifyHash($input)
{
if (strlen($input) === 40 && preg_match('/^[0-9a-f]+$/', $input))
return true;
else
return false;
}
// Returns info on one peer
function getPeerInfo($user, $hash)
{
// If "trackerid" is set, let's try that
if (isset($GLOBALS["trackerid"]))
{
$query = "SELECT peer_id,bytes,ip,port,status,lastupdate,sequence FROM peers WHERE sequence=${GLOBALS["trackerid"]} AND infohash=\"$hash\"";
$results = mysql_query($query) or showError("Tracker error: invalid torrent");
$data = mysql_fetch_assoc($results);
if (!$data || $data["peer_id"] != $user)
{
// Damn, but don't crash just yet.
$query = "SELECT peer_id,bytes,ip,port,status,lastupdate,sequence from peers where peer_id=\"$user\" AND infohash=\"$hash\"";
$results = mysql_query($query) or showError(INVALID_TORRENT);
$data = mysql_fetch_assoc($results);
$GLOBALS["trackerid"] = $data["sequence"];
}
}
else
{
$query = "SELECT peer_id,bytes,ip,port,status,lastupdate,sequence from peers where peer_id=\"$user\" AND infohash=\"$hash\"";
$results = mysql_query($query) or showError(INVALID_TORRENT);
$data = mysql_fetch_assoc($results);
$GLOBALS["trackerid"] = $data["sequence"];
}
if (!($data))
return false;
return $data;
}
// Slight redesign of loadPeers
function getRandomPeers($hash, $where="")
{
// Don't want to send a bad "num peers" for new seeds
$where="WHERE infohash=\"$hash\"";
if ($GLOBALS["NAT"])
$results = mysql_query("SELECT COUNT(*) FROM peers WHERE natuser = 'N' AND infohash=\"$hash\"");
else
$results = mysql_query("SELECT COUNT(*) FROM peers WHERE infohash=\"$hash\"");
$peercount = mysql_result($results, 0,0);
// ORDER BY RAND() is expensive. Don't do it when the load gets too high
if ($peercount < 500)
$query = "SELECT ".((isset($_GET["no_peer_id"]) && $_GET["no_peer_id"] == 1) ? "" : "peer_id,")."ip, port, status FROM peers ".$where." ORDER BY RAND() LIMIT ${GLOBALS['maxpeers']}";
else
$query = "SELECT ".((isset($_GET["no_peer_id"]) && $_GET["no_peer_id"] == 1) ? "" : "peer_id,")."ip, port, status FROM peers ".$where." LIMIT ".@mt_rand(0, $peercount - $GLOBALS["maxpeers"]).", ${GLOBALS['maxpeers']}";
$results = mysql_query($query);
if (!$results)
return false;
$peerno = 0;
while ($return[] = mysql_fetch_assoc($results))
$peerno++;
array_pop ($return);
mysql_free_result($results);
$return['size'] = $peerno;
return $return;
}
// Deletes a peer from the system and performs all cleaning up
//
// $assumepeer contains the result of getPeerInfo, or false
// if we should grab it ourselves.
function killPeer($userid, $hash, $left, $assumepeer = false)
{
if (!$assumepeer)
{
$peer = getPeerInfo($userid, $hash);
if (!$peer)
return;
if ($left != $peer["bytes"])
$bytes = sqlSubtract($peer["bytes"], $left);
else
$bytes = 0;
}
else
{
$bytes = 0;
$peer = $assumepeer;
}
quickQuery("DELETE FROM peers WHERE peer_id=\"$userid\" AND infohash=\"$hash\"");
if (mysql_affected_rows() == 1)
{
// if ($GLOBALS["peercaching"])
// quickQuery("DELETE FROM y$hash WHERE sequence=" . $peer["sequence"]);
if ($peer["status"] == "leecher")
summaryAdd("leechers", -1);
else
summaryAdd("seeds", -1);
if ($GLOBALS["countbytes"] && ((float)$bytes) > 0)
summaryAdd("dlbytes",$bytes);
if ($peer["bytes"] != 0 && $left == 0)
summaryAdd("finished", 1);
}
}
// Updates the peer user's info.
// Currently it does absolutely nothing. lastupdate is set in collectBytes
// as well.
function updatePeer($peerid, $hash)
{
}
// Transfers bytes from "left" to "dlbytes" when a peer reports in.
function collectBytes($peer, $hash, $left, $downloaded=0, $uploaded=0, $pid="")
{
$peerid=$peer["peer_id"];
if (!$GLOBALS["countbytes"])
{
quickQuery("UPDATE peers SET lastupdate=UNIX_TIMESTAMP(), downloaded=$downloaded, uploaded=$uploaded, pid=\"$pid\" where infohash=\"$hash\" AND " . (isset($GLOBALS["trackerid"]) ? "sequence=\"${GLOBALS["trackerid"]}\"" : "peer_id=\"$peerid\""));
return;
}
$diff = sqlSubtract($peer["bytes"], $left);
quickQuery("UPDATE peers set " . (($diff != 0) ? "bytes=\"$left\"," : ""). " lastupdate=UNIX_TIMESTAMP(), downloaded=$downloaded, uploaded=$uploaded, pid=\"$pid\" where infohash=\"$hash\" AND " . (isset($GLOBALS["trackerid"]) ? "sequence=\"${GLOBALS["trackerid"]}\"" : "peer_id=\"$peerid\""));
// Anti-negative clause
if (((float)$diff) > 0)
summaryAdd("dlbytes", $diff);
}
// Transmits the actual data to the peer. No other output is permitted if
// this function is called, as that would break BEncoding.
// I don't use the bencode library, so watch out! If you add data,
// rules such as dictionary sorting are enforced by the remote side.
function sendPeerList($peers)
{
echo "d";
echo "8:intervali".$GLOBALS["report_interval"]."e";
if (isset($GLOBALS["min_interval"]))
echo "12:min intervali".$GLOBALS["min_interval"]."e";
echo "5:peers";
$size=$peers["size"];
if (isset($_GET["compact"]) && $_GET["compact"] == '1')
{
$p = '';
for ($i=0; $i < $size; $i++)
$p .= str_pad(pack("Nn", ip2long($peers[$i]['ip']), $peers[$i]['port']), 6);
echo strlen($p).':'.$p;
}
else // no_peer_id or no feature supported
{
echo 'l';
for ($i=0; $i < $size; $i++)
{
echo "d2:ip".strlen($peers[$i]["ip"]).":".$peers[$i]["ip"];
if (isset($peers[$i]["peer_id"]))
echo "7:peer id20:".hex2bin($peers[$i]["peer_id"]);
echo "4:port".$peers[$i]["port"]."ee";
}
echo "e";
}
if (isset($GLOBALS["trackerid"]))
{
// Now it gets annoying. trackerid is a string
echo "10:tracker id".strlen($GLOBALS["trackerid"]).":".$GLOBALS["trackerid"];
}
echo "e";
}
// Faster pass-through version of getRandompeers => sendPeerList
// It's the only way to use cache tables. In fact, it only uses it.
function sendRandomPeers($info_hash)
{
$result = mysql_query("SELECT COUNT(*) FROM peers WHERE infohash=\"$info_hash\"");
$count = mysql_result($result, 0, 0);
if (isset($_GET["compact"]) && $_GET["compact"] == '1')
$column = "compact";
else if (isset($_GET["no_peer_id"]) && $_GET["no_peer_id"] == '1')
$column = "without_peerid";
else
$column = "with_peerid";
if ($count < $GLOBALS["maxpeers"])
$query = "SELECT $column FROM peers WHERE infohash=\"$info_hash\"";
else if ($count > 500)
{
do
{
$rand1 = mt_rand(0, $count-$GLOBALS["maxpeers"]);
$rand2 = mt_rand(0, $count-$GLOBALS["maxpeers"]);
} while (abs($rand1 - $rand2) < $GLOBALS["maxpeers"]/2);
$query = "(SELECT $column FROM peers WHERE infohash=\"$info_hash\" LIMIT $rand1, ".($GLOBALS["maxpeers"]/2). ") UNION (SELECT $column FROM peers WHERE infohash=\"$info_hash\" LIMIT $rand2, ".($GLOBALS["maxpeers"]/2). ")";
}
else
$query = "SELECT $column FROM peers WHERE infohash=\"$info_hash\" ORDER BY RAND() LIMIT ".$GLOBALS["maxpeers"];
echo "d";
echo "8:intervali".$GLOBALS["report_interval"]."e";
if (isset($GLOBALS["min_interval"]))
echo "12:min intervali".$GLOBALS["min_interval"]."e";
echo "5:peers";
$result = mysql_query($query);
if ($column == "compact")
{
echo (mysql_num_rows($result) * 6) . ":";
while ($row = mysql_fetch_row($result))
echo str_pad($row[0], 6); //echo $row[0];
}
else
{
echo "l";
while ($row = mysql_fetch_row($result))
echo "d".$row[0]."e";
echo "e";
}
if (isset($GLOBALS["trackerid"]))
echo "10:tracker id".strlen($GLOBALS["trackerid"]).":".$GLOBALS["trackerid"];
echo "e";
}
// Returns a $peers array of all peers that have timed out (2* report interval seems fair
// for any reasonable report interval (900 or larger))
function loadLostPeers($hash, $timeout)
{
$results = mysql_query("SELECT peer_id,bytes,ip,port,status,lastupdate,sequence from peers WHERE infohash=\"$hash\" AND lastupdate < (UNIX_TIMESTAMP() - 2 * $timeout)");
//echo "SELECT peer_id,bytes,ip,port,status,lastupdate,sequence from x$hash WHERE infohash=\"$hash\" AND lastupdate < (UNIX_TIMESTAMP() - 2 * $timeout) ";
$peerno = 0;
if (!$results)
return false;
while ($return[] = mysql_fetch_assoc($results))
$peerno++;
array_pop($return);
$return["size"] = $peerno;
mysql_free_result($results);
return $return;
}
function trashCollector($hash, $timeout)
{
if (isset($GLOBALS["trackerid"]))
unset($GLOBALS["trackerid"]);
if (!Lock($hash))
return;
$results = mysql_query("SELECT lastcycle FROM summary WHERE info_hash='$hash'");
$lastcheck = (mysql_fetch_row($results));
// Check once every re-announce cycle
if (($lastcheck[0] + $timeout) < time())
{
$peers = loadLostPeers($hash, $timeout);
for ($i=0; $i < $peers["size"]; $i++)
killPeer($peers[$i]["peer_id"], $hash, $peers[$i]["bytes"]);
summaryAdd("lastcycle", "UNIX_TIMESTAMP()", true);
}
Unlock($hash);
}
// Attempts to aquire a lock by name.
// Returns true on success, false on failure
function Lock($hash, $time = 0)
{
$results = mysql_query("SELECT GET_LOCK('$hash', $time)");
$string = mysql_fetch_row($results);
if (strcmp($string[0], "1") == 0)
return true;
return false;
}
// Releases a lock. Ignores errors.
function Unlock($hash)
{
quickQuery("SELECT RELEASE_LOCK('$hash')");
}
// Returns true if the lock is available
function isFreeLock($lock)
{
if (Lock($lock, 0))
{
Unlock($lock);
return true;
}
return false;
}
/* Returns true if the user is firewalled, NAT'd, or whatever.
* The original tracker had its --nat_check parameter, so
* here is my version.
*
* This code has proven itself to be sufficiently correct,
* but will consume system resources when a lot of httpd processes
* are lingering around trying to connect to remote hosts.
* Consider disabling it under higher loads.
*/
function isFireWalled($hash, $peerid, $ip, $port)
{
// NAT checking off?
if (!$GLOBALS["NAT"])
return false;
$protocol_name = 'BitTorrent protocol';
$theError = "";
// Hoping 10 seconds will be enough
$fd = fsockopen($ip, $port, $errno, $theError, 10);
if (!$fd)
return true;
stream_set_timeout($fd, 5, 0);
fwrite($fd, chr(strlen($protocol_name)).$protocol_name.hex2bin("0000000000000000").
hex2bin($hash));
$data = fread($fd, strlen($protocol_name)+1+20+20+8); // ideally...
fclose($fd);
$offset = 0;
// First byte: strlen($protocol_name), then the protocol string itself
if (ord($data[$offset]) != strlen($protocol_name))
return true;
$offset++;
if (substr($data, $offset, strlen($protocol_name)) != $protocol_name)
return true;
$offset += strlen($protocol_name);
// 8 bytes reserved, ignore
$offset += 8;
// Download ID (hash)
if (substr($data, $offset, 20) != hex2bin($hash))
return true;
$offset+=20;
// Peer ID
if (substr($data, $offset, 20) != hex2bin($peerid))
return true;
return false;
}
// It's cruel, but if people abuse my tracker, I just might do it.
// It pretends to accept the torrent, and reports that you are the
// only person connected.
function evilReject($ip, $peer_id, $port)
{
// For those of you who are feeling evil, comment out this line.
showError("Torrent is not authorized for use on this tracker.");
$peers[0]["peer_id"] = $peer_id;
$peers[0]["ip"] = $ip;
$peers[0]["port"] = $port;
$peers["size"] = 1;
$GLOBALS["report_interval"] = 86400;
$GLOBALS["min_interval"] = 86000;
sendPeerList($peers);
exit(0);
}
function runSpeed($info_hash, $delta)
{
//stick in our latest data before we calc it out
quickQuery("INSERT IGNORE INTO timestamps (info_hash, bytes, delta, sequence) SELECT '$info_hash' AS info_hash, dlbytes, UNIX_TIMESTAMP() - lastSpeedCycle, NULL FROM summary WHERE info_hash=\"$info_hash\"");
// mysql blows sometimes so we have to read the data into php before updating it
$results = mysql_query('SELECT (MAX(bytes)-MIN(bytes))/SUM(delta), COUNT(*), MIN(sequence) FROM timestamps WHERE info_hash="'.$info_hash.'"' );
$data = mysql_fetch_row($results);
summaryAdd("speed", $data[0], true);
summaryAdd("lastSpeedCycle", "UNIX_TIMESTAMP()", true);
// if we have more than 20 drop the rest
if ($data[1] == 21)
quickQuery("DELETE FROM timestamps WHERE info_hash=\"$info_hash\" AND sequence=${data[2]}");
else if ($data[1] > 21)
// This query requires MySQL 4.0.x, but should rarely be used.
quickQuery ('DELETE FROM timestamps WHERE info_hash="'.$info_hash.'" ORDER BY sequence LIMIT '.($data['1'] - 20));
}
// Schedules an update to the summary table. It gets so much traffic
// that we do all our changes at once.
// When called, the column $column for the current info_hash is incremented
// by $value, or set to exactly $value if $abs is true.
function summaryAdd($column, $value, $abs = false)
{
if (isset($GLOBALS["summaryupdate"][$column]))
{
if (!$abs)
$GLOBALS["summaryupdate"][$column][0] += $value;
else
showError(SUMADD_BUG);
}
else
{
$GLOBALS["summaryupdate"][$column][0] = $value;
$GLOBALS["summaryupdate"][$column][1] = $abs;
}
}
// Even if you're missing PHP 4.3.0, the MHASH extension might be of use.
// Someone was kind enought to email this code snippit in.
if (function_exists('mhash') && (!function_exists('sha1')) &&
defined('MHASH_SHA1'))
{
function sha1($str)
{
return bin2hex(mhash(MHASH_SHA1,$str));
}
}
// begin of function added from original
function unesc($x) {
if (get_magic_quotes_gpc())
return stripslashes($x);
return $x;
}
function mksecret($len = 20) {
$ret = "";
for ($i = 0; $i < $len; $i++)
$ret .= chr(mt_rand(0, 255));
return $ret;
}
function logincookie($id, $passhash, $expires = 0x7fffffff)
{
setcookie("uid", $id, $expires, "/");
setcookie("pass", $passhash, $expires, "/");
}
function logoutcookie() {
setcookie("uid", "", 0x7fffffff, "/");
setcookie("pass", "", 0x7fffffff, "/");
}
function hash_pad($hash) {
return str_pad($hash, 20);
}
/**** validip/getip courtesy of manolete ****/
// IP Validation
function validip($ip)
{
if (!empty($ip) && $ip==long2ip(ip2long($ip)))
{
// reserved IANA IPv4 addresses
// http://www.iana.org/assignments/ipv4-address-space
$reserved_ips = array (
array('0.0.0.0','2.255.255.255'),
array('10.0.0.0','10.255.255.255'),
array('127.0.0.0','127.255.255.255'),
array('169.254.0.0','169.254.255.255'),
array('172.16.0.0','172.31.255.255'),
array('192.0.2.0','192.0.2.255'),
array('192.168.0.0','192.168.255.255'),
array('255.255.255.0','255.255.255.255')
);
foreach ($reserved_ips as $r)
{
$min = ip2long($r[0]);
$max = ip2long($r[1]);
if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
}
return true;
}
else return false;
}
// Patched function to detect REAL IP address if it's valid
function getip() {
if (isset($_SERVER["HTTP_CLIENT_IP"])) {
if (validip($_SERVER["HTTP_CLIENT_IP"])) {
return $_SERVER["HTTP_CLIENT_IP"];
}
}
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
foreach (explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
if (validip(trim($ip))) {
return $ip;
}
}
}
if (validip(isset($_SERVER["HTTP_X_FORWARDED"])?$_SERVER["HTTP_X_FORWARDED"]:'127.0.0.1')) {
return $_SERVER["HTTP_X_FORWARDED"];
} elseif (validip(isset($_SERVER["HTTP_FORWARDED_FOR"])?$_SERVER["HTTP_FORWARDED_FOR"]:'127.0.0.1')) {
return $_SERVER["HTTP_FORWARDED_FOR"];
} elseif (validip(isset($_SERVER["HTTP_FORWARDED"])?$_SERVER["HTTP_FORWARDED"]:'127.0.0.1')) {
return $_SERVER["HTTP_FORWARDED"];
} elseif (validip(isset($_SERVER["HTTP_X_FORWARDED"])?$_SERVER["HTTP_X_FORWARDED"]:'127.0.0.1')) {
return $_SERVER["HTTP_X_FORWARDED"];
} else {
return $_SERVER["REMOTE_ADDR"];
}
}
function userlogin() {
global $CURUSER;
unset($GLOBALS["CURUSER"]);
$ip = getip(); //$_SERVER["REMOTE_ADDR"];
$nip = ip2long($ip);
$res = mysql_query("SELECT * FROM bannedip WHERE $nip >= first AND $nip <= last") or sqlerr(__FILE__, __LINE__);
if (mysql_num_rows($res) > 0)
{
header("HTTP/1.0 403 Forbidden");
print("
403 Forbidden
Unauthorized IP address.\n");
die;
}
// guest
if (empty($_COOKIE["uid"]) || empty($_COOKIE["pass"]))
$id=1;
if (!isset($_COOKIE["uid"])) $_COOKIE["uid"] = 1;
$id = max(1 ,$_COOKIE["uid"]);
// it's guest
if (!$id)
$id=1;
$res = mysql_query("SELECT users.topicsperpage, users.postsperpage,users.torrentsperpage, users.flag, users.avatar, UNIX_TIMESTAMP(users.lastconnect) AS lastconnect, UNIX_TIMESTAMP(users.joined) AS joined, users.id as uid, users.username, users.password, users.random, users.email, users.language,users.style, users_level.* FROM users INNER JOIN users_level ON users.id_level=users_level.id WHERE users.id = $id") or die(mysql_error());
$row = mysql_fetch_array($res);
if (!$row)
{
$id=1;
$res = mysql_query("SELECT users.topicsperpage, users.postsperpage,users.torrentsperpage, users.flag, users.avatar, UNIX_TIMESTAMP(users.lastconnect) AS lastconnect, UNIX_TIMESTAMP(users.joined) AS joined, users.id as uid, users.username, users.password, users.random, users.email, users.language,users.style, users_level.* FROM users INNER JOIN users_level ON users.id_level=users_level.id WHERE users.id = 1");
$row = mysql_fetch_array($res);
}
if (!isset($_COOKIE["pass"])) $_COOKIE["pass"] = "";
if (($_COOKIE["pass"] != $row["password"]) && $id != 1)
{
$id=1;
$res = mysql_query("SELECT users.topicsperpage, users.postsperpage,users.torrentsperpage, users.flag, users.avatar, UNIX_TIMESTAMP(users.lastconnect) AS lastconnect, UNIX_TIMESTAMP(users.joined) AS joined, users.id as uid, users.username, users.password, users.random, users.email, users.language,users.style, users_level.* FROM users INNER JOIN users_level ON users.id_level=users_level.id WHERE users.id = 1");
$row = mysql_fetch_array($res);
}
//$ip=$_SERVER["REMOTE_ADDR"]);
//$ip=sprintf("%u", ip2long($_SERVER["REMOTE_ADDR"]));
if ($id>1)
mysql_query("UPDATE users SET lastconnect=NOW(), lip=".$nip.", cip='".AddSlashes($ip)."' WHERE id = $id");
else
mysql_query("UPDATE users SET lastconnect=NOW(), lip=0, cip=NULL WHERE id = 1");
$GLOBALS["CURUSER"] = $row;
unset($row);
}
function dbconn($do_clean=false) {
global $dbhost, $dbuser, $dbpass, $database, $HTTP_SERVER_VARS;
if ($GLOBALS["persist"])
$conres=mysql_pconnect($dbhost, $dbuser, $dbpass);
else
$conres=mysql_connect($dbhost, $dbuser, $dbpass);
if (!$conres)
{
switch (mysql_errno())
{
case 1040:
case 2002:
if ($HTTP_SERVER_VARS[REQUEST_METHOD] == "GET")
die("
".ERR_SERVER_LOAD."
");
else
die(ERR_CANT_CONNECT);
default:
die("[" . mysql_errno() . "] dbconn: mysql_connect: " . mysql_error());
}
}
mysql_select_db($database)
or die(ERR_CANT_OPEN_DB." $database - ".mysql_error());
userlogin();
if ($do_clean)
register_shutdown_function("cleandata");
}
function cleandata() {
global $CURRENTPATH;
require_once("$CURRENTPATH/sanity.php");
global $clean_interval;
if ((0+$clean_interval)==0)
return;
$now = time();
$res = mysql_query("SELECT last_time FROM tasks WHERE task='sanity'");
$row = mysql_fetch_array($res);
if (!$row) {
mysql_query("INSERT INTO tasks (task, last_time) VALUES ('sanity',$now)");
return;
}
$ts = $row[0];
if ($ts + $clean_interval > $now)
return;
mysql_query("UPDATE tasks SET last_time=$now WHERE task='sanity' AND last_time = $ts");
if (!mysql_affected_rows())
return;
do_sanity();
}
function updatedata() {
global $CURRENTPATH;
require_once("$CURRENTPATH/getscrape.php");
global $update_interval;
if ((0+$update_interval)==0)
return;
$now = time();
$res = @mysql_query("SELECT last_time FROM tasks WHERE task='update'");
$row = @mysql_fetch_array($res);
if (!$row) {
mysql_query("INSERT INTO tasks (task, last_time) VALUES ('update',$now)");
return;
}
$ts = $row[0];
if ($ts + $update_interval > $now)
return;
mysql_query("UPDATE tasks SET last_time=$now WHERE task='update' AND last_time = $ts");
if (!mysql_affected_rows())
return;
// $res = mysql_query("SELECT announce_url,info_hash FROM namemap WHERE external='yes' ORDER BY lastupdate ASC LIMIT 5");
$res = @mysql_query("SELECT announce_url FROM namemap WHERE external='yes' ORDER BY lastupdate ASC LIMIT 1");
if (!$res || mysql_num_rows($res)==0)
return;
// get the url to scrape, take 5 torrent at a time (try to getting multiscrape)
$row = mysql_fetch_row($res);
$resurl=@mysql_query("SELECT info_hash FROM namemap WHERE external='yes' AND announce_url='".$row[0]."' ORDER BY lastupdate ASC LIMIT 5");
if (!$resurl || mysql_num_rows($resurl)==0)
return
$combinedinfohash=array();
while ($rhash=mysql_fetch_row($resurl))
$combinedinfohash[]=$rhash[0];
//scrape($row["announce_url"],$row["info_hash"]);
scrape($row[0],implode("','",$combinedinfohash));
}
function pager($rpp, $count, $href, $opts = array()) {
if($rpp!=0) $pages = ceil($count / $rpp);
else $pages=0;
if (!isset($opts["lastpagedefault"]))
$pagedefault = 0;
else {
$pagedefault = floor(($count - 1) / $rpp);
if ($pagedefault < 0)
$pagedefault = 0;
}
$pagename="page";
if (isset($opts["pagename"]))
{
$pagename=$opts["pagename"];
if (isset($_GET[$opts["pagename"]]))
$page = max(0 ,$_GET[$opts["pagename"]]);
else
$page = $pagedefault;
}
elseif (isset($_GET["page"])) {
$page = 0 + $_GET["page"];
if ($page < 0)
$page = $pagedefault;
}
else
$page = $pagedefault;
$pager = "";
$mp = $pages - 1;
$as = "<< ".PREVIOUS."";
if ($page >= 1) {
$pager .= "";
$pager .= $as;
$pager .= "";
}
else
$pager .= $as;
$pager .= " ";
$as = "".NEXT." >>";
if ($page < $mp && $mp >= 0) {
$pager .= "";
$pager .= $as;
$pager .= "";
}
else
$pager .= $as;
if ($count) {
$pagerarr = array();
$dotted = 0;
$dotspace = 3;
$dotend = $pages - $dotspace;
$curdotend = $page - $dotspace;
$curdotstart = $page + $dotspace;
for ($i = 0; $i < $pages; $i++) {
if (($i >= $dotspace && $i <= $curdotend) || ($i >= $curdotstart && $i < $dotend)) {
if (!$dotted)
$pagerarr[] = "...";
$dotted = 1;
continue;
}
$dotted = 0;
$start = $i * $rpp + 1;
$end = $start + $rpp - 1;
if ($end > $count)
$end = $count;
$text = "$start - $end";
if ($i != $page)
$pagerarr[] = "$text";
else
$pagerarr[] = "$text";
}
$pagerstr = join(" | ", $pagerarr);
$pagertop = "
$pager $pagerstr
\n";
$pagerbottom = "
$pagerstr $pager
\n";
}
else {
$pagertop = "
$pager
\n";
$pagerbottom = $pagertop;
}
$start = $page * $rpp;
return array($pagertop, $pagerbottom, "LIMIT $start,$rpp");
}
// give back categories recorset
function genrelist()
{
$ret = array();
$res = mysql_query("SELECT * FROM categories ORDER BY sort_index, id");
while ($row = mysql_fetch_array($res))
$ret[] = $row;
return $ret;
}
// this returns all the categories
function categories($val="")
{
echo "";
}
// this returns all the subcategories
function sub_categories($val="")
{
echo "";
}
// this returns the category of a sub-category
function sub_cat($sub)
{
$c_q = @mysql_fetch_array( @mysql_query("SELECT name FROM categories WHERE id='$sub'") );
$name = unesc($c_q["name"]);
return $name;
}
function style_list()
{
$ret = array();
$res = mysql_query("SELECT * FROM style ORDER BY id");
while ($row = mysql_fetch_array($res))
$ret[] = $row;
return $ret;
}
function language_list()
{
$ret = array();
$res = mysql_query("SELECT * FROM language ORDER BY language");
while ($row = mysql_fetch_array($res))
$ret[] = $row;
return $ret;
}
function flag_list()
{
$ret = array();
$res = mysql_query("SELECT * FROM countries ORDER BY name");
while ($row = mysql_fetch_array($res))
$ret[] = $row;
return $ret;
}
function stdfoot($normalpage=true, $update=true) {
global $STYLEPATH;
if ($normalpage) include($STYLEPATH."/footer.php");
print("