You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

195 lines
5.3 KiB

<?php
namespace app\core\auth;
use app\core\contract\Authentication;
use app\core\auth\Session;
use app\core\traits\Rememberme;
use app\core\utils\Request;
use app\core\utils\Response;
use app\core\utils\Cookie;
class User implements Authentication {
use Rememberme;
public static function login(array $userData): bool {
// Get CodeIgniter instance
$CI =& get_instance();
$CI->load->model('user_login_history_model');
$sessID = session_id();
$loginH = [
'session_id' => $sessID,
'role_id' => $userData['role_id'],
'user_id' => $userData['user_id']
];
/**
* This is when BO User login as Subscriber
* Add access token to history log
* */
if (isset($userData['token_id']) && !empty($userData['token_id'])) {
$loginH['access_token_id'] = $userData['token_id'];
}
// Add signin history
$login_id = $CI->user_login_history_model->client_checkdb(
array_merge(Request::metaData($CI), $loginH),
"LOGIN"
);
if (!$login_id) return false;
// Lets create session!
$sessionData = new Session(array_merge(
[
"session_id" => $sessID,
"login_id" => $login_id
], $userData
)
);
// Invalidate previous Remember Me
Rememberme::forget();
// Then create new one on-demand
if ($userData['remember_me']) {
Rememberme::create(
$userData['user_id'],
$userData['role_id'],
$userData['isBOUser']
);
}
// Register session data
$CI->session->set_userdata([ self::KEY => $sessionData->toArray() ]);
return !!$CI->session->userdata(self::KEY);
}
public static function logout() {
// Get CodeIgniter instance
$CI =& get_instance();
// Immediate redirection
if (!self::isAuth()) return Response::backToReferrerDefaultPage();
$userSession = self::auth();
// Invalidate access token
if (self::isLoggedInAsSubscriber()) {
$CI->user_model->update_access_token($userSession['token_id']);
}
// Add signout history
$CI->user_login_history_model->client_checkdb(array_merge(
Request::metaData($CI),
[
'session_id' => $userSession['session_id'],
'login_id' => $userSession['login_id'],
'user_id' => $userSession['user_id'],
'role_id' => $userSession['role_id']
]
), "LOGOUT");
// Finally reset login session
$CI->session->unset_userdata(self::KEY);
// Invalidate Remember Me
if (!$userSession['remember_me'])
Rememberme::forget();
// Redirect to respective page
if ($userSession["isBOUser"])
redirect(base_url('auth'));
else
redirect(base_url('home'));
}
/**
* Get session data
* @return void
*/
public static function auth(): array {
// Get CodeIgniter instance
$CI =& get_instance();
if (!self::isAuth()) return [];
return $CI->session->userdata(self::KEY);
}
public static function isAuth(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
$loggedIn = $CI->session->userdata(self::KEY);
if (!$loggedIn) return false;
$CI->load->model('user_model');
return !!$CI->user_model->check_if_session_is_active($loggedIn);
}
public static function isBOUser(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!@$CI->session->userdata(self::KEY)['isBOUser'];
}
public static function isFOUser(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!!$CI->session->userdata(self::KEY)['isBOUser'];
}
public static function isFirstLogin(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!@$CI->session->userdata(self::KEY)['isFirstLogin'];
}
public static function isLoggedInAsSubscriber(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!$CI->session->userdata(self::KEY)['token_id'];
}
public static function isLoggedBySSO(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!$CI->session->userdata(self::KEY)['sso'] && count($CI->session->userdata(self::KEY)['sso']);
}
public static function isPremium(): bool {
// Get CodeIgniter instance
$CI =& get_instance();
return !!$CI->session->userdata(self::KEY)['premium'];
}
public static function updateSession($key, $value) {
$editableFields = ['first_name', 'last_name'];
if (in_array($key, $editableFields)) {
// Get CodeIgniter instance
$CI =& get_instance();
$loggedIn = $CI->session->userdata(self::KEY);
$loggedIn[$key] = $value;
$loggedIn['fullname'] = $loggedIn['first_name']." ".$loggedIn['last_name'];
// Register session data
$CI->session->set_userdata([ self::KEY => $loggedIn ]);
}
}
}