Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.291
diff -u -p -r1.291 block.module
--- modules/block/block.module	16 Dec 2007 10:30:09 -0000	1.291
+++ modules/block/block.module	17 Dec 2007 01:47:22 -0000
@@ -162,21 +162,27 @@ function block_menu() {
   );
   $default = variable_get('theme_default', 'garland');
   foreach (list_themes() as $key => $theme) {
-    // only show enabled themes
-    if ($theme->status) {
-      $items['admin/build/block/list/'. $key] = array(
-        'title' => check_plain($theme->info['name']),
-        'page arguments' => array($key),
-        'type' => $key == $default ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
-        'weight' => $key == $default ? -10 : 0,
-        'file' => 'block.admin.inc',
-      );
-    }
+    $items['admin/build/block/list/'. $key] = array(
+      'title' => check_plain($theme->info['name']),
+      'page arguments' => array($key),
+      'type' => $key == $default ? MENU_DEFAULT_LOCAL_TASK : MENU_LOCAL_TASK,
+      'weight' => $key == $default ? -10 : 0,
+      'file' => 'block.admin.inc',
+      'access callback' => '_block_themes_access',
+      'access arguments' => array($theme),
+    );
   }
   return $items;
 }
 
 /**
+ * Menu item access callback - only admin or enabled themes can be accessed
+ */
+function _block_themes_access($theme) {
+  return user_access('administer blocks') && ($theme->status || $theme->name == variable_get('admin_theme', '0'));
+}
+
+/**
  * Implementation of hook_block().
  *
  * Generates the administrator-defined blocks for display.
