4 Commits

Author SHA1 Message Date
ismailmasseran b52f4b6919 Merge pull request 'DONE: add password on laravel log viewer' (#19) from feature/add-pass-logviewer into main
Build Docker Image / build-backend (push) Successful in 18s
Reviewed-on: #19
2026-09-28 16:27:55 +08:00
ISMAIL MASSERAN b8e3e2b369 DONE: add password on laravel log viewer 2026-09-28 16:26:50 +08:00
ismailmasseran 3a86ba5b26 Merge pull request 'DONE: add env based checking for whatsapp before testing at staging' (#18) from feature/env-based-whatsapp-cloud into main
Build Docker Image / build-backend (push) Successful in 18s
Reviewed-on: #18
2026-09-28 10:30:11 +08:00
ISMAIL MASSERAN b1934e1627 DONE: add env based checking for whatsapp before testing at staging 2026-09-28 10:26:06 +08:00
9 changed files with 74 additions and 15 deletions
+2
View File
@@ -98,6 +98,8 @@ TENNANT_KAUNTER_DB=kaunter_erahn
KAUNTER_URL=http://host.docker.internal:8081 KAUNTER_URL=http://host.docker.internal:8081
INTERNAL_NOTIFICATION_SECRET= INTERNAL_NOTIFICATION_SECRET=
LOGVIEWER_PASSWORD=
WHATSAPP_TOKEN= # Paste token from Graph API explorer. WHATSAPP_TOKEN= # Paste token from Graph API explorer.
WHATSAPP_PHONE_NUMBER_ID=1323449077519027 WHATSAPP_PHONE_NUMBER_ID=1323449077519027
WHATSAPP_API_VERSION=v25.0 WHATSAPP_API_VERSION=v25.0
+4 -2
View File
@@ -9,6 +9,7 @@ API_ARRAHNBID_ANNUR=https://adminbid-annur.erahn.com.my/api/
LOG_CHANNEL=stack LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL= LOG_SLACK_WEBHOOK_URL=
LOGVIEWER_PASSWORD="$2y$10$k7eiUyZdm3BruwAaT1gbmelTm.PPgZptOEQT1nlBjyiR84a4KBMlm"
DB_CONNECTION_2=mysql DB_CONNECTION_2=mysql
DB_HOST_2=192.168.1.216 DB_HOST_2=192.168.1.216
@@ -77,11 +78,12 @@ TENNANT_KAUNTER_DB=kaunter_erahn
KAUNTER_URL=https://ujrah.erahn.com.my KAUNTER_URL=https://ujrah.erahn.com.my
INTERNAL_NOTIFICATION_SECRET="nIDTe(u@6[)VLJyd" INTERNAL_NOTIFICATION_SECRET="nIDTe(u@6[)VLJyd"
WHATSAPP_CLOUD_ENABLED=true
WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD
WHATSAPP_PHONE_NUMBER_ID=1323449077519027 WHATSAPP_PHONE_NUMBER_ID=1375899418935337
WHATSAPP_API_VERSION=v25.0 WHATSAPP_API_VERSION=v25.0
WHATSAPP_TEMPLATE=hebahan_pembiayaan_online WHATSAPP_TEMPLATE=hebahan_pembiayaan_online
WHATSAPP_TEMPLATE_LANG=ms WHATSAPP_TEMPLATE_LANG=ms
WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a
WHATSAPP_APP_SECRET= WHATSAPP_APP_SECRET=
ADMIN_PHONE_NUMBER=6097414339 ADMIN_PHONE_NUMBER=
+9 -7
View File
@@ -13,6 +13,7 @@ MYSQL_PUBLISH_PORT=3308
LOG_CHANNEL=stack LOG_CHANNEL=stack
LOG_LEVEL=debug LOG_LEVEL=debug
LOG_SLACK_WEBHOOK_URL= LOG_SLACK_WEBHOOK_URL=
LOGVIEWER_PASSWORD=
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=mysql DB_HOST=mysql
@@ -88,11 +89,12 @@ TENNANT_KAUNTER_DB=kaunter_erahn
KAUNTER_URL=https://staging.erahn.com.my/login KAUNTER_URL=https://staging.erahn.com.my/login
INTERNAL_NOTIFICATION_SECRET=staging_noti_secret INTERNAL_NOTIFICATION_SECRET=staging_noti_secret
WHATSAPP_TOKEN= # Paste token from Graph API explorer. WHATSAPP_CLOUD_ENABLED=false
WHATSAPP_PHONE_NUMBER_ID=1323449077519027 WHATSAPP_TOKEN=EAAZAonT56AO0BSnZAhWLi4UXDRT6iAldbiybxSQZAnGrzIke1QiNWvQkZAbQQTjWeVZC5bL1gEBhW6ff3Shf79nowXiTQEwyxqgZAZB6ZATwFCeTs8MZA5H6ZA76IJBuVqRiAZBvZCfkeSurbUNpEWyi9W7zsT2GWiZCLX8meX0KCfDHu7cp4aBgVu1Ps5ZCRO3bP4ZCQZDZD
WHATSAPP_PHONE_NUMBER_ID=1375899418935337
WHATSAPP_API_VERSION=v25.0 WHATSAPP_API_VERSION=v25.0
WHATSAPP_TEMPLATE=hello_world WHATSAPP_TEMPLATE=hebahan_pembiayaan_online
WHATSAPP_TEMPLATE_LANG=en_US WHATSAPP_TEMPLATE_LANG=ms
WHATSAPP_VERIFY_TOKEN= # webhook verify token WHATSAPP_VERIFY_TOKEN=418ed86d49422071681c76bed25ae1cb7e90456c794a92f1c9ea417945a35a0a
WHATSAPP_APP_SECRET= # X-Hub-Signature-256 checks; need to be enable first WHATSAPP_APP_SECRET=
ADMIN_PHONE_NUMBER=60193450165 ADMIN_PHONE_NUMBER=
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Middleware;
use Closure;
class LogViewerPassword
{
public function handle($request, Closure $next)
{
$passwordHash = config('logviewer.password');
if (!is_string($passwordHash) || $passwordHash === '') {
return response('Akses log belum dikonfigurasi.', 503)
->header('Cache-Control', 'no-store');
}
$provided = $request->getPassword();
if ($request->getUser() !== 'logviewer' || !is_string($provided) ||
!password_verify($provided, $passwordHash)) {
return response('Kata laluan diperlukan untuk mengakses log.', 401, [
'WWW-Authenticate' => 'Basic realm="Log Viewer", charset="UTF-8"',
'Cache-Control' => 'no-store',
]);
}
$response = $next($request);
$response->headers->set('Cache-Control', 'no-store');
return $response;
}
}
+2 -2
View File
@@ -54,10 +54,10 @@ class WhatsappPembiayaanOnlinePaid extends Job
$storedPhone = $customer ? ($customer->telefon ?: $customer->telefon2) : null; $storedPhone = $customer ? ($customer->telefon ?: $customer->telefon2) : null;
$to = $client->normalizeMsisdn($storedPhone); $to = $client->normalizeMsisdn($storedPhone);
if (env('APP_ENV') !== 'production') { if (!config('whatsapp.whatsapp_cloud_enabled')) {
$admin = $client->normalizeMsisdn(env('ADMIN_PHONE_NUMBER')); $admin = $client->normalizeMsisdn(env('ADMIN_PHONE_NUMBER'));
if (!$admin) { if (!$admin) {
Log::warning('WhatsApp Cloud skipped: ADMIN_PHONE_NUMBER required when not production', [ Log::warning('WhatsApp Cloud skipped: ADMIN_PHONE_NUMBER required when WHATSAPP_ENABLED is false', [
'norujukan' => $this->norujukan, 'norujukan' => $this->norujukan,
]); ]);
$this->logBlast($now, $storedPhone, 'skipped: ADMIN_PHONE_NUMBER empty'); $this->logBlast($now, $storedPhone, 'skipped: ADMIN_PHONE_NUMBER empty');
+4 -3
View File
@@ -88,6 +88,7 @@ $app->singleton(
$app->configure('app'); $app->configure('app');
$app->configure('logging'); $app->configure('logging');
$app->configure('logviewer');
$app->configure('tinker'); $app->configure('tinker');
$app->configure('tennant_database'); $app->configure('tennant_database');
$app->configure('report'); $app->configure('report');
@@ -110,9 +111,9 @@ $app->configure('kaunter');
// App\Http\Middleware\ExampleMiddleware::class // App\Http\Middleware\ExampleMiddleware::class
// ]); // ]);
// $app->routeMiddleware([ $app->routeMiddleware([
// 'auth' => App\Http\Middleware\Authenticate::class, 'logviewer.password' => App\Http\Middleware\LogViewerPassword::class,
// ]); ]);
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
+16
View File
@@ -0,0 +1,16 @@
<?php
return [
'password' => env('LOGVIEWER_PASSWORD'),
/*
|--------------------------------------------------------------------------
| Pattern and storage path settings
|--------------------------------------------------------------------------
|
| The env key for pattern and storage path with a default value
|
*/
'max_file_size' => 52428800, // size in Byte
'pattern' => env('LOGVIEWER_PATTERN', '*.log'),
'storage_path' => env('LOGVIEWER_STORAGE_PATH', storage_path('logs')),
];
+1
View File
@@ -1,6 +1,7 @@
<?php <?php
return [ return [
'whatsapp_cloud_enabled' => env('WHATSAPP_CLOUD_ENABLED', true),
'token' => env('WHATSAPP_TOKEN'), 'token' => env('WHATSAPP_TOKEN'),
'phone_number_id' => env('WHATSAPP_PHONE_NUMBER_ID'), 'phone_number_id' => env('WHATSAPP_PHONE_NUMBER_ID'),
'api_version' => env('WHATSAPP_API_VERSION', 'v25.0'), 'api_version' => env('WHATSAPP_API_VERSION', 'v25.0'),
+4 -1
View File
@@ -25,7 +25,10 @@ $router->get('/health', function () {
return response()->json(['status' => 'ok']); return response()->json(['status' => 'ok']);
}); });
$router->group(['namespace' => '\Rap2hpoutre\LaravelLogViewer'], function() use ($router) { $router->group([
'namespace' => '\Rap2hpoutre\LaravelLogViewer',
'middleware' => 'logviewer.password',
], function () use ($router) {
$router->get('logs', 'LogViewerController@index'); $router->get('logs', 'LogViewerController@index');
}); });