From: skodak <skodak>
Date: Sun, 18 Jan 2009 12:20:55 +0000 (+0000)
Subject: MDL-17942 fixed gc regressions, added gc after deleting users and similar cases
X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=88fdd846f640221e39c65c50f66bb706b7492c25;p=moodle.git

MDL-17942 fixed gc regressions, added gc after deleting users and similar cases
---

diff --git a/admin/auth.php b/admin/auth.php
index 41faab54dd..caed90baeb 100644
--- a/admin/auth.php
+++ b/admin/auth.php
@@ -52,6 +52,7 @@ switch ($action) {
         if ($auth == $CFG->registerauth) {
             set_config('registerauth', '');
         }
+        session_get_instance()->gc(); // remove stale sessions
         break;
 
     case 'enable':
@@ -61,6 +62,7 @@ switch ($action) {
             $authsenabled = array_unique($authsenabled);
             set_config('auth', implode(',', $authsenabled));
         }
+        session_get_instance()->gc(); // remove stale sessions
         break;
 
     case 'down':
diff --git a/admin/user.php b/admin/user.php
index 94c2e98b4b..0ef6cf246f 100644
--- a/admin/user.php
+++ b/admin/user.php
@@ -80,6 +80,7 @@
             } else {
                 notify(get_string('deletednot', '', fullname($user, true)));
             }
+            session_get_instance()->gc(); // remove stale sessions
         }
     } else if ($acl and confirm_sesskey()) {
         if (!has_capability('moodle/user:delete', $sitecontext)) {
diff --git a/admin/user/user_bulk_delete.php b/admin/user/user_bulk_delete.php
index 42fd9858ef..5df513572c 100755
--- a/admin/user/user_bulk_delete.php
+++ b/admin/user/user_bulk_delete.php
@@ -35,6 +35,7 @@ if ($confirm and confirm_sesskey()) {
         }
         $rs->close;
     }
+    session_get_instance()->gc(); // remove stale sessions
     redirect($return, get_string('changessaved'));
 
 } else {
diff --git a/lib/authlib.php b/lib/authlib.php
index 5ea18ed383..164dc3b468 100644
--- a/lib/authlib.php
+++ b/lib/authlib.php
@@ -343,6 +343,10 @@ class auth_plugin_base {
         //override if needed
     }
 
+    function ignore_timeout_hook($userid, $userauth, $sid, $timecreated, $timemodified) {
+        return false;
+    }
+
     /**
      * Return the properly translated human-friendly title of this auth plugin
      */
diff --git a/lib/sessionlib.php b/lib/sessionlib.php
index f6d98842ca..71d2dcf33a 100644
--- a/lib/sessionlib.php
+++ b/lib/sessionlib.php
@@ -413,7 +413,7 @@ class database_session extends session_stub {
             $this->database->delete_records_select('sessions', "userid IN (SELECT id FROM {user} WHERE auth $notplugins)", $params);
 
             /// now get a list of time-out candidates
-            $sql = "SELECT s.*, u.auth
+            $sql = "SELECT s.*, u.auth, u.username
                       FROM {sessions} s
                       JOIN {user} u ON u.id = s.userid
                      WHERE s.timemodified + ? < ?";
@@ -425,9 +425,11 @@ class database_session extends session_stub {
             }
             $records = $this->database->get_records_sql($sql, $params);
             foreach ($records as $record) {
-                foreach ($authplugins as $authplugin) {
-                    if ($authplugin->ignore_timeout($record->userid, $records->auth, $record->timecreated, $record->timemodified)) {
-                        continue;
+                if (!empty($record->userid) and $record->username !== 'guest') { // skips not logged in and guests
+                    foreach ($authplugins as $authplugin) {
+                        if ($authplugin->ignore_timeout_hook($record->userid, $records->auth, $record->sid, $record->timecreated, $record->timemodified)) {
+                            continue;
+                        }
                     }
                 }
                 $this->database->delete_records('sessions', array('id'=>$record->id));
@@ -481,12 +483,18 @@ class database_session extends session_stub {
         // verify timeout
         if ($record->timemodified + $CFG->sessiontimeout < time()) {
             $ignoretimeout = false;
-            $authsequence = get_enabled_auth_plugins(); // auths, in sequence
-            foreach($authsequence as $authname) {
-                $authplugin = get_auth_plugin($authname);
-                if ($authplugin->ignore_timeout($record->userid, $records->auth, $record->timecreated, $record->timemodified)) {
-                    $ignoretimeout = true;
-                    break;
+            if (!empty($record->userid)) { // skips not logged in
+                if ($user = $this->database->get_record('user', array('id'=>$record->userid))) {
+                    if ($user->username !== 'guest') {
+                        $authsequence = get_enabled_auth_plugins(); // auths, in sequence
+                        foreach($authsequence as $authname) {
+                            $authplugin = get_auth_plugin($authname);
+                            if ($authplugin->ignore_timeout_hook($user->id, $user->auth, $record->sid, $record->timecreated, $record->timemodified)) {
+                                $ignoretimeout = true;
+                                break;
+                            }
+                        }
+                    }
                 }
             }
             if ($ignoretimeout) {
diff --git a/user/editadvanced.php b/user/editadvanced.php
index 6236facd73..81c45ffce2 100644
--- a/user/editadvanced.php
+++ b/user/editadvanced.php
@@ -177,6 +177,7 @@
                 redirect("$CFG->wwwroot/user/view.php?id=$USER->id&course=$course->id");
             }            
         } else {
+            session_get_instance()->gc(); // remove stale sessions
             redirect("$CFG->wwwroot/$CFG->admin/user.php");
         }
         //never reached