'Nodeaccess', 'description' => 'Change default settings for the Nodeaccess module.', 'page callback' => 'nodeaccess_admin', 'file' => 'nodeaccess.admin.inc', 'access arguments' => array('administer nodeaccess'), ); $items['node/%node/grant'] = array( 'title' => 'Grant', 'page callback' => 'nodeaccess_grant_tab', 'page arguments' => array(1), 'access callback' => 'nodeaccess_access', 'access arguments' => array('grant', 1), 'weight' => 5, 'type' => MENU_LOCAL_TASK, ); return $items; } /** * Implements hook_admin_paths(). * * @return array */ function nodeaccess_admin_paths() { $paths = array( 'node/*/grant' => TRUE, 'admin/config/people/nodeaccess' => TRUE, ); return $paths; } /** * Implements hook_permission(). * * @return array */ function nodeaccess_permission() { return array( 'administer nodeaccess' => array( 'title' => t('Administer Nodeaccess'), ), 'grant node permissions' => array( 'title' => t('Grant Node Permissions'), ), 'grant editable node permissions' => array( 'title' => t('Grant node edit permissions'), ), 'grant deletable node permissions' => array( 'title' => t('Grant node delete permissions'), ), 'grant own node permissions' => array( 'title' => t('Grant own node permissions'), ), ); } /** * Implements hook_node_access(). * * @param $node * @param $op * @param $account * * @return string */ function nodeaccess_node_access($node, $op, $account) { switch ($op) { case 'update': case 'delete': if (!isset($account->uid)) { global $user; $account = $user; } // If the node belongs to a deleted user. if ($account->uid == 0 && $node->uid == 0) { $grants = nodeaccess_get_grants($node); // We check if the role has particular access to this node. // If anonymous has rights to this node, we allow them. if ((!empty($grants['rid'][DRUPAL_ANONYMOUS_RID]['grant_update']) && $op == 'update') || (!empty($grants['rid'][DRUPAL_ANONYMOUS_RID]['grant_delete']) && $op == 'delete')) { return NODE_ACCESS_ALLOW; } return NODE_ACCESS_DENY; } break; } } /** * Determine access to Grant tab. * * @param $op * @param $node * @param $account * * @return bool * Whether the user has access to the grant tab. */ function nodeaccess_access($op, $node, $account = NULL) { global $user; if (!$node) { return FALSE; } // Apparently D7 no longer defaults to admin getting anything? if (user_access('administer nodeaccess')) { return TRUE; } // If no user object is supplied, the access check is for the current user. if (empty($account)) { $account = $user; } $allowed_types = variable_get('nodeaccess-types', array()); if ($op == 'grant') { if ($node->nid && isset($allowed_types[$node->type]) && !empty($allowed_types[$node->type]) && (user_access('grant node permissions', $account) || (user_access('grant editable node permissions', $account) && node_access('update', $node, $account)) || (user_access('grant deletable node permissions', $account) && node_access('delete', $node, $account)) || (user_access('grant own node permissions', $account) && ($account->uid == $node->uid)))) { return TRUE; } } return FALSE; } /** * Implements hook_theme(). * * @param $existing * @param $type * @param $theme * @param $path * * @return array */ function nodeaccess_theme($existing, $type, $theme, $path) { return array( 'nodeaccess_admin_form_roles' => array( 'render element' => 'form', ), 'nodeaccess_admin_form_types' => array( 'render element' => 'form', ), 'nodeaccess_grants_form' => array( 'render element' => 'form', ), ); } /** * Menu callback. Draws the grant tab. * * @param Object $node * * @return array * Form array. */ function nodeaccess_grant_tab($node) { return drupal_get_form('nodeaccess_grants_form', $node); } /** * Menu callback. Draws the grant tab. * * @param $form * @param $form_state * @param $node * * @return mixed */ function nodeaccess_grants_form($form, &$form_state, $node) { if (isset($form_state['values'])) { $form_values = $form_state['values']; } if (!isset($form_values)) { $form_values = array(); $grants = nodeaccess_get_grants($node); $form_values['rid'] = isset($grants['rid']) ? $grants['rid'] : array(); $form_values['uid'] = isset($grants['uid']) ? $grants['uid'] : array(); } elseif ($form_values['keys']) { $name = preg_replace('!\*+!', '%', $form_values['keys']); $query = db_select('users', 'u') ->fields('u', array('uid', 'name')) ->condition('name', $name, "LIKE"); if (isset($form_values['uid']) && count($form_values['uid'])) { $uid = array_keys($form_values['uid']); $query->condition('uid', $uid, 'NOT IN'); } $result = $query->execute(); while ($account = $result->fetch()) { $form_values['uid'][$account->uid] = array( 'name' => $account->name, 'keep' => 1, 'grant_view' => isset($form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_view']) ? $form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_view'] : 0, 'grant_update' => isset($form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_update']) ? $form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_update'] : 0, 'grant_delete' => isset($form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_delete']) ? $form_values['rid'][DRUPAL_AUTHENTICATED_RID]['grant_delete'] : 0, ); } } if (!isset($form_values['rid'])) { $form_values['rid'] = array(); } if (!isset($form_values['uid'])) { $form_values['uid'] = array(); } $roles = $form_values['rid']; $users = $form_values['uid']; $form['nid'] = array( '#type' => 'hidden', '#value' => $node->nid, ); $allowed_roles = variable_get('nodeaccess-roles', array()); $allowed_grants = variable_get('nodeaccess-grants', array()); // If $preserve is TRUE, the fields the user is not allowed to view or // edit are included in the form as hidden fields to preserve them. $preserve = variable_get('nodeaccess-preserve', 1); // Roles table. if (is_array($roles)) { $form['rid'] = array('#tree' => TRUE); foreach ($roles as $key => $field) { if (isset($allowed_roles[$key]) && $allowed_roles[$key]) { $form['rid'][$key]['name'] = array( '#type' => 'hidden', '#value' => $field['name'], ); if ($allowed_grants['view']) { $form['rid'][$key]['grant_view'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_view'], ); } elseif ($preserve) { $form['rid'][$key]['grant_view'] = array( '#type' => 'hidden', '#value' => $field['grant_view'], ); } if ($allowed_grants['edit']) { $form['rid'][$key]['grant_update'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_update'], ); } elseif ($preserve) { $form['rid'][$key]['grant_update'] = array( '#type' => 'hidden', '#value' => $field['grant_update'], ); } if ($allowed_grants['delete']) { $form['rid'][$key]['grant_delete'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_delete'], ); } elseif ($preserve) { $form['rid'][$key]['grant_delete'] = array( '#type' => 'hidden', '#value' => $field['grant_delete'], ); } } elseif ($preserve) { $form['rid'][$key]['name'] = array( '#type' => 'hidden', '#value' => $field['name'], ); $form['rid'][$key]['grant_view'] = array( '#type' => 'hidden', '#value' => $field['grant_view'], ); $form['rid'][$key]['grant_update'] = array( '#type' => 'hidden', '#value' => $field['grant_update'], ); $form['rid'][$key]['grant_delete'] = array( '#type' => 'hidden', '#value' => $field['grant_delete'], ); } } } // Users table. if (is_array($users)) { $form['uid'] = array('#tree' => TRUE); foreach ($users as $key => $field) { $form['uid'][$key]['name'] = array( '#type' => 'hidden', '#value' => $field['name'], ); $form['uid'][$key]['keep'] = array( '#type' => 'checkbox', '#default_value' => $field['keep'], ); if ($allowed_grants['view']) { $form['uid'][$key]['grant_view'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_view'], ); } elseif ($preserve) { $form['uid'][$key]['grant_view'] = array( '#type' => 'hidden', '#value' => $field['grant_view'], ); } if ($allowed_grants['edit']) { $form['uid'][$key]['grant_update'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_update'], ); } elseif ($preserve) { $form['uid'][$key]['grant_update'] = array( '#type' => 'hidden', '#value' => $field['grant_update'], ); } if ($allowed_grants['delete']) { $form['uid'][$key]['grant_delete'] = array( '#type' => 'checkbox', '#default_value' => $field['grant_delete'], ); } elseif ($preserve) { $form['uid'][$key]['grant_delete'] = array( '#type' => 'hidden', '#value' => $field['grant_delete'], ); } } } // Autocomplete returns errors if users don't have access to profiles. if (user_access('access user profiles')) { $form['keys'] = array( '#type' => 'textfield', '#default_value' => isset($form_values['keys']) ? $form_values['keys'] : '', '#size' => 40, '#autocomplete_path' => 'user/autocomplete', ); } else { $form['keys'] = array( '#type' => 'textfield', '#default_value' => isset($form_values['keys'])? $form_values['keys'] : '', '#size' => 40, ); } $form['search'] = array( '#type' => 'submit', '#value' => t('Search'), ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Save Grants'), ); return $form; } /** * Validate function for nodeaccess_grants_form. * * @param array $form * @param array &$form_state */ function nodeaccess_grants_form_validate($form, &$form_state) { $form_values = &$form_state['values']; // Delete unkept users. if (isset($form_values['uid']) && is_array($form_values['uid'])) { foreach ($form_values['uid'] as $uid => $row) { if (!$row['keep']) { unset($form_values['uid'][$uid]); } } } if (!isset($form_values['uid'])) { unset($form_values['uid']); } } /** * Submit function for nodeaccess_grants_form. * * @param array $form * @param array &$form_state */ function nodeaccess_grants_form_submit($form, &$form_state) { if ($form_state['clicked_button']['#id'] == 'edit-search') { $form_state['rebuild'] = TRUE; $form_state['storage']['values'] = $form_state['values']; } else { unset($form_state['rebuild']); _nodeaccess_grants_form_submit($form, $form_state); drupal_set_message(t('Grants saved.')); } } /** * Private function to submit the per-node grants table. * * @param array $form * @param array &$form_state */ function _nodeaccess_grants_form_submit($form, &$form_state) { $form_values = &$form_state['values']; $grants = array(); $nid = $form_values['nid']; $node = node_load($nid); foreach (array('uid', 'rid') as $type) { $realm = 'nodeaccess_' . $type; if (isset($form_values[$type]) && is_array($form_values[$type])) { foreach ($form_values[$type] as $gid => $line) { $grant = array( 'gid' => $gid, 'realm' => $realm, 'grant_view' => empty($line['grant_view']) ? 0 : 1, 'grant_update' => empty($line['grant_update']) ? 0 : 1, 'grant_delete' => empty($line['grant_delete']) ? 0 : 1, ); $grants[] = $grant; } } } nodeaccess_set_grants($node, $grants); } /** * Theme function for nodeaccess_grants_form. * * @param array $vars * * @return string */ function theme_nodeaccess_grants_form($vars) { $output = ''; $form = $vars['form']; $rows = array(); $allowed_roles = variable_get('nodeaccess-roles', array()); $allowed_grants = variable_get('nodeaccess-grants', array()); // Retrieve role names for columns. $role_names = user_roles(); $role_aliases = nodeaccess_get_role_aliases(); // Replace names with aliases. foreach ($role_names as $rid => $name) { if (isset($role_aliases[$rid]['alias'])) { $role_names[$rid] = $role_aliases[$rid]['alias']; } } // Roles table. $roles = element_children($form['rid']); if (count($roles) && count($allowed_roles)) { $header = array(); $header[] = t('Role'); if ($allowed_grants['view']) { $header[] = t('View'); } if ($allowed_grants['edit']) { $header[] = t('Edit'); } if ($allowed_grants['delete']) { $header[] = t('Delete'); } foreach ($roles as $key) { if (isset($allowed_roles[$key]) && $allowed_roles[$key]) { $row = array(); $row[] = $role_names[$key] . drupal_render($form['rid'][$key]['name']); if ($allowed_grants['view']) { $row[] = drupal_render($form['rid'][$key]['grant_view']); } if ($allowed_grants['edit']) { $row[] = drupal_render($form['rid'][$key]['grant_update']); } if ($allowed_grants['delete']) { $row[] = drupal_render($form['rid'][$key]['grant_delete']); } $rows[] = $row; } } $output .= theme('table', array('header' => $header, 'rows' => $rows)); } // Search form. $output .= '

'; $output .= '' . t('Enter names to search for users:') . ''; $output .= '
'; $output .= drupal_render($form['keys']); $output .= drupal_render($form['search']); $output .= '

'; // Users table. unset($rows); $users = element_children($form['uid']); if (count($users) > 0) { $header = array(); $rows = array(); $header[] = t('User'); $header[] = t('Keep?'); if ($allowed_grants['view']) { $header[] = t('View'); } if ($allowed_grants['edit']) { $header[] = t('Edit'); } if ($allowed_grants['delete']) { $header[] = t('Delete'); } foreach ($users as $key) { $row = array(); $row[] = $form['uid'][$key]['name']['#value']; $row[] = drupal_render($form['uid'][$key]['keep']); if ($allowed_grants['view']) { $row[] = drupal_render($form['uid'][$key]['grant_view']); } if ($allowed_grants['edit']) { $row[] = drupal_render($form['uid'][$key]['grant_update']); } if ($allowed_grants['delete']) { $row[] = drupal_render($form['uid'][$key]['grant_delete']); } $rows[] = $row; } $output .= theme('table', array('header' => $header, 'rows' => $rows)); } $output .= drupal_render_children($form); return $output; } /** * Implements hook_node_grants(). * * @param Object $account * @parap string $op * * @return array */ function nodeaccess_node_grants($account, $op) { $roles = is_array($account->roles) ? array_keys($account->roles) : array(-1); return array( 'nodeaccess_rid' => $roles, 'nodeaccess_uid' => array($account->uid), 'nodeaccess_author' => array($account->uid), ); } /** * Implements hook_node_update(). * * @param Object $node */ function nodeaccess_node_update($node) { if (module_exists('user_reference')) { $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); foreach (array_keys($fields) as $field_name) { if (isset($node->$field_name)) { $old_node = node_load($node->nid); // Delete the old user as it's changed. if ($node->$field_name != $old_node->$field_name) { nodeaccess_delete_user_reference($old_node); nodeaccess_insert_user_reference($node); } break; } } } // Done, author permissions are not written into nodeaccess. } /** * Implements hook_node_delete(). * * @param Object $node */ function nodeaccess_node_delete($node) { // Deleting node, delete related permissions. nodeaccess_delete_grants($node); } /** * Implements hook_node_access_records(). * * @param Object $node * * @return array|NULL */ function nodeaccess_node_access_records($node) { if (nodeaccess_disabling() || !$node->status) { return NULL; } // Need to find out if node has own grants or whether to use defaults. $default = variable_get('nodeaccess_' . $node->type, array()); // Setup default keys that are required by node_access_write_grants(). $grant_defaults = array( 'gid' => 0, 'realm' => 'nodeaccess_rid', 'grant_view' => 0, 'grant_update' => 0, 'grant_delete' => 0, 'priority' => variable_get('nodeaccess-priority', 0), ); $query = db_select('nodeaccess', 'n') ->fields('n', array('gid', 'realm', 'grant_view', 'grant_update', 'grant_delete')) ->condition('nid', $node->nid, '='); $result = $query->execute(); if (!$result->rowCount()) { // Node has no own grants, use defaults. $grants = $default; } else { // Node has own grants, use them. $grants = array(); while ($row = $result->fetchAssoc()) { $grants[] = $row; } } // Apply author grants. $author_prefs = variable_get('nodeaccess_authors', array()); // Array is pre-populated with grant values. $grant = $author_prefs[$node->type]; $grant['gid'] = $node->uid; $grant['realm'] = 'nodeaccess_author'; // Include author grant even with all values FALSE, it may be // needed to overwrite an older value. $grants[] = $grant; foreach ($grants as $id => $grant) { // Merge missing default grant keys. $grants[$id] = $grants[$id] + $grant_defaults; } return $grants; } /** * Mark module to be in process of disabling. * * Prevents entries being saved to node_access while module is being disabled. * * @param mixed $set * A boolean set or NULL to not change status. * * @return bool */ function nodeaccess_disabling($set = NULL) { static $disabling = FALSE; if ($set !== NULL) { $disabling = $set; } return $disabling; } /** * Implements hook_node_type_delete(). * * @param Object $info */ function nodeaccess_node_type_delete($info) { // Node type is being deleted, delete its preferences. variable_del('nodeaccess_' . $info->type); $author_prefs = variable_get('nodeaccess_authors', array()); unset($author_prefs[$info->type]); variable_set('nodeaccess_authors', $author_prefs); } /** * Implements hook_node_type_update(). * * @param Object $info */ function nodeaccess_node_type_update($info) { // Node type has changed, move preferences to new type. if (!empty($info->old_type) && $info->old_type != $info->type) { $setting = variable_get('nodeaccess_' . $info->old_type, array()); variable_del('nodeaccess_' . $info->old_type); variable_set('nodeaccess_' . $info->type, $setting); $author_prefs = variable_get('nodeaccess_authors', array()); $author_prefs[$info->type] = array( 'grant_view' => $author_prefs[$info->old_type]['grant_view'], 'grant_update' => $author_prefs[$info->old_type]['grant_update'], 'grant_delete' => $author_prefs[$info->old_type]['grant_delete'], ); unset($author_prefs[$info->old_type]); variable_set('nodeaccess_authors', $author_prefs); } } /** * Implements hook_node_type_insert(). * * @param Object $info */ function nodeaccess_node_type_insert($info) { // New node type, default to whatever is set for access content permission. $role_perms = user_role_permissions(array(1 => 1, 2 => 2)); $role_perms[DRUPAL_ANONYMOUS_RID]['access content'] = isset($role_perms[1]['access content']) ? intval($role_perms[1]['access content']) : 0; $role_perms[DRUPAL_AUTHENTICATED_RID]['access content'] = isset($role_perms[2]['access content']) ? intval($role_perms[2]['access content']) : 0; $grants[] = array( 'gid' => DRUPAL_ANONYMOUS_RID, 'realm' => 'nodeaccess_rid', 'grant_view' => $role_perms[DRUPAL_ANONYMOUS_RID]['access content'], 'grant_update' => 0, 'grant_delete' => 0, ); $grants[] = array( 'gid' => DRUPAL_AUTHENTICATED_RID, 'realm' => 'nodeaccess_rid', 'grant_view' => $role_perms[DRUPAL_AUTHENTICATED_RID]['access content'], 'grant_update' => 0, 'grant_delete' => 0, ); variable_set('nodeaccess_' . $info->type, $grants); // Add permissions for author. $author_prefs = variable_get('nodeaccess_authors', array()); $author_prefs[$info->type] = array( 'grant_view' => 0, 'grant_update' => 0, 'grant_delete' => 0, ); variable_set('nodeaccess_authors', $author_prefs); node_access_needs_rebuild(TRUE); } /** * Retrieve role aliases. * * @return array * Role aliases indexed by rid. */ function nodeaccess_get_role_aliases() { $aliases = array(); $query = db_select('role', 'r'); $query->leftJoin('nodeaccess_role_alias', 'a', 'r.rid = a.rid'); $query->fields('r', array('rid', 'name')); $query->addField('a', 'name', 'alias'); $query->addField('a', 'weight'); $query->orderBy('a.weight'); $query->orderBy('r.weight'); $query->orderBy('a.name'); $query->orderBy('r.name'); $result = $query->execute(); while($a = $result->fetch()) { $aliases[$a->rid]['name'] = $a->name; $aliases[$a->rid]['alias'] = $a->alias; $aliases[$a->rid]['weight'] = $a->weight; } return $aliases; } /** * Save a role alias. * * @param array $edit * An array of aliases to save, indexed by rid. */ function nodeaccess_save_role_aliases($edit) { db_delete('nodeaccess_role_alias')->execute(); if (is_array($edit)) { foreach ($edit as $key => $value) { db_insert('nodeaccess_role_alias')->fields(array( 'rid' => $key, 'name' => $value['name'], 'weight' => $value['weight'], ))->execute(); } } return; } /** * Insert userreference grants from a node. * * @param Object $node */ function nodeaccess_insert_user_reference($node) { $form_values = nodeaccess_get_grants($node); // Now, append or overwrite the uid with what was specified in the user // reference field. $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); foreach ($fields as $field_name => $field) { $user_uids = field_get_items('node', $node, $field_name); $user_references = user_load_multiple($user_uids); // Add each of the referenced users a form value. foreach ($user_references as $user) { $form_values['uid'][$user->uid] = array( 'name' => $user->name, 'keep' => 1, 'grant_view' => $field['grant_view'], 'grant_update' => $field['grant_update'], 'grant_delete' => $field['grant_delete'], ); } } // Only do the changes if there are users to save. if (count($form_values['uid']) > 0) { $form_values['nid'] = $node->nid; $form_state = array('values' => $form_values); _nodeaccess_grants_form_submit(NULL, $form_state); } } /** * Delete all userreference user grants from a node. * * @param Object $node */ function nodeaccess_delete_user_reference($node) { $form_values = nodeaccess_get_grants($node); // Now, append or overwrite the uid with what was specified in the user // reference field. $fields = variable_get('nodeaccess_' . $node->type . '_user_reference', array()); foreach ($fields as $field_name => $field) { $user_uids = field_get_items('node', $node, $field_name); $user_references = user_load_multiple($user_uids); foreach ($user_references as $user) { unset($form_values['uid'][$user->uid]); } } $form_values['nid'] = $node->nid; $form_state = array('values' => $form_values); _nodeaccess_grants_form_submit(NULL, $form_state); } /** * Return the grants applied to a node object used for Grant form. * * @param Object $node * * @return array * An array of grants with keys 'rid' for roles and 'uid' for users. */ function nodeaccess_get_grants($node) { $grants = array(); // Load grants by roles. $query = db_select('role', 'r'); $query->leftJoin('nodeaccess_role_alias', 'nra', 'nra.rid = r.rid'); $query->leftJoin('node_access', 'na', 'na.gid = r.rid AND na.realm = :realm AND na.nid = :nid', array(':realm' => 'nodeaccess_rid', ':nid' => $node->nid)); $query->fields('r', array('rid')); $query->fields('nra', array('name')); $query->fields('na', array('grant_view', 'grant_update', 'grant_delete')); $query->orderBy('nra.weight'); $query->orderBy('nra.name'); $result = $query->execute(); while ($grant = $result->fetch()) { $grants['rid'][$grant->rid] = array( 'name' => empty($grant->name) ? '' : check_plain($grant->name), 'grant_view' => (bool) $grant->grant_view, 'grant_update' => (bool) $grant->grant_update, 'grant_delete' => (bool) $grant->grant_delete, ); } // Load grants by users $query = db_select('node_access', 'na'); $query->join('users', 'u', 'u.uid = na.gid'); $query->fields('u', array('uid', 'name')); $query->fields('na', array('grant_view', 'grant_update', 'grant_delete')); $query->condition('na.nid', $node->nid, '='); $query->condition('na.realm', 'nodeaccess_uid', '='); $query->orderBy('name'); $result = $query->execute(); while ($account = $result->fetch()) { $grants['uid'][$account->uid] = array( 'name' => $account->name, 'keep' => TRUE, 'grant_view' => (bool) $account->grant_view, 'grant_update' => (bool) $account->grant_update, 'grant_delete' => (bool) $account->grant_delete, ); } return $grants; } /** * Set all grants for a node to nodeaccess table and acquire them. * * @param $node * node object the grants are being applied to. * @param array $grants * array of grants as defined (@see nodeaccess_save_grant). */ function nodeaccess_set_grants($node, $grants = array()) { // Allow other modules to edit all grants for array. drupal_alter('nodeaccess_grants', $grants, $node); nodeaccess_delete_grants($node); if (count($grants)) { foreach ($grants as $grant) { // Allow other modules to edit single grants. drupal_alter('nodeaccess_grant', $grant, $node); nodeaccess_save_grant($node, $grant); } } node_access_acquire_grants($node); } /** * Delete all grants from nodeaccess table for this node. * * @param $node * node object whose grants are being revoked. */ function nodeaccess_delete_grants($node) { try { db_delete('nodeaccess') ->condition('nid', $node->nid) ->execute(); node_access_acquire_grants($node); } catch (Exception $e) { drupal_set_message(t("Database error has occurred while clearing nodeaccess table."), 'error'); watchdog('nodeaccess', 'Database error: @message.', array('@message' => $e->getMessage()), WATCHDOG_ERROR); } } /** * Revoke all custom grants from nodeaccess table for this node. Essentially * reset the grants to their default state (by node type). * * @param $node * node object whose grants are being revoked. */ function nodeaccess_revoke_grants($node) { nodeaccess_delete_grants($node); node_access_acquire_grants($node); } /** * Save the grant settings/options for the node. * * @param $node * node object the grant is being applied to. * @param array $grant * array( * 'gid' => (int) gid for realm, * 'realm' => (string) what realm the access grant belongs to (ex: nodeaccess_rid). * 'grant_view' => (int) view access being granted, * 'grant_update' => (int) update access being granted, * 'grant_delete' => (int) delete access being granted, * ) */ function nodeaccess_save_grant($node, $grant) { // Save role and user grants to our own table. try { db_insert('nodeaccess') ->fields(array( 'nid' => $node->nid, 'gid' => $grant['gid'], 'realm' => $grant['realm'], 'grant_view' => (int) $grant['grant_view'], 'grant_update' => (int) $grant['grant_update'], 'grant_delete' => (int) $grant['grant_delete'], )) ->execute(); } catch (Exception $e) { drupal_set_message(t("Database error has occurred while saving to nodeaccess table."), 'error'); watchdog('nodeaccess', 'Database error: @message.', array('@message' => $e->getMessage()), WATCHDOG_ERROR); } } /** * Add the grant tab to the specified node type. * * @param string $type * The node type we are adding the grant tab for. */ function nodeaccess_add_type_grant($type) { $grants = variable_get('nodeaccess-types', array()); $grants[$type] = TRUE; nodeaccess_set_type_grants($grants); } /** * Delete the grant tab for specified node type. * * @param string $type * The node type we are removing the grant tab from. */ function nodeaccess_delete_type_grant($type) { $grants = variable_get('nodeaccess-types', array()); if (isset($grants[$type])) { unset($grants[$type]); } nodeaccess_set_type_grants($grants); } /** * Set the grant tab settings for all node types. * * @param array $types * The types that will have the grant tab appear. * */ function nodeaccess_set_type_grants($types = array()) { if (!is_array($types)) { return; } variable_set('nodeaccess-types', $types); node_access_needs_rebuild(TRUE); }