From 98e110fcc795dac5c4b08aa271e4e7a0a22da53d Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 5 Feb 2015 08:05:27 +0400 Subject: [PATCH] SignMe optimizations --- dev/Common/Enums.js | 3 +- dev/View/User/Login.js | 24 +++++++-- .../0.0.0/app/libraries/RainLoop/Actions.php | 52 ++++++++++++++----- .../app/libraries/RainLoop/KeyPathHelper.php | 10 ---- 4 files changed, 62 insertions(+), 27 deletions(-) diff --git a/dev/Common/Enums.js b/dev/Common/Enums.js index 669042fa6..b73de81ce 100644 --- a/dev/Common/Enums.js +++ b/dev/Common/Enums.js @@ -148,7 +148,8 @@ 'ExpandedFolders': 3, 'FolderListSize': 4, 'MessageListSize': 5, - 'LastReplyAction': 6 + 'LastReplyAction': 6, + 'LastSignMe': 7 }; /** diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index d97481cd8..d549cd141 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -20,6 +20,7 @@ LanguageStore = require('Stores/Language'), AppStore = require('Stores/User/App'), + Local = require('Storage/Client'), Settings = require('Storage/Settings'), Remote = require('Storage/User/Remote'), @@ -215,6 +216,8 @@ this.additionalCode.visibility() ? !!this.additionalCodeSignMe() : false ); + Local.set(Enums.ClientSideKeyName.LastSignMe, !!this.signMe() ? '-1-' : '-0-'); + }, this) ; @@ -322,6 +325,8 @@ { var self = this, + sSignMeLocal = Local.get(Enums.ClientSideKeyName.LastSignMe), + sSignMe = (Settings.settingsGet('SignMe') || 'unused').toLowerCase(), sJsHash = Settings.settingsGet('JsHash'), fSocial = function (iErrorCode) { iErrorCode = Utils.pInt(iErrorCode); @@ -342,13 +347,24 @@ this.googleLoginEnabled(!!Settings.settingsGet('AllowGoogleSocial') && !!Settings.settingsGet('AllowGoogleSocialAuth')); - switch ((Settings.settingsGet('SignMe') || 'unused').toLowerCase()) + switch (sSignMe) { case Enums.LoginSignMeTypeAsString.DefaultOff: - this.signMeType(Enums.LoginSignMeType.DefaultOff); - break; case Enums.LoginSignMeTypeAsString.DefaultOn: - this.signMeType(Enums.LoginSignMeType.DefaultOn); + + this.signMeType(Enums.LoginSignMeTypeAsString.DefaultOn === sSignMe ? + Enums.LoginSignMeType.DefaultOn : Enums.LoginSignMeType.DefaultOff); + + switch (sSignMeLocal) + { + case '-1-': + this.signMeType(Enums.LoginSignMeType.DefaultOn); + break; + case '-0-': + this.signMeType(Enums.LoginSignMeType.DefaultOff); + break; + } + break; default: case Enums.LoginSignMeTypeAsString.Unused: diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 1549bd030..8c4aeb362 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -531,13 +531,21 @@ class Actions if ($oAccount->SignMe() && 0 < \strlen($oAccount->SignMeToken())) { - \RainLoop\Utils::SetCookie(self::AUTH_SIGN_ME_TOKEN_KEY, $oAccount->SignMeToken(), + \RainLoop\Utils::SetCookie(self::AUTH_SIGN_ME_TOKEN_KEY, + \RainLoop\Utils::EncodeKeyValues(array( + 'e' => $oAccount->Email(), + 't' => $oAccount->SignMeToken() + )), \time() + 60 * 60 * 24 * 30, '/', null, null, true); - $this->StorageProvider()->Put(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - \RainLoop\KeyPathHelper::SignMeUserToken($oAccount->SignMeToken()), - $oAccount->GetAuthToken() + $this->StorageProvider()->Put($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me', + \RainLoop\Utils::EncodeKeyValues(array( + 'Time' => \time(), + 'AuthToken' => $oAccount->GetAuthToken(), + 'SignMetToken' => $oAccount->SignMeToken() + )) ); } } @@ -1136,10 +1144,30 @@ class Actions $sSignMeToken = \RainLoop\Utils::GetCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY, ''); if (!empty($sSignMeToken)) { - $oAccount = $this->GetAccountFromCustomToken($this->StorageProvider()->Get(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - \RainLoop\KeyPathHelper::SignMeUserToken($sSignMeToken) - ), false, false); + $aTokenData = \RainLoop\Utils::DecodeKeyValues($sSignMeToken); + if (\is_array($aTokenData) && !empty($aTokenData['e']) && !empty($aTokenData['t'])) + { + $sTokenSettings = $this->StorageProvider()->Get($aTokenData['e'], + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me' + ); + + if (!empty($sTokenSettings)) + { + $aSignMeData = \RainLoop\Utils::DecodeKeyValues($sTokenSettings); + if (\is_array($aSignMeData) && + !empty($aSignMeData['AuthToken']) && + !empty($aSignMeData['SignMetToken']) && + $aSignMeData['SignMetToken'] === $aTokenData['t']) + { + $oAccount = $this->GetAccountFromCustomToken($aSignMeData['AuthToken'], false, false); + } + } + } + } + else + { + \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); } return $oAccount; @@ -2671,9 +2699,9 @@ class Actions { \RainLoop\Utils::ClearCookie(\RainLoop\Actions::AUTH_SIGN_ME_TOKEN_KEY); - $this->StorageProvider()->Clear(null, - \RainLoop\Providers\Storage\Enumerations\StorageType::NOBODY, - \RainLoop\KeyPathHelper::SignMeUserToken($oAccount->SignMeToken()) + $this->StorageProvider()->Clear($oAccount, + \RainLoop\Providers\Storage\Enumerations\StorageType::CONFIG, + 'sign_me' ); } } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/KeyPathHelper.php b/rainloop/v/0.0.0/app/libraries/RainLoop/KeyPathHelper.php index 7b9d7808a..f292d4dba 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/KeyPathHelper.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/KeyPathHelper.php @@ -34,16 +34,6 @@ class KeyPathHelper return '/Rsa/Data/'.$sHash.'/'; } - /** - * @param string $sSignMeToken - * - * @return string - */ - static public function SignMeUserToken($sSignMeToken) - { - return '/SignMe/UserToken/'.$sSignMeToken; - } - /** * @param string $sDomain *