GeoNetAgent, LDAPWeb, server-audit, server-connection
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

120 lines
3.5 KiB

<?php
namespace App\Services;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
/**
* AgentTokenSyncService
*
* Sinkronisasi token ke geonetagent.agent_tokens agar geonet-console
* menjadi single point of control untuk microservice Bearer tokens.
*
* geonetagent DB connection: config/database.php -> 'geonetagent'
* Env vars: GEONETAGENT_DB_HOST, GEONETAGENT_DB_DATABASE, GEONETAGENT_DB_USERNAME, GEONETAGENT_DB_PASSWORD
*
* Jika koneksi tidak tersedia (env kosong), sync di-skip dengan warning log
* sehingga geonet-console tetap berjalan normal.
*/
class AgentTokenSyncService
{
private bool $enabled;
public function __construct()
{
$this->enabled = !empty(env('GEONETAGENT_DB_USERNAME'));
}
/**
* Tambah token ke geonetagent.agent_tokens
*
* @param string $name Token name (e.g. "GeoNetAgent-Production")
* @param string $tokenHash SHA256 hash dari plain token
* @return bool true jika berhasil, false jika skip/gagal
*/
public function addToken(string $name, string $tokenHash): bool
{
if (!$this->enabled) {
Log::warning('AgentTokenSyncService: GEONETAGENT_DB_USERNAME tidak di-set, sync di-skip.');
return false;
}
try {
DB::connection('geonetagent')->table('agent_tokens')->insert([
'id' => (string) \Illuminate\Support\Str::uuid(),
'name' => $name,
'token_hash' => $tokenHash,
'is_active' => true,
'created_at' => now(),
'last_used_at' => null,
]);
return true;
} catch (\Throwable $e) {
Log::error('AgentTokenSyncService: gagal insert ke agent_tokens', [
'error' => $e->getMessage(),
'name' => $name,
]);
return false;
}
}
/**
* Revoke token di geonetagent.agent_tokens berdasarkan hash
*
* @param string $tokenHash SHA256 hash dari plain token
* @return bool
*/
public function revokeToken(string $tokenHash): bool
{
if (!$this->enabled) {
Log::warning('AgentTokenSyncService: GEONETAGENT_DB_USERNAME tidak di-set, revoke sync di-skip.');
return false;
}
try {
DB::connection('geonetagent')->table('agent_tokens')
->where('token_hash', $tokenHash)
->update(['is_active' => false]);
return true;
} catch (\Throwable $e) {
Log::error('AgentTokenSyncService: gagal revoke di agent_tokens', [
'error' => $e->getMessage(),
]);
return false;
}
}
/**
* Hapus token dari geonetagent.agent_tokens berdasarkan hash
*
* @param string $tokenHash
* @return bool
*/
public function deleteToken(string $tokenHash): bool
{
if (!$this->enabled) {
return false;
}
try {
DB::connection('geonetagent')->table('agent_tokens')
->where('token_hash', $tokenHash)
->delete();
return true;
} catch (\Throwable $e) {
Log::error('AgentTokenSyncService: gagal delete di agent_tokens', [
'error' => $e->getMessage(),
]);
return false;
}
}
/**
* Cek apakah sinkronisasi aktif (env terkonfigurasi)
*/
public function isEnabled(): bool
{
return $this->enabled;
}
}