PageRenderTime 38ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/ojs/ojs-2.2.3/pages/login/LoginHandler.inc.php

https://github.com/mcrider/pkpUpgradeTestSuite
PHP | 315 lines | 197 code | 59 blank | 59 comment | 52 complexity | b0e830afa724eee4968b3624e382b52c MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /**
  3. * @file LoginHandler.inc.php
  4. *
  5. * Copyright (c) 2003-2009 John Willinsky
  6. * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING.
  7. *
  8. * @class LoginHandler
  9. * @ingroup pages_login
  10. *
  11. * @brief Handle login/logout requests.
  12. */
  13. // $Id: LoginHandler.inc.php,v 1.26.2.3 2009/04/08 19:43:07 asmecher Exp $
  14. class LoginHandler extends Handler {
  15. /**
  16. * Display user login form.
  17. * Redirect to user index page if user is already validated.
  18. */
  19. function index() {
  20. parent::validate();
  21. if (Validation::isLoggedIn()) {
  22. Request::redirect(null, 'user');
  23. }
  24. if (Config::getVar('security', 'force_login_ssl') && Request::getProtocol() != 'https') {
  25. // Force SSL connections for login
  26. Request::redirectSSL();
  27. }
  28. $sessionManager = &SessionManager::getManager();
  29. $session = &$sessionManager->getUserSession();
  30. $templateMgr = &TemplateManager::getManager();
  31. // If the user wasn't expecting a login page, i.e. if they're new to the
  32. // site and want to submit a paper, it helps to explain why they need to
  33. // register.
  34. if(Request::getUserVar('loginMessage'))
  35. $templateMgr->assign('loginMessage', Request::getUserVar('loginMessage'));
  36. $templateMgr->assign('username', $session->getSessionVar('username'));
  37. $templateMgr->assign('remember', Request::getUserVar('remember'));
  38. $templateMgr->assign('source', Request::getUserVar('source'));
  39. $templateMgr->assign('showRemember', Config::getVar('general', 'session_lifetime') > 0);
  40. $templateMgr->display('user/login.tpl');
  41. }
  42. /**
  43. * Handle login when implicitAuth is enabled.
  44. * If the user came in on a non-ssl url - then redirect back to the ssl url
  45. */
  46. function implicitAuthLogin() {
  47. if (Request::getProtocol() != 'https')
  48. Request::redirectSSL();
  49. $wayf_url = Config::getVar("security", "implicit_auth_wayf_url");
  50. if ($wayf_url == "")
  51. die("Error in implicit authentication. WAYF URL not set in config file.");
  52. $url = $wayf_url . "?target=https://" . Request::getServerHost() . Request::getBasePath() . '/index.php/index/login/implicitAuthReturn';
  53. Request::redirectUrl($url);
  54. }
  55. /**
  56. * This is the function that Shibboleth redirects to - after the user has authenticated.
  57. */
  58. function implicitAuthReturn() {
  59. parent::validate();
  60. if (Validation::isLoggedIn()) {
  61. Request::redirect(null, 'user');
  62. }
  63. // Login - set remember to false
  64. $user = Validation::login(Request::getUserVar('username'), Request::getUserVar('password'), $reason, false);
  65. Request::redirect(null, 'user');
  66. }
  67. /**
  68. * Validate a user's credentials and log the user in.
  69. */
  70. function signIn() {
  71. parent::validate();
  72. if (Validation::isLoggedIn()) {
  73. Request::redirect(null, 'user');
  74. }
  75. if (Config::getVar('security', 'force_login_ssl') && Request::getProtocol() != 'https') {
  76. // Force SSL connections for login
  77. Request::redirectSSL();
  78. }
  79. $user = Validation::login(Request::getUserVar('username'), Request::getUserVar('password'), $reason, Request::getUserVar('remember') == null ? false : true);
  80. if ($user !== false) {
  81. if (Config::getVar('security', 'force_login_ssl') && !Config::getVar('security', 'force_ssl')) {
  82. // Redirect back to HTTP if forcing SSL for login only
  83. Request::redirectNonSSL();
  84. } else if ($user->getMustChangePassword()) {
  85. // User must change their password in order to log in
  86. Validation::logout();
  87. Request::redirect(null, null, 'changePassword', $user->getUsername());
  88. } else {
  89. $source = Request::getUserVar('source');
  90. if (isset($source) && !empty($source)) {
  91. Request::redirectUrl(Request::getProtocol() . '://' . Request::getServerHost() . $source, false);
  92. } else {
  93. Request::redirect(null, 'user');
  94. }
  95. }
  96. } else {
  97. $sessionManager = &SessionManager::getManager();
  98. $session = &$sessionManager->getUserSession();
  99. $templateMgr = &TemplateManager::getManager();
  100. $templateMgr->assign('username', Request::getUserVar('username'));
  101. $templateMgr->assign('remember', Request::getUserVar('remember'));
  102. $templateMgr->assign('source', Request::getUserVar('source'));
  103. $templateMgr->assign('showRemember', Config::getVar('general', 'session_lifetime') > 0);
  104. $templateMgr->assign('error', $reason===null?'user.login.loginError':($reason===''?'user.login.accountDisabled':'user.login.accountDisabledWithReason'));
  105. $templateMgr->assign('reason', $reason);
  106. $templateMgr->display('user/login.tpl');
  107. }
  108. }
  109. /**
  110. * Log a user out.
  111. */
  112. function signOut() {
  113. parent::validate();
  114. if (Validation::isLoggedIn()) {
  115. Validation::logout();
  116. }
  117. Request::redirect(null, Request::getRequestedPage());
  118. }
  119. /**
  120. * Display form to reset a user's password.
  121. */
  122. function lostPassword() {
  123. parent::validate();
  124. $templateMgr = &TemplateManager::getManager();
  125. $templateMgr->display('user/lostPassword.tpl');
  126. }
  127. /**
  128. * Send a request to reset a user's password
  129. */
  130. function requestResetPassword() {
  131. parent::validate();
  132. $templateMgr = &TemplateManager::getManager();
  133. $email = Request::getUserVar('email');
  134. $userDao = &DAORegistry::getDAO('UserDAO');
  135. $user = &$userDao->getUserByEmail($email);
  136. if ($user == null || ($hash = Validation::generatePasswordResetHash($user->getUserId())) == false) {
  137. $templateMgr->assign('error', 'user.login.lostPassword.invalidUser');
  138. $templateMgr->display('user/lostPassword.tpl');
  139. } else {
  140. $site =& Request::getSite();
  141. $journal =& Request::getJournal();
  142. // Send email confirming password reset
  143. import('mail.MailTemplate');
  144. $mail =& new MailTemplate('PASSWORD_RESET_CONFIRM');
  145. // Set the sender based on the current context
  146. if ($journal && $journal->getSetting('supportEmail')) {
  147. $email->setFrom($journal->getSetting('supportEmail'), $journal->getSetting('supportName'));
  148. } else {
  149. $mail->setFrom($site->getSiteContactEmail(), $site->getSiteContactName());
  150. }
  151. $mail->assignParams(array(
  152. 'url' => Request::url(null, 'login', 'resetPassword', $user->getUsername(), array('confirm' => $hash)),
  153. 'siteTitle' => $site->getSiteTitle()
  154. ));
  155. $mail->addRecipient($user->getEmail(), $user->getFullName());
  156. $mail->send();
  157. $templateMgr->assign('pageTitle', 'user.login.resetPassword');
  158. $templateMgr->assign('message', 'user.login.lostPassword.confirmationSent');
  159. $templateMgr->assign('backLink', Request::url(null, Request::getRequestedPage()));
  160. $templateMgr->assign('backLinkLabel', 'user.login');
  161. $templateMgr->display('common/message.tpl');
  162. }
  163. }
  164. /**
  165. * Reset a user's password
  166. * @param $args array first param contains the username of the user whose password is to be reset
  167. */
  168. function resetPassword($args) {
  169. parent::validate();
  170. $username = isset($args[0]) ? $args[0] : null;
  171. $userDao = &DAORegistry::getDAO('UserDAO');
  172. $confirmHash = Request::getUserVar('confirm');
  173. if ($username == null || ($user = &$userDao->getUserByUsername($username)) == null) {
  174. Request::redirect(null, null, 'lostPassword');
  175. return;
  176. }
  177. $templateMgr = &TemplateManager::getManager();
  178. $hash = Validation::generatePasswordResetHash($user->getUserId());
  179. if ($hash == false || $confirmHash != $hash) {
  180. $templateMgr->assign('errorMsg', 'user.login.lostPassword.invalidHash');
  181. $templateMgr->assign('backLink', Request::url(null, null, 'lostPassword'));
  182. $templateMgr->assign('backLinkLabel', 'user.login.resetPassword');
  183. $templateMgr->display('common/error.tpl');
  184. } else {
  185. // Reset password
  186. $newPassword = Validation::generatePassword();
  187. if ($user->getAuthId()) {
  188. $authDao = &DAORegistry::getDAO('AuthSourceDAO');
  189. $auth = &$authDao->getPlugin($user->getAuthId());
  190. }
  191. if (isset($auth)) {
  192. $auth->doSetUserPassword($user->getUsername(), $newPassword);
  193. $user->setPassword(Validation::encryptCredentials($user->getUserId(), Validation::generatePassword())); // Used for PW reset hash only
  194. } else {
  195. $user->setPassword(Validation::encryptCredentials($user->getUsername(), $newPassword));
  196. }
  197. $user->setMustChangePassword(1);
  198. $userDao->updateUser($user);
  199. // Send email with new password
  200. $site =& Request::getSite();
  201. $journal =& Request::getJournal();
  202. import('mail.MailTemplate');
  203. $mail =& new MailTemplate('PASSWORD_RESET');
  204. // Set the sender based on the current context
  205. if ($journal) {
  206. $email->setFrom($journal->getSetting('supportEmail'), $journal->getSetting('supportName'));
  207. } else {
  208. $mail->setFrom($site->getSiteContactEmail(), $site->getSiteContactName());
  209. }
  210. $mail->assignParams(array(
  211. 'username' => $user->getUsername(),
  212. 'password' => $newPassword,
  213. 'siteTitle' => $site->getSiteTitle()
  214. ));
  215. $mail->addRecipient($user->getEmail(), $user->getFullName());
  216. $mail->send();
  217. $templateMgr->assign('pageTitle', 'user.login.resetPassword');
  218. $templateMgr->assign('message', 'user.login.lostPassword.passwordSent');
  219. $templateMgr->assign('backLink', Request::url(null, Request::getRequestedPage()));
  220. $templateMgr->assign('backLinkLabel', 'user.login');
  221. $templateMgr->display('common/message.tpl');
  222. }
  223. }
  224. /**
  225. * Display form to change user's password.
  226. * @param $args array first argument may contain user's username
  227. */
  228. function changePassword($args = array()) {
  229. parent::validate();
  230. import('user.form.LoginChangePasswordForm');
  231. $passwordForm = &new LoginChangePasswordForm();
  232. $passwordForm->initData();
  233. if (isset($args[0])) {
  234. $passwordForm->setData('username', $args[0]);
  235. }
  236. $passwordForm->display();
  237. }
  238. /**
  239. * Save user's new password.
  240. */
  241. function savePassword() {
  242. parent::validate();
  243. import('user.form.LoginChangePasswordForm');
  244. $passwordForm = &new LoginChangePasswordForm();
  245. $passwordForm->readInputData();
  246. if ($passwordForm->validate()) {
  247. if ($passwordForm->execute()) {
  248. $user = Validation::login($passwordForm->getData('username'), $passwordForm->getData('password'), $reason);
  249. }
  250. Request::redirect(null, 'user');
  251. } else {
  252. $passwordForm->display();
  253. }
  254. }
  255. }
  256. ?>