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 157ab9c..24f6fa5 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -100,4 +100,7 @@ use CodeIgniter\Router\RouteCollection; $routes->post('status_branch','BranchController::status_branch'); - \ No newline at end of file + $routes->get('sendSms','TestController::sendSms'); + $routes->get('preview', 'TestController::protectedPage', ['filter' => 'signedUrl']); + $routes->get('sendUrl', 'TestController::sendUrl'); + $routes->get('protectedPage', 'TestController::protectedPage'); \ No newline at end of file diff --git a/app/Controllers/TestController.php b/app/Controllers/TestController.php new file mode 100644 index 0000000..9b354a0 --- /dev/null +++ b/app/Controllers/TestController.php @@ -0,0 +1,172 @@ +ServiceModel = new ServiceModel(); + $this->TemplateModel = new TemplateModel(); + $this->StaffModel = new StaffModel(); + $this->ClientDocsModel = new ClientDocsModel(); + $this->ClientModel = new ClientModel(); + $this->BusinessModel = new BusinessModel(); + $this->BranchModel = new BranchModel(); + $this->ServiceGroupModel = new ServiceGroupModel(); + $this->ClientBranchModel = new ClientBranchModel(); + $this->DocsStatusModel = new DocsStatusModel(); + + + + + } + + public function sendSms() + { + $apiKey = 'HgvlULWCIrs'; // Your API key + $mobileNumbers = '919894638731'; // Recipient mobile numbers + $DLTTemplateID = '1105171896608602869'; // DLT Template ID + $senderId = 'LDRAJ'; // Sender ID + $message = 'Dear Gowtham, 986532 is OTP to approve Service group for service name purposes.'; + $serviceName = 'TEMPLATE_BASED'; // Service name + + // URL encode the message + $encodedMessage = urlencode($message); + + // Initialize cURL + $ch = curl_init(); + + // Set cURL options + curl_setopt($ch, CURLOPT_URL, "https://smsapi.24x7sms.com/api_2.0/SendSMS.aspx?APIKEY=$apiKey&MobileNo=$mobileNumbers&SenderID=$senderId&Message=$encodedMessage&ServiceName=$serviceName&DLTTemplateID=$DLTTemplateID"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + + // Execute cURL request and get the response + $output = curl_exec($ch); + + // Close cURL session + curl_close($ch); + + // Output the response (for testing purposes) + return $this->response->setJSON(['response' => $output]); + } + + public function sendUrl() + { + helper('url'); + $signedUrl = generate_signed_url('preview', ['doc_id'=>md5(7)], 60); + // Send the $signedUrl to your client (e.g., via email) + + return $this->response->setJSON(['url' => $signedUrl]); + } + + public function protectedPage(){ + $doc_id = $this->request->getVar('doc_id'); + $data['docData'] = $this->ClientDocsModel->docPreview($doc_id); + + $data['clientData'] = $this->ClientBranchModel->select('client.name , client.pan_no ,client_branch.gst_no , client_branch.mobile_no , client_branch.email , client_branch.address , client_branch.country , client_branch.state , client_branch.city , client_branch.pin_code ') + ->join('client', 'client_branch.client_id = client.client_id', 'left') + ->where('client_branch.id',$data['docData']->client_branch_id) + ->get()->getRow(); + + + + + $data['header_html'] = $data['docData']->header_html; + $data['footer_html'] = $data['docData']->footer_html; + $data['body_html'] = $data['docData']->body_html; + //replace client details in template content + foreach ($data['clientData'] as $key => $value) { + $placeHolder = '%'.$key.'%'; + $data['body_html'] = str_replace($placeHolder,$value,$data['body_html']); + } + + if($data['docData']->is_active == 1){ + $DateAndYears = $data['docData']->place_holder_object; + }else{ + $DateAndYears = $this->dateAndYearPlaceholder(); + } + //replace Date and Year values in template content + foreach (json_decode($DateAndYears,true) as $key => $value) { + $placeHolder = '%'.$key.'%'; + $data['body_html'] = str_replace($placeHolder,$value,$data['body_html']); + } + + + + + echo view('layout/doc_header'); + echo view('client_docs_preview',$data); + echo view('layout/footer'); + + } + + + public function dateAndYearPlaceholder() + { + $currentDate = date('d-m-Y'); + $currentYear = date('Y'); + $currentMonth = date('m'); + + + if ($currentMonth >= 4) { + $financialYearStart = $currentYear . '-04-01'; + $financialYearEnd = ($currentYear + 1) . '-03-31'; + $financialYear = $currentYear . '-' . ($currentYear + 1); + $assessmentYear = ($currentYear + 1) . '-' . ($currentYear + 2); + $q1 = '01-04-' . $currentYear . ' to ' . '30-06-' . $currentYear; + $q2 = '01-07-' . $currentYear . ' to ' . '30-09-' . $currentYear; + $q3 = '01-10-' . $currentYear . ' to ' . '31-12-' . $currentYear; + $q4 = '01-01-' . ($currentYear + 1) . ' to ' . '31-03-' . ($currentYear + 1); + + } else { + $financialYearStart = ($currentYear - 1) . '-04-01'; + $financialYearEnd = $currentYear . '-03-31'; + $financialYear = ($currentYear - 1) . '-' . $currentYear; + $assessmentYear = $currentYear . '-' . ($currentYear + 1); + $q1 = '01-04-' . ($currentYear - 1) . ' to ' . '30-06-' . ($currentYear - 1); + $q2 = '01-07-' . ($currentYear - 1) . ' to ' . '30-09-' . ($currentYear - 1); + $q3 = '01-10-' . ($currentYear - 1) . ' to ' . '31-12-' . ($currentYear - 1); + $q4 = '01-01-' . $currentYear . ' to ' . '31-03-' . $currentYear; + } + + $DateAndYears = [ + "CD" => $currentDate, + "CY" => $currentYear, + "FY" => $financialYear, + "AY" => $assessmentYear, + "Q1" => $q1, + "Q2" => $q2, + "Q3" => $q3, + "Q4" => $q4, + ]; + + return json_encode($DateAndYears); + + } +} 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/app/Views/layout/doc_header.php b/app/Views/layout/doc_header.php new file mode 100644 index 0000000..94cc2de --- /dev/null +++ b/app/Views/layout/doc_header.php @@ -0,0 +1,176 @@ + + + + + Approve Dox + + + + + + /assets/images/favicon.ico"> + + + /assets/css/bootstrap-creative.min.css" rel="stylesheet" type="text/css" id="bs-default-stylesheet" /> + /assets/css/app-creative.min.css" rel="stylesheet" type="text/css" id="app-default-stylesheet" /> + + /assets/css/bootstrap-creative-dark.min.css" rel="stylesheet" type="text/css" id="bs-dark-stylesheet" /> + /assets/css/app-creative-dark.min.css" rel="stylesheet" type="text/css" id="app-dark-stylesheet" /> + + + /assets/css/icons.min.css" rel="stylesheet" type="text/css" /> + + + /assets/libs/datatables.net-bs4/css/dataTables.bootstrap4.min.css" rel="stylesheet" type="text/css" /> + /assets/libs/datatables.net-responsive-bs4/css/responsive.bootstrap4.min.css" rel="stylesheet" type="text/css" /> + /assets/libs/datatables.net-buttons-bs4/css/buttons.bootstrap4.min.css" rel="stylesheet" type="text/css" /> + /assets/libs/datatables.net-select-bs4/css//select.bootstrap4.min.css" rel="stylesheet" type="text/css" /> + + + + /assets/libs/select2/css/select2.min.css" rel="stylesheet" type="text/css" /> + + + + + + + + /assets/libs/summernote/summernote-bs4.min.css" rel="stylesheet" type="text/css" /> + + + /assets/libs/admin-resources/jquery.vectormap/jquery-jvectormap-1.2.2.css" rel="stylesheet" type="text/css" /> + + + + + + + + + + +
+ + + + + + \ No newline at end of file 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