mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-14 12:30:49 +08:00
improve announce check authkey
This commit is contained in:
@@ -72,12 +72,12 @@ class IconResource extends Resource
|
||||
return $table
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('id'),
|
||||
Tables\Columns\TextColumn::make('name'),
|
||||
Tables\Columns\TextColumn::make('folder'),
|
||||
Tables\Columns\TextColumn::make('cssfile'),
|
||||
Tables\Columns\TextColumn::make('multilang'),
|
||||
Tables\Columns\TextColumn::make('secondicon'),
|
||||
Tables\Columns\TextColumn::make('designer'),
|
||||
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')),
|
||||
])
|
||||
->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'){
|
||||
global $Cache;
|
||||
static $rows;
|
||||
$cacheKey = "search_box_content_{$mode}";
|
||||
$cacheKey = "search_box_content";
|
||||
if (!$rows && !$rows = $Cache->get_value($cacheKey)){
|
||||
$rows = array();
|
||||
$res = sql_query("SELECT * FROM searchbox ORDER BY id ASC");
|
||||
|
||||
@@ -1002,10 +1002,10 @@ function clear_staff_message_cache()
|
||||
\App\Repositories\MessageRepository::updateStaffMessageCountCache(false);
|
||||
}
|
||||
|
||||
function clear_search_box_cache($id)
|
||||
function clear_search_box_cache()
|
||||
{
|
||||
do_log("clear_search_box_cache: $id");
|
||||
\Nexus\Database\NexusDB::cache_del("search_box_content_{$id}");
|
||||
do_log("clear_search_box_cache");
|
||||
\Nexus\Database\NexusDB::cache_del("search_box_content");
|
||||
}
|
||||
|
||||
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'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @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;
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,50 +1,20 @@
|
||||
<?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';
|
||||
dbconn_announce();
|
||||
do_log(nexus_json_encode($_SERVER));
|
||||
//1. BLOCK ACCESS WITH WEB BROWSERS AND CHEATS!
|
||||
$agent = $_SERVER["HTTP_USER_AGENT"];
|
||||
block_browser();
|
||||
|
||||
dbconn_announce();
|
||||
//check 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 {
|
||||
$decrypted = $torrentRep->checkTrackerReportAuthKey($_REQUEST['authkey']);
|
||||
$_GET['passkey'] = get_passkey_by_authkey($_REQUEST['authkey']);
|
||||
} catch (\Exception $exception) {
|
||||
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
|
||||
// get string type passkey, info_hash, peer_id, event, ip from client
|
||||
foreach (array("passkey","info_hash","peer_id","event") as $x)
|
||||
@@ -168,8 +138,7 @@ if (!$torrent) {
|
||||
$start = strpos($queryString, $firstNeedle) + strlen($firstNeedle);
|
||||
$end = strpos($queryString, "&", $start);
|
||||
$infoHashUrlEncode = substr($queryString, $start, $end - $start);
|
||||
do_log("[TORRENT NOT EXISTS] $checkTorrentSql, params: $queryString", 'error');
|
||||
do_log("[TORRENT NOT EXISTS] infoHashUrlEncode: $infoHashUrlEncode", 'error');
|
||||
do_log("[TORRENT NOT EXISTS] $checkTorrentSql, params: $queryString, infoHashUrlEncode: $infoHashUrlEncode");
|
||||
|
||||
err("torrent not registered with this tracker");
|
||||
}
|
||||
|
||||
@@ -202,5 +202,6 @@ else
|
||||
//header ("Content-Disposition: attachment; filename=".$row["filename"]."");
|
||||
//ob_implicit_flush(true);
|
||||
//print(benc($dict));
|
||||
\Nexus\Database\NexusDB::cache_put("authkey2passkey:$trackerReportAuthKey", $CURUSER['passkey'], 3600*24);
|
||||
echo \Rhilip\Bencode\Bencode::encode($dict);
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user