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; } ?>