Index: modules/block/block.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.module,v
retrieving revision 1.262
diff -u -p -r1.262 block.module
--- modules/block/block.module	28 May 2007 06:08:39 -0000	1.262
+++ modules/block/block.module	30 May 2007 01:45:55 -0000
@@ -400,9 +400,11 @@ function block_admin_configure($module =
     '#weight' => -18,
   );
 
+  $edit['module'] = $module;
+  $edit['delta'] = $delta;
 
   // Module-specific block configurations.
-  if ($settings = module_invoke($module, 'block', 'configure', $delta)) {
+  if ($settings = module_invoke($module, 'block', 'configure', $edit)) {
     foreach ($settings as $k => $v) {
       $form['block_settings'][$k] = $v;
     }
@@ -513,7 +515,7 @@ function block_admin_configure_submit($f
     foreach (array_filter($form_values['roles']) as $rid) {
       db_query("INSERT INTO {blocks_roles} (rid, module, delta) VALUES (%d, '%s', '%s')", $rid, $form_values['module'], $form_values['delta']);
     }
-    module_invoke($form_values['module'], 'block', 'save', $form_values['delta'], $form_values);
+    module_invoke($form_values['module'], 'block', 'save', $form_values);
     drupal_set_message(t('The block configuration has been saved.'));
     cache_clear_all();
     $form_state['redirect'] = 'admin/build/block';
@@ -689,17 +691,27 @@ function block_list($region) {
       if (!isset($blocks[$block->region])) {
         $blocks[$block->region] = array();
       }
-      // Use the user's block visibility setting, if necessary
-      if ($block->custom != 0) {
-        if ($user->uid && isset($user->block[$block->module][$block->delta])) {
-          $enabled = $user->block[$block->module][$block->delta];
-        }
-        else {
-          $enabled = ($block->custom == 1);
+      // Allow other modules to influence block visibility.
+      $access = module_invoke_all('block', 'access', (array)$block);
+      if (!empty($access) && is_array($access)) {
+        // If any modules returned FALSE, don't show the block.
+        if (array_search(FALSE, $access)) {
+          $enabled = FALSE;
         }
       }
       else {
-        $enabled = TRUE;
+        // Use the user's block visibility setting, if necessary
+        if ($block->custom != 0) {
+          if ($user->uid && isset($user->block[$block->module][$block->delta])) {
+            $enabled = $user->block[$block->module][$block->delta];
+          }
+          else {
+            $enabled = ($block->custom == 1);
+          }
+        }
+        else {
+          $enabled = TRUE;
+        }
       }
 
       // Match path if necessary
@@ -729,7 +741,7 @@ function block_list($region) {
         // Check the current throttle status and see if block should be displayed
         // based on server load.
         if (!($block->throttle && (module_invoke('throttle', 'status') > 0))) {
-          $array = module_invoke($block->module, 'block', 'view', $block->delta);
+          $array = module_invoke($block->module, 'block', 'view', (array)$block);
           if (isset($array) && is_array($array)) {
             foreach ($array as $k => $v) {
               $block->$k = $v;
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.820
diff -u -p -r1.820 node.module
--- modules/node/node.module	28 May 2007 06:08:43 -0000	1.820
+++ modules/node/node.module	30 May 2007 01:45:58 -0000
@@ -1829,7 +1829,7 @@ function node_admin_search() {
 /**
  * Implementation of hook_block().
  */
-function node_block($op = 'list', $delta = 0) {
+function node_block($op = 'list', $block = array()) {
   if ($op == 'list') {
     $blocks[0]['info'] = t('Syndicate');
     return $blocks;
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.787
diff -u -p -r1.787 user.module
--- modules/user/user.module	28 May 2007 06:08:47 -0000	1.787
+++ modules/user/user.module	30 May 2007 01:46:02 -0000
@@ -556,7 +556,7 @@ function user_login_block() {
 /**
  * Implementation of hook_block().
  */
-function user_block($op = 'list', $delta = 0, $edit = array()) {
+function user_block($op = 'list', $block = array(), $edit = array()) {
   global $user;
 
   if ($op == 'list') {
@@ -567,7 +567,7 @@ function user_block($op = 'list', $delta
 
      return $blocks;
   }
-  else if ($op == 'configure' && $delta == 2) {
+  else if ($op == 'configure' && $block['delta'] == 2) {
     $form['user_block_whois_new_count'] = array(
       '#type' => 'select',
       '#title' => t('Number of users to display'),
@@ -576,24 +576,22 @@ function user_block($op = 'list', $delta
     );
     return $form;
   }
-  else if ($op == 'configure' && $delta == 3) {
+  else if ($op == 'configure' && $block['delta'] == 3) {
     $period = drupal_map_assoc(array(30, 60, 120, 180, 300, 600, 900, 1800, 2700, 3600, 5400, 7200, 10800, 21600, 43200, 86400), 'format_interval');
     $form['user_block_seconds_online'] = array('#type' => 'select', '#title' => t('User activity'), '#default_value' => variable_get('user_block_seconds_online', 900), '#options' => $period, '#description' => t('A user is considered online for this long after they have last viewed a page.'));
     $form['user_block_max_list_count'] = array('#type' => 'select', '#title' => t('User list length'), '#default_value' => variable_get('user_block_max_list_count', 10), '#options' => drupal_map_assoc(array(0, 5, 10, 15, 20, 25, 30, 40, 50, 75, 100)), '#description' => t('Maximum number of currently online users to display.'));
 
     return $form;
   }
-  else if ($op == 'save' && $delta == 2) {
+  else if ($op == 'save' && $block['delta'] == 2) {
     variable_set('user_block_whois_new_count', $edit['user_block_whois_new_count']);
   }
-  else if ($op == 'save' && $delta == 3) {
+  else if ($op == 'save' && $block['delta'] == 3) {
     variable_set('user_block_seconds_online', $edit['user_block_seconds_online']);
     variable_set('user_block_max_list_count', $edit['user_block_max_list_count']);
   }
   else if ($op == 'view') {
-    $block = array();
-
-    switch ($delta) {
+    switch ($block['delta']) {
       case 0:
         // For usability's sake, avoid showing two login forms on one page.
         if (!$user->uid && !(arg(0) == 'user' && !is_numeric(arg(1)))) {
