diff --git a/app/Config/Filters.php b/app/Config/Filters.php index eb46a1d..b641d98 100644 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -12,7 +12,7 @@ use CodeIgniter\Filters\InvalidChars; use CodeIgniter\Filters\PageCache; use CodeIgniter\Filters\PerformanceMetrics; use CodeIgniter\Filters\SecureHeaders; - +use App\Filters\SignedUrlFilter; class Filters extends BaseFilters { /** @@ -34,6 +34,7 @@ class Filters extends BaseFilters 'forcehttps' => ForceHTTPS::class, 'pagecache' => PageCache::class, 'performance' => PerformanceMetrics::class, + 'signedUrl' => SignedUrlFilter::class, ]; /** diff --git a/app/Config/Logger.php b/app/Config/Logger.php index ab6997e..1c7fb90 100644 --- a/app/Config/Logger.php +++ b/app/Config/Logger.php @@ -38,7 +38,7 @@ class Logger extends BaseConfig * * @var int|list */ - public $threshold = (ENVIRONMENT === 'production') ? 4 : 9; + public $threshold = 4; /** * -------------------------------------------------------------------------- diff --git a/app/Config/Routes.php b/app/Config/Routes.php index b61b6a8..27402f5 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -98,4 +98,6 @@ use CodeIgniter\Router\RouteCollection; $routes->post('status_branch','BranchController::status_branch'); - \ No newline at end of file + $routes->get('sendSms','TestController::sendSms'); + $routes->get('protected-page', 'TestController::protectedPage', ['filter' => 'signedUrl']); + $routes->get('sendUrl', 'TestController::sendUrl'); \ No newline at end of file diff --git a/app/Controllers/TestController.php b/app/Controllers/TestController.php new file mode 100644 index 0000000..b2ee8e6 --- /dev/null +++ b/app/Controllers/TestController.php @@ -0,0 +1,49 @@ +response->setJSON(['response' => $output]); + } + + public function sendUrl() + { + helper('url'); + $signedUrl = generate_signed_url('protected-page', [], 36000); + // Send the $signedUrl to your client (e.g., via email) + + return $this->response->setJSON(['url' => $signedUrl]); + } + public function protectedPage(){ + echo "This is protectedPage"; + } +} diff --git a/app/Filters/SignedUrlFilter.php b/app/Filters/SignedUrlFilter.php new file mode 100644 index 0000000..00492c6 --- /dev/null +++ b/app/Filters/SignedUrlFilter.php @@ -0,0 +1,44 @@ +getGet('expires'); + $signature = $request->getGet('signature'); + + if (!$expires || !$signature) { + return Services::response()->setStatusCode(403)->setBody('Forbidden'); + } + + if (time() > $expires) { + $body = view('expired_link'); + return Services::response()->setStatusCode(403)->setBody($body); + } + + $queryParams = $request->getGet(); + unset($queryParams['signature']); + $route = $request->getPath(); + $expectedSignature = hash_hmac('sha256', $route . '?' . http_build_query($queryParams), $secretKey); + + if (!hash_equals($expectedSignature, $signature)) { + return Services::response()->setStatusCode(403)->setBody('Invalid signature'); + } + + return true; // Allow the request + } + + public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) + { + // Do nothing here + } +} + + diff --git a/app/Helpers/url_helper.php b/app/Helpers/url_helper.php new file mode 100644 index 0000000..064e82b --- /dev/null +++ b/app/Helpers/url_helper.php @@ -0,0 +1,15 @@ + + + + + + Link Expired + + + +
+ Link Expired +

Link expired

+
+ + diff --git a/public/assets/images/404.gif b/public/assets/images/404.gif new file mode 100644 index 0000000..f23f59d Binary files /dev/null and b/public/assets/images/404.gif differ