diff --git a/app/Console/Commands/AttendanceMigrate.php b/app/Console/Commands/AttendanceMigrate.php index d3e22f29..554bbff7 100644 --- a/app/Console/Commands/AttendanceMigrate.php +++ b/app/Console/Commands/AttendanceMigrate.php @@ -41,7 +41,7 @@ class AttendanceMigrate extends Command { $rep = new AttendanceRepository(); $result = $rep->migrateAttendance(); - $log = sprintf('[%s], %s, result: %s, query: %s', REQUEST_ID, __METHOD__, var_export($result, true), last_query()); + $log = sprintf('[%s], %s, result: %s, query: %s', nexus() ? nexus()->getRequestId() : 'NO_REQUEST_ID', __METHOD__, var_export($result, true), last_query()); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/BackuAll.php b/app/Console/Commands/BackuAll.php index abc8f9bc..f17fd855 100644 --- a/app/Console/Commands/BackuAll.php +++ b/app/Console/Commands/BackuAll.php @@ -42,7 +42,7 @@ class BackuAll extends Command $result = $rep->backupAll(); $log = sprintf( '[%s], %s, result: %s', - REQUEST_ID, __METHOD__, var_export($result, true) + nexus()->getRequestId(), __METHOD__, var_export($result, true) ); $this->info($log); do_log($log); diff --git a/app/Console/Commands/BackupCronjob.php b/app/Console/Commands/BackupCronjob.php index 153a8e6d..09871d4e 100644 --- a/app/Console/Commands/BackupCronjob.php +++ b/app/Console/Commands/BackupCronjob.php @@ -42,7 +42,7 @@ class BackupCronjob extends Command $result = $rep->cronjobBackup(); $log = sprintf( '[%s], %s, result: %s', - REQUEST_ID, __METHOD__, var_export($result, true) + nexus()->getRequestId(), __METHOD__, var_export($result, true) ); $this->info($log); do_log($log); diff --git a/app/Console/Commands/BackupDatabase.php b/app/Console/Commands/BackupDatabase.php index f8c7e979..9b8825fa 100644 --- a/app/Console/Commands/BackupDatabase.php +++ b/app/Console/Commands/BackupDatabase.php @@ -40,7 +40,7 @@ class BackupDatabase extends Command { $rep = new ToolRepository(); $result = $rep->backupDatabase(); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); } diff --git a/app/Console/Commands/BackupWeb.php b/app/Console/Commands/BackupWeb.php index d31eb24a..be0d9fba 100644 --- a/app/Console/Commands/BackupWeb.php +++ b/app/Console/Commands/BackupWeb.php @@ -40,7 +40,7 @@ class BackupWeb extends Command { $rep = new ToolRepository(); $result = $rep->backupWeb(); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); } diff --git a/app/Console/Commands/DeleteExpiredToken.php b/app/Console/Commands/DeleteExpiredToken.php index f822ff92..6be57d14 100644 --- a/app/Console/Commands/DeleteExpiredToken.php +++ b/app/Console/Commands/DeleteExpiredToken.php @@ -55,7 +55,7 @@ class DeleteExpiredToken extends Command $query->where('last_used_at', '<', Carbon::now()->subDays($days)); $result = $query->delete(); - $log = sprintf('[%s], %s, result: %s, query: %s', REQUEST_ID, __METHOD__, var_export($result, true), last_query()); + $log = sprintf('[%s], %s, result: %s, query: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true), last_query()); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/ExamAssign.php b/app/Console/Commands/ExamAssign.php index 92965d65..f5a73f4c 100644 --- a/app/Console/Commands/ExamAssign.php +++ b/app/Console/Commands/ExamAssign.php @@ -45,7 +45,7 @@ class ExamAssign extends Command $end = $this->option('end'); $this->info(sprintf('uid: %s, examId: %s, begin: %s, end: %s', $uid, $examId, $begin, $end)); $result = $examRep->assignToUser($uid, $examId, $begin, $end); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/ExamAssignCronjob.php b/app/Console/Commands/ExamAssignCronjob.php index 44dc4bde..b0fc7855 100644 --- a/app/Console/Commands/ExamAssignCronjob.php +++ b/app/Console/Commands/ExamAssignCronjob.php @@ -40,7 +40,7 @@ class ExamAssignCronjob extends Command { $examRep = new ExamRepository(); $result = $examRep->cronjonAssign(); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/ExamCheckoutCronjob.php b/app/Console/Commands/ExamCheckoutCronjob.php index 979dc4f5..56944739 100644 --- a/app/Console/Commands/ExamCheckoutCronjob.php +++ b/app/Console/Commands/ExamCheckoutCronjob.php @@ -42,7 +42,7 @@ class ExamCheckoutCronjob extends Command $ignoreTimeRange = $this->option('ignore-time-range'); $this->info('ignore-time-range: ' . var_export($ignoreTimeRange, true)); $result = $examRep->cronjobCheckout($ignoreTimeRange); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/ExamUpdateProgress.php b/app/Console/Commands/ExamUpdateProgress.php index bcc78745..a24f341b 100644 --- a/app/Console/Commands/ExamUpdateProgress.php +++ b/app/Console/Commands/ExamUpdateProgress.php @@ -42,7 +42,7 @@ class ExamUpdateProgress extends Command $uid = $this->argument('uid'); $examRep = new ExamRepository(); $result = $examRep->updateProgress($uid); - $this->info(REQUEST_ID . ", result: " . var_export($result, true)); + $this->info(nexus()->getRequestId() . ", result: " . var_export($result, true)); return 0; } } diff --git a/app/Console/Commands/HitAndRunUpdateStatus.php b/app/Console/Commands/HitAndRunUpdateStatus.php index 7baeb85e..8ad0980a 100644 --- a/app/Console/Commands/HitAndRunUpdateStatus.php +++ b/app/Console/Commands/HitAndRunUpdateStatus.php @@ -44,7 +44,7 @@ class HitAndRunUpdateStatus extends Command $result = $rep->cronjobUpdateStatus($uid, $torrentId); $log = sprintf( '[%s], %s, uid: %s, torrentId: %s, result: %s', - REQUEST_ID, __METHOD__, $uid, $torrentId, var_export($result, true) + nexus()->getRequestId(), __METHOD__, $uid, $torrentId, var_export($result, true) ); $this->info($log); do_log($log); diff --git a/app/Console/Commands/MigrateTorrentTag.php b/app/Console/Commands/MigrateTorrentTag.php index fc294529..9ac1d4ba 100644 --- a/app/Console/Commands/MigrateTorrentTag.php +++ b/app/Console/Commands/MigrateTorrentTag.php @@ -43,7 +43,7 @@ class MigrateTorrentTag extends Command { $rep = new TagRepository(); $result = $rep->migrateTorrentTag(); - $log = sprintf('[%s], %s, result: %s, query: %s', REQUEST_ID, __METHOD__, var_export($result, true), last_query()); + $log = sprintf('[%s], %s, result: %s, query: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true), last_query()); $this->info($log); do_log($log); return 0; diff --git a/app/Console/Commands/Test.php b/app/Console/Commands/Test.php index 230eefd7..db247f98 100644 --- a/app/Console/Commands/Test.php +++ b/app/Console/Commands/Test.php @@ -65,8 +65,11 @@ class Test extends Command */ public function handle() { - $redis = Redis::connection()->client(); - $r = $redis->get('5da94a358e67cb5181166ae2611c2fd9'); + $peerId = '-UT355W-%af%b0ky%86N%a6%17i%f8%c1%0a'; + $peerId = '-UT355W-%af%b0ky%86N%a6%17i%f8%c1%0a'; + $peerId = '-UT355W-%AF%B0ky%86N%A6%17i%F8%C1'; + $peerId = '-UT355W-%AF%B0ky%86N%A6%17i%F8%C1%0A'; + $r = strlen(urldecode($peerId)); dd($r); } diff --git a/app/Console/Commands/UserResetPassword.php b/app/Console/Commands/UserResetPassword.php index 43b2fa01..538c68a8 100644 --- a/app/Console/Commands/UserResetPassword.php +++ b/app/Console/Commands/UserResetPassword.php @@ -47,7 +47,7 @@ class UserResetPassword extends Command $rep = new UserRepository(); $result = $rep->resetPassword($uid, $password, $passwordConfirmation); - $log = sprintf('[%s], %s, result: %s', REQUEST_ID, __METHOD__, var_export($result, true)); + $log = sprintf('[%s], %s, result: %s', nexus()->getRequestId(), __METHOD__, var_export($result, true)); $this->info($log); do_log($log); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 0cf41a39..250b41d6 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -21,6 +21,7 @@ class Kernel extends HttpKernel \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, // \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + \App\Http\Middleware\BootNexus::class, ]; /** diff --git a/app/Http/Middleware/BootNexus.php b/app/Http/Middleware/BootNexus.php new file mode 100644 index 00000000..80e79fa2 --- /dev/null +++ b/app/Http/Middleware/BootNexus.php @@ -0,0 +1,29 @@ +server()), nexus_json_encode($request->header()), nexus_json_encode($request->query()), nexus_json_encode($request->input()) + )); + return $next($request); + } + + +} diff --git a/app/Http/Middleware/Permission.php b/app/Http/Middleware/Permission.php index 0b824eb8..7fe477c9 100644 --- a/app/Http/Middleware/Permission.php +++ b/app/Http/Middleware/Permission.php @@ -20,7 +20,7 @@ class Permission { /** @var User $user */ $user = $request->user(); - if (!$user || (IS_PLATFORM_ADMIN && !$user->canAccessAdmin())) { + if (!$user || (nexus()->isPlatformAdmin() && !$user->canAccessAdmin())) { do_log("denied!"); throw new UnauthorizedException('Unauthorized!'); } diff --git a/app/Http/Middleware/Platform.php b/app/Http/Middleware/Platform.php index 56e1c2d7..a7ee857d 100644 --- a/app/Http/Middleware/Platform.php +++ b/app/Http/Middleware/Platform.php @@ -17,11 +17,10 @@ class Platform */ public function handle(Request $request, Closure $next) { - do_log(nexus_json_encode($_SERVER)); - if (empty(CURRENT_PLATFORM)) { + if (empty(nexus()->getPlatform())) { throw new \InvalidArgumentException("Require platform header."); } - if (!in_array(CURRENT_PLATFORM, PLATFORMS)) { + if (!nexus()->isPlatformValid()) { throw new \InvalidArgumentException("Invalid platform: " . CURRENT_PLATFORM); } return $next($request); diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php index a8a252df..5a70b40d 100644 --- a/app/Http/Middleware/TrimStrings.php +++ b/app/Http/Middleware/TrimStrings.php @@ -15,5 +15,7 @@ class TrimStrings extends Middleware 'current_password', 'password', 'password_confirmation', + 'peer_id', + 'info_hash', ]; } diff --git a/app/Listeners/ResetNexus.php b/app/Listeners/ResetNexus.php new file mode 100644 index 00000000..75b302ab --- /dev/null +++ b/app/Listeners/ResetNexus.php @@ -0,0 +1,21 @@ +getRequestId() . "] %channel%.%level_name%: %message% %context% %extra%\n"; return tap(new LineFormatter($format, 'Y-m-d H:i:s', true, true), function ($formatter) { $formatter->includeStacktraces(); }); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index faa701f6..5904a028 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,6 +6,7 @@ use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; use Illuminate\Http\Resources\Json\JsonResource; +use Nexus\Nexus; class AppServiceProvider extends ServiceProvider { @@ -28,5 +29,6 @@ class AppServiceProvider extends ServiceProvider { // JsonResource::withoutWrapping(); DB::connection(config('database.default'))->enableQueryLog(); +// Nexus::boot(); } } diff --git a/app/Repositories/AgentAllowRepository.php b/app/Repositories/AgentAllowRepository.php index 63d865f9..839db108 100644 --- a/app/Repositories/AgentAllowRepository.php +++ b/app/Repositories/AgentAllowRepository.php @@ -82,8 +82,8 @@ class AgentAllowRepository extends BaseRepository $agentAllowId = $agentAllow->id; $logPrefix = "[ID: $agentAllowId]"; $isPeerIdAllowed = $isAgentAllowed = $isPeerIdTooLow = $isAgentTooLow = false; - //check peer_id - if ($agentAllow->peer_id_pattern == '') { + //check peer_id, when handle scrape request, no peer_id, so let it pass + if ($agentAllow->peer_id_pattern == '' || $peerId === null) { $isPeerIdAllowed = true; } else { $pattern = $agentAllow->peer_id_pattern; diff --git a/app/Repositories/AuthenticateRepository.php b/app/Repositories/AuthenticateRepository.php index 8a4d2fb0..7669fb9a 100644 --- a/app/Repositories/AuthenticateRepository.php +++ b/app/Repositories/AuthenticateRepository.php @@ -17,7 +17,7 @@ class AuthenticateRepository extends BaseRepository if (!$user || md5($user->secret . $password . $user->secret) != $user->passhash) { throw new \InvalidArgumentException('Username or password invalid.'); } - if (IS_PLATFORM_ADMIN && !$user->canAccessAdmin()) { + if (nexus()->isPlatformAdmin() && !$user->canAccessAdmin()) { throw new UnauthorizedException('Unauthorized!'); } $user->checkIsNormal(); diff --git a/app/Repositories/DashboardRepository.php b/app/Repositories/DashboardRepository.php index 766c8f96..4b41a193 100644 --- a/app/Repositories/DashboardRepository.php +++ b/app/Repositories/DashboardRepository.php @@ -54,7 +54,7 @@ class DashboardRepository extends BaseRepository $result[$name] = [ 'name' => $name, 'text' => nexus_trans("dashboard.system_info.$name"), - 'value' => $_SERVER['SERVER_SOFTWARE'], + 'value' => $_SERVER['SERVER_SOFTWARE'] ?? '', ]; $name = 'load_average'; $result[$name] = [ diff --git a/app/Repositories/TrackerRepository.php b/app/Repositories/TrackerRepository.php index 1bc4c8c5..3a4ad288 100644 --- a/app/Repositories/TrackerRepository.php +++ b/app/Repositories/TrackerRepository.php @@ -51,11 +51,10 @@ class TrackerRepository extends BaseRepository public function announce(Request $request): \Illuminate\Http\Response { - do_log(nexus_json_encode($_SERVER)); + do_log("queryString: " . $request->getQueryString()); try { $withPeers = false; $queries = $this->checkAnnounceFields($request); - do_log("[QUERIES] " . json_encode(Arr::only($queries, ['ip', 'user_agent', 'uploaded', 'downloaded', 'left', 'event'])), 'debug'); $user = $this->checkUser($request); $clientAllow = $this->checkClient($request); $torrent = $this->checkTorrent($queries, $user); @@ -108,7 +107,7 @@ class TrackerRepository extends BaseRepository } catch (\Exception $exception) { //other system exception do_log("[" . get_class($exception) . "] " . $exception->getMessage() . "\n" . $exception->getTraceAsString(), 'error'); - $repDict = $this->generateFailedAnnounceResponse("system error, report to sysop please, hint: " . REQUEST_ID); + $repDict = $this->generateFailedAnnounceResponse("system error, report to sysop please, hint: " . nexus()->getRequestId()); } finally { if (isset($user) && count($this->userUpdates)) { $user->update($this->userUpdates); @@ -218,8 +217,8 @@ class TrackerRepository extends BaseRepository } foreach (['info_hash', 'peer_id'] as $item) { - if (\strlen((string) $queries[$item]) !== 20) { - throw new TrackerException("Invalid $item ! $item is not 20 bytes long"); + if (($length = \strlen((string) $queries[$item])) !== 20) { + throw new TrackerException("Invalid $item ! $item is not 20 bytes long($length)"); } } @@ -502,7 +501,7 @@ class TrackerRepository extends BaseRepository unset($queries['key']); $lockKey = md5(http_build_query($queries)); $redis = Redis::connection()->client(); - if (!$redis->set($lockKey, NEXUS_START, ['nx', 'ex' => self::MIN_ANNOUNCE_WAIT_SECOND])) { + if (!$redis->set($lockKey, nexus()->getStartTimestamp(), ['nx', 'ex' => 5])) { do_log('[RE_ANNOUNCE]'); return true; } @@ -654,6 +653,7 @@ class TrackerRepository extends BaseRepository protected function sendFinalAnnounceResponse($repDict): \Illuminate\Http\Response { + do_log("[repDict] " . nexus_json_encode($repDict)); return \response(Bencode::encode($repDict)) ->withHeaders(['Content-Type' => 'text/plain; charset=utf-8']) ->withHeaders(['Connection' => 'close']) @@ -776,7 +776,7 @@ class TrackerRepository extends BaseRepository public function scrape(Request $request): \Illuminate\Http\Response { - do_log(nexus_json_encode($_SERVER)); + do_log("queryString: " . $request->getQueryString()); try { $infoHashArr = $this->checkScrapeFields($request); $user = $this->checkUser($request); @@ -785,6 +785,9 @@ class TrackerRepository extends BaseRepository if ($user->clientselect != $clientAllow->id) { $this->userUpdates['clientselect'] = $clientAllow->id; } + if ($user->showclienterror == 'yes') { + $this->userUpdates['showclienterror'] = 'no'; + } $repDict = $this->generateScrapeResponse($infoHashArr); } catch (ClientNotAllowedException $exception) { do_log("[ClientNotAllowedException] " . $exception->getMessage()); @@ -797,8 +800,9 @@ class TrackerRepository extends BaseRepository } catch (\Exception $exception) { //other system exception do_log("[" . get_class($exception) . "] " . $exception->getMessage() . "\n" . $exception->getTraceAsString(), 'error'); - $repDict = $this->generateFailedAnnounceResponse("system error, report to sysop please, hint: " . REQUEST_ID); + $repDict = $this->generateFailedAnnounceResponse("system error, report to sysop please, hint: " . nexus()->getRequestId()); } finally { + do_log("userUpdates: " . nexus_json_encode($this->userUpdates)); if (isset($user) && count($this->userUpdates)) { $user->update($this->userUpdates); do_log(last_query(), 'debug'); @@ -817,7 +821,7 @@ class TrackerRepository extends BaseRepository } else { foreach ($info_hash_array as $item) { if (strlen($item) != 20) { - throw new TrackerException("Invalid info_hash ! :attribute is not 20 bytes long"); + throw new TrackerException("Invalid info_hash ! info_hash is not 20 bytes long"); } } } @@ -852,7 +856,7 @@ class TrackerRepository extends BaseRepository return Cache::remember($cacheKey, 60, function () use ($infoHash) { $fieldRaw = 'id, owner, sp_state, seeders, leechers, added, banned, hr, visible, last_action, times_completed'; $torrent = Torrent::query()->where('info_hash', $infoHash)->selectRaw($fieldRaw)->first(); - do_log("cache miss, from database: " . last_query() . ", and get: " . $torrent->id); + do_log("[getTorrentByInfoHash] cache miss, from database: " . last_query() . ", and get: " . $torrent->id); return $torrent; }); } diff --git a/bootstrap/app.php b/bootstrap/app.php index 0f565005..44ab0203 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,10 +1,13 @@ [ ...Octane::prepareApplicationForNextOperation(), ...Octane::prepareApplicationForNextRequest(), - // + \App\Listeners\ResetNexus::class, ], RequestHandled::class => [ @@ -189,6 +189,7 @@ return [ 'routes', 'composer.lock', '.env', + 'include/**/*.php', ], /* diff --git a/include/bittorrent.php b/include/bittorrent.php index c97dcf80..3b7fe025 100644 --- a/include/bittorrent.php +++ b/include/bittorrent.php @@ -1,5 +1,4 @@ "; - echo sprintf("[%s] [%s] %s ... done!%s", date('Y-m-d H:i:s'), REQUEST_ID, $msg, $br); + echo sprintf("[%s] [%s] %s ... done!%s", date('Y-m-d H:i:s'), nexus()->getRequestId(), $msg, $br); } function torrent_promotion_expire($days, $type = 2, $targettype = 1){ diff --git a/include/constants.php b/include/constants.php index 9c216d2d..3360eb7b 100644 --- a/include/constants.php +++ b/include/constants.php @@ -7,31 +7,38 @@ defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org"); defined('NEXUSWIKIURL') || define("NEXUSWIKIURL","https://doc.nexusphp.org"); defined('VERSION') || define("VERSION","Powered by ".PROJECTNAME.""); defined('THISTRACKER') || define("THISTRACKER","General"); -$showversion = " - Powered by ".PROJECTNAME; defined('ROOT_PATH') || define('ROOT_PATH', dirname(__DIR__) . '/'); -defined('CURRENT_SCRIPT') || define('CURRENT_SCRIPT', strstr(basename($_SERVER['SCRIPT_FILENAME']), '.', true)); -defined('IS_ANNOUNCE') || define('IS_ANNOUNCE', CURRENT_SCRIPT == 'announce'); - -defined('PLATFORM_ADMIN') || define('PLATFORM_ADMIN', 'admin'); -defined('PLATFORM_USER') || define('PLATFORM_USER', 'user'); -defined('PLATFORMS') || define('PLATFORMS', [PLATFORM_ADMIN, PLATFORM_USER]); -defined('CURRENT_PLATFORM') || define('CURRENT_PLATFORM', $_SERVER['HTTP_PLATFORM'] ?? ''); -defined('IS_PLATFORM_ADMIN') || define('IS_PLATFORM_ADMIN', CURRENT_PLATFORM == PLATFORM_ADMIN); -defined('IS_PLATFORM_USER') || define('IS_PLATFORM_USER', CURRENT_PLATFORM == PLATFORM_USER); - - -//define the REQUEST_ID -if (!defined('REQUEST_ID')) { - if (!empty($_SERVER['HTTP_X_REQUEST_ID'])) { - $requestId = $_SERVER['HTTP_X_REQUEST_ID']; - } elseif (!empty($_SERVER['REQUEST_ID'])) { - $requestId = $_SERVER['REQUEST_ID']; +if (!defined('RUNNING_IN_OCTANE')) { + if (!empty($_SERVER['PWD']) && str_contains($_SERVER['PWD'], 'vendor/laravel/octane/bin')) { + define('RUNNING_IN_OCTANE', true); } else { - $prefix = ($_SERVER['SCRIPT_FILENAME'] ?? '') . implode('', $_SERVER['argv'] ?? []); - $prefix = substr(md5($prefix), 0, 4); - // 4 + 23 = 27 characters, after replace '.', 26 - $requestId = str_replace('.', '', uniqid($prefix, true)); - $requestId .= bin2hex(random_bytes(3)); + define('RUNNING_IN_OCTANE', false); } - define('REQUEST_ID', $requestId); } + +//defined('CURRENT_SCRIPT') || define('CURRENT_SCRIPT', strstr(basename($_SERVER['SCRIPT_FILENAME']), '.', true)); +//defined('IS_ANNOUNCE') || define('IS_ANNOUNCE', CURRENT_SCRIPT == 'announce'); +// +//defined('PLATFORM_ADMIN') || define('PLATFORM_ADMIN', 'admin'); +//defined('PLATFORM_USER') || define('PLATFORM_USER', 'user'); +//defined('PLATFORMS') || define('PLATFORMS', [PLATFORM_ADMIN, PLATFORM_USER]); +//defined('CURRENT_PLATFORM') || define('CURRENT_PLATFORM', $_SERVER['HTTP_PLATFORM'] ?? ''); +//defined('IS_PLATFORM_ADMIN') || define('IS_PLATFORM_ADMIN', CURRENT_PLATFORM == PLATFORM_ADMIN); +//defined('IS_PLATFORM_USER') || define('IS_PLATFORM_USER', CURRENT_PLATFORM == PLATFORM_USER); +// +// +////define the REQUEST_ID +//if (!defined('REQUEST_ID')) { +// if (!empty($_SERVER['HTTP_X_REQUEST_ID'])) { +// $requestId = $_SERVER['HTTP_X_REQUEST_ID']; +// } elseif (!empty($_SERVER['REQUEST_ID'])) { +// $requestId = $_SERVER['REQUEST_ID']; +// } else { +// $prefix = ($_SERVER['SCRIPT_FILENAME'] ?? '') . implode('', $_SERVER['argv'] ?? []); +// $prefix = substr(md5($prefix), 0, 4); +// // 4 + 23 = 27 characters, after replace '.', 26 +// $requestId = str_replace('.', '', uniqid($prefix, true)); +// $requestId .= bin2hex(random_bytes(3)); +// } +// define('REQUEST_ID', $requestId); +//} diff --git a/include/core.php b/include/core.php index 592d7214..7ffa5f70 100644 --- a/include/core.php +++ b/include/core.php @@ -1,6 +1,7 @@ getScript(), ['announce', 'scrape'])) { require $rootpath . get_langfile_path("functions.php"); checkGuestVisit(); } diff --git a/include/functions.php b/include/functions.php index b650ec98..716246dc 100644 --- a/include/functions.php +++ b/include/functions.php @@ -2274,7 +2274,7 @@ function get_style_highlight() function stdhead($title = "", $msgalert = true, $script = "", $place = "") { global $lang_functions; - global $CURUSER, $CURLANGDIR, $USERUPDATESET, $iplog1, $oldip, $SITE_ONLINE, $FUNDS, $SITENAME, $SLOGAN, $logo_main, $BASEURL, $offlinemsg, $showversion,$enabledonation, $staffmem_class, $titlekeywords_tweak, $metakeywords_tweak, $metadescription_tweak, $cssdate_tweak, $deletenotransfertwo_account, $neverdelete_account, $iniupload_main; + global $CURUSER, $CURLANGDIR, $USERUPDATESET, $iplog1, $oldip, $SITE_ONLINE, $FUNDS, $SITENAME, $SLOGAN, $logo_main, $BASEURL, $offlinemsg,$enabledonation, $staffmem_class, $titlekeywords_tweak, $metakeywords_tweak, $metadescription_tweak, $cssdate_tweak, $deletenotransfertwo_account, $neverdelete_account, $iniupload_main; global $tstart; global $Cache; global $Advertisement; @@ -2302,7 +2302,7 @@ function stdhead($title = "", $msgalert = true, $script = "", $place = "") $title = $SITENAME." :: " . htmlspecialchars($title); if ($titlekeywords_tweak) $title .= " ".htmlspecialchars($titlekeywords_tweak); - $title .= $showversion; + $title .= " - Powered by ".PROJECTNAME; if ($SITE_ONLINE == "no") { if (get_user_class() < UC_ADMINISTRATOR) { die($lang_functions['std_site_down_for_maintenance']); @@ -2660,7 +2660,7 @@ function stdfoot() { } // Variables for End Time $tend = microtime(true); - $totaltime = ($tend - NEXUS_START); + $totaltime = ($tend - nexus()->getStartTimestamp()); $year = substr($datefounded, 0, 4); $yearfounded = ($year ? $year : 2007); print(" (c) "." ".$SITENAME." ".($icplicense_main ? " ".$icplicense_main." " : "").(date("Y") != $yearfounded ? $yearfounded."-" : "").date("Y")." ".VERSION."

"); @@ -2812,7 +2812,7 @@ function base64 ($string, $encode=true) { function loggedinorreturn($mainpage = false) { global $CURUSER,$BASEURL; if (!$CURUSER) { - if (CURRENT_SCRIPT == 'ajax') { + if (nexus()->getScript() == 'ajax') { exit(fail('Not login!', $_POST)); } if ($mainpage) @@ -4840,7 +4840,7 @@ function checkGuestVisit() if (empty($guestVisitType) || $guestVisitType == 'normal') { return; } - if (in_array(CURRENT_SCRIPT, ['login', 'takelogin', 'image']) && canDoLogin()) { + if (in_array(nexus()->getScript(), ['login', 'takelogin', 'image']) && canDoLogin()) { return; } @@ -5225,7 +5225,7 @@ function list_require_search_box_id() 'userdetails' => [$setting['browsecat'], $setting['specialcat']], 'offers' => [$setting['browsecat'], $setting['specialcat']], ]; - return $maps[CURRENT_SCRIPT] ?? []; + return $maps[nexus()->getScript()] ?? []; } function can_access_torrent($torrent) diff --git a/include/functions_announce.php b/include/functions_announce.php index 523158cf..b5ba1e08 100644 --- a/include/functions_announce.php +++ b/include/functions_announce.php @@ -344,6 +344,7 @@ function request_local_api($api) $options = [ CURLOPT_URL => sprintf('%s?%s', trim($api, '/'), $_SERVER['QUERY_STRING']), CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"], + CURLOPT_HTTPHEADER => ['REQUEST_ID: ' . nexus()->getRequestId(), 'Platform: tracker'], CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_TIMEOUT => 60, diff --git a/include/globalfunctions.php b/include/globalfunctions.php index bb875ac1..52f0e137 100644 --- a/include/globalfunctions.php +++ b/include/globalfunctions.php @@ -1,4 +1,7 @@ id ?? 0; - $passkey = $user->passkey ?? $_REQUEST['passkey'] ?? $_REQUEST['authkey'] ?? ''; - $env = env('APP_ENV'); - } + if (IN_NEXUS) { + global $CURUSER; + $user = $CURUSER; + $uid = $user['id'] ?? 0; + $passkey = $user['passkey'] ?? $_REQUEST['passkey'] ?? $_REQUEST['authkey'] ?? ''; } else { - $sequence++; + $user = \Illuminate\Support\Facades\Auth::user(); + $uid = $user->id ?? 0; + $passkey = $user->passkey ?? request('passkey', request('authkey', '')); } $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $content = sprintf( "[%s] [%s] [%s] [%s] [%s] [%s] %s.%s %s:%s %s%s%s %s%s", date('Y-m-d H:i:s'), - defined('REQUEST_ID') ? REQUEST_ID : '', + nexus() ? nexus()->getRequestId() : 'NO_REQUEST_ID', + nexus() ? nexus()->getLogSequence() : 0, + sprintf('%.3f', microtime(true) - (nexus() ? nexus()->getStartTimestamp() : 0)), $uid, $passkey, - $sequence, - sprintf('%.3f', microtime(true) - NEXUS_START), $env, $level, $backtrace[0]['file'] ?? '', $backtrace[0]['line'] ?? '', @@ -212,6 +211,9 @@ function do_log($log, $level = 'info') ); fwrite($fd, $content); fclose($fd); + if (nexus()) { + nexus()->incrementLogSequence(); + } } function getLogFile() @@ -483,26 +485,19 @@ function api(...$args) $msg = $args[1]; $data = $args[2]; } - if (defined('LARAVEL_START')) { - $start = LARAVEL_START; - if ($data instanceof \Illuminate\Http\Resources\Json\ResourceCollection || $data instanceof \Illuminate\Http\Resources\Json\JsonResource) { - $data = $data->response()->getData(true); - if (isset($data['data']) && count($data) == 1) { - //单纯的集合,无分页等其数据 - $data = $data['data']; - } + if ($data instanceof \Illuminate\Http\Resources\Json\ResourceCollection || $data instanceof \Illuminate\Http\Resources\Json\JsonResource) { + $data = $data->response()->getData(true); + if (isset($data['data']) && count($data) == 1) { + //单纯的集合,无分页等其数据 + $data = $data['data']; } - } elseif (defined('NEXUS_START')) { - $start = NEXUS_START; - } else { - throw new \RuntimeException("no constant START is defined."); } return [ 'ret' => (int)$ret, 'msg' => (string)$msg, 'data' => $data, - 'time' => (float)number_format(microtime(true) - $start, 3), - 'rid' => REQUEST_ID, + 'time' => (float)number_format(microtime(true) - nexus()->getStartTimestamp(), 3), + 'rid' => nexus()->getRequestId(), ]; } @@ -669,3 +664,8 @@ function get_hr_ratio($uped, $downed) return $ratio; } + +function nexus() +{ + return \Nexus\Nexus::instance(); +} diff --git a/nexus/Core/Constant.php b/nexus/Core/Constant.php new file mode 100644 index 00000000..06670aa0 --- /dev/null +++ b/nexus/Core/Constant.php @@ -0,0 +1,73 @@ +defineForOctane(); + } else { + $this->defineForFPM(); + } + $this->defineCommon(); + } + + private function defineForFPM() + { + defined('CURRENT_SCRIPT') || define('CURRENT_SCRIPT', strstr(basename($_SERVER['SCRIPT_FILENAME']), '.', true)); + defined('CURRENT_PLATFORM') || define('CURRENT_PLATFORM', $_SERVER['HTTP_PLATFORM'] ?? ''); + $requestId = ''; + if (!empty($_SERVER['HTTP_X_REQUEST_ID'])) { + $requestId = $_SERVER['HTTP_X_REQUEST_ID']; + } elseif (!empty($_SERVER['REQUEST_ID'])) { + $requestId = $_SERVER['REQUEST_ID']; + } + define('REQUEST_ID', $requestId ?: $this->generateRequestId()); + } + + private function defineForOctane() + { + $request = request(); + defined('CURRENT_SCRIPT') || define('CURRENT_SCRIPT', $request->header('script_filename', '')); + defined('CURRENT_PLATFORM') || define('CURRENT_PLATFORM', $request->header('platform', '')); + $requestId = $request->header('request_id', ''); + define('REQUEST_ID', $requestId ?: $this->generateRequestId()); + } + + private function generateRequestId() + { + $prefix = ($_SERVER['SCRIPT_FILENAME'] ?? '') . implode('', $_SERVER['argv'] ?? []); + $prefix = substr(md5($prefix), 0, 4); + // 4 + 23 = 27 characters, after replace '.', 26 + $requestId = str_replace('.', '', uniqid($prefix, true)); + $requestId .= bin2hex(random_bytes(3)); + return $requestId; + } + + private function defineCommon() + { + defined('VERSION_NUMBER') || define('VERSION_NUMBER', '1.6.0'); + defined('RELEASE_DATE') || define('RELEASE_DATE', '2022-03-14'); + defined('ROOT_PATH') || define('ROOT_PATH', dirname(dirname(__DIR__)) . '/'); + defined('IN_TRACKER') || define('IN_TRACKER', true); + defined('PROJECTNAME') || define("PROJECTNAME","NexusPHP"); + defined('NEXUSPHPURL') || define("NEXUSPHPURL","https://nexusphp.org"); + defined('NEXUSWIKIURL') || define("NEXUSWIKIURL","https://doc.nexusphp.org"); + defined('VERSION') || define("VERSION","Powered by ".PROJECTNAME.""); + defined('THISTRACKER') || define("THISTRACKER","General"); + + defined('PLATFORM_ADMIN') || define('PLATFORM_ADMIN', 'admin'); + defined('PLATFORM_USER') || define('PLATFORM_USER', 'user'); + defined('PLATFORMS') || define('PLATFORMS', [PLATFORM_ADMIN, PLATFORM_USER]); + defined('IS_PLATFORM_ADMIN') || define('IS_PLATFORM_ADMIN', CURRENT_PLATFORM == PLATFORM_ADMIN); + defined('IS_PLATFORM_USER') || define('IS_PLATFORM_USER', CURRENT_PLATFORM == PLATFORM_USER); + defined('IS_ANNOUNCE') || define('IS_ANNOUNCE', CURRENT_SCRIPT == 'announce'); + } + + + +} diff --git a/nexus/Nexus.php b/nexus/Nexus.php new file mode 100644 index 00000000..a23709b5 --- /dev/null +++ b/nexus/Nexus.php @@ -0,0 +1,176 @@ +requestId; + } + + public function getStartTimestamp(): float + { + return $this->startTimestamp; + } + + + public function getPlatform(): string + { + return $this->platform; + } + + public function getScript(): string + { + return $this->script; + } + + public function getLogSequence(): int + { + return $this->logSequence; + } + + public function isPlatformValid(): bool + { + return in_array($this->platform, self::PLATFORMS); + } + + public function isPlatformAdmin(): bool + { + return $this->platform == self::PLATFORM_ADMIN; + } + + public function isPlatformUser(): bool + { + return $this->platform == self::PLATFORM_USER; + } + + public function isScriptAnnounce(): bool + { + return $this->script == 'announce'; + } + + public function incrementLogSequence() + { + $this->logSequence++; + } + + private function runningInOctane(): bool + { + if (defined('RUNNING_IN_OCTANE') && RUNNING_IN_OCTANE) { + return true; + } + return false; + } + + private function generateRequestId(): string + { + $prefix = ($_SERVER['SCRIPT_FILENAME'] ?? '') . implode('', $_SERVER['argv'] ?? []); + $prefix = substr(md5($prefix), 0, 4); + // 4 + 23 = 27 characters, after replace '.', 26 + $requestId = str_replace('.', '', uniqid($prefix, true)); + $requestId .= bin2hex(random_bytes(3)); + return $requestId; + } + + public static function boot() + { + if (self::$booted) { + return; + } + $instance = new self(); + $instance->setStartTimestamp(); + $instance->setRequestId(); + $instance->setScript(); + $instance->setPlatform(); + self::$instance = $instance; + self::$booted = true; + } + + public static function flush() + { + self::$booted = false; + + } + + private function setRequestId() + { + $requestId = ''; + if ($this->runningInOctane()) { + $request = request(); + $requestId = $request->server('request_id', $request->header('request_id', '')); + } else { + if (!empty($_SERVER['HTTP_X_REQUEST_ID'])) { + $requestId = $_SERVER['HTTP_X_REQUEST_ID']; + } elseif (!empty($_SERVER['REQUEST_ID'])) { + $requestId = $_SERVER['REQUEST_ID']; + } + } + if (empty($requestId)) { + $requestId = $this->generateRequestId(); + } + $this->requestId = $requestId; + } + + private function setScript() + { + if ($this->runningInOctane()) { + $request = request(); + $script = $request->header('script_filename', ''); + } else { + $script = strstr(basename($_SERVER['SCRIPT_FILENAME']), '.', true); + } + $this->script = $script; + } + + private function setStartTimestamp() + { + $this->startTimestamp = microtime(true); + } + + private function setPlatform() + { + if ($this->runningInOctane()) { + $request = request(); + $platform = $request->header('platform', ''); + } else { + $platform = $_SERVER['HTTP_PLATFORM'] ?? ''; + } + $this->platform = $platform; + } + + +} diff --git a/public/torrents.php b/public/torrents.php index e9a61067..d0d2a0c4 100644 --- a/public/torrents.php +++ b/public/torrents.php @@ -14,7 +14,7 @@ $tagKeyById = $tagRep->createBasicQuery()->get()->keyBy('id'); $renderKeyArr = $tagKeyById->keys()->toArray(); //check searchbox -switch (CURRENT_SCRIPT) { +switch (nexus()->getScript()) { case 'torrents': $sectiontype = $browsecatmode; break;