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', '
Kata sandi salah!
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Email ini belum diaktifkan!
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Email belum terdaftar!
');
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', 'Selamat! Akun Anda telah dibuat. Silakan aktivasi akun Anda.
');
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', '' . $email . ' telah diaktifkan. Silakan login!
');
redirect('auth');
} else {
$this->db->delete('admin', ['email' => $email]);
$this->db->delete('admin_token', ['email' => $email]);
$this->session->set_flashdata('message', 'Verifikasi akun gagal! Token kadaluarsa.
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Verifikasi akun gagal! Token salah.
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Verifikasi akun gagal! Email salah.
');
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', 'Anda telah keluar!
');
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', 'Silakan cek email Anda untuk mengatur ulang kata sandi Anda!
');
redirect('auth/forgotpassword');
} else {
$this->session->set_flashdata('message', 'Email belum terdaftar!
');
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', 'Atur ulang kata sandi gagal! Token kadaluarsa.
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Atur ulang kata sandi gagal! Token salah.
');
redirect('auth');
}
} else {
$this->session->set_flashdata('message', 'Atur ulang kata sandi gagal! Email salah.
');
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', 'Kata sandi sudah berubah! Silakan login.
');
redirect('auth');
}
}
}