You are here

remember_me.module in Remember me 5.2

Same filename and directory in other branches
  1. 5 remember_me.module
  2. 6.2 remember_me.module
  3. 7 remember_me.module

Add a "Remember me" checkbox to login forms.

File

remember_me.module
View source
<?php

/**
 * @file
 * Add a "Remember me" checkbox to login forms.
 */

/**
 * Implementation of hook_init().
 */
function remember_me_init() {
  global $user;

  // If we have a user logged in, then we have a session.
  if ($user->uid) {
    if ($user->remember_me && variable_get('remember_me_managed', 0) != 0) {

      // Set lifetime as configured via admin settings.
      if (variable_get('remember_me_lifetime', 604800) != ini_get('session.cookie_lifetime')) {
        _remember_me_set_lifetime(variable_get('remember_me_lifetime', 604800));
      }
    }
    else {
      if (!$user->remember_me) {

        // If we have cookie lifetime set already then unset it.
        if (0 != ini_get('session.cookie_lifetime')) {
          _remember_me_set_lifetime(0);
        }
      }
    }
  }
}

/**
 * remember_me_init() callback helper function.
 */
function _remember_me_set_lifetime($cookie_lifetime) {

  // We have session started.
  // Lets close the session, change php cookie lifetime variable, and start
  // session again.
  // Prevent sess_write from persisting the session object at this time,
  // it will happen on shutdown.
  session_save_session(FALSE);
  session_write_close();
  session_save_session(TRUE);
  ini_set('session.cookie_lifetime', $cookie_lifetime);

  // Use remember_me_sess_read() to avoid reloading of user object, because
  // 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_sid", "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 ($user->uid) {
        $user = user_save($user, array(
          'remember_me' => (bool) $remember_me,
        ), NULL);
      }
    }
    if (variable_get('remember_me_phantom_session', 0)) {
      require_once './' . drupal_get_path('module', 'remember_me') . '/remember_me.inc';
      remember_me_manage_phantom_sessions();
    }
  }
}

/**
 * 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)) {
    require_once './' . drupal_get_path('module', 'remember_me') . '/remember_me.inc';
    remember_me_insert_checkbox($form);
  }
}

/**
 * Implementation of hook_menu().
 */
function remember_me_menu($may_cache) {
  $items = array();
  if ($may_cache) {
    $items[] = array(
      'path' => 'admin/settings/remember_me',
      'title' => t('Remember me settings'),
      'description' => t('Configure settings like session time out for remember_me module.'),
      'callback' => 'drupal_get_form',
      'callback arguments' => array(
        'remember_me_admin_settings',
      ),
      'access' => user_access('administer site configuration'),
      'type' => MENU_NORMAL_ITEM,
    );
    $items[] = array(
      'path' => 'admin/settings/remember_me/users/online',
      'title' => t("'Who's online' settings"),
      'callback' => 'drupal_get_form',
      'callback arguments' => array(
        'remember_me_users_online_form',
      ),
      'access' => user_access('administer site configuration'),
      'type' => MENU_CALLBACK,
    );
  }
  return $items;
}

/**
 * Implementation of hook_help().
 */
function remember_me_help($section) {
  switch ($section) {
    case 'admin/help#remember_me':
      return t('Allows users to have persistent sessions via a checkbox "Remember me" on the login form.');
  }
}

/**
 * Implementation of menu callback
 */
function remember_me_admin_settings() {
  global $user;
  $options = drupal_map_assoc(array(
    3600,
    10800,
    21600,
    43200,
    86400,
    172800,
    259200,
    604800,
    1209600,
    2419200,
  ), 'format_interval');
  $link = l(t('Configure Who\'s online settings'), 'admin/settings/remember_me/users/online', array(
    'title' => t('Who\'s online settings.'),
    'class' => 'remember-me-users-online',
  ), 'destination=admin/settings/remember_me');
  $vars = array(
    'remember' => array(
      '#type' => 'item',
      '#title' => t('Remember me'),
      '#value' => $user->remember_me ? t('Yes') : t('No'),
      '#description' => t("Current user chose at log in."),
    ),
    'session' => array(
      '#type' => 'item',
      '#title' => t('Session lifetime'),
      '#value' => format_interval(ini_get('session.cookie_lifetime')),
      '#description' => t("Currently configured session cookie lifetime."),
    ),
    'activity' => array(
      '#type' => 'item',
      '#title' => t('User activity'),
      '#value' => '<span id="remember-me-timeout">' . format_interval(variable_get('user_block_seconds_online', 900)) . '</span>',
      '#description' => t("Period a user is considered to be online for after they have last viewed a page."),
    ),
  );
  $form['legend'] = array(
    '#type' => 'markup',
    '#value' => theme('remember_me_settings_display', $vars),
  );
  $form['remember_me_phantom_session'] = array(
    '#type' => 'checkbox',
    '#title' => t('Manage phantom sessions'),
    '#default_value' => variable_get('remember_me_phantom_session', 0),
    '#description' => t("Prevent phantom sessions from causing duplicate entries on the Who's online list."),
  );
  $form['user_activity'] = array(
    '#type' => 'item',
    '#value' => $link,
    '#description' => t("Decrease the likelihood of trapping phantom sessions by shortening the Who's online user activity period."),
  );
  $form['remember_me_managed'] = array(
    '#type' => 'checkbox',
    '#title' => t('Manage session lifetime'),
    '#default_value' => variable_get('remember_me_managed', 0),
    '#description' => t('Choose to manually overwrite the configuration value from settings.php.'),
  );
  $form['remember_me_lifetime'] = array(
    '#type' => 'select',
    '#title' => t('Lifetime'),
    '#default_value' => variable_get('remember_me_lifetime', 604800),
    '#options' => $options,
    '#description' => t('Duration a user will be remembered for. This setting is ignored if Manage session lifetime (above) is disabled.'),
  );
  $form['remember_me_checkbox'] = array(
    '#type' => 'checkbox',
    '#title' => t('Remember me field'),
    '#default_value' => variable_get('remember_me_checkbox', 1),
    '#description' => t('Default state of the "Remember me" field on the login forms.'),
  );
  return system_settings_form($form);
}
function theme_remember_me_settings_display($vars) {
  $rows = array();
  foreach ($vars as $var) {
    $desc = $var['#description'];
    unset($var['#description']);
    $output = '<div class="container-inline">' . theme('item', $var) . '</div>';
    $output .= '<div class="description">' . $desc . '</div>';
    $rows[] = $output;
    if (is_array($rows[0])) {
      $rows[1] = array(
        $rows[1],
      );
    }
    else {
      if (sizeof($rows) == 2) {
        $rows = array(
          array(
            'data' => $rows,
            'class' => 'even',
          ),
        );
      }
    }
  }
  return theme('table', array(), $rows);
}

/**
 * Who's online form callback.
 * Extract form from user_block method and add buttons.
 */
function remember_me_users_online_form() {
  $form['conf'] = array();
  $form['conf'] += user_block('configure', 3);
  $form['disp'] = array(
    '#type' => 'fieldset',
    '#title' => t("'Who's online' block preview"),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  );
  $view = user_block('view', 3);
  $form['disp']['items'] = array(
    '#type' => 'markup',
    '#value' => '<div>' . $view['content'] . '</div>',
  );
  return system_settings_form($form);
}

Functions

Namesort descending Description
remember_me_admin_settings Implementation of menu callback
remember_me_form_alter Implementation of hook_form_alter().
remember_me_help Implementation of hook_help().
remember_me_init Implementation of hook_init().
remember_me_menu Implementation of hook_menu().
remember_me_sess_read Session handler 'read' callback.
remember_me_user Implementation of hook_user().
remember_me_users_online_form Who's online form callback. Extract form from user_block method and add buttons.
theme_remember_me_settings_display
_remember_me_set_lifetime remember_me_init() callback helper function.