mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-24 12:07:23 +08:00
improve announce check authkey
This commit is contained in:
@@ -72,12 +72,12 @@ class IconResource extends Resource
|
|||||||
return $table
|
return $table
|
||||||
->columns([
|
->columns([
|
||||||
Tables\Columns\TextColumn::make('id'),
|
Tables\Columns\TextColumn::make('id'),
|
||||||
Tables\Columns\TextColumn::make('name'),
|
Tables\Columns\TextColumn::make('name')->label(__('label.name')),
|
||||||
Tables\Columns\TextColumn::make('folder'),
|
Tables\Columns\TextColumn::make('folder')->label(__('label.icon.folder')),
|
||||||
Tables\Columns\TextColumn::make('cssfile'),
|
Tables\Columns\TextColumn::make('multilang')->label(__('label.icon.multilang')),
|
||||||
Tables\Columns\TextColumn::make('multilang'),
|
Tables\Columns\TextColumn::make('secondicon')->label(__('label.icon.secondicon')),
|
||||||
Tables\Columns\TextColumn::make('secondicon'),
|
Tables\Columns\TextColumn::make('cssfile')->label(__('label.icon.cssfile')),
|
||||||
Tables\Columns\TextColumn::make('designer'),
|
Tables\Columns\TextColumn::make('designer')->label(__('label.icon.designer')),
|
||||||
])
|
])
|
||||||
->filters([
|
->filters([
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,115 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\System;
|
|
||||||
|
|
||||||
use App\Filament\OptionsTrait;
|
|
||||||
use App\Filament\Resources\System\CategoryIconResource\Pages;
|
|
||||||
use App\Filament\Resources\System\CategoryIconResource\RelationManagers;
|
|
||||||
use App\Models\Icon;
|
|
||||||
use Filament\Forms;
|
|
||||||
use Filament\Resources\Form;
|
|
||||||
use Filament\Resources\Resource;
|
|
||||||
use Filament\Resources\Table;
|
|
||||||
use Filament\Tables;
|
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
|
||||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
|
||||||
|
|
||||||
class CategoryIconResource extends Resource
|
|
||||||
{
|
|
||||||
use OptionsTrait;
|
|
||||||
|
|
||||||
protected static ?string $model = Icon::class;
|
|
||||||
|
|
||||||
protected static ?string $navigationIcon = 'heroicon-o-collection';
|
|
||||||
|
|
||||||
protected static ?string $navigationGroup = 'System';
|
|
||||||
|
|
||||||
protected static ?int $navigationSort = 3;
|
|
||||||
|
|
||||||
protected static function getNavigationLabel(): string
|
|
||||||
{
|
|
||||||
return __('admin.sidebar.icon');
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getBreadcrumb(): string
|
|
||||||
{
|
|
||||||
return self::getNavigationLabel();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function form(Form $form): Form
|
|
||||||
{
|
|
||||||
return $form
|
|
||||||
->schema([
|
|
||||||
Forms\Components\TextInput::make('name')->label(__('label.name'))->required(),
|
|
||||||
Forms\Components\TextInput::make('folder')
|
|
||||||
->label(__('label.icon.folder'))
|
|
||||||
->helperText(__('label.icon.folder_help'))
|
|
||||||
->required()
|
|
||||||
,
|
|
||||||
Forms\Components\Radio::make('multilang')
|
|
||||||
->options(self::$yesOrNo)
|
|
||||||
->default('no')
|
|
||||||
->label(__('label.icon.multilang'))
|
|
||||||
->helperText(__('label.icon.multilang_help'))
|
|
||||||
,
|
|
||||||
Forms\Components\Radio::make('secondicon')
|
|
||||||
->options(self::$yesOrNo)
|
|
||||||
->default('no')
|
|
||||||
->label(__('label.icon.secondicon'))
|
|
||||||
->helperText(__('label.icon.secondicon_help'))
|
|
||||||
,
|
|
||||||
Forms\Components\TextInput::make('cssfile')
|
|
||||||
->label(__('label.icon.cssfile'))
|
|
||||||
->helperText(__('label.icon.cssfile_help'))
|
|
||||||
,
|
|
||||||
Forms\Components\TextInput::make('designer')
|
|
||||||
->label(__('label.icon.designer'))
|
|
||||||
->helperText(__('label.icon.designer_help'))
|
|
||||||
,
|
|
||||||
Forms\Components\TextInput::make('comment')
|
|
||||||
->label(__('label.icon.comment'))
|
|
||||||
->helperText(__('label.icon.comment_help'))
|
|
||||||
,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function table(Table $table): Table
|
|
||||||
{
|
|
||||||
return $table
|
|
||||||
->columns([
|
|
||||||
Tables\Columns\TextColumn::make('id'),
|
|
||||||
Tables\Columns\TextColumn::make('name')->label(__('label.name')),
|
|
||||||
Tables\Columns\TextColumn::make('folder')->label(__('label.icon.folder')),
|
|
||||||
Tables\Columns\TextColumn::make('multilang')->label(__('label.icon.multilang')),
|
|
||||||
Tables\Columns\TextColumn::make('secondicon')->label(__('label.icon.secondicon')),
|
|
||||||
Tables\Columns\TextColumn::make('cssfile')->label(__('label.icon.cssfile')),
|
|
||||||
Tables\Columns\TextColumn::make('designer')->label(__('label.icon.designer')),
|
|
||||||
Tables\Columns\TextColumn::make('comment')->label(__('label.icon.comment')),
|
|
||||||
])
|
|
||||||
->filters([
|
|
||||||
//
|
|
||||||
])
|
|
||||||
->actions([
|
|
||||||
Tables\Actions\EditAction::make(),
|
|
||||||
])
|
|
||||||
->bulkActions([
|
|
||||||
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getRelations(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
//
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getPages(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'index' => Pages\ListCategoryIcons::route('/'),
|
|
||||||
'create' => Pages\CreateCategoryIcon::route('/create'),
|
|
||||||
'edit' => Pages\EditCategoryIcon::route('/{record}/edit'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\System\CategoryIconResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\Resources\System\CategoryIconResource;
|
|
||||||
use Filament\Pages\Actions;
|
|
||||||
use Filament\Resources\Pages\CreateRecord;
|
|
||||||
|
|
||||||
class CreateCategoryIcon extends CreateRecord
|
|
||||||
{
|
|
||||||
protected static string $resource = CategoryIconResource::class;
|
|
||||||
|
|
||||||
protected static string $view = 'filament.resources.system.category-icon-resource.pages.create-record';
|
|
||||||
|
|
||||||
protected function mutateFormDataBeforeCreate(array $data): array
|
|
||||||
{
|
|
||||||
return array_filter($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getRedirectUrl(): string
|
|
||||||
{
|
|
||||||
return static::$resource::getUrl('index');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getViewData(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'desc' => nexus_trans('label.icon.desc')
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\System\CategoryIconResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\Resources\System\CategoryIconResource;
|
|
||||||
use Filament\Pages\Actions;
|
|
||||||
use Filament\Resources\Pages\EditRecord;
|
|
||||||
|
|
||||||
class EditCategoryIcon extends EditRecord
|
|
||||||
{
|
|
||||||
protected static string $resource = CategoryIconResource::class;
|
|
||||||
|
|
||||||
protected static string $view = 'filament.resources.system.category-icon-resource.pages.edit-record';
|
|
||||||
|
|
||||||
protected function getActions(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
Actions\DeleteAction::make(),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function mutateFormDataBeforeSave(array $data): array
|
|
||||||
{
|
|
||||||
return array_filter($data);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getRedirectUrl(): string
|
|
||||||
{
|
|
||||||
return static::$resource::getUrl('index');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getViewData(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'desc' => nexus_trans('label.icon.desc')
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\System\CategoryIconResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\PageList;
|
|
||||||
use App\Filament\Resources\System\CategoryIconResource;
|
|
||||||
use Filament\Pages\Actions;
|
|
||||||
use Filament\Resources\Pages\ListRecords;
|
|
||||||
|
|
||||||
class ListCategoryIcons extends PageList
|
|
||||||
{
|
|
||||||
protected static string $resource = CategoryIconResource::class;
|
|
||||||
|
|
||||||
protected function getActions(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
Actions\CreateAction::make(),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getViewData(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'desc' => nexus_trans('label.icon.desc')
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4844,7 +4844,7 @@ function get_plain_username($id){
|
|||||||
function get_searchbox_value($mode = 1, $item = 'showsubcat'){
|
function get_searchbox_value($mode = 1, $item = 'showsubcat'){
|
||||||
global $Cache;
|
global $Cache;
|
||||||
static $rows;
|
static $rows;
|
||||||
$cacheKey = "search_box_content_{$mode}";
|
$cacheKey = "search_box_content";
|
||||||
if (!$rows && !$rows = $Cache->get_value($cacheKey)){
|
if (!$rows && !$rows = $Cache->get_value($cacheKey)){
|
||||||
$rows = array();
|
$rows = array();
|
||||||
$res = sql_query("SELECT * FROM searchbox ORDER BY id ASC");
|
$res = sql_query("SELECT * FROM searchbox ORDER BY id ASC");
|
||||||
|
|||||||
@@ -1002,10 +1002,10 @@ function clear_staff_message_cache()
|
|||||||
\App\Repositories\MessageRepository::updateStaffMessageCountCache(false);
|
\App\Repositories\MessageRepository::updateStaffMessageCountCache(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
function clear_search_box_cache($id)
|
function clear_search_box_cache()
|
||||||
{
|
{
|
||||||
do_log("clear_search_box_cache: $id");
|
do_log("clear_search_box_cache");
|
||||||
\Nexus\Database\NexusDB::cache_del("search_box_content_{$id}");
|
\Nexus\Database\NexusDB::cache_del("search_box_content");
|
||||||
}
|
}
|
||||||
|
|
||||||
function user_can($permission, $fail = false, $uid = 0): bool
|
function user_can($permission, $fail = false, $uid = 0): bool
|
||||||
@@ -1061,3 +1061,29 @@ function is_donor(array $userInfo): bool
|
|||||||
{
|
{
|
||||||
return $userInfo['donor'] == 'yes' && ($userInfo['donoruntil'] === null || $userInfo['donoruntil'] == '0000-00-00 00:00:00' || $userInfo['donoruntil'] >= date('Y-m-d H:i:s'));
|
return $userInfo['donor'] == 'yes' && ($userInfo['donoruntil'] === null || $userInfo['donoruntil'] == '0000-00-00 00:00:00' || $userInfo['donoruntil'] >= date('Y-m-d H:i:s'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $authkey
|
||||||
|
* @return false|int|mixed|string|null
|
||||||
|
* @throws \App\Exceptions\NexusException
|
||||||
|
* @see download.php
|
||||||
|
*/
|
||||||
|
function get_passkey_by_authkey($authkey)
|
||||||
|
{
|
||||||
|
return \Nexus\Database\NexusDB::remember("authkey2passkey:$authkey", 3600*24, function () use ($authkey) {
|
||||||
|
$arr = explode('|', $authkey);
|
||||||
|
if (count($arr) != 3) {
|
||||||
|
throw new \InvalidArgumentException("Invalid authkey: $authkey, format error");
|
||||||
|
}
|
||||||
|
$uid = $arr[1];
|
||||||
|
$torrentRep = new \App\Repositories\TorrentRepository();
|
||||||
|
$decrypted = $torrentRep->checkTrackerReportAuthKey($_REQUEST['authkey']);
|
||||||
|
if (empty($decrypted)) {
|
||||||
|
throw new \InvalidArgumentException("Invalid authkey: $authkey");
|
||||||
|
}
|
||||||
|
$userInfo = \Nexus\Database\NexusDB::remember("announce_user_passkey_$uid", 3600, function () use ($uid) {
|
||||||
|
return \App\Models\User::query()->where('id', $uid)->first(['id', 'passkey']);
|
||||||
|
});
|
||||||
|
return $userInfo->passkey;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
+3
-34
@@ -1,50 +1,20 @@
|
|||||||
<?php
|
<?php
|
||||||
require '../include/bittorrent_announce.php';
|
require '../include/bittorrent_announce.php';
|
||||||
$apiLocalHost = nexus_env('TRACKER_API_LOCAL_HOST');
|
|
||||||
if ($apiLocalHost) {
|
|
||||||
do_log("[TRACKER_API_LOCAL_HOST] $apiLocalHost");
|
|
||||||
$response = request_local_api(trim($apiLocalHost, '/') . '/api/announce');
|
|
||||||
if (empty($response)) {
|
|
||||||
err("error from TRACKER_API_LOCAL_HOST");
|
|
||||||
} else {
|
|
||||||
exit(benc_resp_raw($response));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//continue the normal process
|
|
||||||
require ROOT_PATH . 'include/core.php';
|
require ROOT_PATH . 'include/core.php';
|
||||||
dbconn_announce();
|
|
||||||
do_log(nexus_json_encode($_SERVER));
|
do_log(nexus_json_encode($_SERVER));
|
||||||
//1. BLOCK ACCESS WITH WEB BROWSERS AND CHEATS!
|
//1. BLOCK ACCESS WITH WEB BROWSERS AND CHEATS!
|
||||||
$agent = $_SERVER["HTTP_USER_AGENT"];
|
$agent = $_SERVER["HTTP_USER_AGENT"];
|
||||||
block_browser();
|
block_browser();
|
||||||
|
dbconn_announce();
|
||||||
//check authkey
|
//check authkey
|
||||||
if (!empty($_REQUEST['authkey'])) {
|
if (!empty($_REQUEST['authkey'])) {
|
||||||
$arr = explode('|', $_REQUEST['authkey']);
|
|
||||||
if (count($arr) != 3) {
|
|
||||||
err('Invalid authkey');
|
|
||||||
}
|
|
||||||
$torrentId = $arr[0];
|
|
||||||
$uid = $arr[1];
|
|
||||||
$torrentRep = new \App\Repositories\TorrentRepository();
|
|
||||||
try {
|
try {
|
||||||
$decrypted = $torrentRep->checkTrackerReportAuthKey($_REQUEST['authkey']);
|
$_GET['passkey'] = get_passkey_by_authkey($_REQUEST['authkey']);
|
||||||
} catch (\Exception $exception) {
|
} catch (\Exception $exception) {
|
||||||
err($exception->getMessage());
|
err($exception->getMessage());
|
||||||
}
|
}
|
||||||
if (empty($decrypted)) {
|
|
||||||
err('Invalid authkey');
|
|
||||||
}
|
|
||||||
$userInfo = \Nexus\Database\NexusDB::remember("announce_user_passkey_$uid", 3600, function () use ($uid) {
|
|
||||||
return \App\Models\User::query()->where('id', $uid)->first(['id', 'passkey']);
|
|
||||||
});
|
|
||||||
if (!$userInfo) {
|
|
||||||
err('Invalid authkey');
|
|
||||||
}
|
|
||||||
$_GET['passkey'] = $userInfo->passkey;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//2. GET ANNOUNCE VARIABLES
|
//2. GET ANNOUNCE VARIABLES
|
||||||
// get string type passkey, info_hash, peer_id, event, ip from client
|
// get string type passkey, info_hash, peer_id, event, ip from client
|
||||||
foreach (array("passkey","info_hash","peer_id","event") as $x)
|
foreach (array("passkey","info_hash","peer_id","event") as $x)
|
||||||
@@ -168,8 +138,7 @@ if (!$torrent) {
|
|||||||
$start = strpos($queryString, $firstNeedle) + strlen($firstNeedle);
|
$start = strpos($queryString, $firstNeedle) + strlen($firstNeedle);
|
||||||
$end = strpos($queryString, "&", $start);
|
$end = strpos($queryString, "&", $start);
|
||||||
$infoHashUrlEncode = substr($queryString, $start, $end - $start);
|
$infoHashUrlEncode = substr($queryString, $start, $end - $start);
|
||||||
do_log("[TORRENT NOT EXISTS] $checkTorrentSql, params: $queryString", 'error');
|
do_log("[TORRENT NOT EXISTS] $checkTorrentSql, params: $queryString, infoHashUrlEncode: $infoHashUrlEncode");
|
||||||
do_log("[TORRENT NOT EXISTS] infoHashUrlEncode: $infoHashUrlEncode", 'error');
|
|
||||||
|
|
||||||
err("torrent not registered with this tracker");
|
err("torrent not registered with this tracker");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,5 +202,6 @@ else
|
|||||||
//header ("Content-Disposition: attachment; filename=".$row["filename"]."");
|
//header ("Content-Disposition: attachment; filename=".$row["filename"]."");
|
||||||
//ob_implicit_flush(true);
|
//ob_implicit_flush(true);
|
||||||
//print(benc($dict));
|
//print(benc($dict));
|
||||||
|
\Nexus\Database\NexusDB::cache_put("authkey2passkey:$trackerReportAuthKey", $CURUSER['passkey'], 3600*24);
|
||||||
echo \Rhilip\Bencode\Bencode::encode($dict);
|
echo \Rhilip\Bencode\Bencode::encode($dict);
|
||||||
?>
|
?>
|
||||||
|
|||||||
Reference in New Issue
Block a user