'select', '#title' => t('Duration to keep users logged in.'), '#default_value' => variable_get(REMEMBER_ME_SECONDS, 604800), '#options' => $options, '#description' => t('Duration to keep users logged in if they check the "remember me" option on the login form.'), ); return $form; } /** * Implementation of hook_init(). */ function remember_me_init() { global $user; // If we have user logged in, then we have session started. if ($user->uid) { // Get the cookie life time. $cookie_lifetime = ini_get('session.cookie_lifetime'); if ($user->remember_me) { // If we have no cookie life time set already then set it. if (0 == $cookie_lifetime) { _remember_me_set_lifetime(REMEMBER_ME_SECONDS); } } else { // If we have cookie life time set already then unset it. if (0 != $cookie_lifetime) { _remember_me_set_lifetime(0); } } } } /** * remember_me_init() callback helper function. */ function _remember_me_set_lifetime($cookie_lifetime) { // We have session started. // We need to commit it, change php variable, and start session again. session_write_close(); ini_set('session.cookie_lifetime', $cookie_lifetime); // Use remember_me_sess_read() to avoid reloading of user object, 'cos it might be once // more reloaded in some other hook_init(). session_set_save_handler("sess_open", "sess_close", "remember_me_sess_read", "sess_write", "sess_destroy", "sess_gc"); session_start(); } /** * Session handler 'read' callback. */ function remember_me_sess_read() { global $user; static $run = FALSE; if (!$run) { $run = TRUE; return !empty($user->session) ? $user->session : ''; } $args = func_get_args(); return call_user_func_array('sess_read', $args); } /** * Implementation of hook_user(). */ function remember_me_user($type, &$edit, &$user, $category = NULL) { if (NULL === $category && 'login' == $type) { $remember_me = isset($edit['remember_me']) ? $edit['remember_me'] : NULL; if (isset($remember_me)) { if (!$remember_me) { ini_set('session.cookie_lifetime', '0'); } else { ini_set('session.cookie_lifetime', REMEMBER_ME_SECONDS); // ~23 days. This value was } // in base Drupal settings. if ($user->uid) { $user = user_save($user, array('remember_me' => (bool)$remember_me), NULL); } } } } /** * Implementation of hook_form_alter(). */ function remember_me_form_alter($form_id, &$form) { $user_login_forms = array('user_login', 'user_login_block'); if (in_array($form_id, $user_login_forms)) { $form['remember_me'] = array( '#title' => t('Remember me'), '#type' => 'checkbox', '#weight' => 1, ); } }