_redirectIfLoggedIn(); // Make sure after first run / update the authdb plugin is registered and active // it can not be deactivated if (!class_exists('Authdb', false)) { $plugin = Plugin::model()->findByAttributes(array('name'=>'Authdb')); if (!$plugin) { $plugin = new Plugin(); $plugin->name = 'Authdb'; $plugin->active = 1; $plugin->save(); App()->getPluginManager()->loadPlugin('Authdb', $plugin->id); } else { $plugin->active = 1; $plugin->save(); } } $beforeLogin = new PluginEvent('beforeLogin'); $beforeLogin->set('identity', new LSUserIdentity('', '')); App()->getPluginManager()->dispatchEvent($beforeLogin); /* @var $identity LSUserIdentity */ $identity = $beforeLogin->get('identity'); if (!$beforeLogin->isStopped() && is_null(App()->getRequest()->getPost('login_submit'))) { if (!is_null($beforeLogin->get('default'))) { $aData['defaultAuth'] = $beforeLogin->get('default'); } $newLoginForm = new PluginEvent('newLoginForm'); App()->getPluginManager()->dispatchEvent($newLoginForm); $aData['summary'] = $this->_getSummary('logout'); $aData['pluginContent'] = $newLoginForm->getAllContent(); $this->_renderWrappedTemplate('authentication', 'login', $aData); } else { // Handle getting the post and populating the identity there $authMethod = App()->getRequest()->getPost('authMethod', $identity->plugin); $identity->plugin = $authMethod; $event = new PluginEvent('afterLoginFormSubmit'); $event->set('identity', $identity); App()->getPluginManager()->dispatchEvent($event, array($authMethod)); $identity = $event->get('identity'); // Now authenticate if ($identity->authenticate()) { FailedLoginAttempt::model()->deleteAttempts(); App()->user->setState('plugin', $authMethod); $this->getController()->_GetSessionUserRights(Yii::app()->session['loginID']); Yii::app()->session['just_logged_in'] = true; Yii::app()->session['loginsummary'] = $this->_getSummary(); $this->_doRedirect(); } else { // Failed $message = $identity->errorMessage; if (empty($message)) { // If no message, return a default message $clang = $this->getController()->lang; $message = $clang->gT('Incorrect username and/or password!'); } App()->user->setFlash('loginError', $message); $this->getController()->redirect(array('/admin/authentication/sa/login')); } } } /** * Logout user */ public function logout() { // Fetch the current user $plugin = App()->user->getState('plugin', null); // Save for afterLogout, current user will be destroyed by then /* Adding beforeLogout event */ $beforeLogout = new PluginEvent('beforeLogout'); App()->getPluginManager()->dispatchEvent($beforeLogout, array($plugin)); App()->user->logout(); App()->user->setFlash('loginmessage', gT('Logout successful.')); /* Adding afterLogout event */ $event = new PluginEvent('afterLogout'); App()->getPluginManager()->dispatchEvent($event, array($plugin)); $this->getController()->redirect(array('/admin/authentication/sa/login')); } /** * Forgot Password screen */ public function forgotpassword() { $this->_redirectIfLoggedIn(); if (!Yii::app()->request->getPost('action')) { $this->_renderWrappedTemplate('authentication', 'forgotpassword'); } else { $sUserName = Yii::app()->request->getPost('user'); $sEmailAddr = Yii::app()->request->getPost('email'); $aFields = User::model()->findAllByAttributes(array('users_name' => $sUserName, 'email' => $sEmailAddr)); if (count($aFields) < 1) { // wrong or unknown username and/or email $aData['errormsg'] = $this->getController()->lang->gT('User name and/or email not found!'); $aData['maxattempts'] = ''; $this->_renderWrappedTemplate('authentication', 'error', $aData); } else { $aData['message'] = $this->_sendPasswordEmail($sEmailAddr, $aFields); $this->_renderWrappedTemplate('authentication', 'message', $aData); } } } /** * Send the forgot password email * * @param string $sEmailAddr * @param array $aFields */ private function _sendPasswordEmail($sEmailAddr, $aFields) { $clang = $this->getController()->lang; $sFrom = Yii::app()->getConfig("siteadminname") . " <" . Yii::app()->getConfig("siteadminemail") . ">"; $sTo = $sEmailAddr; $sSubject = $clang->gT('User data'); $sNewPass = createPassword(); $sSiteName = Yii::app()->getConfig('sitename'); $sSiteAdminBounce = Yii::app()->getConfig('siteadminbounce'); $username = sprintf($clang->gT('Username: %s'), $aFields[0]['users_name']); $email = sprintf($clang->gT('Email: %s'), $sEmailAddr); $password = sprintf($clang->gT('New password: %s'), $sNewPass); $body = array(); $body[] = sprintf($clang->gT('Your user data for accessing %s'), Yii::app()->getConfig('sitename')); $body[] = $username; $body[] = $password; $body = implode("\n", $body); if (SendEmailMessage($body, $sSubject, $sTo, $sFrom, $sSiteName, false, $sSiteAdminBounce)) { User::model()->updatePassword($aFields[0]['uid'], $sNewPass); $sMessage = $username . '
' . $email . '

' . $clang->gT('An email with your login data was sent to you.'); } else { $sTmp = str_replace("{NAME}", '' . $aFields[0]['users_name'] . '', $clang->gT("Email to {NAME} ({EMAIL}) failed.")); $sMessage = str_replace("{EMAIL}", $sEmailAddr, $sTmp) . '
'; } return $sMessage; } /** * Get's the summary * @param string $sMethod login|logout * @param string $sSummary Default summary * @return string Summary */ private function _getSummary($sMethod = 'login', $sSummary = '') { if (!empty($sSummary)) { return $sSummary; } $clang = $this->getController()->lang; switch ($sMethod) { case 'logout' : $sSummary = $clang->gT('Please log in first.'); break; case 'login' : default : $sSummary = '
' . sprintf($clang->gT('Welcome %s!'), Yii::app()->session['full_name']) . '
 '; if (!empty(Yii::app()->session['redirect_after_login']) && strpos(Yii::app()->session['redirect_after_login'], 'logout') === FALSE) { Yii::app()->session['metaHeader'] = ''; $sSummary = '

' . $clang->gT('Reloading screen. Please wait.') . ''; unset(Yii::app()->session['redirect_after_login']); } break; } return $sSummary; } /** * Redirects a logged in user to the administration page */ private function _redirectIfLoggedIn() { if (!Yii::app()->user->getIsGuest()) { $this->getController()->redirect(array('/admin')); } } /** * Check if a user can log in * @return bool|array */ private function _userCanLogin() { $failed_login_attempts = FailedLoginAttempt::model(); $failed_login_attempts->cleanOutOldAttempts(); if ($failed_login_attempts->isLockedOut()) { return $this->_getAuthenticationFailedErrorMessage(); } else { return true; } } /** * Redirect after login */ private function _doRedirect() { $returnUrl = App()->user->getReturnUrl(array('/admin')); $this->getController()->redirect($returnUrl); } /** * Renders template(s) wrapped in header and footer * * @param string $sAction Current action, the folder to fetch views from * @param string|array $aViewUrls View url(s) * @param array $aData Data to be passed on. Optional. */ protected function _renderWrappedTemplate($sAction = 'authentication', $aViewUrls = array(), $aData = array()) { $aData['display']['menu_bars'] = false; parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData); } }