* * @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', ['REG_ID'=>0])['REG_ID']; } public function set_id_reg(int|string $id = 0): void { if ((int) $id > 0) $this->id_reg = (int) $id; } 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]); return ($i_hasil > 0 ? true : false); } public function user_data(string $user): array { $adata = [ 'Grup_MenuID' => 0 ]; $xdata = $this->db->fetchRow('SELECT *,DECODE(Menu,?) Menu2 FROM app_operator WHERE Username=?', [$this->id_reg, $user]); if ($xdata) { $adata = $xdata->getData(); $adata['Menu'] = $adata['Menu2']; unset($adata['Menu2'], $adata['Password']); } 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 ]); } if ((int) $adata['Grup_MenuID'] > 0) $adata['Menu_Grup'] = $this->user_allmenu((int) $adata['Grup_MenuID']); $adata['UNIX'] = time(); $adata['LOCALE'] = $this->session->get('WEB_APP', ['DEF_LOCALE'=>'id'])['DEF_LOCALE']; $adata['MENU_MODUL'] = []; return $adata; } public function gen_module_menu(): void { $amodul = []; $aallow = []; $tallow = ''; if ($this->session->get('WEB_APP', ['APP_MODULE'=>0])['APP_MODULE']) { $tallow = $this->db->fetchField('SELECT Modul_Akses FROM app_menu_grup WHERE Grup_MenuID=?', [$this->session->get('WEB_USER', ['Grup_MenuID'=>0])['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; $amodul[] = $row; } } } $auser = $this->session->get('WEB_USER', []); $auser['MENU_MODUL'] = $amodul; $this->session->set('WEB_USER', $auser); } public function user_allmenu(int $id_grup = 0): string { $allmenu = $this->db->fetchField('SELECT DECODE(Menu,?) MenuX FROM app_menu_grup WHERE Grup_MenuID=?', [$this->id_reg, $id_grup]); return $allmenu; } 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])->getData(); if (count($a_hasil) > 0) { $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; } } ?>