- Dịch vụ custom: bảng custom_products + services.custom_product_id; createService nhận
custom{} thay product_id, giá = đơn giá tháng x số tháng chu kỳ (1/3/6/12/24/36),
gia hạn tính theo cùng đơn giá, ServiceClientDetailResource trả custom_product và specs.
- Giám sát VM: GET v1/system/vm-metrics/history gom lịch sử về tối đa 240 điểm;
lỗi lấy dung lượng đĩa không còn làm hỏng cả thẻ metrics.
- SealResponse: AES-256-GCM theo khoá phiên do proxy Next cấp qua header x-seal-key
(HMAC của session id). Client opt-in bằng x-seal; chi tiết dịch vụ, mật khẩu VM và
console ticket luôn được mã hoá. Body gửi lên dạng {enc} được giải mã trước validate;
khoá lệch trả 428 để client lấy khoá mới. Đây là che mắt DevTools, không phải bảo mật
chống chính chủ tài khoản.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
96 lines
4.1 KiB
PHP
96 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http;
|
|
|
|
use Illuminate\Foundation\Http\Kernel as HttpKernel;
|
|
|
|
class Kernel extends HttpKernel
|
|
{
|
|
/**
|
|
* The application's global HTTP middleware stack.
|
|
*
|
|
* These middleware are run during every request to your application.
|
|
*
|
|
* @var array<int, class-string|string>
|
|
*/
|
|
protected $middleware = [
|
|
\App\Http\Middleware\TrustProxies::class,
|
|
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
|
|
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
|
|
\App\Http\Middleware\SealResponse::class,
|
|
\App\Http\Middleware\TrimStrings::class,
|
|
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
|
\Illuminate\Http\Middleware\HandleCors::class
|
|
];
|
|
|
|
/**
|
|
* Mặc định của Laravel + ClientAccessTokenCheck đứng trước ThrottleRequests: nó gán IP thật
|
|
* của khách (từ payload x-access-token) nên throttle phải chạy sau.
|
|
*
|
|
* @var array<int, class-string|string>
|
|
*/
|
|
protected $middlewarePriority = [
|
|
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
|
|
\Illuminate\Cookie\Middleware\EncryptCookies::class,
|
|
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
|
\Illuminate\Session\Middleware\StartSession::class,
|
|
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
|
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
|
|
\App\Http\Middleware\ClientAccessTokenCheck::class,
|
|
\Illuminate\Routing\Middleware\ThrottleRequests::class,
|
|
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
|
|
\Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
|
|
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
|
\Illuminate\Auth\Middleware\Authorize::class,
|
|
];
|
|
|
|
/**
|
|
* The application's route middleware groups.
|
|
*
|
|
* @var array<string, array<int, class-string|string>>
|
|
*/
|
|
protected $middlewareGroups = [
|
|
'web' => [
|
|
\App\Http\Middleware\EncryptCookies::class,
|
|
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
|
\Illuminate\Session\Middleware\StartSession::class,
|
|
// \Illuminate\Session\Middleware\AuthenticateSession::class,
|
|
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
|
\App\Http\Middleware\VerifyCsrfToken::class,
|
|
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
|
],
|
|
|
|
'api' => [
|
|
'throttle:api',
|
|
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
|
],
|
|
];
|
|
|
|
/**
|
|
* The application's route middleware.
|
|
*
|
|
* These middleware may be assigned to groups or used individually.
|
|
*
|
|
* @var array<string, class-string|string>
|
|
*/
|
|
protected $routeMiddleware = [
|
|
'auth' => \App\Http\Middleware\Authenticate::class,
|
|
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
|
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
|
|
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
|
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
|
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
|
|
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
|
|
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
|
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
|
|
'json.response' => \App\Http\Middleware\ForceJsonResponse::class,
|
|
'api.auth' => \App\Http\Middleware\ApiAuthCheck::class,
|
|
'client.access-token' => \App\Http\Middleware\ClientAccessTokenCheck::class,
|
|
'perm' => \App\Http\Middleware\CheckPermission::class,
|
|
'restrict.local' => \App\Http\Middleware\RestrictToLocalEnvironment::class,
|
|
'portal-monitor.service' => \App\Http\Middleware\AuthenticatePortalMonitor::class,
|
|
'seal.response' => \App\Http\Middleware\SealResponse::class,
|
|
'turnstile' => \App\Http\Middleware\VerifyTurnstile::class,
|
|
];
|
|
}
|