237 lines
7.7 KiB
PHP
237 lines
7.7 KiB
PHP
<?php
|
|
if (!defined('BASEPATH')) exit('No direct script access allowed');
|
|
|
|
/*
|
|
* InvoicePlane
|
|
*
|
|
* @author InvoicePlane Developers & Contributors
|
|
* @copyright Copyright (c) 2012 - 2017 InvoicePlane.com
|
|
* @license https://invoiceplane.com/license.txt
|
|
* @link https://invoiceplane.com
|
|
*/
|
|
|
|
/**
|
|
* Class Sessions
|
|
*/
|
|
class Sessions extends Base_Controller
|
|
{
|
|
public function index()
|
|
{
|
|
redirect('sessions/login');
|
|
}
|
|
|
|
public function login()
|
|
{
|
|
$view_data = array(
|
|
'login_logo' => get_setting('login_logo')
|
|
);
|
|
|
|
if ($this->input->post('btn_login')) {
|
|
|
|
$this->db->where('user_email', $this->input->post('email'));
|
|
$query = $this->db->get('ip_users');
|
|
$user = $query->row();
|
|
|
|
// Check if the user exists
|
|
if (empty($user)) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_user_not_found'));
|
|
redirect('sessions/login');
|
|
} else {
|
|
|
|
// Check if the user is marked as active
|
|
if ($user->user_active == 0) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_user_inactive'));
|
|
redirect('sessions/login');
|
|
} else {
|
|
|
|
if ($this->authenticate($this->input->post('email'), $this->input->post('password'))) {
|
|
if ($this->session->userdata('user_type') == 1) {
|
|
redirect('dashboard');
|
|
} elseif ($this->session->userdata('user_type') == 2) {
|
|
redirect('guest');
|
|
}
|
|
} else {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_credentials_incorrect'));
|
|
redirect('sessions/login');
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$this->load->view('session_login', $view_data);
|
|
}
|
|
|
|
/**
|
|
* @param $email_address
|
|
* @param $password
|
|
* @return bool
|
|
*/
|
|
public function authenticate($email_address, $password)
|
|
{
|
|
$this->load->model('mdl_sessions');
|
|
|
|
if ($this->mdl_sessions->auth($email_address, $password)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function logout()
|
|
{
|
|
$this->session->sess_destroy();
|
|
|
|
redirect('sessions/login');
|
|
}
|
|
|
|
/**
|
|
* @param null $token
|
|
* @return mixed
|
|
*/
|
|
public function passwordreset($token = null)
|
|
{
|
|
// Check if a token was provided
|
|
if ($token) {
|
|
$this->db->where('user_passwordreset_token', $token);
|
|
$user = $this->db->get('ip_users');
|
|
$user = $user->row();
|
|
|
|
if (empty($user)) {
|
|
// Redirect back to the login screen with an alert
|
|
$this->session->set_flashdata('alert_error', trans('wrong_passwordreset_token'));
|
|
redirect('sessions/passwordreset');
|
|
}
|
|
|
|
$formdata = array(
|
|
'token' => $token,
|
|
'user_id' => $user->user_id,
|
|
);
|
|
|
|
return $this->load->view('session_new_password', $formdata);
|
|
}
|
|
|
|
// Check if the form for a new password was used
|
|
if ($this->input->post('btn_new_password')) {
|
|
$new_password = $this->input->post('new_password');
|
|
$user_id = $this->input->post('user_id');
|
|
|
|
if (empty($user_id) || empty($new_password)) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_no_password'));
|
|
redirect($_SERVER['HTTP_REFERER']);
|
|
}
|
|
|
|
$this->load->model('users/mdl_users');
|
|
|
|
// Check for the reset token
|
|
$user = $this->mdl_users->get_by_id($user_id);
|
|
|
|
if (empty($user)) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_user_not_found'));
|
|
redirect($_SERVER['HTTP_REFERER']);
|
|
}
|
|
|
|
if (empty($user->user_passwordreset_token) || $this->input->post('token') !== $user->user_passwordreset_token) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_wrong_auth_code'));
|
|
redirect($_SERVER['HTTP_REFERER']);
|
|
}
|
|
|
|
// Call the save_change_password() function from users model
|
|
$this->mdl_users->save_change_password(
|
|
$user_id, $new_password
|
|
);
|
|
|
|
// Update the user and set him active again
|
|
$db_array = array(
|
|
'user_passwordreset_token' => '',
|
|
);
|
|
|
|
$this->db->where('user_id', $user_id);
|
|
$this->db->update('ip_users', $db_array);
|
|
|
|
// Redirect back to the login form
|
|
redirect('sessions/login');
|
|
|
|
}
|
|
|
|
// Check if the password reset form was used
|
|
if ($this->input->post('btn_reset')) {
|
|
$email = $this->input->post('email');
|
|
|
|
if (empty($email)) {
|
|
$this->session->set_flashdata('alert_error', trans('loginalert_user_not_found'));
|
|
redirect($_SERVER['HTTP_REFERER']);
|
|
}
|
|
|
|
// Test if a user with this email exists
|
|
if ($this->db->where('user_email', $email)) {
|
|
// Create a passwordreset token
|
|
$email = $this->input->post('email');
|
|
$token = md5(time() . $email);
|
|
|
|
// Save the token to the database and set the user to inactive
|
|
$db_array = array(
|
|
'user_passwordreset_token' => $token,
|
|
);
|
|
|
|
$this->db->where('user_email', $email);
|
|
$this->db->update('ip_users', $db_array);
|
|
|
|
// Send the email with reset link
|
|
$this->load->helper('mailer');
|
|
|
|
// Preprare some variables for the email
|
|
$email_resetlink = site_url('sessions/passwordreset/' . $token);
|
|
$email_message = $this->load->view('emails/passwordreset', array(
|
|
'resetlink' => $email_resetlink
|
|
), true);
|
|
$email_from = 'system@' . preg_replace("/^[\w]{2,6}:\/\/([\w\d\.\-]+).*$/", "$1", base_url());
|
|
|
|
// Mail the invoice with the pre-configured mailer if possible
|
|
if (mailer_configured()) {
|
|
|
|
$this->load->helper('mailer/phpmailer');
|
|
|
|
if (!phpmail_send($email_from, $email, trans('password_reset'), $email_message)) {
|
|
$email_failed = true;
|
|
}
|
|
|
|
} else {
|
|
|
|
$this->load->library('email');
|
|
|
|
// Set email configuration
|
|
$config['mailtype'] = 'html';
|
|
$this->email->initialize($config);
|
|
|
|
// Set the email params
|
|
$this->email->from($email_from);
|
|
$this->email->to($email);
|
|
$this->email->subject(trans('password_reset'));
|
|
$this->email->message($email_message);
|
|
|
|
// Send the reset email
|
|
if (!$this->email->send()) {
|
|
$email_failed = true;
|
|
log_message('error', $this->email->print_debugger());
|
|
}
|
|
}
|
|
|
|
// Redirect back to the login screen with an alert
|
|
if (isset($email_failed)) {
|
|
$this->session->set_flashdata('alert_error', trans('password_reset_failed'));
|
|
} else {
|
|
$this->session->set_flashdata('alert_success', trans('email_successfully_sent'));
|
|
}
|
|
|
|
redirect('sessions/login');
|
|
}
|
|
}
|
|
|
|
return $this->load->view('session_passwordreset');
|
|
}
|
|
|
|
}
|