Index: units/helpers/user_helper.php =================================================================== --- units/helpers/user_helper.php (revision 15519) +++ units/helpers/user_helper.php (working copy) @@ -83,6 +83,7 @@ $this->_processLoginRedirect('root', $password); $this->_processInterfaceLanguage(); + $this->_fixNextTemplate(); } return LoginResult::OK; @@ -116,6 +117,7 @@ $this->_processLoginRedirect($username, $password); $this->_processInterfaceLanguage(); + $this->_fixNextTemplate(); } } @@ -177,7 +179,9 @@ $this->Application->StorePersistentVar('ThisLogin', adodb_mktime()); } - $this->Application->HandleEvent(new kEvent('u:OnAfterLogin')); + $hook_event = new kEvent('u:OnAfterLogin'); + $hook_event->MasterEvent = $this->event; + $this->Application->HandleEvent($hook_event); } /** @@ -273,13 +277,12 @@ $this->event = new kEvent('u:OnLogout'); } - $sync_manager = $this->Application->recallObject('UsersSyncronizeManager', null, Array(), Array ('InPortalSyncronize')); - /* @var $sync_manager UsersSyncronizeManager */ + $hook_event = new kEvent('u:OnBeforeLogout'); + $hook_event->MasterEvent = $this->event; + $this->Application->HandleEvent($hook_event); - $sync_manager->performAction('LogoutUser'); + $this->_processLoginRedirect(); - $this->Application->HandleEvent(new kEvent('u:OnBeforeLogout')); - $user_id = USER_GUEST; $this->Application->SetVar('u.current_id', $user_id); @@ -306,6 +309,8 @@ // don't pass user prefix on logout, since resulting url will have broken "env" $this->event->SetRedirectParam('pass', MOD_REWRITE ? 'm' : 'all'); + + $this->_fixNextTemplate(); } /** @@ -335,26 +340,32 @@ * * @param string $username * @param string $password + * @return void */ - function _processLoginRedirect($username, $password) + protected function _processLoginRedirect($username = null, $password = null) { // set next template $next_template = $this->Application->GetVar('next_template'); - if ($next_template) { + if ( $next_template ) { $this->event->redirect = $next_template; } // process IIS redirect - if ($this->Application->ConfigValue('UseJSRedirect')) { + if ( $this->Application->ConfigValue('UseJSRedirect') ) { $this->event->SetRedirectParam('js_redirect', 1); } // synchronize login - $sync_manager = $this->Application->recallObject('UsersSyncronizeManager', null, Array(), Array ('InPortalSyncronize')); + $sync_manager = $this->Application->recallObject('UsersSyncronizeManager', null, Array (), Array ('InPortalSyncronize')); /* @var $sync_manager UsersSyncronizeManager */ - $sync_manager->performAction('LoginUser', $username, $password); + if ( isset($username) && isset($password) ) { + $sync_manager->performAction('LoginUser', $username, $password); + } + else { + $sync_manager->performAction('LogoutUser'); + } } /** @@ -402,29 +413,30 @@ // set language for Admin Console & Front-End with disabled Mod-Rewrite $this->event->SetRedirectParam('m_lang', $language_id); // data $this->Application->Session->SetField('Language', $language_id); // interface - - // set language for Front-End with enabled Mod-Rewrite - if ( MOD_REWRITE ) { - $this->_injectLanguageIntoUrl($language_id); - } } /** - * Inject language into whatever page user wants to go after login + * Injects redirect params into next template, which doesn't happen if next template starts with "external:" * - * @param int $language_id * @return void * @access protected */ - protected function _injectLanguageIntoUrl($language_id) + protected function _fixNextTemplate() { + if ( !MOD_REWRITE || !is_object($this->event) ) { + return; + } + // solve problem, when template is "true" instead of actual template name $template = is_string($this->event->redirect) ? $this->event->redirect : ''; $url = $this->Application->HREF($template, '', $this->event->getRedirectParams(), $this->event->redirectScript); $vars = $this->Application->parseRewriteUrl($url, 'pass'); + unset($vars['login'], $vars['logout'], $vars['next_template']); + // merge back url params, because they were ignored if this was "external:" url $vars['pass'] = implode(',', $vars['pass']); - $vars['m_lang'] = $language_id; + $vars = array_merge($vars, $this->event->getRedirectParams()); + $template = $vars['t']; unset($vars['is_virtual'], $vars['t']); Index: units/languages/languages_item.php =================================================================== --- units/languages/languages_item.php (revision 15437) +++ units/languages/languages_item.php (working copy) @@ -221,6 +221,7 @@ 'pass' => 'm' ); + $this->_addLoginState($url_params); $exception = new kRedirectException('Redirect into language ID = ' . $language_id . ' according to "Accepted-Language" header "' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '"'); $exception->setup('', $url_params); @@ -263,6 +264,26 @@ } /** + * Pass login state variables into new language url + * + * @param $url_params + * @return void + * @access protected + */ + protected function _addLoginState(&$url_params) + { + $pass_along = Array ('login', 'logout'); + + foreach ($pass_along as $pass_along_name) { + $pass_along_value = $this->Application->GetVar($pass_along_name); + + if ( $pass_along_value !== false ) { + $url_params[$pass_along_name] = $pass_along_value; + } + } + } + + /** * Checks, that language is enabled in site domain * * @param int $id Index: units/users/users_event_handler.php =================================================================== --- units/users/users_event_handler.php (revision 15541) +++ units/users/users_event_handler.php (working copy) @@ -289,8 +289,8 @@ $password = $object->GetDBField('UserPassword'); $remember_login = $object->GetDBField('UserRememberLogin') == 1; + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user_helper->event =& $event; $result = $user_helper->loginUser($username, $password, false, $remember_login); @@ -335,8 +335,8 @@ return ; } + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user_helper->loginUser('', '', false, false, $remember_login_cookie); } @@ -381,8 +381,8 @@ */ protected function OnLogout($event) { + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user_helper->event =& $event; $user_helper->logoutUser(); @@ -496,8 +496,8 @@ /* @var $object UsersItem */ if ( $object->GetDBField('Status') == STATUS_ACTIVE ) { + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user =& $user_helper->getUserObject(); $user->Load($object->GetID()); @@ -540,8 +540,8 @@ $this->setUserGroup($object); + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ if ( !$user_helper->checkBanRules($object) ) { $object->SetError('Username', 'banned'); @@ -1147,8 +1147,8 @@ break; case 'forgot': + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $id = $user_helper->validateUserCode($this->Application->GetVar('user_key'), 'forgot_password'); @@ -1173,7 +1173,7 @@ */ function OnUpdateRootPassword($event) { - return $this->OnUpdatePassword($event); + $this->OnUpdatePassword($event); } /** @@ -1866,7 +1866,9 @@ */ function OnAfterLogin($event) { - + if ( is_object($event->MasterEvent) && !$this->Application->isAdmin ) { + $event->MasterEvent->SetRedirectParam('login', 1); + } } /** @@ -1876,7 +1878,9 @@ */ function OnBeforeLogout($event) { - + if ( is_object($event->MasterEvent) && !$this->Application->isAdmin ) { + $event->MasterEvent->SetRedirectParam('logout', 1); + } } /** @@ -1906,8 +1910,8 @@ $event->CallSubEvent('OnUpdate'); if ( $event->status == kEvent::erSUCCESS ) { + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user =& $user_helper->getUserObject(); $user->Load( $object->GetID() ); @@ -1949,8 +1953,8 @@ */ protected function OnLoginAs(kEvent $event) { + /* @var $user_helper UserHelper */ $user_helper = $this->Application->recallObject('UserHelper'); - /* @var $user_helper UserHelper */ $user =& $user_helper->getUserObject(); $user->Load( $this->Application->GetVar('user_id') );