|
|
|
<?php
|
|
|
|
|
|
|
|
// Load dependencies
|
|
|
|
require_once (__DIR__ . '/../config/app.php');
|
|
|
|
require_once (__DIR__ . '/../library/database.php');
|
|
|
|
require_once (__DIR__ . '/../../vendor/autoload.php');
|
|
|
|
|
|
|
|
// Connect database
|
|
|
|
try {
|
|
|
|
|
|
|
|
$db = new Database(DB_HOST, DB_PORT, DB_NAME, DB_USERNAME, DB_PASSWORD);
|
|
|
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
|
|
|
var_dump($e);
|
|
|
|
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Define response
|
|
|
|
$response = (object)
|
|
|
|
[
|
|
|
|
'success' => true,
|
|
|
|
'message' => _('Internal server error')
|
|
|
|
];
|
|
|
|
|
|
|
|
// Begin action request
|
|
|
|
switch (isset($_GET['target']) ? urldecode($_GET['target']) : false)
|
|
|
|
{
|
|
|
|
case 'profile':
|
|
|
|
|
|
|
|
switch (isset($_GET['toggle']) ? $_GET['toggle'] : false)
|
|
|
|
{
|
|
|
|
case 'jidenticon':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get user
|
|
|
|
else if (!$user = $db->getUser($userId))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user info');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Render icon
|
|
|
|
else
|
|
|
|
{
|
|
|
|
header('Cache-Control: max-age=604800');
|
|
|
|
|
|
|
|
|
|
|
|
$icon = new Jdenticon\Identicon();
|
|
|
|
|
|
|
|
$icon->setValue($user->{USER_IDENTICON_FIELD});
|
|
|
|
$icon->setSize(empty($_GET['size']) ? 100 : (int) $_GET['size']);
|
|
|
|
$icon->setStyle(
|
|
|
|
[
|
|
|
|
'backgroundColor' => 'rgba(255, 255, 255, 0)',
|
|
|
|
]
|
|
|
|
);
|
|
|
|
$icon->displayImage('webp');
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'comment':
|
|
|
|
|
|
|
|
switch (isset($_GET['toggle']) ? $_GET['toggle'] : false)
|
|
|
|
{
|
|
|
|
case 'approved':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get user
|
|
|
|
else if (!$user = $db->getUser($userId))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user info');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Magnet comment exists
|
|
|
|
else if (!$magnetComment = $db->getMagnetComment(isset($_GET['magnetCommentId']) && $_GET['magnetCommentId'] > 0 ? (int) $_GET['magnetCommentId'] : 0))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Requested magnet comment not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Access allowed
|
|
|
|
else if (!in_array($user->address, MODERATOR_IP_LIST)) {
|
|
|
|
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Access denied');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate callback
|
|
|
|
else if (empty($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Callback required');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate base64
|
|
|
|
else if (!$callback = (string) @base64_decode($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid callback encoding');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ($magnetComment->approved)
|
|
|
|
{
|
|
|
|
$db->updateMagnetCommentApproved($magnetComment->magnetCommentId, false);
|
|
|
|
|
|
|
|
if (USER_AUTO_APPROVE_ON_COMMENT_APPROVE)
|
|
|
|
{
|
|
|
|
$db->updateUserApproved($magnetComment->userId, false, time());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$db->updateMagnetCommentApproved($magnetComment->magnetCommentId, true);
|
|
|
|
|
|
|
|
if (USER_AUTO_APPROVE_ON_COMMENT_APPROVE)
|
|
|
|
{
|
|
|
|
$db->updateUserApproved($magnetComment->userId, true, time());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Redirect to edit page
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s', $callback)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'public':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get user
|
|
|
|
else if (!$user = $db->getUser($userId))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user info');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Magnet comment exists
|
|
|
|
else if (!$magnetComment = $db->getMagnetComment(isset($_GET['magnetCommentId']) && $_GET['magnetCommentId'] > 0 ? (int) $_GET['magnetCommentId'] : 0))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Requested magnet comment not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Access allowed
|
|
|
|
else if (!($user->address == $db->getUser($magnetComment->userId)->address || in_array($user->address, MODERATOR_IP_LIST))) {
|
|
|
|
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Access denied');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate callback
|
|
|
|
else if (empty($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Callback required');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate base64
|
|
|
|
else if (!$callback = (string) @base64_decode($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid callback encoding');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ($magnetComment->public)
|
|
|
|
{
|
|
|
|
$db->updateMagnetCommentPublic($magnetComment->magnetCommentId, false);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
$db->updateMagnetCommentPublic($magnetComment->magnetCommentId, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Redirect to edit page
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s', $callback)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'new':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get user
|
|
|
|
else if (!$user = $db->getUser($userId))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user info');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Magnet exists
|
|
|
|
else if (!$magnet = $db->getMagnet(isset($_GET['magnetId']) && $_GET['magnetId'] > 0 ? (int) $_GET['magnetId'] : 0))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Requested magnet not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Access allowed
|
|
|
|
else if (!($user->address == $db->getUser($magnet->userId)->address || in_array($user->address, MODERATOR_IP_LIST) || ($magnet->public && $magnet->approved))) {
|
|
|
|
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Magnet not available for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate callback
|
|
|
|
else if (empty($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Callback required');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate base64
|
|
|
|
else if (!$callback = (string) @base64_decode($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid callback encoding');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate comment value
|
|
|
|
else if (empty($_POST['comment']) ||
|
|
|
|
mb_strlen($_POST['comment']) < COMMENT_MIN_LENGTH ||
|
|
|
|
mb_strlen($_POST['comment']) > COMMENT_MAX_LENGTH)
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = sprintf(_('Valid comment value required, %s-%s chars allowed'), COMMENT_MIN_LENGTH, COMMENT_MAX_LENGTH);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ($magnetCommentId = $db->addMagnetComment($magnet->magnetId,
|
|
|
|
$user->userId,
|
|
|
|
null, // @TODO implement threads
|
|
|
|
trim($_POST['comment']),
|
|
|
|
$user->approved || in_array($user->address, MODERATOR_IP_LIST) ? true : COMMENT_DEFAULT_APPROVED,
|
|
|
|
COMMENT_DEFAULT_PUBLIC,
|
|
|
|
time()))
|
|
|
|
{
|
|
|
|
// Redirect to referrer page
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s#comment-%s', $callback, $magnetCommentId)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s', WEBSITE_URL)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'magnet':
|
|
|
|
|
|
|
|
switch (isset($_GET['toggle']) ? $_GET['toggle'] : false)
|
|
|
|
{
|
|
|
|
case 'star':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Magnet exists
|
|
|
|
else if (!$magnet = $db->getMagnet(isset($_GET['magnetId']) && $_GET['magnetId'] > 0 ? (int) $_GET['magnetId'] : 0))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Requested magnet not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Access allowed
|
|
|
|
else if (!($_SERVER['REMOTE_ADDR'] == $db->getUser($magnet->userId)->address || in_array($_SERVER['REMOTE_ADDR'], MODERATOR_IP_LIST) || ($magnet->public && $magnet->approved))) {
|
|
|
|
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Magnet not available for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate callback
|
|
|
|
else if (empty($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Callback required');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate base64
|
|
|
|
else if (!$callback = (string) @base64_decode($_GET['callback']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid callback encoding');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Star exists, trigger delete
|
|
|
|
if ($db->findMagnetStarsTotalByUserId($magnet->magnetId, $userId))
|
|
|
|
{
|
|
|
|
$db->deleteMagnetStarByUserId($magnet->magnetId, $userId);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Star not exists, trigger add
|
|
|
|
$db->addMagnetStar($magnet->magnetId, $userId, time());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Redirect to edit page
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s', $callback)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'download':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Magnet exists
|
|
|
|
else if (!$magnet = $db->getMagnet(isset($_GET['magnetId']) && $_GET['magnetId'] > 0 ? (int) $_GET['magnetId'] : 0))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Requested magnet not found');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Access allowed
|
|
|
|
else if (!($_SERVER['REMOTE_ADDR'] == $db->getUser($magnet->userId)->address || in_array($_SERVER['REMOTE_ADDR'], MODERATOR_IP_LIST) || ($magnet->public && $magnet->approved))) {
|
|
|
|
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Magnet not available for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Update download stats
|
|
|
|
$db->addMagnetDownload($magnet->magnetId, $userId, time());
|
|
|
|
|
|
|
|
// Build magnet link
|
|
|
|
$link = [];
|
|
|
|
|
|
|
|
/// Exact Topic
|
|
|
|
$xt = [];
|
|
|
|
|
|
|
|
foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result)
|
|
|
|
{
|
|
|
|
if ($infoHash = $db->getInfoHash($result->infoHashId))
|
|
|
|
{
|
|
|
|
switch ($infoHash->version)
|
|
|
|
{
|
|
|
|
case 1:
|
|
|
|
|
|
|
|
$xt[] = sprintf('xt=urn:btih:%s', $infoHash->value);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
|
|
$xt[] = sprintf('xt=urn:btmh:1220%s', $infoHash->value);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$link[] = sprintf('magnet:?%s', implode('&', $xt));
|
|
|
|
|
|
|
|
/// Display Name
|
|
|
|
$link[] = sprintf('dn=%s', urlencode($magnet->dn));
|
|
|
|
|
|
|
|
// Keyword Topic
|
|
|
|
$kt = [];
|
|
|
|
|
|
|
|
foreach ($db->findKeywordTopicByMagnetId($magnet->magnetId) as $result)
|
|
|
|
{
|
|
|
|
$kt[] = urlencode($db->getKeywordTopic($result->keywordTopicId)->value);
|
|
|
|
}
|
|
|
|
|
|
|
|
$link[] = sprintf('kt=%s', implode('+', $kt));
|
|
|
|
|
|
|
|
/// Address Tracker
|
|
|
|
foreach ($db->findAddressTrackerByMagnetId($magnet->magnetId) as $result)
|
|
|
|
{
|
|
|
|
$addressTracker = $db->getAddressTracker($result->addressTrackerId);
|
|
|
|
|
|
|
|
$scheme = $db->getScheme($addressTracker->schemeId);
|
|
|
|
$host = $db->getHost($addressTracker->hostId);
|
|
|
|
$port = $db->getPort($addressTracker->portId);
|
|
|
|
$uri = $db->getUri($addressTracker->uriId);
|
|
|
|
|
|
|
|
$url = sprintf('tr=%s', urlencode($port->value ? sprintf('%s://%s:%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$port->value,
|
|
|
|
$uri->value) : sprintf('%s://%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$uri->value)));
|
|
|
|
|
|
|
|
// Yggdrasil url only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $url))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$link[] = $url;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Append trackers.json
|
|
|
|
foreach (json_decode(file_get_contents(__DIR__ . '/../config/trackers.json')) as $tracker)
|
|
|
|
{
|
|
|
|
$link[] = sprintf('tr=%s', urlencode($tracker->announce));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Acceptable Source
|
|
|
|
foreach ($db->findAcceptableSourceByMagnetId($magnet->magnetId) as $result)
|
|
|
|
{
|
|
|
|
$acceptableSource = $db->getAcceptableSource($result->acceptableSourceId);
|
|
|
|
|
|
|
|
$scheme = $db->getScheme($acceptableSource->schemeId);
|
|
|
|
$host = $db->getHost($acceptableSource->hostId);
|
|
|
|
$port = $db->getPort($acceptableSource->portId);
|
|
|
|
$uri = $db->getUri($acceptableSource->uriId);
|
|
|
|
|
|
|
|
$url = sprintf('as=%s', urlencode($port->value ? sprintf('%s://%s:%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$port->value,
|
|
|
|
$uri->value) : sprintf('%s://%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$uri->value)));
|
|
|
|
|
|
|
|
// Yggdrasil url only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $url))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$link[] = $url;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Exact Source
|
|
|
|
foreach ($db->findExactSourceByMagnetId($magnet->magnetId) as $result)
|
|
|
|
{
|
|
|
|
$eXactSource = $db->getExactSource($result->eXactSourceId);
|
|
|
|
|
|
|
|
$scheme = $db->getScheme($eXactSource->schemeId);
|
|
|
|
$host = $db->getHost($eXactSource->hostId);
|
|
|
|
$port = $db->getPort($eXactSource->portId);
|
|
|
|
$uri = $db->getUri($eXactSource->uriId);
|
|
|
|
|
|
|
|
$url = sprintf('xs=%s', urlencode($port->value ? sprintf('%s://%s:%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$port->value,
|
|
|
|
$uri->value) : sprintf('%s://%s%s', $scheme->value,
|
|
|
|
$host->value,
|
|
|
|
$uri->value)));
|
|
|
|
|
|
|
|
// Yggdrasil url only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $url))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
$link[] = $url;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Return download link
|
|
|
|
header(
|
|
|
|
sprintf('Location: %s', implode('&', array_unique($link)))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 'new':
|
|
|
|
|
|
|
|
// Yggdrasil connections only
|
|
|
|
if (!preg_match(YGGDRASIL_URL_REGEX, $_SERVER['REMOTE_ADDR']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Yggdrasil connection required for this action');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Init session
|
|
|
|
else if (!$userId = $db->initUserId($_SERVER['REMOTE_ADDR'], USER_DEFAULT_APPROVED, time()))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user session');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get user
|
|
|
|
else if (!$user = $db->getUser($userId))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Could not init user info');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate link
|
|
|
|
if (empty($_GET['magnet']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Link required');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate base64
|
|
|
|
else if (!$link = (string) @base64_decode($_GET['magnet']))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid link encoding');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate magnet
|
|
|
|
else if (!$magnet = Yggverse\Parser\Magnet::parse($link))
|
|
|
|
{
|
|
|
|
$response->success = false;
|
|
|
|
$response->message = _('Invalid magnet link');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Request valid
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Begin magnet registration
|
|
|
|
try
|
|
|
|
{
|
|
|
|
$db->beginTransaction();
|
|
|
|
|
|
|
|
// Init magnet
|
|
|
|
if ($magnetId = $db->addMagnet( $user->userId,
|
|
|
|
$magnet->xl,
|
|
|
|
$magnet->dn,
|
|
|
|
$link,
|
|
|
|
MAGNET_DEFAULT_PUBLIC,
|
|
|
|
MAGNET_DEFAULT_COMMENTS,
|
|
|
|
MAGNET_DEFAULT_SENSITIVE,
|
|
|
|
$user->approved ? true : MAGNET_DEFAULT_APPROVED,
|
|
|
|
time()))
|
|
|
|
{
|
|
|
|
foreach ($magnet as $key => $value)
|
|
|
|
{
|
|
|
|
switch ($key)
|
|
|
|
{
|
|
|
|
case 'xt':
|
|
|
|
foreach ($value as $xt)
|
|
|
|
{
|
|
|
|
if (Yggverse\Parser\Magnet::isXTv1($xt))
|
|
|
|
{
|
|
|
|
$db->addMagnetToInfoHash(
|
|
|
|
$magnetId,
|
|
|
|
$db->initInfoHashId(
|
|
|
|
Yggverse\Parser\Magnet::filterInfoHash($xt), 1
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (Yggverse\Parser\Magnet::isXTv2($xt))
|
|
|
|
{
|
|
|
|
$db->addMagnetToInfoHash(
|
|
|
|
$magnetId,
|
|
|
|
$db->initInfoHashId(
|
|
|
|
Yggverse\Parser\Magnet::filterInfoHash($xt), 2
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'tr':
|
|
|
|
foreach ($value as $tr)
|
|
|
|
{
|
|
|
|
if ($url = Yggverse\Parser\Url::parse($tr))
|
|
|
|
{
|
|
|
|
if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name)))
|
|
|
|
{
|
|
|
|
$db->initMagnetToAddressTrackerId(
|
|
|
|
$magnetId,
|
|
|
|
$db->initAddressTrackerId(
|
|
|
|
$db->initSchemeId($url->host->scheme),
|
|
|
|
$db->initHostId($url->host->name),
|
|
|
|
$db->initPortId($url->host->port),
|
|
|
|
$db->initUriId($url->page->uri)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'ws':
|
|
|
|
foreach ($value as $ws)
|
|
|
|
{
|
|
|
|
// @TODO
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'as':
|
|
|
|
foreach ($value as $as)
|
|
|
|
{
|
|
|
|
if ($url = Yggverse\Parser\Url::parse($as))
|
|
|
|
{
|
|
|
|
if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name)))
|
|
|
|
{
|
|
|
|
$db->initMagnetToAcceptableSourceId(
|
|
|
|
$magnetId,
|
|
|
|
$db->initAcceptableSourceId(
|
|
|
|
$db->initSchemeId($url->host->scheme),
|
|
|
|
$db->initHostId($url->host->name),
|
|
|
|
$db->initPortId($url->host->port),
|
|
|
|
$db->initUriId($url->page->uri)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'xs':
|
|
|
|
foreach ($value as $xs)
|
|
|
|
{
|
|
|
|
if ($url = Yggverse\Parser\Url::parse($xs))
|
|
|
|
{
|
|
|
|
if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name)))
|
|
|
|
{
|
|
|
|
$db->initMagnetToExactSourceId(
|
|
|
|
$magnetId,
|
|
|
|
$db->initExactSourceId(
|
|
|
|
$db->initSchemeId($url->host->scheme),
|
|
|
|
$db->initHostId($url->host->name),
|
|
|
|
$db->initPortId($url->host->port),
|
|
|
|
$db->initUriId($url->page->uri)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'mt':
|
|
|
|
foreach ($value as $mt)
|
|
|
|
{
|
|
|
|
// @TODO
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'x.pe':
|
|
|
|
foreach ($value as $xPe)
|
|
|
|
{
|
|
|
|
// @TODO
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'kt':
|
|
|
|
foreach ($value as $kt)
|
|
|
|
{
|
|
|
|
$db->initMagnetToKeywordTopicId(
|
|
|
|
$magnetId,
|
|
|
|
$db->initKeywordTopicId(trim(mb_strtolower(strip_tags(html_entity_decode($kt)))))
|
|
|
|
);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$db->commit();
|
|
|
|
|
|
|
|
// Redirect to edit page
|
|
|
|
header(sprintf('Location: %s/edit.php?magnetId=%s', trim(WEBSITE_URL, '/'), $magnetId));
|
|
|
|
}
|
|
|
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
|
|
|
var_dump($e);
|
|
|
|
|
|
|
|
$db->rollBack();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang="en-US">
|
|
|
|
<head>
|
|
|
|
<link rel="stylesheet" type="text/css" href="<?php echo WEBSITE_URL ?>/assets/theme/default/css/common.css?<?php echo WEBSITE_CSS_VERSION ?>" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="<?php echo WEBSITE_URL ?>/assets/theme/default/css/framework.css?<?php echo WEBSITE_CSS_VERSION ?>" />
|
|
|
|
<title>
|
|
|
|
<?php echo sprintf(_('Oops - %s'), WEBSITE_NAME) ?>
|
|
|
|
</title>
|
|
|
|
<meta name="robots" content="noindex,nofollow"/>
|
|
|
|
<meta name="author" content="YGGtracker" />
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<header>
|
|
|
|
<div class="container">
|
|
|
|
<div class="row margin-t-8 text-center">
|
|
|
|
<a class="logo" href="<?php echo WEBSITE_URL ?>"><?php echo str_replace('YGG', '<span>YGG</span>', WEBSITE_NAME) ?></a>
|
|
|
|
<form class="margin-t-8" name="search" method="get" action="<?php echo WEBSITE_URL ?>/index.php">
|
|
|
|
<input type="text" name="query" value="" placeholder="<?php echo _('search or submit magnet link') ?>" />
|
|
|
|
<input type="submit" value="<?php echo _('submit') ?>" />
|
|
|
|
</form>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
<main>
|
|
|
|
<div class="container">
|
|
|
|
<div class="row">
|
|
|
|
<div class="column width-100">
|
|
|
|
<div class="padding-16 margin-y-8 border-radius-3 background-color-night">
|
|
|
|
<div class="text-center"><?php echo $response->message ?></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</main>
|
|
|
|
<footer>
|
|
|
|
<div class="container">
|
|
|
|
<div class="row">
|
|
|
|
<div class="column width-100 text-center margin-y-8">
|
|
|
|
<?php foreach (json_decode(file_get_contents(__DIR__ . '/../config/trackers.json')) as $i => $tracker) { ?>
|
|
|
|
<?php if (!empty($tracker->announce) && !empty($tracker->stats)) { ?>
|
|
|
|
<a href="<?php echo $tracker->announce ?>"><?php echo sprintf('Tracker %s', $i + 1) ?></a>
|
|
|
|
/
|
|
|
|
<a href="<?php echo $tracker->stats ?>"><?php echo _('Stats') ?></a>
|
|
|
|
|
|
|
|
|
<?php } ?>
|
|
|
|
<?php } ?>
|
|
|
|
<a href="<?php echo WEBSITE_URL ?>/node.php"><?php echo _('Node') ?></a>
|
|
|
|
|
|
|
|
|
<a rel="nofollow" href="<?php echo WEBSITE_URL ?>/index.php?rss"><?php echo _('RSS') ?></a>
|
|
|
|
|
|
|
|
|
<a href="https://github.com/YGGverse/YGGtracker"><?php echo _('GitHub') ?></a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</footer>
|
|
|
|
</body>
|
|
|
|
</html>
|