- Converted PoleDisplay from a function-based structure to a class-based structure for improved readability and maintainability. - Simplified the Open and Close methods to handle port state more clearly. - Enhanced the Send method to support both string and array inputs for sending data. - Updated the cd_Text method to use modern JavaScript features for padding calculations. - Modified the user_log method in Auth class to streamline database fetch and update logic.
142 lines
6.0 KiB
PHP
142 lines
6.0 KiB
PHP
<?php
|
|
|
|
/*******************************************************************
|
|
|
|
Module : /App/Auth.php
|
|
Created By : Siau Pheng ([email protected]).
|
|
Created Date : March 16th, 2008.
|
|
Last Modified : October 31st, 2026.
|
|
|
|
(c) 3FONIA Software; WWW.3FONIA.COM.
|
|
|
|
*******************************************************************/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Webapp\App;
|
|
|
|
use \flight\Engine;
|
|
use \flight\Session;
|
|
use \flight\database\SimplePdo;
|
|
|
|
/**
|
|
* Class Auth
|
|
*
|
|
* Kontrol dan Manajemen User Session.
|
|
*
|
|
* @license MIT, https://www.3fonia.com
|
|
* @copyright Copyright (c) 2008-2026, Siau Pheng <[email protected]>
|
|
*
|
|
* @package Webapp\App
|
|
*/
|
|
|
|
final class Auth {
|
|
private int $id_reg = 0;
|
|
protected Engine $app;
|
|
protected SimplePdo $db;
|
|
protected Session $session;
|
|
|
|
/**
|
|
* @param Engine $app
|
|
*/
|
|
public function __construct(Engine $app){
|
|
$this->app = $app;
|
|
$this->db = $app->db();
|
|
$this->session = $app->session();
|
|
$this->id_reg = (int) $this->session->get('WEB_APP', ['PARENT_CODE'=>0])['PARENT_CODE'];
|
|
}
|
|
|
|
public function user_check(string $user, string $pass): bool {
|
|
$i_hasil = (int) $this->db->fetchField('SELECT COUNT(*) FROM app_operator WHERE Username=? AND Password=MD5(?) AND Aktif=1', [$user, $pass]) ?? 0;
|
|
return ($i_hasil > 0 ? true : false);
|
|
}
|
|
|
|
public function user_data(string $user, bool $gen_module=true): array {
|
|
$adata = [ 'Grup_MenuID' => 0 ];
|
|
$xdata = $this->db->fetchRow('SELECT UserID,Grup_MenuID,Username,Nama,Posisi,Email,HP,Level,Last_IP,Last_Date FROM app_operator WHERE Username=?', [$user]);
|
|
if ($xdata) $adata = $xdata->getData();
|
|
|
|
if (empty($this->session->get('APP_TOKEN'))) {
|
|
$_token = $this->genToken(60);
|
|
$this->session->set('APP_TOKEN', $_token);
|
|
$this->db->insert('app_token', [ 'Token' => $_token, 'UserID' => $adata['UserID'], 'IP' => $this->app->request()->ip ]);
|
|
}
|
|
$adata['UNIX'] = time();
|
|
$adata['LOCALE'] = $this->session->get('WEB_APP', ['DEF_LOCALE'=>'id'])['DEF_LOCALE'];
|
|
$adata['MENU_MODUL'] = [];
|
|
if ($gen_module === true && !empty($this->session->get('WEB_APP')['APP_MODULE'])) {
|
|
$tallow = $this->db->fetchField('SELECT Modul_Akses FROM app_menu_grup WHERE Grup_MenuID=?', [$adata['Grup_MenuID']]) ?? '';
|
|
$aallow = explode(",", $tallow);
|
|
if (count($aallow) > 0) {
|
|
$stat = $this->db->runQuery('SELECT * FROM (SELECT APP_MODULE,APP_PATH FROM app_config) A LEFT JOIN (SELECT Modul,Urut,Judul,Icon FROM app_menu WHERE Level=0) B ON (A.APP_MODULE=B.Modul) ORDER BY B.Urut');
|
|
while ($row = $stat->fetch()) {
|
|
if (!in_array($row['Modul'], $aallow) || $row['Modul'] === $this->session->get('WEB_APP')['APP_MODULE']) continue;
|
|
$adata['MENU_MODUL'][] = $row;
|
|
}
|
|
}
|
|
}
|
|
return $adata;
|
|
}
|
|
|
|
public function user_check_level(string $user, int $level = 9): bool {
|
|
$i_hasil = (int) $this->db->fetchField('SELECT COUNT(*) FROM app_operator WHERE Username=? AND Level<=? AND Aktif=1', [$user, $level]);
|
|
return ($i_hasil > 0 ? true : false);
|
|
}
|
|
|
|
public function user_log(): void {
|
|
$_user_id = $this->session->get('WEB_USER')['UserID'] ?? 0;
|
|
if ($_user_id === 0) return;
|
|
$a_hasil = $this->db->fetchRow('SELECT * FROM app_logs WHERE UserID=? ORDER BY Last_Date DESC LIMIT 1', [$_user_id]);
|
|
if ($a_hasil) {
|
|
$this->db->update('app_operator', [ 'Last_IP' => $a_hasil['Last_IP'], 'Last_Date' => $a_hasil['Last_Date'] ], 'UserID=?', [$_user_id]);
|
|
}
|
|
$this->db->runQuery('INSERT IGNORE INTO app_logs SELECT UserID,Token,IP,DateStamp FROM app_token WHERE Token=?', [$this->session->get('APP_TOKEN')]);
|
|
}
|
|
|
|
public function logout(): void {
|
|
$this->db->delete('app_token', 'Token=?', [$this->session->get('APP_TOKEN')]);
|
|
}
|
|
|
|
public function token_check(string $token): bool {
|
|
$hasil = (bool) $this->db->fetchField('SELECT 1 FROM app_token WHERE Token=?', [$token ?? $this->session->get('APP_TOKEN')]);
|
|
if ($hasil === true) $this->db->runQuery('UPDATE app_token SET DateStamp=NOW() WHERE Token=?', [$token ?? $this->session->get('APP_TOKEN')]);
|
|
return $hasil;
|
|
}
|
|
|
|
public function token_update(): void {
|
|
$this->db->runQuery('UPDATE app_token SET DateStamp=NOW() WHERE Token=?', [$this->session->get('APP_TOKEN')]);
|
|
}
|
|
|
|
public function redirect(string $appUrl): string {
|
|
$source = parse_url($appUrl);
|
|
$desti = "";
|
|
$hasil = (bool)$this->db->fetchField('SELECT 1 FROM app_host WHERE Nama_Host=?', [$source['host']]);
|
|
if ($hasil) $desti = $source['scheme'].$source['host'].$source['path'].'?'.'auth='.$this->session->get('APP_TOKEN');
|
|
return $desti;
|
|
}
|
|
|
|
private function genToken(int $length = 16): string {
|
|
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
|
|
}
|
|
|
|
public function getUserByToken(string $token): string {
|
|
$hasil = $this->db->fetchField('SELECT Username FROM app_operator WHERE UserID IN (SELECT UserID FROM app_token WHERE Token=?) LIMIT 1', [$token ?? $this->session->get('APP_TOKEN')]) ?? '';
|
|
return $hasil;
|
|
}
|
|
|
|
public function pos_login(int $id_cab, int $id_user, int $unix, string $ip): void {
|
|
if (empty($id_cab) || empty($id_user) || empty($ip)) return;
|
|
$this->db->delete('disp_login', 'CabID=? AND UserID=?', [$id_cab, $id_user]);
|
|
$this->db->runQuery('INSERT INTO disp_login (IP, CabID, UserID, Unix, Date) VALUES (?, ?, ?, ?, NOW())', [ $ip, $id_cab, $id_user, $unix ?? 0 ]);
|
|
}
|
|
|
|
public function pos_logout(int $id_cab, int $id_user, int $unix, string $ip): void {
|
|
if (empty($id_cab) || empty($id_user) || empty($ip)) return;
|
|
$this->db->delete('disp_login', 'CabID=? AND UserID=? AND IP=? AND Unix=?', [$id_cab, $id_user, $ip, $unix ?? 0 ]);
|
|
}
|
|
|
|
}
|
|
|
|
?>
|