Delegate session operations to SessionManager
Signed-off-by: VirtualTam <virtualtam@flibidi.net>
This commit is contained in:
parent
1b28c66cc7
commit
c7721487b2
2 changed files with 69 additions and 24 deletions
|
@ -1,6 +1,8 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Shaarli;
|
namespace Shaarli;
|
||||||
|
|
||||||
|
use Shaarli\Config\ConfigManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User login management
|
* User login management
|
||||||
*/
|
*/
|
||||||
|
@ -62,34 +64,24 @@ public function checkLoginState($server, & $session, $cookie, $webPath, $token)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$clientIpId = client_ip_id($server);
|
||||||
|
|
||||||
if (isset($cookie[SessionManager::$LOGGED_IN_COOKIE])
|
if (isset($cookie[SessionManager::$LOGGED_IN_COOKIE])
|
||||||
&& $cookie[SessionManager::$LOGGED_IN_COOKIE] === $token
|
&& $cookie[SessionManager::$LOGGED_IN_COOKIE] === $token
|
||||||
) {
|
) {
|
||||||
$this->sessionManager->storeLoginInfo($server);
|
$this->sessionManager->storeLoginInfo($clientIpId);
|
||||||
$this->isLoggedIn = true;
|
$this->isLoggedIn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logout when:
|
if ($this->sessionManager->hasSessionExpired()
|
||||||
// - the session does not exist on the server side
|
|| $this->sessionManager->hasClientIpChanged($clientIpId)
|
||||||
// - the session has expired
|
|
||||||
// - the client IP address has changed
|
|
||||||
if (empty($session['uid'])
|
|
||||||
|| ($this->configManager->get('security.session_protection_disabled') === false
|
|
||||||
&& $session['ip'] != client_ip_id($server))
|
|
||||||
|| time() >= $session['expires_on']
|
|
||||||
) {
|
) {
|
||||||
$this->sessionManager->logout($webPath);
|
$this->sessionManager->logout($webPath);
|
||||||
$this->isLoggedIn = false;
|
$this->isLoggedIn = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extend session validity
|
$this->sessionManager->extendSession();
|
||||||
if (! empty($session['longlastingsession'])) {
|
|
||||||
// "Stay signed in" is enabled
|
|
||||||
$session['expires_on'] = time() + $session['longlastingsession'];
|
|
||||||
} else {
|
|
||||||
$session['expires_on'] = time() + SessionManager::$INACTIVITY_TIMEOUT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -129,7 +121,8 @@ public function checkCredentials($server, $login, $password)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->sessionManager->storeLoginInfo($server);
|
$clientIpId = client_ip_id($server);
|
||||||
|
$this->sessionManager->storeLoginInfo($clientIpId);
|
||||||
logm(
|
logm(
|
||||||
$this->configManager->get('resource.log'),
|
$this->configManager->get('resource.log'),
|
||||||
$server['REMOTE_ADDR'],
|
$server['REMOTE_ADDR'],
|
||||||
|
|
|
@ -1,21 +1,23 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Shaarli;
|
namespace Shaarli;
|
||||||
|
|
||||||
|
use Shaarli\Config\ConfigManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages the server-side session
|
* Manages the server-side session
|
||||||
*/
|
*/
|
||||||
class SessionManager
|
class SessionManager
|
||||||
{
|
{
|
||||||
/** Session expiration timeout, in seconds */
|
/** @var int Session expiration timeout, in seconds */
|
||||||
public static $INACTIVITY_TIMEOUT = 3600;
|
public static $INACTIVITY_TIMEOUT = 3600;
|
||||||
|
|
||||||
/** Name of the cookie set after logging in **/
|
/** @var string Name of the cookie set after logging in **/
|
||||||
public static $LOGGED_IN_COOKIE = 'shaarli_staySignedIn';
|
public static $LOGGED_IN_COOKIE = 'shaarli_staySignedIn';
|
||||||
|
|
||||||
/** Local reference to the global $_SESSION array */
|
/** @var array Local reference to the global $_SESSION array */
|
||||||
protected $session = [];
|
protected $session = [];
|
||||||
|
|
||||||
/** ConfigManager instance **/
|
/** @var ConfigManager Configuration Manager instance **/
|
||||||
protected $conf = null;
|
protected $conf = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -94,17 +96,30 @@ public static function checkId($sessionId)
|
||||||
/**
|
/**
|
||||||
* Store user login information after a successful login
|
* Store user login information after a successful login
|
||||||
*
|
*
|
||||||
* @param array $server The global $_SERVER array
|
* @param string $clientIpId Client IP address identifier
|
||||||
*/
|
*/
|
||||||
public function storeLoginInfo($server)
|
public function storeLoginInfo($clientIpId)
|
||||||
{
|
{
|
||||||
// Generate unique random number (different than phpsessionid)
|
// Generate unique random number (different than phpsessionid)
|
||||||
$this->session['uid'] = sha1(uniqid('', true) . '_' . mt_rand());
|
$this->session['uid'] = sha1(uniqid('', true) . '_' . mt_rand());
|
||||||
$this->session['ip'] = client_ip_id($server);
|
$this->session['ip'] = $clientIpId;
|
||||||
$this->session['username'] = $this->conf->get('credentials.login');
|
$this->session['username'] = $this->conf->get('credentials.login');
|
||||||
$this->session['expires_on'] = time() + self::$INACTIVITY_TIMEOUT;
|
$this->session['expires_on'] = time() + self::$INACTIVITY_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extend session validity
|
||||||
|
*/
|
||||||
|
public function extendSession()
|
||||||
|
{
|
||||||
|
if (! empty($this->session['longlastingsession'])) {
|
||||||
|
// "Stay signed in" is enabled
|
||||||
|
$this->session['expires_on'] = time() + $this->session['longlastingsession'];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->session['expires_on'] = time() + self::$INACTIVITY_TIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logout a user by unsetting all login information
|
* Logout a user by unsetting all login information
|
||||||
*
|
*
|
||||||
|
@ -124,4 +139,41 @@ public function logout($webPath)
|
||||||
}
|
}
|
||||||
setcookie(self::$LOGGED_IN_COOKIE, 'false', 0, $webPath);
|
setcookie(self::$LOGGED_IN_COOKIE, 'false', 0, $webPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the session has expired
|
||||||
|
*
|
||||||
|
* @param string $clientIpId Client IP address identifier
|
||||||
|
*
|
||||||
|
* @return bool true if the session has expired, false otherwise
|
||||||
|
*/
|
||||||
|
public function hasSessionExpired()
|
||||||
|
{
|
||||||
|
if (empty($this->session['uid'])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (time() >= $this->session['expires_on']) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the client IP address has changed
|
||||||
|
*
|
||||||
|
* @param string $clientIpId Client IP address identifier
|
||||||
|
*
|
||||||
|
* @return bool true if the IP has changed, false if it has not, or
|
||||||
|
* if session protection has been disabled
|
||||||
|
*/
|
||||||
|
public function hasClientIpChanged($clientIpId)
|
||||||
|
{
|
||||||
|
if ($this->conf->get('security.session_protection_disabled') === true) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($this->session['ip'] == $clientIpId) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue