diff --git a/dictionaries/login.definition.json b/dictionaries/login.definition.json index 1acb64e1063b3695bcebcdb3517cb3f3659119ec..dcb4ea20a96338ab2ca5b9bff2de428b513c067d 100644 --- a/dictionaries/login.definition.json +++ b/dictionaries/login.definition.json @@ -58,5 +58,8 @@ }, "remember_username": { "en": "Remember my username" - } + }, + "remember_me": { + "en": "Remember me" + } } diff --git a/modules/core/lib/Auth/UserPassBase.php b/modules/core/lib/Auth/UserPassBase.php index d9c0b7196f30312b504cc9f808fe28f895e9d657..d8dc3eff3ccb578de3fd2c873bd13353a57d01ac 100644 --- a/modules/core/lib/Auth/UserPassBase.php +++ b/modules/core/lib/Auth/UserPassBase.php @@ -55,6 +55,23 @@ abstract class sspmod_core_Auth_UserPassBase extends SimpleSAML_Auth_Source { */ protected $rememberUsernameChecked = FALSE; + /** + * Storage for general config option session.rememberme.enable. + * loginuserpass.php page/template uses this option to present + * users with a checkbox to keep their session alive across + * different browser sessions (that is, closing and opening the + * browser again). + * @var bool + */ + protected $rememberMeEnabled = FALSE; + + /** + * Storage for general config option session.rememberme.checked. + * loginuserpass.php page/template uses this option to default + * the "remember me" checkbox to checked or not. + * @var bool + */ + protected $rememberMeChecked = FALSE; /** * Constructor for this authentication source. @@ -85,6 +102,11 @@ abstract class sspmod_core_Auth_UserPassBase extends SimpleSAML_Auth_Source { $this->rememberUsernameChecked = (bool) $config['remember.username.checked']; unset($config['remember.username.checked']); } + + // get the "remember me" config options + $sspcnf = SimpleSAML_Configuration::getInstance(); + $this->rememberMeEnabled = $sspcnf->getBoolean('session.rememberme.enable', FALSE); + $this->rememberMeChecked = $sspcnf->getBoolean('session.rememberme.checked', FALSE); } @@ -121,6 +143,21 @@ abstract class sspmod_core_Auth_UserPassBase extends SimpleSAML_Auth_Source { return $this->rememberUsernameChecked; } + /** + * Check if the "remember me" feature is enabled. + * @return bool TRUE if enabled, FALSE otherwise. + */ + public function isRememberMeEnabled() { + return $this->rememberMeEnabled; + } + + /** + * Check if the "remember me" checkbox should be checked. + * @return bool TRUE if enabled, FALSE otherwise. + */ + public function isRememberMeChecked() { + return $this->rememberMeChecked; + } /** * Initialize login. diff --git a/modules/core/templates/loginuserpass.php b/modules/core/templates/loginuserpass.php index 7b0cae6f9d80329bcf89493fb917990d8e26a707..98a778a4f26c0444174f7e420a3cced3adc5aa85 100644 --- a/modules/core/templates/loginuserpass.php +++ b/modules/core/templates/loginuserpass.php @@ -40,44 +40,52 @@ if ($this->data['forceUsername']) { } ?> </td> -<?php -if ($this->data['rememberUsernameEnabled']) { - $rowspan = 1; -} elseif (array_key_exists('organizations', $this->data)) { - $rowspan = 3; -} else { - $rowspan = 2; -} -?> - <td style="padding: .4em;" rowspan="<?php echo $rowspan; ?>"> -<?php -if ($this->data['rememberUsernameEnabled']) { - echo str_repeat("\t", 4); - echo '<input type="checkbox" id="remember_username" tabindex="4" name="remember_username" value="Yes" '; - echo ($this->data['rememberUsernameChecked'] ? 'checked="Yes" /> ' : '/> '); - echo $this->t('{login:remember_username}'); -} else { - $text = $this->t('{login:login_button}'); - echo str_repeat("\t", 4); - echo "<input type=\"submit\" tabindex=\"4\" id=\"regularsubmit\" value=\"{$text}\" />"; -} -?> +<?php +if ($this->data['rememberUsernameEnabled'] || $this->data['rememberMeEnabled']) { + $rowspan = 1; +} elseif (array_key_exists('organizations', $this->data)) { + $rowspan = 3; +} else { + $rowspan = 2; +} +?> + <td style="padding: .4em;" rowspan="<?php echo $rowspan; ?>"> +<?php +if ($this->data['rememberUsernameEnabled'] || $this->data['rememberMeEnabled']) { + if ($this->data['rememberUsernameEnabled']) { + echo str_repeat("\t", 4); + echo '<input type="checkbox" id="remember_username" tabindex="4" name="remember_username" value="Yes" '; + echo ($this->data['rememberUsernameChecked'] ? 'checked="Yes" /> ' : '/> '); + echo $this->t('{login:remember_username}'); + } + if ($this->data['rememberMeEnabled']) { + echo str_repeat("\t", 4); + echo '<input type="checkbox" id="remember_me" tabindex="4" name="remember_me" value="Yes" '; + echo $this->data['rememberMeChecked'] ? 'checked="Yes" /> ' : '/> '; + echo $this->t('{login:remember_me}'); + } +} else { + $text = $this->t('{login:login_button}'); + echo str_repeat("\t", 4); + echo "<input type=\"submit\" tabindex=\"4\" id=\"regularsubmit\" value=\"{$text}\" />"; +} +?> </td> </tr> <tr> <td style="padding: .3em;"><?php echo $this->t('{login:password}'); ?></td> <td><input id="password" type="password" tabindex="2" name="password" /></td> -<?php -// Move submit button to next row if remember checkbox enabled -if ($this->data['rememberUsernameEnabled']) { - $rowspan = (array_key_exists('organizations', $this->data) ? 2 : 1); -?> - <td style="padding: .4em;" rowspan="<?php echo $rowspan; ?>"> - <input type="submit" tabindex="5" id="regularsubmit" value="<?php echo $this->t('{login:login_button}'); ?>" /> - </td> -<?php -} -?> +<?php +// Move submit button to next row if remember checkbox enabled +if ($this->data['rememberUsernameEnabled'] || $this->data['rememberMeEnabled']) { + $rowspan = (array_key_exists('organizations', $this->data) ? 2 : 1); +?> + <td style="padding: .4em;" rowspan="<?php echo $rowspan; ?>"> + <input type="submit" tabindex="5" id="regularsubmit" value="<?php echo $this->t('{login:login_button}'); ?>" /> + </td> +<?php +} +?> </tr> <?php diff --git a/modules/core/www/loginuserpass.php b/modules/core/www/loginuserpass.php index 6a2dc9718dddecc29907389bf145d65da67fb3cb..c6251148e5ac42ad4f1c9ba6cb24a5a5691078e8 100644 --- a/modules/core/www/loginuserpass.php +++ b/modules/core/www/loginuserpass.php @@ -65,6 +65,13 @@ if (!empty($_REQUEST['username']) || !empty($password)) { SimpleSAML_Utilities::setCookie($source->getAuthId() . '-username', $username, $params, FALSE); } + if ($source->isRememberMeEnabled()) { + if (array_key_exists('remember_me', $_REQUEST) && $_REQUEST['remember_me'] === 'Yes') { + $state['RememberMe'] = TRUE; + $authStateId = SimpleSAML_Auth_State::saveState($state, sspmod_core_Auth_UserPassBase::STAGEID); + } + } + try { sspmod_core_Auth_UserPassBase::handleLogin($authStateId, $username, $password); } catch (SimpleSAML_Error_Error $e) { @@ -82,11 +89,15 @@ if (array_key_exists('forcedUsername', $state)) { $t->data['forceUsername'] = TRUE; $t->data['rememberUsernameEnabled'] = FALSE; $t->data['rememberUsernameChecked'] = FALSE; + $t->data['rememberMeEnabled'] = $source->isRememberMeEnabled(); + $t->data['rememberMeChecked'] = $source->isRememberMeChecked(); } else { $t->data['username'] = $username; $t->data['forceUsername'] = FALSE; $t->data['rememberUsernameEnabled'] = $source->getRememberUsernameEnabled(); $t->data['rememberUsernameChecked'] = $source->getRememberUsernameChecked(); + $t->data['rememberMeEnabled'] = $source->isRememberMeEnabled(); + $t->data['rememberMeChecked'] = $source->isRememberMeChecked(); if (isset($_COOKIE[$source->getAuthId() . '-username'])) $t->data['rememberUsernameChecked'] = TRUE; } $t->data['links'] = $source->getLoginLinks();