function Puff_Member_2FA_Disable($Connection, $Username, $Code) { global $Sitewide; require_once $Sitewide['Puff']['Libs'] . 'authenticatron.php'; //// Check Member Existence // For the sake of the space-time continuum, // new users should not already exist. $Username = Puff_Member_Sanitize_Username($Username); $MemberExists = Puff_Member_Exists($Connection, $Username, true); if (!$MemberExists) { return array('error' => 'Sorry, that user doesn\'t exist, so we can\'t disable 2FA for it.'); } //// Get Secret $Secret = mysqli_fetch_once($Connection, 'SELECT `2FA Secret` FROM `Members` WHERE `Username`=\'' . $Username . '\';'); if (empty($Secret['2FA Secret'])) { return array('error' => 'Sorry, 2FA isn\'t set up for that user.'); } $Secret = $Secret['2FA Secret']; //// Generate all the 2FA Stuff $Check = Authenticatron_Check($Code, $Secret); if ($Check) { //// Update Database $Result = mysqli_query($Connection, 'UPDATE `Members` SET `2FA Active`=\'0\' WHERE `Username`=\'' . $Username . '\';'); return $Result; } else { return array('error' => 'Sorry, your code was not valid. They are only valid for 30 seconds.'); } }
function tracker_stats() { global $connection, $settings; require_once __DIR__ . '/once.db.connect.php'; require_once __DIR__ . '/function.mysqli.fetch.once.php'; // Statistics $stats = mysqli_fetch_once('SELECT ' . 'SUM(`state`=\'1\') AS `seeders`, ' . 'SUM(`state`=\'0\') AS `leechers`, ' . 'COUNT(DISTINCT info_hash) AS `torrents` ' . 'FROM `' . $settings['db_prefix'] . 'peers`'); // Downloads $downloads = mysqli_fetch_once('SELECT ' . 'SUM(`downloads`) AS `downloads` ' . 'FROM `' . $settings['db_prefix'] . 'torrents`'); if (!$stats) { tracker_error('Unable to get stats.'); } else { $phoenix_version = 'Phoenix Procedural 1.3 2015-02-16 20:44:00Z eustasy'; $stats['seeders'] = intval($stats['seeders']); $stats['leechers'] = intval($stats['leechers']); $stats['torrents'] = intval($stats['torrents']); $stats['downloads'] = intval($downloads['downloads']); $stats['peers'] = $stats['seeders'] + $stats['leechers']; // XML if (isset($_GET['xml'])) { header('Content-Type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . '<tracker version="$Id: ' . $phoenix_version . ' $">' . '<peers>' . $stats['peers'] . '</peers>' . '<seeders>' . $stats['seeders'] . '</seeders>' . '<leechers>' . $stats['leechers'] . '</leechers>' . '<torrents>' . $stats['torrents'] . '</torrents>' . '<downloads>' . $stats['downloads'] . '</downloads></tracker>'; // JSON } else { if (isset($_GET['json'])) { header('Content-Type: application/json'); echo json_encode(array('tracker' => array('version' => '$Id: ' . $phoenix_version . ' $,', 'peers' => $stats['peers'], 'seeders' => $stats['seeders'], 'leechers' => $stats['leechers'], 'torrents' => $stats['torrents'], 'downloads' => $stats['downloads']))); // HTML } else { echo '<!DocType html><html><head><meta charset="UTF-8">' . '<title>Phoenix: $Id: ' . $phoenix_version . ' $</title>' . '<body><pre>' . number_format($stats['peers']) . ' peers (' . number_format($stats['seeders']) . ' seeders + ' . number_format($stats['leechers']) . ' leechers) in ' . number_format($stats['torrents']) . ' torrents and' . ' ' . number_format($stats['downloads']) . ' downloads completed.</pre></body></html>'; } } } }
function Puff_Member_Key_Value($Connection, $Username, $Key) { $Username = Puff_Member_Sanitize_Username($Username); $Key = htmlentities($Key, ENT_QUOTES, 'UTF-8'); $Result = mysqli_fetch_once($Connection, 'SELECT `Value` FROM `KeyValues` WHERE `Username`=\'' . $Username . '\' AND `Key`=\'' . $Key . '\';'); return $Result['Value']; }
function peer_event() { global $connection, $settings; require_once __DIR__ . '/once.db.connect.php'; require_once __DIR__ . '/function.mysqli.fetch.once.php'; $peer = mysqli_fetch_once('SELECT * FROM `' . $settings['db_prefix'] . 'peers` ' . 'WHERE `info_hash`=\'' . $_GET['info_hash'] . '\' AND `peer_id`=\'' . $_GET['peer_id'] . '\''); // IF Event if (isset($_GET['event'])) { // IF Peer Exited if ($_GET['event'] == 'stopped') { if ($peer) { require_once __DIR__ . '/function.peer.delete.php'; peer_delete(); // HOOK PEER DELETE if (is_readable(__DIR__ . '/hook.peer.delete.php')) { include __DIR__ . '/hook.peer.delete.php'; } } exit; // END IF Peer Exited // IF Peer Completed } else { if ($_GET['event'] == 'completed') { // Force Seeding Status $settings['seeding'] = 1; // Increment downloads require_once __DIR__ . '/function.peer.completed.php'; peer_completed(); // HOOK DOWNLOAD COMPLETE if (is_readable(__DIR__ . '/hook.download.complete.php')) { include __DIR__ . '/hook.download.complete.php'; } } } // END IF Peer Completed } // END IF Event // IF Any Change if (!$peer || $peer['ip'] != $_GET['ip'] || $peer['port'] != $_GET['port'] || $peer['state'] != $settings['seeding']) { require_once __DIR__ . '/function.peer.new.php'; peer_new(); // HOOK PEER NEW/CHANGE if (is_readable(__DIR__ . '/hook.peer.change.php')) { include __DIR__ . '/hook.peer.change.php'; } // END Any Change // IF Unchanged } else { require_once __DIR__ . '/function.peer.access.php'; peer_access(); // HOOK PEER ACCESS if (is_readable(__DIR__ . '/hook.peer.access.php')) { include __DIR__ . '/hook.peer.access.php'; } } // END IF Unchanged }
function torrent_scrape() { global $connection, $settings; require_once __DIR__ . '/once.db.connect.php'; require_once __DIR__ . '/function.mysqli.fetch.once.php'; // select seeders and leechers $query = ' SELECT `p`.`info_hash` AS `info_hash`, SUM(`p`.`state`=\'1\') AS `seeders`, SUM(`p`.`state`=\'0\') AS `leechers`, `t`.`downloads` AS `downloads` FROM `' . $settings['db_prefix'] . 'peers` AS `p` LEFT JOIN `' . $settings['db_prefix'] . 'torrents` AS `t` ON `p`.`info_hash`=`t`.`info_hash` WHERE `p`.`info_hash`=\'' . $_GET['info_hash'] . '\';'; $scrape = mysqli_fetch_once($query); if (!$scrape) { tracker_error('Unable to scrape for that torrent.'); } else { $scrape['seeders'] = intval($scrape['seeders']); $scrape['leechers'] = intval($scrape['leechers']); $scrape['downloads'] = intval($scrape['downloads']); $scrape['peers'] = $scrape['seeders'] + $scrape['leechers']; // XML if (isset($_GET['xml'])) { header('Content-Type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . '<torrent>' . '<info_hash>' . $_GET['info_hash'] . '</info_hash>' . '<seeders>' . $scrape['seeders'] . '</seeders>' . '<leechers>' . $scrape['leechers'] . '</leechers>' . '<peers>' . $scrape['peers'] . '</peers>' . '<downloads>' . $scrape['downloads'] . '</downloads>' . '</torrent>'; // JSON } else { if (isset($_GET['json'])) { header('Content-Type: application/json'); echo json_encode(array('torrent' => array('info_hash' => $_GET['info_hash'], 'seeders' => $scrape['seeders'], 'leechers' => $scrape['leechers'], 'peers' => $scrape['peers'], 'downloads' => $scrape['downloads']))); } else { $echo = 'd 5:files d 20:' . hex2bin($_GET['info_hash']) . ' d 8:complete i' . $scrape['seeders'] . 'e 10:downloaded i' . $scrape['downloads'] . 'e 10:incomplete i' . $scrape['leechers'] . 'e e e e'; if (isset($_GET['verbose'])) { echo $echo; } else { echo preg_replace('/\\s+/', '', $echo); } } } } }
<?php require_once $settings['functions'] . 'function.peer.delete.php'; require_once $settings['functions'] . 'function.mysqli.fetch.once.php'; $insert = 'INSERT INTO `' . $settings['db_prefix'] . 'peers` ( `info_hash`, `peer_id` ) VALUES ( \'__TEST_1__\', \'__TEST_1__\' );'; mysqli_query($connection, $insert); $peer['info_hash'] = '__TEST_1__'; $peer['peer_id'] = '__TEST_1__'; peer_delete($connection, $settings, $peer); $select = 'SELECT * FROM `' . $settings['db_prefix'] . 'peers` WHERE `info_hash` = \'__TEST_1__\' AND `peer_id` = \'__TEST_1__\';'; $result = mysqli_fetch_once($connection, $select); $delete = 'DELETE FROM `' . $settings['db_prefix'] . 'peers` WHERE `info_hash` LIKE \'__TEST_%\';'; mysqli_query($connection, $delete); if ($result) { echo 'Peer does not appear to have been deleted.' . PHP_EOL; $failure = true; }
<?php require_once $settings['functions'] . 'function.mysqli.fetch.once.php'; // Statistics $sql = 'SELECT ' . 'SUM(`state`=\'1\') AS `seeders`, ' . 'SUM(`state`=\'0\') AS `leechers`, ' . 'COUNT(DISTINCT info_hash) AS `torrents` ' . 'FROM `' . $settings['db_prefix'] . 'peers`;'; $stats = mysqli_fetch_once($connection, $sql); // Downloads $sql = 'SELECT ' . 'SUM(`downloads`) AS `downloads` ' . 'FROM `' . $settings['db_prefix'] . 'torrents`;'; $downloads = mysqli_fetch_once($connection, $sql); if (!$stats || !$downloads) { tracker_error('Unable to get stats.'); } else { $stats['seeders'] = intval($stats['seeders']); $stats['leechers'] = intval($stats['leechers']); $stats['torrents'] = intval($stats['torrents']); $stats['downloads'] = intval($downloads['downloads']); $stats['peers'] = $stats['seeders'] + $stats['leechers']; // XML if (isset($_GET['xml'])) { header('Content-Type: text/xml'); echo '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . '<tracker version="$Id: ' . $settings['phoenix_version'] . ' $">' . '<peers>' . $stats['peers'] . '</peers>' . '<seeders>' . $stats['seeders'] . '</seeders>' . '<leechers>' . $stats['leechers'] . '</leechers>' . '<torrents>' . $stats['torrents'] . '</torrents>' . '<downloads>' . $stats['downloads'] . '</downloads></tracker>'; // JSON } else { if (isset($_GET['json'])) { header('Content-Type: application/json'); echo json_encode(array('tracker' => array('version' => '$Id: ' . $settings['phoenix_version'] . ' $,', 'peers' => $stats['peers'], 'seeders' => $stats['seeders'], 'leechers' => $stats['leechers'], 'torrents' => $stats['torrents'], 'downloads' => $stats['downloads']))); // HTML } else { echo '<!DocType html><html><head><meta charset="UTF-8">' . '<title>Phoenix: $Id: ' . $settings['phoenix_version'] . ' $</title>' . '<body><pre>' . number_format($stats['peers']) . ' peers (' . number_format($stats['seeders']) . ' seeders + ' . number_format($stats['leechers']) . ' leechers) in ' . number_format($stats['torrents']) . ' torrents and' . ' ' . number_format($stats['downloads']) . ' downloads completed.</pre></body></html>'; } }
<?php require_once $settings['functions'] . 'function.mysqli.fetch.once.php'; // begin response $response = 'd8:intervali' . $settings['announce_interval'] . 'e12:min intervali' . $settings['min_interval'] . 'e5:peers'; $sql = 'SELECT COUNT(*) AS `count` FROM `' . $settings['db_prefix'] . 'peers` ' . 'WHERE `info_hash`=\'' . $peer['info_hash'] . '\';'; $peer_count = mysqli_fetch_once($connection, $sql); if (!$peer_count) { $peer_count = 0; } else { $peer_count = $peer_count['count']; } $sql = 'SELECT * FROM `' . $settings['db_prefix'] . 'peers` WHERE `info_hash`=\'' . $peer['info_hash'] . '\''; // IF there are more peers than requested, // only return the ones we need. if ($peer_count > $peer['numwant']) { $sql .= ' LIMIT ' . $peer['numwant'] . ' OFFSET ' . mt_rand(0, $peer_count - $peer['numwant']) . ';'; // IF there are more peers than the random limit. } else { if ($peer_count > $settings['random_limit']) { $sql .= ' ORDER BY RAND();'; } } // IF Compact if ($peer['compact']) { $peers = ''; $peersv6 = ''; // END IF Compact // IF Not Compact } else { $response .= 'l';
function torrent_announce() { global $connection, $settings; require_once __DIR__ . '/once.db.connect.php'; // begin response $response = 'd8:intervali' . $settings['announce_interval'] . 'e12:min intervali' . $settings['min_interval'] . 'e5:peers'; require_once __DIR__ . '/function.mysqli.fetch.once.php'; $peer_count = mysqli_fetch_once('SELECT COUNT(*) AS `count` FROM `' . $settings['db_prefix'] . 'peers` WHERE `info_hash`=\'' . $_GET['info_hash'] . '\''); if (!$peer_count) { $peer_count = 0; } else { $peer_count = $peer_count['count']; } $sql = 'SELECT * FROM `' . $settings['db_prefix'] . 'peers` WHERE `info_hash`=\'' . $_GET['info_hash'] . '\''; // IF there are more peers than requested, // only return the ones we need. if ($peer_count > $_GET['numwant']) { $sql .= ' LIMIT ' . $_GET['numwant'] . ' OFFSET ' . mt_rand(0, $peer_count - $_GET['numwant']); // IF there are more peers than the random limit. } else { if ($peer_count > $settings['random_limit']) { $sql .= ' ORDER BY RAND()'; } } // IF Compact if ($_GET['compact']) { $peers = ''; // END IF Compact // IF Not Compact } else { $response .= 'l'; } // END IF Not Compact $query = mysqli_query($connection, $sql); if (!$query) { tracker_error('Failed to select peers.'); } else { while ($peer = mysqli_fetch_assoc($query)) { // IF Compact if ($_GET['compact']) { $peers .= hex2bin($peer['compact']); // END IF Compact // IF No Peer ID } else { if ($_GET['no_peer_id']) { $response .= 'd2:ip' . strlen($peer['ip']) . ':' . $peer['ip'] . '4:porti' . $peer['port'] . 'ee'; // END IF No Peer ID // IF Normal } else { $response .= 'd2:ip' . strlen($peer['ip']) . ':' . $peer['ip'] . '7:peer id20:' . hex2bin($peer['peer_id']) . '4:porti' . $peer['port'] . 'ee'; } } // END IF Normal } } // IF Compact if ($_GET['compact']) { // 6-byte compacted peer info $response .= strlen($peers) . ':' . $peers; // END IF Compact // IF Not Compact } else { $response .= 'e'; } // END IF Not Compact echo $response . 'e'; }
<?php require_once $settings['functions'] . 'function.mysqli.fetch.once.php'; $peer['old'] = mysqli_fetch_once($connection, 'SELECT * FROM `' . $settings['db_prefix'] . 'peers` ' . 'WHERE `info_hash`=\'' . $peer['info_hash'] . '\' AND `peer_id`=\'' . $peer['peer_id'] . '\';'); // IF Event if (isset($_GET['event'])) { // IF Peer Exited if ($_GET['event'] == 'stopped') { if ($peer) { require_once $settings['functions'] . 'function.peer.delete.php'; peer_delete($connection, $settings, $peer); // HOOK PEER STOPPED if (is_readable($settings['hooks'] . 'phoenix.peer.stopped.php')) { include $settings['hooks'] . 'phoenix.peer.stopped.php'; } } // EXIT Only because the client does not require any data. exit; // END IF Peer Exited // IF Peer Completed } else { if ($_GET['event'] == 'completed') { // Force Seeding Status $peer['state'] = 1; // Increment downloads require_once $settings['functions'] . 'function.peer.completed.php'; peer_completed($connection, $settings, $peer); // HOOK DOWNLOAD COMPLETE if (is_readable($settings['hooks'] . 'phoenix.download.complete.php')) { include $settings['hooks'] . 'phoenix.download.complete.php'; }