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.
		
		
		
		
		
			
		
			
				
					
					
						
							174 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							174 lines
						
					
					
						
							3.8 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace App\Classes; | 
						|
 | 
						|
use App\Model\UserModel; | 
						|
 | 
						|
class User { | 
						|
 | 
						|
	public static function check(): bool | 
						|
	{ | 
						|
		$success = false; | 
						|
 | 
						|
		// Session | 
						|
		if (Session::exists('user')) { | 
						|
			$success = true; | 
						|
		} | 
						|
 | 
						|
		// If cookie is set, try to login | 
						|
		if (!$success && | 
						|
			_exists($_COOKIE, 'id') && | 
						|
			_exists($_COOKIE, 'username') && | 
						|
			_exists($_COOKIE, 'salt') && | 
						|
			_exists($_COOKIE, 'toggle')) { | 
						|
 | 
						|
			$user = UserModel::find($_COOKIE['id']); | 
						|
 | 
						|
			if ($user->exists() && | 
						|
				$_COOKIE['username'] == $user->username && | 
						|
				$_COOKIE['salt'] == $user->salt) { | 
						|
				$success = true; | 
						|
 | 
						|
				self::setSession($_COOKIE['id'], $_COOKIE['username'], | 
						|
								 $_COOKIE['salt'], $_COOKIE['toggle']); | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		return $success; | 
						|
	} | 
						|
 | 
						|
	public static function login(string $username, string $password, string $rememberMe): bool | 
						|
	{ | 
						|
		$user = UserModel::search(['username' => $username]); | 
						|
 | 
						|
		$success = false; | 
						|
		if ($user->exists() && $user->failed_login_attempt <= 2) { | 
						|
			$saltPassword = $user->salt . $password; | 
						|
			if (password_verify($saltPassword, $user->password)) { | 
						|
				$success = true; | 
						|
 | 
						|
				// On successful login, set failed_login_attempt to 0 | 
						|
				if ($user->failed_login_attempt > 0) { | 
						|
					$user->failed_login_attempt = 0; | 
						|
					$user->save(); | 
						|
				} | 
						|
			} | 
						|
			else { | 
						|
				$user->failed_login_attempt++; | 
						|
				$user->save(); | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		if (!$success) { | 
						|
			self::logout(); | 
						|
 | 
						|
			return false; | 
						|
		} | 
						|
 | 
						|
		// Set session | 
						|
		self::setSession($user->id, $user->username, $user->salt, 1); | 
						|
 | 
						|
		// Set cookie | 
						|
		if ($rememberMe == '1') { | 
						|
			$time = time() + (3600 * 24 * 7); | 
						|
			self::setCookie($time, $user->id, $user->username, $user->salt, 1); | 
						|
		} | 
						|
 | 
						|
		return true; | 
						|
	} | 
						|
 | 
						|
	public static function logout(): void | 
						|
	{ | 
						|
		Session::delete('user'); | 
						|
 | 
						|
		// Destroy user login cookie | 
						|
		$time = time() - 3600; | 
						|
		self::setCookie($time, 0, '', '', 0); | 
						|
	} | 
						|
 | 
						|
	public static function getUser(string $id = '', string $username = '', string $email = ''): UserModel | 
						|
	{ | 
						|
		if ($id == '' && $username == '' && $email == '' && self::check()) { | 
						|
			$id = Session::get('user.id'); | 
						|
			$username = Session::get('user.username'); | 
						|
		} | 
						|
 | 
						|
		return UserModel::search([ | 
						|
			'id' => $id, | 
						|
			'username' => $username, | 
						|
			'email' => $email, | 
						|
		], 'OR'); | 
						|
	} | 
						|
 | 
						|
	public static function toggle(): void | 
						|
	{ | 
						|
		if (self::check()) { | 
						|
			// Toggle session | 
						|
			Session::put('user.toggle', !Session::get('user.toggle')); | 
						|
			// Toggle cookie | 
						|
			self::setCookieToggle(Session::get('user.toggle')); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	protected static function setSession( | 
						|
		int $id, string $username, string $salt, int $toggle): void | 
						|
	{ | 
						|
		Session::put('user', [ | 
						|
			'id'			=> $id, | 
						|
			'username'		=> $username, | 
						|
			'salt'			=> $salt, | 
						|
			'toggle'		=> $toggle, | 
						|
		]); | 
						|
	} | 
						|
 | 
						|
	protected static function setCookie( | 
						|
		int $time, int $id, string $username, string $salt, int $toggle): void | 
						|
	{ | 
						|
		if (_exists($_SERVER, 'HTTPS') && $_SERVER['HTTPS'] == 'on') { | 
						|
			$domain = Config::c('APP_NAME'); | 
						|
			$options = [ | 
						|
				'expires' => $time, | 
						|
				'path' => '/', | 
						|
				'domain' => $domain, | 
						|
				'secure' => true, | 
						|
				'httponly' => true, | 
						|
				'samesite' => 'Strict' | 
						|
			]; | 
						|
			setcookie('id',        $id,        $options); | 
						|
			setcookie('username',  $username,  $options); | 
						|
			setcookie('salt',      $salt,      $options); | 
						|
			setcookie('toggle',    $toggle,    $options); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	protected static function setCookieToggle(int $toggle): void | 
						|
	{ | 
						|
		if (_exists($_SERVER, 'HTTPS') && $_SERVER['HTTPS'] == 'on') { | 
						|
			$domain = Config::c('APP_NAME'); | 
						|
			$options = [ | 
						|
				'expires' => time() + (3600 * 24 * 7), | 
						|
				'path' => '/', | 
						|
				'domain' => $domain, | 
						|
				'secure' => true, | 
						|
				'httponly' => true, | 
						|
				'samesite' => 'Strict' | 
						|
			]; | 
						|
			setcookie('toggle', $toggle, $options); | 
						|
		} | 
						|
	} | 
						|
 | 
						|
	//-------------------------------------// | 
						|
 | 
						|
	public static function getToggle(): int | 
						|
	{ | 
						|
		return self::check() ? Session::get('user.toggle') : 0; | 
						|
	} | 
						|
 | 
						|
	public static function getSession(): array | 
						|
	{ | 
						|
		return self::check() ? Session::get('user') : []; | 
						|
	} | 
						|
 | 
						|
}
 | 
						|
 |