Mimics hook_node_grants_alter() and traces what each module does with it.

Parameters

object $grants: An indexed array of grant records, augmented by the '#module' key, as created by _devel_node_access_module_invoke_all('node_grants'). This array is updated by the hook_node_grants_alter() implementations.

$node: The node that the grant records belong to.

Return value

A tree representation of the grant records in $grants including their history: $data[$realm][$gid]

  • ['cur']: TRUE or FALSE whether the gid is present or not
  • ['ori'][]: An array of module names that contributed this grant (if any)
  • ['chg'][]: An array of changes, such as
    • 'added' if module name is a prefix if the $realm,
    • 'added by module' otherwise, or
    • 'removed by module'

File

./devel_node_access.module, line 478
Functions for debugging node access permissions.

Code

function _devel_node_access_ng_alter(&$grants, $account, $op) {

  //dpm($grants, '_devel_node_access_ng_alter(): grants IN');
  $dummy = array();
  drupal_alter('node_grants', $dummy, $account, $op);
  static $drupal_static = array();
  isset($drupal_static['drupal_alter']) || ($drupal_static['drupal_alter'] =& drupal_static('drupal_alter'));
  $functions = $drupal_static['drupal_alter'];

  // Build the initial structure.
  $data = array();
  foreach ($grants as $realm => $gids) {
    foreach ($gids as $i => $gid) {
      if ($i !== '#module') {
        $data[$realm][$gid]['cur'] = TRUE;
        $data[$realm][$gid]['ori'][] = $gids['#module'];
      }
    }
    unset($grants[$realm]['#module']);
  }

  // Simulate drupal_alter('node_grants', $grants, $account, $op);
  foreach ($functions['node_grants'] as $function) {

    // Call hook_node_grants_alter() for one module at a time and analyze.
    $function($grants, $account, $op);

    // <==
    $module = substr($function, 0, strlen($function) - 18);

    // Check for new gids.
    foreach ($grants as $realm => $gids) {
      foreach ($gids as $i => $gid) {
        if (empty($data[$realm][$gid]['cur'])) {
          $data[$realm][$gid]['cur'] = TRUE;
          $data[$realm][$gid]['chg'][] = 'added by ' . $module;
        }
      }
    }

    // Check for removed gids.
    foreach ($data as $realm => $gids) {
      foreach ($gids as $gid => $history) {
        if ($history['cur'] && array_search($gid, $grants[$realm]) === FALSE) {
          $data[$realm][$gid]['cur'] = FALSE;
          $data[$realm][$gid]['chg'][] = 'removed by ' . $module;
        }
      }
    }
  }

  //dpm($data, '_devel_node_access_ng_alter() returns');

  //dpm($grants, '_devel_node_access_ng_alter(): grants OUT');
  return $data;
}