hosting_client.access.inc in Hosting 5
Same filename and directory in other branches
Control client node access
File
client/hosting_client.access.incView source
<?php
/**
 * @file
 *   Control client node access
 */
/**
 * Implementation of hook_user().
 */
function hosting_client_user($op, &$edit, &$user, $category = NULL) {
  switch ($op) {
    case 'load':
      $user->client_id = hosting_get_client_from_user($user->uid);
      break;
    case 'view':
      return hosting_client_user_view($user);
    case 'form':
      return hosting_client_user_form($edit, $user, $category);
    case 'validate':
      return hosting_client_user_form_validate($edit);
    case 'insert':
    case 'update':
      hosting_client_user_form_submit($edit, $user);
      $edit['hosting_client'] = NULL;
      break;
    case 'submit':
      break;
    case 'delete':
      db_query('DELETE FROM {hosting_client_user} WHERE user = %d', $user->uid);
  }
}
function hosting_client_user_view($user) {
  if ($user->client_id) {
    foreach ($user->client_id as $client => $type) {
      $rows[] = array(
        _hosting_node_link($client),
      );
    }
    // this is a table because we'll have types for clients eventually
    $header = array(
      t('Hosting client'),
    );
    $items['client_list'] = array(
      'value' => theme('table', $header, $rows),
      'class' => 'client',
    );
    return array(
      t('Clients') => $items,
    );
  }
}
function hosting_client_user_form($edit, $user, $category) {
  $clients = array();
  if ($user->client_id) {
    foreach ($user->client_id as $client => $type) {
      $clients[$client] = '';
      $fields[$category]['name'][$client] = array(
        '#type' => 'markup',
        '#value' => _hosting_node_link($client),
      );
    }
  }
  if (user_access('edit client users')) {
    $fields[$category]['clients'] = array(
      '#type' => 'checkboxes',
      '#options' => $clients,
    );
  }
  $fields[$category]['header'] = array(
    '#type' => 'value',
    '#value' => array(
      array(
        'data' => t('Hosting client'),
      ),
      array(
        'data' => t('Remove'),
      ),
    ),
  );
  if (user_access('edit client users')) {
    $fields[$category]['hosting_client'] = array(
      '#type' => 'textfield',
      '#title' => t('Add new client'),
      '#weight' => 2,
      '#autocomplete_path' => 'hosting_client/autocomplete/client',
    );
  }
  $fields[$category]['#theme'] = 'hosting_client_user_form';
  return $fields;
}
function theme_hosting_client_user_form($form) {
  if (array_key_exists('hosting_client', $form)) {
    $edit_name = drupal_render($form['hosting_client']);
  }
  else {
    $edit_name = '';
  }
  foreach (element_children($form['name']) as $client) {
    $row = array();
    $row['data'][] = drupal_render($form['name'][$client]);
    if (user_access('edit client users')) {
      $row['data'][] = drupal_render($form['clients'][$client]);
    }
    $rows[] = $row;
  }
  $output = drupal_render($form);
  $output .= theme('table', $form['header']['#value'], $rows);
  $output .= $edit_name;
  return $output;
}
function hosting_client_user_form_validate($edit) {
  if (array_key_exists('hosting_client', $edit) && $edit['hosting_client'] && !($client = hosting_get_client($edit['hosting_client']))) {
    form_set_error('hosting_client', 'Please fill in a valid client');
  }
}
function hosting_client_user_form_submit($edit, $user) {
  if (array_key_exists('clients', $edit)) {
    foreach ($edit['clients'] as $client) {
      $query = db_query('DELETE FROM {hosting_client_user} WHERE user = %d AND client = %d', $user->uid, $client);
    }
  }
  if (array_key_exists('hosting_client', $edit) && $edit['hosting_client']) {
    $client = hosting_get_client($edit['hosting_client']);
    $query = db_query('INSERT INTO {hosting_client_user} (client, user, contact_type) VALUES (%d, %d, "%s")', $client->nid, $user->uid, '');
  }
}
/**
 * Simple function to make sure we don't respond with grants when disabling
 * ourselves.
 */
function hosting_client_disabling($set = NULL) {
  static $disabling = false;
  if ($set !== NULL) {
    $disabling = $set;
  }
  return $disabling;
}
/**
 * Implementation of hook_node_grants().
 *
 * Tell the node access system what GIDs the user belongs to for each realm.
 * In this example, we are providing two realms: the example realm, which
 * has just one group id (1) and the user is either a member or not depending
 * upon the operation and the access permission set.
 *
 * We are also setting up a realm for the node author, though, to give it
 * special privileges. That has 1 GID for every UID, and each user is
 * automatically a member of the group where GID == UID.
 *
 */
function hosting_node_grants($account, $op) {
  $account->client_id = hosting_get_client_from_user($account->uid);
  $types = array_merge(hosting_feature_node_types(), array(
    'site',
    'task',
    'package',
    'client',
  ));
  foreach ($types as $type) {
    if (user_access("{$op} {$type}")) {
      // TODO: restrict access to certain op-type based on the user relationship to this client - see content of $client_relations
      $grants['hosting ' . $type] = array_keys($account->client_id);
    }
  }
  return $grants;
}
/**
 * Implementation of hook_node_access_records().
 *
 * All node access modules must implement this hook. If the module is
 * interested in the privacy of the node passed in, return a list
 * of node access values for each grant ID we offer. Since this
 * example module only offers 1 grant ID, we will only ever be
 * returning one record.
 */
function hosting_client_node_access_records($node) {
  if (hosting_client_disabling()) {
    return;
  }
  $base_grant = array(
    'realm' => 'hosting ' . $node->type,
    'grant_view' => TRUE,
    'grant_update' => TRUE,
    'grant_delete' => FALSE,
    'priority' => 1,
  );
  // tasks inherit from their parent
  if ($node->type == 'task') {
    $node = node_load($node->rid);
    $base_grant['grant_update'] = FALSE;
  }
  switch ($node->type) {
    case 'site':
      $base_grant['gid'] = $node->client;
      break;
    case 'client':
      $base_grant['gid'] = $node->nid;
      break;
    case 'package':
      $base_grant['grant_update'] = FALSE;
    case 'task':
    case 'platform':
    case 'web_server':
    case 'db_server':
      // The rest of the node types are configuration, so only admin should see them.
      $base_grant['gid'] = HOSTING_DEFAULT_CLIENT;
      break;
    default:
      //Not hosting node, don't change access.
      return;
  }
  if ($base_grant['gid']) {
    if ($base_grant['gid'] != HOSTING_DEFAULT_CLIENT) {
      $grants[] = $base_grant;
    }
    // Also give full access to the administrator user.
    $base_grant['gid'] = 1;
    $grants[] = $base_grant;
    return $grants;
  }
}
/**
 * Returns an associative array that provides the relationships a user has with different clients
 */
function hosting_get_client_from_user($uid) {
  $clients = array();
  if ($results = db_query("SELECT client, contact_type FROM {hosting_client_user} WHERE user=%d", $uid)) {
    while ($result = db_fetch_array($results)) {
      $clients[$result['client']] = explode(',', $result['contact_type']);
    }
  }
  return $clients;
}Functions
| 
            Name | 
                  Description | 
|---|---|
| hosting_client_disabling | Simple function to make sure we don't respond with grants when disabling ourselves. | 
| hosting_client_node_access_records | Implementation of hook_node_access_records(). | 
| hosting_client_user | Implementation of hook_user(). | 
| hosting_client_user_form | |
| hosting_client_user_form_submit | |
| hosting_client_user_form_validate | |
| hosting_client_user_view | |
| hosting_get_client_from_user | Returns an associative array that provides the relationships a user has with different clients | 
| hosting_node_grants | Implementation of hook_node_grants(). | 
| theme_hosting_client_user_form |