const bcrypt = require('bcrypt'); const db = require('../config/database'); // Memvalidasi kredensial login petugas lapangan menggunakan pencarian SQLite const proses_autentikasi_petugas = (req, res) => { const { username, password } = req.body; // Praktik keamanan: Memblokir eksekusi lebih lanjut jika muatan data kosong untuk menghindari error sistem if (!username || !password) { return res.status(400).json({ error: 'Username dan kata sandi petugas wajib diisi.' }); } const kueri_petugas = `SELECT * FROM PETUGAS WHERE username = ?`; db.get(kueri_petugas, [username], async (error_sql, baris_petugas) => { if (error_sql) { console.error('Gagal query tabel PETUGAS:', error_sql.message); return res.status(500).json({ error: 'Terjadi kegagalan sistem internal server.' }); } // Praktik keamanan: Memberikan pesan error generik agar peretas tidak mengetahui apakah username tersebut ada di database atau tidak if (!baris_petugas) { return res.status(401).json({ error: 'Kredensial login tidak valid.' }); } try { /* Baris kompleks: Melakukan verifikasi asinkron untuk mencocokkan kata sandi teks murni dari klien dengan nilai hash terenkripsi di database menggunakan bcrypt.compare, yang secara inheren kebal terhadap serangan timing-attack. */ const validasi_password = await bcrypt.compare(password, baris_petugas.password); if (!validasi_password) { return res.status(401).json({ error: 'Kredensial login tidak valid.' }); } res.status(200).json({ message: 'Autentikasi petugas berhasil', token: `simulasi_jwt_token_untuk_petugas_${baris_petugas.username}` }); } catch (error_kripto) { console.error('Error komputasi hash:', error_kripto.message); res.status(500).json({ error: 'Gagal memproses verifikasi keamanan.' }); } }); }; // Memvalidasi kredensial login administrator utama menggunakan pencarian SQLite const proses_autentikasi_admin = (req, res) => { const { username, password } = req.body; // Praktik keamanan: Memblokir eksekusi lebih lanjut jika muatan data kosong if (!username || !password) { return res.status(400).json({ error: 'Username dan kata sandi admin wajib diisi.' }); } const kueri_admin = `SELECT * FROM ADMIN WHERE username = ?`; // Baris kompleks: Eksekusi pencarian data dengan parameterized query (?) memastikan nilai input diperlakukan murni sebagai string data, menutup celah eksploitasi SQL Injection secara absolut. db.get(kueri_admin, [username], async (error_sql, baris_admin) => { if (error_sql) { console.error('Gagal query tabel ADMIN:', error_sql.message); return res.status(500).json({ error: 'Terjadi kegagalan sistem internal server.' }); } if (!baris_admin) { return res.status(401).json({ error: 'Kredensial login admin tidak valid.' }); } try { const validasi_password = await bcrypt.compare(password, baris_admin.password); if (!validasi_password) { return res.status(401).json({ error: 'Kredensial login admin tidak valid.' }); } res.status(200).json({ message: 'Autentikasi admin berhasil', token: `simulasi_jwt_token_untuk_admin_${baris_admin.username}` }); } catch (error_kripto) { console.error('Error komputasi hash admin:', error_kripto.message); res.status(500).json({ error: 'Gagal memproses verifikasi keamanan admin.' }); } }); }; // Mengekspor semua fungsi agar dapat diakses oleh file router module.exports = { proses_autentikasi_petugas, proses_autentikasi_admin };