-
-
Notifications
You must be signed in to change notification settings - Fork 21
Open
Description
Source File
<?php
/**
* fruithost | OpenSource Hosting
*
* @author Adrian Preuß
* @version 1.0.0
* @license MIT
*/
namespace fruithost\Accounting;
use fruithost\Localization\I18N;
use fruithost\Network\Response;
use fruithost\Storage\Database;
class AuthFactory {
private static ?AuthFactory $instance = null;
private array $permissions = [];
private ?User $user = null;
protected function __construct() {
$this->user = new User();
if(self::isLoggedIn()) {
$this->user->fetch(self::getID());
foreach(Database::fetch('SELECT * FROM `'.DATABASE_PREFIX.'users_permissions` WHERE `user_id`=:user_id', [ 'user_id' => self::getID() ]) as $entry) {
$this->permissions[] = $entry->permission;
}
if(defined('DEBUG') && DEBUG) {
Response::addHeader('USER', json_encode([
'ID' => $this->user->getID(),
'Username' => $this->user->getUsername(),
'IsLoggedIn' => $this->isLoggedIn()
]));
Response::addHeader('PERMISSIONS', json_encode($this->permissions));
}
}
}
public function isLoggedIn() : bool {
$user_id = Session::get('user_id');
return (!empty($user_id) && $user_id > 0);
}
/*
Check if user is logged in.
@return bool
*/
public function getID() : ?int {
return Session::get('user_id');
}
/*
Get user id of the current user.
@return int | null
*/
public function getUsername() : ?string {
return Session::get('user_name');
}
/*
Get username of the current user.
@return string | null
*/
public static function getInstance() : AuthFactory {
if(self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
/*
Log out the current user.
@return bool
*/
public static function logout() : bool {
Session::remove('user_id');
Session::remove('user_name');
return true;
}
/*
Get E-Mail address of the current user.
@return string | null
*/
public function getMail() : ?string {
return $this->user->getMail();
}
/*
Log in a specific user by `$username` and `$password`.
@param string $username
@param string $password
@return bool
@throw Exception
*/
public function login(string $username, #[\SensitiveParameter] string $password) : bool {
$result = Database::single('SELECT `id`, `username`, `password`, UPPER(SHA2(CONCAT(`id`, :salt, :password), 512)) as `crypted` FROM `'.DATABASE_PREFIX.'users` WHERE `username`=:username LIMIT 1', [
'username' => $username,
'password' => $password,
'salt' => MYSQL_PASSWORTD_SALT
]);
if(!$result) {
throw new \Exception(I18N::get('Unknown User'));
}
if($result->password !== $result->crypted) {
throw new \Exception(I18N::get('Password mismatched.'));
}
if($result->id > 0) {
$this->user->fetch((int) $result->id);
Session::set('user_name', $result->username);
Session::set('user_id', (int) $result->id);
} else {
throw new \Exception(I18N::get('Unknown User'));
}
return true;
}
/*
Check a specific user by `$username` and `$password` for Two-Factor-Authentication.
@param string $username
@param string $password
@return bool
@throw Exception
*/
public function TwoFactorLogin(string $username, #[\SensitiveParameter] string $password) : bool {
$result = Database::single('SELECT `id`, `username`, `email`, `password`, UPPER(SHA2(CONCAT(`id`, :salt, :password), 512)) as `crypted` FROM `'.DATABASE_PREFIX.'users` WHERE `username`=:username LIMIT 1', [
'username' => $username,
'password' => $password,
'salt' => MYSQL_PASSWORTD_SALT
]);
if(!$result) {
throw new \Exception(I18N::get('Unknown User'));
}
if($result->password !== $result->crypted) {
throw new \Exception(I18N::get('Password mismatched.'));
}
if(!filter_var($result->email, FILTER_VALIDATE_EMAIL)) {
return false;
}
if($result->id <= 0) {
throw new \Exception(I18N::get('Unknown User'));
}
return true;
}
/*
Get Settings from (given) user account.
@param string $name
@param string | int | null $user_id
@param mixed $default
@return mixed
*/
public function getSettings(string $name, int | string | null $user_id = null, mixed $default = null) : mixed {
return $this->user->getSettings($name, $user_id, $default);
}
/*
Remove Settings from (given) user account.
@param string $name
@param string | int | null $user_id
*/
public function removeSettings(string $name, int | string | null $user_id = null) : void {
$this->user->removeSettings($name, $user_id);
}
/*
Set Settings from (given) user account.
@param string $name
@param string | int | null $user_id
@param mixed $value
*/
public function setSettings(string $name, int | string | null $user_id = null, mixed $value = null) : void {
$this->user->setSettings($name, $user_id, $value);
}
/*
Get Gravatar-URL from actual user.
@return string
*/
public function getGravatar() : string {
return $this->user->getGravatar();
}
/*
Check given Permission from actual user.
@param string $name
@return bool
*/
public function hasPermission(string $name) : bool {
if(count($this->permissions) > 0) {
if($name === '*') {
return count($this->permissions) >= 1;
}
if(in_array('*', $this->permissions)) {
return true;
}
if(stristr($name, '::*') !== false) {
$count = 0;
$split = explode('::*', $name);
foreach($this->permissions as $permission) {
if(str_starts_with($permission, $split[0])) {
++$count;
}
}
if($count > 0) {
return true;
}
}
return in_array($name, $this->permissions);
}
if($name === '*') {
return (count($this->permissions) >= 1);
}
return in_array($name, $this->permissions);
}
public function getPermissions() : array {
return $this->permissions;
}
}
?>Output
[
{
content: {
type: 'BlockComment',
value: '\r\n' +
'fruithost | OpenSource Hosting\r\n' +
'\r\n' +
'@author Adrian Preuß\r\n' +
'@version 1.0.0\r\n' +
'@license MIT',
range: [Array],
loc: [Object],
codeStart: 126,
raw: '*\r\n' +
'\t * fruithost | OpenSource Hosting\r\n' +
'\t *\r\n' +
'\t * @author Adrian Preuß\r\n' +
'\t * @version 1.0.0\r\n' +
'\t * @license MIT\r\n' +
'\t ',
code: [Object],
description: 'fruithost | OpenSource Hosting',
footer: '',
examples: [],
tags: [Array],
inlineTags: []
}
}
]
[
{
content: {
type: 'BlockComment',
value: '\r\n' +
'fruithost | OpenSource Hosting\r\n' +
'\r\n' +
'@author Adrian Preuß\r\n' +
'@version 1.0.0\r\n' +
'@license MIT',
range: [Array],
loc: [Object],
codeStart: 126,
raw: '*\r\n' +
'\t * fruithost | OpenSource Hosting\r\n' +
'\t *\r\n' +
'\t * @author Adrian Preuß\r\n' +
'\t * @version 1.0.0\r\n' +
'\t * @license MIT\r\n' +
'\t ',
code: [Object],
description: 'fruithost | OpenSource Hosting',
footer: '',
examples: [],
tags: [Array],
inlineTags: []
}
}
]
[
{
content: {
type: 'BlockComment',
value: '\r\n' +
'fruithost | OpenSource Hosting\r\n' +
'\r\n' +
'@author Adrian Preuß\r\n' +
'@version 1.0.0\r\n' +
'@license MIT',
range: [Array],
loc: [Object],
codeStart: 151,
raw: '*\r\n' +
' * fruithost | OpenSource Hosting\r\n' +
' *\r\n' +
' * @author Adrian Preuß\r\n' +
' * @version 1.0.0\r\n' +
' * @license MIT\r\n' +
' ',
code: [Object],
description: 'fruithost | OpenSource Hosting',
footer: '',
examples: [],
tags: [Array],
inlineTags: []
}
}
]Simple Usage
import CommentsParser from 'parse-comments';
let data = CommentsParser.parse(this._content);
console.log(data);Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels