true, 'message' => _('Internal server error'), 'title' => sprintf(_('Oops - %s'), WEBSITE_NAME) ]; // 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 link @TODO implement .bittorrent and separated v1/v2 magnet links $response->title = sprintf( _('%s - Download - %s'), htmlentities($magnet->metaTitle), WEBSITE_NAME ); $response->message = sprintf( // @TODO MVC page for downloads needed '