2018-04-28 12:20:07 +00:00
< ? php
namespace App\Controllers ;
2019-01-10 22:22:19 +00:00
use App\Database\DB ;
2020-03-03 16:18:52 +00:00
use App\Database\Queries\UserQuery ;
2019-08-20 12:56:41 +00:00
use App\Web\Lang ;
2019-01-10 22:22:19 +00:00
use App\Web\Session ;
2020-04-04 17:29:00 +00:00
use App\Web\ValidationHelper ;
2019-11-19 12:59:17 +00:00
use App\Web\View ;
2019-11-12 23:13:23 +00:00
use DI\Container ;
use DI\DependencyException ;
use DI\NotFoundException ;
2020-03-03 16:18:52 +00:00
use Exception ;
2019-05-19 13:39:42 +00:00
use League\Flysystem\Filesystem ;
2019-01-10 22:22:19 +00:00
use Monolog\Logger ;
2019-11-19 11:55:51 +00:00
use Psr\Http\Message\ServerRequestInterface as Request ;
2018-04-28 12:20:07 +00:00
2019-01-10 22:22:19 +00:00
/**
2020-03-02 20:43:34 +00:00
* @ property Session session
2019-11-19 12:59:17 +00:00
* @ property View view
2020-03-02 20:43:34 +00:00
* @ property DB database
2019-01-10 22:22:19 +00:00
* @ property Logger | null logger
2019-05-19 13:39:42 +00:00
* @ property Filesystem | null storage
2019-08-20 12:56:41 +00:00
* @ property Lang lang
2019-11-12 23:13:23 +00:00
* @ property array config
2019-01-10 22:22:19 +00:00
*/
2018-04-28 12:20:07 +00:00
abstract class Controller
{
2019-11-12 23:13:23 +00:00
/** @var Container */
protected $container ;
2018-06-02 20:32:14 +00:00
2019-11-12 23:13:23 +00:00
public function __construct ( Container $container )
{
$this -> container = $container ;
}
2018-04-28 12:20:07 +00:00
2019-11-12 23:13:23 +00:00
/**
* @ param $name
2019-11-20 17:49:31 +00:00
*
2019-11-23 12:18:00 +00:00
* @ return mixed | null
2019-11-12 23:13:23 +00:00
* @ throws NotFoundException
2019-11-20 17:49:31 +00:00
*
2019-11-23 12:18:00 +00:00
* @ throws DependencyException
2019-11-12 23:13:23 +00:00
*/
public function __get ( $name )
{
if ( $this -> container -> has ( $name )) {
return $this -> container -> get ( $name );
}
2020-02-29 22:35:43 +00:00
return null ;
2019-11-12 23:13:23 +00:00
}
2018-04-28 12:20:07 +00:00
2019-11-12 23:13:23 +00:00
/**
2020-03-01 16:03:07 +00:00
* @ param $key
* @ param null $default
2020-02-29 22:35:43 +00:00
* @ return object
2019-11-12 23:13:23 +00:00
*/
2020-03-01 16:03:07 +00:00
protected function getSetting ( $key , $default = null )
2019-11-12 23:13:23 +00:00
{
2020-03-01 16:03:07 +00:00
return $this -> database -> query ( 'SELECT `value` FROM `settings` WHERE `key` = ' . $this -> database -> getPdo () -> quote ( $key )) -> fetch () -> value ? ? $default ;
}
/**
* @ param $current
* @ param $max
*/
protected function setSessionQuotaInfo ( $current , $max )
{
$this -> session -> set ( 'current_disk_quota' , humanFileSize ( $current ));
if ( $this -> getSetting ( 'quota_enabled' , 'off' ) === 'on' ) {
if ( $max < 0 ) {
2020-04-04 17:29:00 +00:00
$this -> session -> set ( 'max_disk_quota' , '∞' ) -> set ( 'percent_disk_quota' , null );
2020-03-01 16:03:07 +00:00
} else {
2020-04-04 17:29:00 +00:00
$this -> session -> set ( 'max_disk_quota' , humanFileSize ( $max )) -> set ( 'percent_disk_quota' , round (( $current * 100 ) / $max ));
2020-03-01 16:03:07 +00:00
}
} else {
2020-04-04 17:29:00 +00:00
$this -> session -> set ( 'max_disk_quota' , null ) -> set ( 'percent_disk_quota' , null );
2020-03-01 16:03:07 +00:00
}
2019-11-12 23:13:23 +00:00
}
2019-11-19 11:55:51 +00:00
2020-02-28 13:29:29 +00:00
/**
* @ param Request $request
* @ param $userId
* @ param $fileSize
* @ param bool $dec
* @ return bool
*/
protected function updateUserQuota ( Request $request , $userId , $fileSize , $dec = false )
{
2020-03-03 16:18:52 +00:00
$user = make ( UserQuery :: class ) -> get ( $request , $userId );
2020-02-28 13:29:29 +00:00
if ( $dec ) {
$tot = max ( $user -> current_disk_quota - $fileSize , 0 );
} else {
$tot = $user -> current_disk_quota + $fileSize ;
2020-03-01 16:03:07 +00:00
if ( $this -> getSetting ( 'quota_enabled' ) === 'on' && $user -> max_disk_quota > 0 && $user -> max_disk_quota < $tot ) {
2020-02-28 13:29:29 +00:00
return false ;
}
}
$this -> database -> query ( 'UPDATE `users` SET `current_disk_quota`=? WHERE `id` = ?' , [
$tot ,
2020-02-29 22:35:43 +00:00
$user -> id ,
2020-02-28 13:29:29 +00:00
]);
return true ;
}
2019-11-23 12:18:00 +00:00
/**
* @ param $userId
2020-03-03 16:18:52 +00:00
* @ throws Exception
2019-11-23 12:18:00 +00:00
*/
protected function refreshRememberCookie ( $userId )
{
$selector = bin2hex ( random_bytes ( 8 ));
$token = bin2hex ( random_bytes ( 32 ));
$expire = time () + 604800 ; // a week
$this -> database -> query ( 'UPDATE `users` SET `remember_selector`=?, `remember_token`=?, `remember_expire`=? WHERE `id`=?' , [
$selector ,
password_hash ( $token , PASSWORD_DEFAULT ),
date ( 'Y-m-d\TH:i:s' , $expire ),
$userId ,
]);
// Workaround for php <= 7.3
if ( PHP_VERSION_ID < 70300 ) {
setcookie ( 'remember' , " { $selector } : { $token } " , $expire , '; SameSite=Lax' , '' , false , true );
} else {
setcookie ( 'remember' , " { $selector } : { $token } " , [
'expires' => $expire ,
'httponly' => true ,
'samesite' => 'Lax' ,
]);
}
}
2020-02-26 17:26:19 +00:00
/**
2020-03-03 16:18:52 +00:00
* @ param Request $request
2020-04-04 17:29:00 +00:00
* @ return ValidationHelper
2020-02-26 17:26:19 +00:00
*/
2020-03-03 16:18:52 +00:00
public function getUserCreateValidator ( Request $request )
2020-02-26 17:26:19 +00:00
{
2020-04-04 17:29:00 +00:00
return make ( ValidationHelper :: class )
-> alertIf ( empty ( param ( $request , 'username' )), 'username_required' )
-> alertIf ( ! filter_var ( param ( $request , 'email' ), FILTER_VALIDATE_EMAIL ), 'email_required' )
-> alertIf ( $this -> database -> query ( 'SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ?' , param ( $request , 'email' )) -> fetch () -> count != 0 , 'email_taken' )
-> alertIf ( $this -> database -> query ( 'SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ?' , param ( $request , 'username' )) -> fetch () -> count != 0 , 'username_taken' );
2020-03-31 18:12:22 +00:00
}
2019-11-20 17:49:31 +00:00
}