=== modified file 'includes/bootstrap.inc'
--- includes/bootstrap.inc	2007-12-20 08:20:58 +0000
+++ includes/bootstrap.inc	2007-12-23 02:05:49 +0000
@@ -751,8 +751,11 @@ function watchdog($type, $message, $vari
  *   - 'status'
  *   - 'warning'
  *   - 'error'
+ * @param $repeat
+ *   If this is FALSE and the message is already set, then the message won't
+ *   be repeated.
  */
-function drupal_set_message($message = NULL, $type = 'status') {
+function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
   if ($message) {
     if (!isset($_SESSION['messages'])) {
       $_SESSION['messages'] = array();
@@ -762,7 +765,9 @@ function drupal_set_message($message = N
       $_SESSION['messages'][$type] = array();
     }
 
-    $_SESSION['messages'][$type][] = $message;
+    if ($repeat || !in_array($message, $messages[$type])) {
+      $_SESSION['messages'][$type][] = $message;
+    }
   }
 
   // messages not set when DB connection fails

=== modified file 'includes/menu.inc'
--- includes/menu.inc	2007-12-22 23:24:24 +0000
+++ includes/menu.inc	2007-12-23 02:12:00 +0000
@@ -333,8 +333,12 @@ function menu_get_item($path = NULL, $ro
  * Execute the page callback associated with the current path
  */
 function menu_execute_active_handler($path = NULL) {
-  if (_menu_site_is_offline()) {
-    return MENU_SITE_OFFLINE;
+  if ($return = _menu_site_is_offline()) {
+    if ($return === TRUE) {
+      return MENU_SITE_OFFLINE;
+    }
+    // The function might return 'logout', let's use that.
+    $path = $return;
   }
   if ($router_item = menu_get_item($path)) {
     if ($router_item['access']) {
@@ -2228,26 +2232,27 @@ function menu_path_is_external($path) {
 }
 
 /**
- * Returns TRUE if the site is off-line for maintenance.
+ * Checks whether the site is off-line for maintenance.
+ *
+ * @return
+ *   FALSE if the site is not off-line or its the login page or the user has
+ *     'administer site configuration' permission.
+ *   'logout' if an unprivileged user is logged in,
+ *   TRUE for anonymous users not on the login page if the site is off-line.
  */
 function _menu_site_is_offline() {
   // Check if site is set to off-line mode.
   if (variable_get('site_offline', 0)) {
     // Check if the user has administration privileges.
-    if (!user_access('administer site configuration')) {
-      // Check if this is an attempt to login.
-      if (drupal_get_normal_path($_GET['q']) != 'user') {
-        return TRUE;
-      }
-    }
-    else {
-      $offline_message = t('Operating in off-line mode.');
-      $messages = drupal_set_message();
+    if (user_access('administer site configuration')) {
       // Ensure that the off-line message is displayed only once [allowing for
       // page redirects].
-      if (!isset($messages) || !isset($messages['status']) || !in_array($offline_message, $messages['status'])) {
-        drupal_set_message($offline_message);
-      }
+      drupal_set_message(t('Operating in off-line mode.'), 'status', FALSE);
+    }
+    else {
+      // Anonymous users get a FALSE at the login prompt, TRUE otherwise.
+      // Logged in users are unprivileged here, so they are logged out.
+      return user_is_anonymous() ? ($_GET['q'] != 'user' && $_GET['q'] != 'user/login') : 'logout';
     }
   }
   return FALSE;

