load->library('form_validation'); $this->load->library('phpmailer_lib'); // Load library PHPMailer } public function index() { $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email', [ 'required' => 'Email harus diisi!', 'valid_email' => 'Email tidak valid!' ]); $this->form_validation->set_rules('password', 'Password', 'trim|required', [ 'required' => 'Kata sandi harus diisi!' ]); if ($this->form_validation->run() == FALSE) { $data['title'] = 'Halaman Login'; $this->load->view('templates/auth_header', $data); $this->load->view('auth/login'); $this->load->view('templates/auth_footer'); } else { // Validasi sukses $this->_login(); } } private function _login() { $email = $this->input->post('email'); $password = $this->input->post('password'); $admin = $this->db->get_where('admin', ['email' => $email])->row_array(); // Jika usernya ada if ($admin) { // Jika usernya aktif if ($admin['is_active'] == 1) { // Cek password if (password_verify($password, $admin['password'])) { $data = [ 'email' => $admin['email'] ]; $this->session->set_userdata($data); redirect('dashboard'); // langsung ke dashboard tanpa cek role_id } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } public function registration() { $this->form_validation->set_rules('name', 'Name', 'required|trim', [ 'required' => 'Nama wajib diisi!' ]); $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email|is_unique[admin.email]', [ 'required' => 'Email wajib diisi!', 'is_unique' => 'Email ini sudah terdaftar!', ]); $this->form_validation->set_rules('password1', 'Password', 'required|trim|min_length[3]|matches[password2]', [ 'required' => 'Kata sandi wajib diisi!', 'matches' => 'Kata sandi tidak cocok!', 'min_length' => 'Kata sandi terlalu pendek!' ]); $this->form_validation->set_rules('password2', 'Password', 'required|trim|matches[password1]', [ 'matches' => 'Kata sandi tidak cocok!' ]); if ($this->form_validation->run() == false) { $data['title'] = 'Halaman Pendaftaran'; $this->load->view('templates/auth_header', $data); $this->load->view('auth/registration'); $this->load->view('templates/auth_footer'); } else { $email = $this->input->post('email', true); $data = [ 'name' => htmlspecialchars($this->input->post('name', true)), 'email' => htmlspecialchars($email), 'image' => 'default1.jpg', 'password' => password_hash($this->input->post('password1'), PASSWORD_DEFAULT), 'is_active' => 0, 'date_created' => time() ]; // siapkan token $token = base64_encode(random_bytes(32)); $admin_token = [ 'email' => $email, 'token' => $token, 'date_created' => time() ]; $this->db->insert('admin', $data); $this->db->insert('admin_token', $admin_token); $this->_sendEmail($token, 'verify'); $this->session->set_flashdata('message', ''); redirect('auth'); } } public function verify() { $email = $this->input->get('email'); $token = $this->input->get('token'); $admin = $this->db->get_where('admin', ['email' => $email])->row_array(); if ($admin) { $admin_token = $this->db->get_where('admin_token', ['token' => $token])->row_array(); if ($admin) { if (time() - $admin_token['date_created'] < (60 * 60 * 24)) { $this->db->set('is_active', 1); $this->db->where('email', $email); $this->db->update('admin'); $this->db->delete('admin_token', ['email' => $email]); $this->session->set_flashdata('message', ''); redirect('auth'); } else { $this->db->delete('admin', ['email' => $email]); $this->db->delete('admin_token', ['email' => $email]); $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } private function _sendEmail($token, $type) { $this->load->library('phpmailer_lib'); $mail = $this->phpmailer_lib->load(); // Mengembalikan objek PHPMailer try { $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'ratnaantika386@gmail.com'; $mail->Password = 'swpf wnxp avvn aukc'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; $mail->setFrom('ratnaantika386@gmail.com'); $mail->addAddress($this->input->post('email')); if ($type == 'verify') { $mail->Subject = 'Verifikasi Akun'; $mail->isHTML(true); $mail->Body = 'Klik tautan ini untuk memverifikasi akun Anda: Aktivasi'; } else if ($type == 'forgot') { $mail->Subject = 'Atur Ulang Kata Sandi'; $mail->isHTML(true); $mail->Body = 'Klik tautan ini untuk mengatur ulang kata sandi Anda: Atur Ulang Kata Sandi'; } $mail->send(); } catch (Exception $e) { echo "Pesan gagal dikirim. Error: {$mail->ErrorInfo}"; die; } } public function logout() { $this->session->unset_userdata('email'); $this->session->unset_userdata('role_id'); $this->session->set_flashdata('message', ''); redirect('auth'); } public function blocked() { $this->load->view('auth/blocked'); } public function forgotPassword() { $this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email', [ 'required' => 'Email harus diisi!', 'valid_email' => 'Email tidak valid!' ]); if ($this->form_validation->run() == false) { $data['title'] = 'Lupa Kata Sandi'; $this->load->view('templates/auth_header', $data); $this->load->view('auth/forgot-password'); $this->load->view('templates/auth_footer'); } else { $email = $this->input->post('email'); $admin = $this->db->get_where('admin', ['email' => $email])->row_array(); if ($admin) { $token = base64_encode(random_bytes('32')); $admin_token = [ 'email' => $email, 'token' => $token, 'date_created' => time(), ]; $this->db->insert('admin_token', $admin_token); $this->_sendEmail($token, 'forgot'); $this->session->set_flashdata('message', ''); redirect('auth/forgotpassword'); } else { $this->session->set_flashdata('message', ''); redirect('auth/forgotpassword'); } } } public function resetPassword() { $email = $this->input->get('email'); $token = $this->input->get('token'); $admin = $this->db->get_where('admin', ['email' => $email])->row_array(); if ($admin) { $admin_token = $this->db->get_where('admin_token', ['token' => $token])->row_array(); if ($admin_token) { // Cek apakah token masih berlaku (5 menit) if (time() - $admin_token['date_created'] < 300) { // 300 detik = 5 menit $this->session->set_userdata('reset_email', $email); $this->changePassword(); // Panggil fungsi untuk mengubah password } else { // Hapus token dan user jika token kadaluarsa $this->db->delete('admin_token', ['email' => $email]); $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } else { $this->session->set_flashdata('message', ''); redirect('auth'); } } public function changePassword() { if (!$this->session->userdata('reset_email')) { redirect('auth'); } $this->form_validation->set_rules('password1', 'Password', 'required|trim|min_length[4]|matches[password2]', [ 'required' => 'Kata sandi harus diisi!', 'min_length' => 'Kata sandi terlalu pendek!', 'matches' => 'Kata sandi tidak cocok!', ]); $this->form_validation->set_rules('password2', 'Password', 'required|trim|min_length[4]|matches[password1]', [ 'required' => 'Ulangi kata sandi harus diisi!', 'min_length' => 'Kata sandi terlalu pendek!', 'matches' => 'Kata sandi tidak cocok!', ]); if ($this->form_validation->run() == false) { $data['title'] = 'Ubah Kata Sandi'; $this->load->view('templates/auth_header', $data); $this->load->view('auth/change-password'); $this->load->view('templates/auth_footer'); } else { $password = password_hash($this->input->post('password1'), PASSWORD_DEFAULT); $email = $this->session->userdata('reset_email'); $this->db->set('password', $password); $this->db->where('email', $email); $this->db->update('admin'); $this->session->unset_userdata('reset_email'); $this->session->set_flashdata('message', ''); redirect('auth'); } } }