diff --git a/session_limit.install b/session_limit.install index a953a58..d7c6149 100644 --- a/session_limit.install +++ b/session_limit.install @@ -12,7 +12,20 @@ */ function session_limit_uninstall() { variable_del('session_limit_max'); - variable_del('session_limit_auto_drop'); + variable_del('session_limit_behaviour'); variable_del('session_limit_masquerade_ignore'); db_query('DELETE FROM {variable} WHERE name LIKE "session_limit_rid_%"'); } + +/** + * Implementation of hook_update_N(). + */ +function session_limit_update_6200() { + if (variable_get('session_limit_auto_drop', 0)) { + drupal_load('module', 'session_limit'); + variable_set('session_limit_behaviour', SESSION_LIMIT_DROP); + } + variable_del('session_limit_auto_drop'); + + return array(); +} diff --git a/session_limit.module b/session_limit.module index 23b2222..c3e87fc 100644 --- a/session_limit.module +++ b/session_limit.module @@ -6,6 +6,21 @@ */ /** + * Do nothing if the session limit is exceeded. + */ +define('SESSION_LIMIT_DO_NOTHING', 0); + +/** + * Automatically drop sessions that would exceed the limit. + */ +define('SESSION_LIMIT_DROP', 1); + +/** + * Disallow sessions that would exceed the limit. + */ +define('SESSION_LIMIT_DISALLOW_NEW', 2); + +/** * Implementation of hook_help(). */ function session_limit_help($path, $args) { @@ -99,10 +114,16 @@ function session_limit_settings() { '#maxlength' => 3, '#description' => t('The maximum number of active sessions a user can have. 0 implies unlimited sessions.') ); - $form['session_limit_auto_drop'] = array( - '#type' => 'checkbox', - '#title' => t('Automatically drop the oldest sessions without prompting.'), - '#default_value' => variable_get('session_limit_auto_drop', 0) + $limit_behaviours = array( + SESSION_LIMIT_DO_NOTHING => t('Do nothing.'), + SESSION_LIMIT_DROP => t('Automatically drop the oldest sessions without prompting.'), + SESSION_LIMIT_DISALLOW_NEW => t('Prevent new session.'), + ); + $form['session_limit_behaviour'] = array( + '#type' => 'radios', + '#title' => t('When the session limit is exceeded'), + '#default_value' => variable_get('session_limit_behaviour', SESSION_LIMIT_DO_NOTHING), + '#options' => $limit_behaviours, ); if (module_exists('masquerade')) { $form['session_limit_masquerade_ignore'] = array( @@ -311,7 +332,7 @@ function session_limit_user_settings_submit($form, &$form_state) { function session_limit_page() { global $user; - if (variable_get('session_limit_auto_drop', 0)) { + if (variable_get('session_limit_behaviour', SESSION_LIMIT_DO_NOTHING) == SESSION_LIMIT_DROP) { // Get the oldest sessions. $count = db_result(db_query("SELECT COUNT(sid) FROM {sessions} WHERE uid = %d", $user->uid)); $max_sessions = $count - session_limit_user_max_sessions($user); @@ -323,6 +344,12 @@ function session_limit_page() { drupal_goto(); } + else if (variable_get('session_limit_behaviour', SESSION_LIMIT_DO_NOTHING) == SESSION_LIMIT_DISALLOW_NEW) { + session_destroy(); + $user = drupal_anonymous_user(); + + return; + } $result = db_query('SELECT * FROM {sessions} WHERE uid = %d', $user->uid); while ($obj = db_fetch_object($result)) {