From d2c7bce03364dac334fd714c1a6d172f68e9bb30 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Wed, 4 Feb 2026 14:03:37 +0700 Subject: [PATCH] feat: force schema --- app/Providers/AppServiceProvider.php | 43 ++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..bd25ee9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -11,7 +13,42 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + URL::macro( + 'alternateHasCorrectSignature', + function (Request $request, $absolute = true, array $ignoreQuery = []) { + $ignoreQuery[] = 'signature'; + + $absoluteUrl = url($request->path()); + $url = $absolute ? $absoluteUrl : '/'.$request->path(); + + $queryString = collect(explode('&', (string) $request + ->server->get('QUERY_STRING'))) + ->reject(fn ($parameter) => in_array(str()->before($parameter, '='), $ignoreQuery)) + ->join('&'); + + $original = rtrim($url.'?'.$queryString, '?'); + + // Use the application key as the HMAC key + $key = config('app.key'); // Ensure app.key is properly set in .env + + if (empty($key)) { + throw new \RuntimeException('Application key is not set.'); + } + + $signature = hash_hmac('sha256', $original, $key); + + return hash_equals($signature, (string) $request->query('signature', '')); + } + ); + + URL::macro('alternateHasValidSignature', function (Request $request, $absolute = true, array $ignoreQuery = []) { + return URL::alternateHasCorrectSignature($request, $absolute, $ignoreQuery) + && URL::signatureHasNotExpired($request); + }); + + Request::macro('hasValidSignature', function ($absolute = true, array $ignoreQuery = []) { + return URL::alternateHasValidSignature($this, $absolute, $ignoreQuery); + }); } /** @@ -19,6 +56,8 @@ public function register(): void */ public function boot(): void { - // + if (! app()->environment('local')) { + URL::forceScheme('https'); + } } }