* * @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 ]); } } ?>