A super easy PHP Framework for web development!
				https://github.com/exacti/phacil-framework
			
			
		
			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.
		
		
		
		
		
			
		
			
				
					
					
						
							255 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
	
	
							255 lines
						
					
					
						
							5.7 KiB
						
					
					
				<?php
 | 
						|
/*
 | 
						|
 * Copyright © 2021 ExacTI Technology Solutions. All rights reserved.
 | 
						|
 * GPLv3 General License.
 | 
						|
 * https://exacti.com.br
 | 
						|
 * Phacil PHP Framework - https://github.com/exacti/phacil-framework
 | 
						|
 */
 | 
						|
 | 
						|
namespace Phacil\Framework;
 | 
						|
 | 
						|
use Phacil\Framework\Config;
 | 
						|
 | 
						|
/** 
 | 
						|
 * The session manipulation class
 | 
						|
 * 
 | 
						|
 * You can activate the Redis session instead use the default PHP session manipulation.
 | 
						|
 * 
 | 
						|
 * @param bool $redis Active or not the Redis session
 | 
						|
 * 
 | 
						|
 * @since 1.0.0
 | 
						|
 * @package Phacil\Framework 
 | 
						|
 */
 | 
						|
class Session
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    public $data = array();
 | 
						|
 | 
						|
    /**
 | 
						|
     * Name of session
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    public $name;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Redis prefix
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    private $redisPrefix = "sess_";
 | 
						|
 | 
						|
    /**
 | 
						|
     * Redis Key
 | 
						|
     * 
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    public $redisKey;
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var \Phacil\Framework\Session\Redis\Handler
 | 
						|
     */
 | 
						|
    private $saveHandler;
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var \Phacil\Framework\Registry
 | 
						|
     */
 | 
						|
    private $registry;
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @var \Phacil\Framework\Cookies\SameSite
 | 
						|
     */
 | 
						|
    private $sameSite;
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @param bool $redis 
 | 
						|
     * @param string|null $redisDSN 
 | 
						|
     * @param int|null $redisPort 
 | 
						|
     * @param string|null $redisPass 
 | 
						|
     * @param int|null $redis_expire 
 | 
						|
     * @param string $redis_prefix 
 | 
						|
     * @return void 
 | 
						|
     */
 | 
						|
    public function __construct(
 | 
						|
        \Phacil\Framework\Registry $registry,
 | 
						|
        Config $config,
 | 
						|
        \Phacil\Framework\Cookies\SameSite $sameSite
 | 
						|
    ) {
 | 
						|
        $this->registry = $registry;
 | 
						|
 | 
						|
        $this->sameSite = $sameSite;
 | 
						|
 | 
						|
        $this->name = (Config::SESSION_PREFIX() ?: 'SESS') . (isset($_SERVER['REMOTE_ADDR']) ? md5($_SERVER['REMOTE_ADDR']) : md5(date("dmY")));
 | 
						|
 | 
						|
        //define('SESSION_PREFIX_INTERNAL_REDIS', Config::REDIS_SESSION_PREFIX() ?: 'phacil_');
 | 
						|
 | 
						|
        $this->redis($config->get('session_redis'));
 | 
						|
 | 
						|
        if (!session_id()) {
 | 
						|
            $this->openSession();
 | 
						|
        }
 | 
						|
 | 
						|
        if (session_name() === $this->name) {
 | 
						|
            $this->data =& $_SESSION;
 | 
						|
        } else {
 | 
						|
            $this->openSession();
 | 
						|
            $this->data =& $_SESSION;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** 
 | 
						|
     * Open the PHP session
 | 
						|
     * 
 | 
						|
     * @return void  
 | 
						|
     */
 | 
						|
    private function openSession()
 | 
						|
    {
 | 
						|
 | 
						|
        $this->closeSession();
 | 
						|
 | 
						|
        ini_set('session.use_cookies', 'On');
 | 
						|
        ini_set('session.use_trans_sid', 'Off');
 | 
						|
        ini_set('session.cookie_httponly', 1);
 | 
						|
        if ($this->isSecure())
 | 
						|
            ini_set('session.cookie_secure', 1);
 | 
						|
 | 
						|
        if (version_compare(phpversion(), "7.3.0", "<")) {
 | 
						|
            session_set_cookie_params(0, '/; samesite=' . $this->sameSite->getValue());
 | 
						|
        } else {
 | 
						|
            session_set_cookie_params([
 | 
						|
                'lifetime' => 0,
 | 
						|
                'path' => '/',
 | 
						|
                'samesite' => $this->sameSite->getValue()
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
        //session_id(md5());
 | 
						|
        session_name($this->name);
 | 
						|
        session_start();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check and iniciate the Redis connection
 | 
						|
     * 
 | 
						|
     * @param bool $redis 
 | 
						|
     * @param string|null $redisDSN 
 | 
						|
     * @param string|null $redisPort 
 | 
						|
     * @param string|null $redisPass 
 | 
						|
     * @param int|null $redis_expire 
 | 
						|
     * @param string $redis_prefix 
 | 
						|
     * 
 | 
						|
     * @since 2.0.0
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    private function redis($redis = false)
 | 
						|
    {
 | 
						|
        if (!$redis)
 | 
						|
            return false;
 | 
						|
 | 
						|
        $this->saveHandler = $this->registry->getInstance(\Phacil\Framework\Session\Redis\Handler::class);
 | 
						|
 | 
						|
        $this->saveHandler->setName($this->name);
 | 
						|
 | 
						|
        return $this->registerSaveHandler();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register save handler
 | 
						|
     *
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    protected function registerSaveHandler()
 | 
						|
    {
 | 
						|
        return session_set_save_handler(
 | 
						|
            //$this->saveHandler
 | 
						|
            [$this->saveHandler, 'open'],
 | 
						|
            [$this->saveHandler, 'close'],
 | 
						|
            [$this->saveHandler, 'read'],
 | 
						|
            [$this->saveHandler, 'write'],
 | 
						|
            [$this->saveHandler, 'destroy'],
 | 
						|
            [$this->saveHandler, 'gc']
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Close sessions
 | 
						|
     * 
 | 
						|
     * @param bool $force 
 | 
						|
     * @return void 
 | 
						|
     */
 | 
						|
    private function closeSession($force = false)
 | 
						|
    {
 | 
						|
        //return ;
 | 
						|
        if (session_status() == PHP_SESSION_ACTIVE || $force) {
 | 
						|
            session_unset();
 | 
						|
            session_destroy();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** 
 | 
						|
     * Check if is secure (SSL) connection
 | 
						|
     * @return bool  
 | 
						|
     */
 | 
						|
    private function isSecure()
 | 
						|
    {
 | 
						|
        return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Flush all session data
 | 
						|
     * @return void 
 | 
						|
     * @since 2.0.0
 | 
						|
     */
 | 
						|
    public function flushAll()
 | 
						|
    {
 | 
						|
        $this->flush();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Flush current session data
 | 
						|
     * @return void 
 | 
						|
     * @since 2.0.0
 | 
						|
     */
 | 
						|
    public function flush()
 | 
						|
    {
 | 
						|
        $this->data = [];
 | 
						|
        $this->closeSession(true);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Return the current session ID
 | 
						|
     * 
 | 
						|
     * @since 2.0.0
 | 
						|
     * @return string|false 
 | 
						|
     */
 | 
						|
    public function getSessionId()
 | 
						|
    {
 | 
						|
        return session_id();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @param string $key 
 | 
						|
     * @return mixed|null 
 | 
						|
     */
 | 
						|
    public function getData($key) {
 | 
						|
        return isset($this->data[$key]) ? $this->data[$key] : null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 
 | 
						|
     * @param string $key 
 | 
						|
     * @param mixed $value 
 | 
						|
     * @return $this 
 | 
						|
     */
 | 
						|
    public function setData($key, $value) {
 | 
						|
        $this->data[$key] = $value;
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
}
 | 
						|
 |