diff --git a/app/Config/Filters.php b/app/Config/Filters.php index 9f28a05..0042bda 100755 --- a/app/Config/Filters.php +++ b/app/Config/Filters.php @@ -19,6 +19,7 @@ use App\Filters\Cors; use App\Filters\GlobalPostFileUploadGuard; use App\Filters\SecurityInputFilter; use App\Filters\AclFilter; +use App\Filters\RateLimitFilter; @@ -47,6 +48,7 @@ class Filters extends BaseConfig 'GlobalPostFileUploadGuard' => GlobalPostFileUploadGuard::class, 'SecurityInputFilter' => SecurityInputFilter::class, 'AclFilter' => AclFilter::class, + 'ratelimit' => RateLimitFilter::class, ]; diff --git a/app/Config/Routes.php b/app/Config/Routes.php index f61965e..a0eb3e0 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -442,7 +442,7 @@ $routes->cli('cli/check_env', 'MasterController::checkEnv'); -$routes->group("/api", ["filter" => "authJWT"], function ($routes) { +$routes->group("/api", ["filter" => [ 'ratelimit' , 'authJWT' ] ], function ($routes) { $routes->post("logined", "RestAuthenticationController::logined"); $routes->post("getId", "RestAuthenticationController::getUserIdFromToken"); }); @@ -454,7 +454,7 @@ $routes->group("/api", ["filter" => "authJWT"], function ($routes) { // $routes->post("employeeRest/createOrUpdateEmployeePolicySiAmount", "EmployeeRestController::createOrUpdateEmployeePolicySiAmount"); // $routes->post("employeeRest/calculatePremium", "EmployeeRestController::calculatePremium"); // $routes->post("updateMpin", "RestAuthenticationController::updateMpin"); -$routes->group("employeeRest", ['filter' => ['GlobalPostFileUploadGuard', 'appSignature' , 'authJWT'] ], function ($routes) { +$routes->group("employeeRest", ['filter' => [ 'GlobalPostFileUploadGuard', 'ratelimit' , 'appSignature' , 'authJWT' ] ], function ($routes) { $routes->post('logout', 'RestAuthenticationController::logout'); @@ -507,7 +507,7 @@ $routes->group("employeeRest", ['filter' => ['GlobalPostFileUploadGuard', 'appSi }); -$routes->group("employeeRest", ['filter' => ['appSignature'] ], function ($routes) { +$routes->group("employeeRest", ['filter' => ['ratelimit' , 'appSignature'] ], function ($routes) { //Employee login api's $routes->post("verifyEmployeeNumber", "RestAuthenticationController::verifyEmployeeWithMobileNumber"); @@ -540,7 +540,7 @@ $routes->group("employeeRest", ['filter' => ['appSignature'] ], function ($route }); -$routes->post("getPreEmployeePolicyCount","EmployeeRestController::getPreEmployeePolicyCount", ['filter' => ['appSignature']]); +$routes->post("getPreEmployeePolicyCount","EmployeeRestController::getPreEmployeePolicyCount", ['filter' => ['ratelimit','appSignature']]); $routes->get("getEmployeeActiveOrInactivePolicy", "EmployeeRestController::getEmployeeActiveOrInactivePolicy"); $routes->get("sendPushNotification", "EmployeeRestController::sendPushNotification"); diff --git a/app/Controllers/EmployeeController.php b/app/Controllers/EmployeeController.php index 17bd959..0f40f94 100755 --- a/app/Controllers/EmployeeController.php +++ b/app/Controllers/EmployeeController.php @@ -180,9 +180,13 @@ class EmployeeController extends AdminController //handles employee & dependent bulk upload with events like inception,addition,deletion, correction and SI enhancements public function employeesUplodWithEvents($post_data = []) - { + { if(empty($post_data)){ $post_data = $this->request->getPost(); + $post_data = array_merge($post_data, $this->request->getFiles()); + $is_post_request = true; + }else{ + $is_post_request = false; } // $empDataServiceController = new EmpDataServiceController(); @@ -339,7 +343,7 @@ class EmployeeController extends AdminController $avatar = isset($post_data['emplist']) ? $post_data['emplist'] : $this->request->getFile('emplist'); if (!$avatar) { $this->myLogger->logme("error", 'File not found'); - if (!empty($post_data)) { + if (!$is_post_request) { return ['status' => false, 'message' => 'File not found']; } else { return $this->respond(['dataStatus' => false, 'code' => 400, 'message' => 'File not found'], 400); @@ -355,7 +359,7 @@ class EmployeeController extends AdminController $this->myLogger->logme("error", 'File move successful'); } else { $this->myLogger->logme("error", 'File move failed'); - if (!empty($post_data)) { + if (!$is_post_request) { return ['status' => false, 'message' => 'File move failed']; } else { return $this->respond(['dataStatus' => false, 'code' => 500, 'message' => 'File move failed'], 500); @@ -363,7 +367,7 @@ class EmployeeController extends AdminController } } else { $this->myLogger->logme("error", 'Upload failed Invalid file'); - if (!empty($post_data)) { + if (!$is_post_request) { return ['status' => false, 'message' => 'Invalid file']; } else { return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'Invalid file'], 404); @@ -385,7 +389,7 @@ class EmployeeController extends AdminController $client_id = $post_data['client_id'] ?? null; $policy_id = $post_data['policy_id'] ?? null; $branch_id = $post_data['client_branch_id'] ?? null; - $action = $post_data['file_action'] ?? null; + $action = "enrollment"; $enrollment_open_date = $post_data['enrollment_open_date'] ?? null; $enrollment_close_date = $post_data['enrollment_close_date'] ?? null; $status = 'inprogress'; @@ -405,7 +409,7 @@ class EmployeeController extends AdminController $this->myLogger->logme("error", '{file_id} is less than 1MB, validating on the fly', ['file_id' => $file_id]); //endof validation process if (isset($result['error_summary']) && count($result['error_summary'])) { - if(!empty($post_data)){ + if(!$is_post_request){ return ['status' => false, 'message' => 'file rejected with errors', 'file_id' => $file_id]; }else{ return $this->respond(['dataStatus' => false, 'code' => 404, 'message' => 'file rejected with errors'], 200); @@ -418,7 +422,7 @@ class EmployeeController extends AdminController $this->myLogger->logme("error", '{file_id} is greather than 1MB, validating with job queue', ['file_id' => $file_id]); } - if (!empty($post_data)) { + if (!$is_post_request) { return ['status' => true, 'message' => 'File upload successs, Data validation is in-progress', 'file_id' => $file_id]; } else { return $this->respond(['dataStatus' => true, 'code' => 200, 'data' => 'file upload success'], 200); @@ -507,7 +511,7 @@ class EmployeeController extends AdminController // dd($data['fileList']);die(); - if ($_SERVER('REQUEST_METHOD') == "GET") { + if ($_SERVER['REQUEST_METHOD'] == "GET") { $this->loadLayout('import_export', $data); } } diff --git a/app/Controllers/EmployeeRestController.php b/app/Controllers/EmployeeRestController.php index aa7cd9e..ad822a1 100755 --- a/app/Controllers/EmployeeRestController.php +++ b/app/Controllers/EmployeeRestController.php @@ -4245,13 +4245,13 @@ class EmployeeRestController extends AdminController $file_id = $this->request->getGet('id') ?? $id; // Find record - $record = $this->hrFileUploadModel->find($file_id); + $record = $this->fileModel->where('id', $file_id)->first(); if (!$record) { return $this->failNotFound("File record not found"); } - $uploadPath = WRITEPATH . 'uploads/hr_files/'; + $uploadPath = WRITEPATH . 'uploads/excel/'; $filePath = $uploadPath . $record['file_name']; if (!file_exists($filePath)) { @@ -4259,8 +4259,8 @@ class EmployeeRestController extends AdminController } // Force file download - return $this->response->download($filePath, null) - ->setFileName($record['file_name']); + return $this->response->download($filePath, null)->setFileName($record['file_name']); + } catch (\Exception $e) { return $this->failServerError($e->getMessage()); } diff --git a/app/Filters/Cors.php b/app/Filters/Cors.php index bb8d5b8..c9ea212 100644 --- a/app/Filters/Cors.php +++ b/app/Filters/Cors.php @@ -38,7 +38,7 @@ class Cors implements FilterInterface * * @var string */ - protected string $allowedMethods = 'GET,POST,PUT,PATCH,DELETE,OPTIONS'; + protected string $allowedMethods = 'GET,POST,OPTIONS'; /** * HTTP headers allowed in CORS requests diff --git a/app/Filters/RateLimitFilter.php b/app/Filters/RateLimitFilter.php new file mode 100644 index 0000000..31efe81 --- /dev/null +++ b/app/Filters/RateLimitFilter.php @@ -0,0 +1,34 @@ +getIPAddress()); + + if ($throttler->check($key, 25, MINUTE) === false) { + return service('response') + ->setStatusCode(429) + ->setJSON([ + 'status' => 'error', + 'message' => 'Too many requests. Try again later.' + ]); + } + } + + + public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) + { + // nothing + } +} diff --git a/app/Helpers/JWTToken.php b/app/Helpers/JWTToken.php index d110444..f7b32ba 100755 --- a/app/Helpers/JWTToken.php +++ b/app/Helpers/JWTToken.php @@ -31,16 +31,16 @@ class JWTToken try{ $token = JWT::encode($request_data ,$secret_Key,'HS512'); $id = $request_data['id']; - $data["token_time_out"] = time() + getenv('TOKENTIMEOUT'); + $update["token_time_out"] = time() + getenv('TOKENTIMEOUT'); if(isset($data['emp_code'])){ $model = new EmployeeModel(); - $model->update($id, $data); + $model->update($id, $update); }else{ $models = new LevelContactModel(); $id = $request_data['pre_hr_id']; - $models->update($id, $data); + $models->update($id, $update); } diff --git a/app/Views/layout/header.php b/app/Views/layout/header.php index 586695f..7bd6b71 100755 --- a/app/Views/layout/header.php +++ b/app/Views/layout/header.php @@ -51,7 +51,7 @@ - + @@ -59,7 +59,7 @@ - +