| <?php |
|
|
| |
| |
| |
| |
| |
| |
|
|
| namespace Piwik\Session; |
|
|
| use Piwik\Config; |
| use Piwik\Date; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class SessionFingerprint |
| { |
| |
| public const DEFAULT_IDLE_TIMEOUT = 3600; |
|
|
| public const USER_NAME_SESSION_VAR_NAME = 'user.name'; |
| public const SESSION_INFO_SESSION_VAR_NAME = 'session.info'; |
| public const SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED = 'twofactorauth.verified'; |
| public const SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER = 'twofactorauth.verified_user'; |
| public const SESSION_INFO_TEMP_TOKEN_AUTH = 'user.token_auth_temp'; |
|
|
| public function getUser() |
| { |
| if (isset($_SESSION[self::USER_NAME_SESSION_VAR_NAME])) { |
| return $_SESSION[self::USER_NAME_SESSION_VAR_NAME]; |
| } |
|
|
| return null; |
| } |
|
|
| public function getUserInfo() |
| { |
| if (isset($_SESSION[self::SESSION_INFO_SESSION_VAR_NAME])) { |
| return $_SESSION[self::SESSION_INFO_SESSION_VAR_NAME]; |
| } |
|
|
| return null; |
| } |
|
|
| public function getSessionTokenAuth() |
| { |
| if (!empty($_SESSION[self::SESSION_INFO_TEMP_TOKEN_AUTH])) { |
| return $_SESSION[self::SESSION_INFO_TEMP_TOKEN_AUTH]; |
| } |
|
|
| return null; |
| } |
|
|
| public function hasVerifiedTwoFactor() |
| { |
| if (!isset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED])) { |
| return null; |
| } |
|
|
| if (empty($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED])) { |
| return false; |
| } |
|
|
| $verifiedUser = $this->getVerifiedTwoFactorUser(); |
| if (!empty($verifiedUser)) { |
| return $verifiedUser === $this->getUser(); |
| } |
|
|
| return true; |
| } |
|
|
| public function getVerifiedTwoFactorUser() |
| { |
| return $_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER] ?? null; |
| } |
|
|
| public function setTwoFactorAuthenticationVerified($userName = null) |
| { |
| $_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED] = 1; |
| $userName = $userName ?? $this->getUser(); |
|
|
| if (!empty($userName)) { |
| $_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER] = $userName; |
| } else { |
| unset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER]); |
| } |
| } |
|
|
| public function initialize( |
| $userName, |
| #[\SensitiveParameter] |
| $tokenAuth, |
| $isRemembered = false, |
| $time = null |
| ) { |
| $time = $time ?: Date::now()->getTimestampUTC(); |
| $_SESSION[self::USER_NAME_SESSION_VAR_NAME] = $userName; |
| $_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED] = 0; |
| unset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER]); |
| $_SESSION[self::SESSION_INFO_TEMP_TOKEN_AUTH] = $tokenAuth; |
| $_SESSION[self::SESSION_INFO_SESSION_VAR_NAME] = [ |
| 'ts' => $time, |
| 'remembered' => $isRemembered, |
| 'expiration' => $this->getExpirationTimeFromNow($time), |
| ]; |
| } |
|
|
| public function clear() |
| { |
| if (isset($_SESSION[self::USER_NAME_SESSION_VAR_NAME])) { |
| unset($_SESSION[self::USER_NAME_SESSION_VAR_NAME]); |
| } |
|
|
| if (isset($_SESSION[self::SESSION_INFO_SESSION_VAR_NAME])) { |
| unset($_SESSION[self::SESSION_INFO_SESSION_VAR_NAME]); |
| } |
|
|
| if (isset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED])) { |
| unset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED]); |
| } |
|
|
| if (isset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER])) { |
| unset($_SESSION[self::SESSION_INFO_TWO_FACTOR_AUTH_VERIFIED_USER]); |
| } |
|
|
| if (isset($_SESSION[self::SESSION_INFO_TEMP_TOKEN_AUTH])) { |
| unset($_SESSION[self::SESSION_INFO_TEMP_TOKEN_AUTH]); |
| } |
| } |
|
|
| public function getSessionStartTime() |
| { |
| $userInfo = $this->getUserInfo(); |
| if ( |
| empty($userInfo) |
| || empty($userInfo['ts']) |
| ) { |
| return null; |
| } |
|
|
| return $userInfo['ts']; |
| } |
|
|
| public function getExpirationTime() |
| { |
| $userInfo = $this->getUserInfo(); |
| if ( |
| empty($userInfo) |
| || empty($userInfo['expiration']) |
| ) { |
| return null; |
| } |
|
|
| return $userInfo['expiration']; |
| } |
|
|
| public function isRemembered() |
| { |
| $userInfo = $this->getUserInfo(); |
| return !empty($userInfo['remembered']); |
| } |
|
|
| public function updateSessionExpirationTime() |
| { |
| $_SESSION[self::SESSION_INFO_SESSION_VAR_NAME]['expiration'] = $this->getExpirationTimeFromNow(); |
| } |
|
|
| private function getExpirationTimeFromNow($time = null) |
| { |
| $time = $time ?: Date::now()->getTimestampUTC(); |
|
|
| $general = Config::getInstance()->General; |
|
|
| if ( |
| !isset($general['login_session_not_remembered_idle_timeout']) |
| || (int) $general['login_session_not_remembered_idle_timeout'] <= 0 |
| ) { |
| $nonRememberedSessionExpireTime = self::DEFAULT_IDLE_TIMEOUT; |
| } else { |
| $nonRememberedSessionExpireTime = (int) $general['login_session_not_remembered_idle_timeout']; |
| } |
|
|
| $sessionCookieLifetime = $general['login_cookie_expire']; |
|
|
| if ($this->isRemembered()) { |
| $expireDuration = $sessionCookieLifetime; |
| } else { |
| $expireDuration = $nonRememberedSessionExpireTime; |
| } |
|
|
| return $time + $expireDuration; |
| } |
| } |
|
|