Open Monograph Press  3.3.0
LoginHandler.inc.php
1 <?php
2 
17 import('classes.handler.Handler');
18 
19 class LoginHandler extends Handler {
23  function authorize($request, &$args, $roleAssignments) {
24  switch ($op = $request->getRequestedOp()) {
25  case 'signInAsUser':
26  import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
27  $this->addPolicy(new RoleBasedHandlerOperationPolicy($request, array(ROLE_ID_MANAGER, ROLE_ID_SITE_ADMIN), array('signInAsUser')));
28  break;
29  }
30  return parent::authorize($request, $args, $roleAssignments);
31  }
32 
37  function index($args, $request) {
38  $this->setupTemplate($request);
39  if (Validation::isLoggedIn()) {
40  $this->sendHome($request);
41  }
42 
43  if (Config::getVar('security', 'force_login_ssl') && $request->getProtocol() != 'https') {
44  // Force SSL connections for login
45  $request->redirectSSL();
46  }
47 
48  $sessionManager = SessionManager::getManager();
49  $session = $sessionManager->getUserSession();
50 
51  $templateMgr = TemplateManager::getManager($request);
52  $templateMgr->assign(array(
53  'loginMessage' => $request->getUserVar('loginMessage'),
54  'username' => $session->getSessionVar('username'),
55  'remember' => $request->getUserVar('remember'),
56  'source' => $request->getUserVar('source'),
57  'showRemember' => Config::getVar('general', 'session_lifetime') > 0,
58  ));
59 
60  // For force_login_ssl with base_url[...]: make sure SSL used for login form
61  $loginUrl = $request->url(null, 'login', 'signIn');
62  if (Config::getVar('security', 'force_login_ssl')) {
63  $loginUrl = PKPString::regexp_replace('/^http:/', 'https:', $loginUrl);
64  }
65  $templateMgr->assign('loginUrl', $loginUrl);
66 
67  $templateMgr->display('frontend/pages/userLogin.tpl');
68  }
69 
74  function _redirectAfterLogin($request) {
75  $context = $this->getTargetContext($request);
76  // If there's a context, send them to the dashboard after login.
77  if ($context && $request->getUserVar('source') == '' && array_intersect(
78  array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_AUTHOR, ROLE_ID_REVIEWER, ROLE_ID_ASSISTANT),
79  (array) $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES)
80  )) {
81  return $request->redirect($context->getPath(), 'dashboard');
82  }
83 
84  $request->redirectHome();
85  }
86 
90  function signIn($args, $request) {
91  $this->setupTemplate($request);
92  if (Validation::isLoggedIn()) $this->sendHome($request);
93 
94  if (Config::getVar('security', 'force_login_ssl') && $request->getProtocol() != 'https') {
95  // Force SSL connections for login
96  $request->redirectSSL();
97  }
98 
99  $user = Validation::login($request->getUserVar('username'), $request->getUserVar('password'), $reason, $request->getUserVar('remember') == null ? false : true);
100  if ($user !== false) {
101  if ($user->getMustChangePassword()) {
102  // User must change their password in order to log in
104  $request->redirect(null, null, 'changePassword', $user->getUsername());
105 
106  } else {
107  $source = $request->getUserVar('source');
108  $redirectNonSsl = Config::getVar('security', 'force_login_ssl') && !Config::getVar('security', 'force_ssl');
109  if (preg_match('#^/\w#', $source) === 1) {
110  $request->redirectUrl($source);
111  }
112  if ($redirectNonSsl) {
113  $request->redirectNonSSL();
114  } else {
115  $this->_redirectAfterLogin($request);
116  }
117  }
118 
119  } else {
120  $sessionManager = SessionManager::getManager();
121  $session = $sessionManager->getUserSession();
122  $templateMgr = TemplateManager::getManager($request);
123  $templateMgr->assign(array(
124  'username' => $request->getUserVar('username'),
125  'remember' => $request->getUserVar('remember'),
126  'source' => $request->getUserVar('source'),
127  'showRemember' => Config::getVar('general', 'session_lifetime') > 0,
128  'error' => $reason===null?'user.login.loginError':($reason===''?'user.login.accountDisabled':'user.login.accountDisabledWithReason'),
129  'reason' => $reason,
130  ));
131  $templateMgr->display('frontend/pages/userLogin.tpl');
132  }
133  }
134 
138  function signOut($args, $request) {
139  $this->setupTemplate($request);
140  if (Validation::isLoggedIn()) {
142  }
143 
144  $source = $request->getUserVar('source');
145  if (isset($source) && !empty($source)) {
146  $request->redirectUrl($request->getProtocol() . '://' . $request->getServerHost() . $source, false);
147  } else {
148  $request->redirect(null, $request->getRequestedPage());
149  }
150  }
151 
155  function lostPassword($args, $request) {
156  $this->setupTemplate($request);
157  $templateMgr = TemplateManager::getManager($request);
158  $templateMgr->display('frontend/pages/userLostPassword.tpl');
159  }
160 
164  function requestResetPassword($args, $request) {
165  $this->setupTemplate($request);
166  $templateMgr = TemplateManager::getManager($request);
167 
168  $email = $request->getUserVar('email');
169  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
170  $user = $userDao->getUserByEmail($email);
171 
172  if ($user == null || ($hash = Validation::generatePasswordResetHash($user->getId())) == false) {
173  $templateMgr->assign('error', 'user.login.lostPassword.invalidUser');
174  $templateMgr->display('frontend/pages/userLostPassword.tpl');
175 
176  } else {
177  // Send email confirming password reset
178  import('lib.pkp.classes.mail.MailTemplate');
179  $mail = new MailTemplate('PASSWORD_RESET_CONFIRM');
180  $site = $request->getSite();
181  $this->_setMailFrom($request, $mail, $site);
182  $mail->assignParams(array(
183  'url' => $request->url(null, 'login', 'resetPassword', $user->getUsername(), array('confirm' => $hash)),
184  'siteTitle' => $site->getLocalizedTitle()
185  ));
186  $mail->addRecipient($user->getEmail(), $user->getFullName());
187  $mail->send();
188 
189  $templateMgr->assign(array(
190  'pageTitle' => 'user.login.resetPassword',
191  'message' => 'user.login.lostPassword.confirmationSent',
192  'backLink' => $request->url(null, $request->getRequestedPage()),
193  'backLinkLabel' => 'user.login',
194  ));
195  $templateMgr->display('frontend/pages/message.tpl');
196  }
197  }
198 
203  function resetPassword($args, $request) {
204  $this->setupTemplate($request);
205 
206  $username = isset($args[0]) ? $args[0] : null;
207  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
208  $confirmHash = $request->getUserVar('confirm');
209 
210  if ($username == null || ($user = $userDao->getByUsername($username)) == null) {
211  $request->redirect(null, null, 'lostPassword');
212  }
213 
214  $templateMgr = TemplateManager::getManager($request);
215 
216  if (!Validation::verifyPasswordResetHash($user->getId(), $confirmHash)) {
217  $templateMgr->assign(array(
218  'errorMsg' => 'user.login.lostPassword.invalidHash',
219  'backLink' => $request->url(null, null, 'lostPassword'),
220  'backLinkLabel' => 'user.login.resetPassword',
221  ));
222  $templateMgr->display('frontend/pages/error.tpl');
223 
224  } else {
225  // Reset password
226  $newPassword = Validation::generatePassword();
227 
228  if ($user->getAuthId()) {
229  $authDao = DAORegistry::getDAO('AuthSourceDAO'); /* @var $authDao AuthSourceDAO */
230  $auth = $authDao->getPlugin($user->getAuthId());
231  }
232 
233  if (isset($auth)) {
234  $auth->doSetUserPassword($user->getUsername(), $newPassword);
235  $user->setPassword(Validation::encryptCredentials($user->getId(), Validation::generatePassword())); // Used for PW reset hash only
236  } else {
237  $user->setPassword(Validation::encryptCredentials($user->getUsername(), $newPassword));
238  }
239 
240  $user->setMustChangePassword(1);
241  $userDao->updateObject($user);
242 
243  // Send email with new password
244  $site = $request->getSite();
245  import('lib.pkp.classes.mail.MailTemplate');
246  $mail = new MailTemplate('PASSWORD_RESET');
247  $this->_setMailFrom($request, $mail, $site);
248  $mail->assignParams(array(
249  'username' => $user->getUsername(),
250  'password' => $newPassword,
251  'siteTitle' => $site->getLocalizedTitle()
252  ));
253  $mail->addRecipient($user->getEmail(), $user->getFullName());
254  if (!$mail->send()) {
255  import('classes.notification.NotificationManager');
256  $notificationMgr = new NotificationManager();
257  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => __('email.compose.error')));
258  }
259 
260  $templateMgr->assign(array(
261  'pageTitle' => 'user.login.resetPassword',
262  'message' => 'user.login.lostPassword.passwordSent',
263  'backLink' => $request->url(null, $request->getRequestedPage()),
264  'backLinkLabel' => 'user.login',
265  ));
266  $templateMgr->display('frontend/pages/message.tpl');
267  }
268  }
269 
274  function changePassword($args, $request) {
275  $this->setupTemplate($request);
276  $templateMgr = TemplateManager::getManager($request);
277  $templateMgr->setupBackendPage();
278  $templateMgr->assign([
279  'pageTitle' => __('user.changePassword'),
280  ]);
281 
282  import('lib.pkp.classes.user.form.LoginChangePasswordForm');
283  $passwordForm = new LoginChangePasswordForm($request->getSite());
284  $passwordForm->initData();
285  if (isset($args[0])) {
286  $passwordForm->setData('username', $args[0]);
287  }
288  $passwordForm->display($request);
289  }
290 
294  function savePassword($args, $request) {
295  $this->setupTemplate($request);
296 
297  import('lib.pkp.classes.user.form.LoginChangePasswordForm');
298 
299  $passwordForm = new LoginChangePasswordForm($request->getSite());
300  $passwordForm->readInputData();
301 
302  if ($passwordForm->validate()) {
303  if ($passwordForm->execute()) {
304  $user = Validation::login($passwordForm->getData('username'), $passwordForm->getData('password'), $reason);
305  }
306  $this->sendHome($request);
307  } else {
308  $passwordForm->display($request);
309  }
310  }
311 
317  function signInAsUser($args, $request) {
318  if (isset($args[0]) && !empty($args[0])) {
319  $userId = (int)$args[0];
320  $session = $request->getSession();
321  if (!Validation::canAdminister($userId, $session->getUserId())) {
322  $this->setupTemplate($request);
323  // We don't have administrative rights
324  // over this user. Display an error.
325  $templateMgr = TemplateManager::getManager($request);
326  $templateMgr->assign(array(
327  'pageTitle' => 'manager.people',
328  'errorMsg' => 'manager.people.noAdministrativeRights',
329  'backLink' => $request->url(null, null, 'people', 'all'),
330  'backLinkLabel' => 'manager.people.allUsers',
331  ));
332  return $templateMgr->display('frontend/pages/error.tpl');
333  }
334 
335  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
336  $newUser = $userDao->getById($userId);
337 
338  if (isset($newUser) && $session->getUserId() != $newUser->getId()) {
339  $session->setSessionVar('signedInAs', $session->getUserId());
340  $session->setSessionVar('userId', $userId);
341  $session->setUserId($userId);
342  $session->setSessionVar('username', $newUser->getUsername());
343  $this->_redirectByURL($request);
344  }
345  }
346 
347  $request->redirect(null, $request->getRequestedPage());
348  }
349 
350 
356  function signOutAsUser($args, $request) {
357  $session = $request->getSession();
358  $signedInAs = $session->getSessionVar('signedInAs');
359 
360  if (isset($signedInAs) && !empty($signedInAs)) {
361  $signedInAs = (int)$signedInAs;
362 
363  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
364  $oldUser = $userDao->getById($signedInAs);
365 
366  $session->unsetSessionVar('signedInAs');
367 
368  if (isset($oldUser)) {
369  $session->setSessionVar('userId', $signedInAs);
370  $session->setUserId($signedInAs);
371  $session->setSessionVar('username', $oldUser->getUsername());
372  }
373  }
374  $this->_redirectByURL($request);
375  }
376 
377 
382  function _redirectByURL($request) {
383  $requestVars = $request->getUserVars();
384  if (isset($requestVars['redirectUrl']) && !empty($requestVars['redirectUrl'])) {
385  $request->redirectUrl($requestVars['redirectUrl']);
386  } else {
387  $this->sendHome($request);
388  }
389  }
390 
391 
399  function _setMailFrom($request, $mail, $site) {
400  $mail->setReplyTo($site->getLocalizedContactEmail(), $site->getLocalizedContactName());
401  return true;
402  }
403 
409  protected function sendHome($request) {
410  if ($request->getContext()) $request->redirect(null, 'submissions');
411  else $request->redirect(null, 'user');
412  }
413 
417  function setupTemplate($request) {
418  AppLocale::requireComponents(LOCALE_COMPONENT_APP_MANAGER, LOCALE_COMPONENT_PKP_MANAGER);
419  parent::setupTemplate($request);
420  }
421 }
422 
423 
LoginHandler\changePassword
changePassword($args, $request)
Definition: LoginHandler.inc.php:274
$op
$op
Definition: lib/pkp/pages/help/index.php:18
SessionManager\getManager
static getManager()
Definition: SessionManager.inc.php:124
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
Validation\encryptCredentials
static encryptCredentials($username, $password, $encryption=false, $legacy=false)
Definition: Validation.inc.php:255
PKPString\regexp_replace
static regexp_replace($pattern, $replacement, $subject, $limit=-1)
Definition: PKPString.inc.php:279
LoginHandler\signInAsUser
signInAsUser($args, $request)
Definition: LoginHandler.inc.php:317
LoginHandler\signOut
signOut($args, $request)
Definition: LoginHandler.inc.php:138
Validation\isLoggedIn
static isLoggedIn()
Definition: Validation.inc.php:376
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
LoginHandler\requestResetPassword
requestResetPassword($args, $request)
Definition: LoginHandler.inc.php:164
LoginHandler\setupTemplate
setupTemplate($request)
Definition: LoginHandler.inc.php:417
Validation\login
static login($username, $password, &$reason, $remember=false)
Definition: Validation.inc.php:26
Validation\logout
static logout()
Definition: Validation.inc.php:146
LoginHandler\lostPassword
lostPassword($args, $request)
Definition: LoginHandler.inc.php:155
Validation\generatePassword
static generatePassword($length=null)
Definition: Validation.inc.php:283
LoginChangePasswordForm
Form to change a user's password in order to login.
Definition: LoginChangePasswordForm.inc.php:18
LoginHandler\resetPassword
resetPassword($args, $request)
Definition: LoginHandler.inc.php:203
MailTemplate
Subclass of Mail for mailing a template email.
Definition: MailTemplate.inc.php:21
LoginHandler
Handle login/logout requests.
Definition: LoginHandler.inc.php:19
LoginHandler\_setMailFrom
_setMailFrom($request, $mail, $site)
Definition: LoginHandler.inc.php:399
LoginHandler\_redirectByURL
_redirectByURL($request)
Definition: LoginHandler.inc.php:382
LoginHandler\signIn
signIn($args, $request)
Definition: LoginHandler.inc.php:90
PKPHandler\getTargetContext
getTargetContext($request, &$contextsCount=null)
Definition: PKPHandler.inc.php:580
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
Validation\verifyPasswordResetHash
static verifyPasswordResetHash($userId, $hash)
Definition: Validation.inc.php:341
LoginHandler\savePassword
savePassword($args, $request)
Definition: LoginHandler.inc.php:294
LoginHandler\_redirectAfterLogin
_redirectAfterLogin($request)
Definition: LoginHandler.inc.php:74
NotificationManager
Definition: NotificationManager.inc.php:19
Validation\generatePasswordResetHash
static generatePasswordResetHash($userId, $expiry=null)
Definition: Validation.inc.php:305
LoginHandler\signOutAsUser
signOutAsUser($args, $request)
Definition: LoginHandler.inc.php:356
RoleBasedHandlerOperationPolicy
Class to control access to handler operations via role based access control.
Definition: RoleBasedHandlerOperationPolicy.inc.php:18
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
Validation\canAdminister
static canAdminister($administeredUserId, $administratorUserId)
Definition: Validation.inc.php:410
LoginHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: LoginHandler.inc.php:23
Handler
Base request handler application class.
Definition: Handler.inc.php:18
LoginHandler\sendHome
sendHome($request)
Definition: LoginHandler.inc.php:409
LoginHandler\index
index($args, $request)
Definition: LoginHandler.inc.php:37