Commit bce27900 authored by baldwinlouie's avatar baldwinlouie Committed by Yas Naoi
Browse files

Issue #3295011 by baldwinlouie, yas: Add "access query tag" to VMware view pages

parent 9d9e3b84
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
services:
  cloud:
    class: Drupal\cloud\Service\CloudService
    arguments: ['@entity_type.manager', '@entity.definition_update_manager', '@config.manager', '@config.factory', '@config.typed', '@file_system', '@extension.path.resolver', '@module_handler', '@request_stack', '@http_client', '@plugin.manager.cloud_config_plugin', '@twig', '@token', '@plugin.manager.mail', '@language_manager', '@cache_tags.invalidator', '@cache.menu', '@cache.render', '@router.builder', '@plugin.cache_clearer', '@queue', '@file.repository']
    arguments: ['@entity_type.manager', '@entity.definition_update_manager', '@config.manager', '@config.factory', '@config.typed', '@file_system', '@extension.path.resolver', '@module_handler', '@request_stack', '@http_client', '@plugin.manager.cloud_config_plugin', '@twig', '@token', '@plugin.manager.mail', '@language_manager', '@cache_tags.invalidator', '@cache.menu', '@cache.render', '@router.builder', '@plugin.cache_clearer', '@current_user', '@current_route_match', '@user.permissions', '@queue', '@file.repository']
  cloud.subscriber:
    class: Drupal\cloud\EventSubscriber\CloudSubscriber
    arguments: ['@entity_type.manager', '@current_route_match', '@current_user']
+1 −34
Original line number Diff line number Diff line
@@ -424,7 +424,7 @@ function k8s_query_k8s_entity_views_access_alter(AlterableInterface $query): voi
  }

  // Add owner condition.
  k8s_build_owner_query_condition($query);
  \Drupal::service('cloud')->buildOwnerQueryCondition($query);
}

/**
@@ -488,39 +488,6 @@ function k8s_build_namespace_query_condition(AlterableInterface $query): void {
  }
}

/**
 * Add query condition to check any/own query parameter for K8s entities.
 */
function k8s_build_owner_query_condition(AlterableInterface $query): void {
  if (!$account = $query->getMetaData('account')) {
    $account = \Drupal::currentUser();
  }

  $route_name = \Drupal::routeMatch()->getRouteName();

  // Regex extracts entity_type from view.*.list and view.*.all.
  if (preg_match('@^view.(.*).(list|all)$@', $route_name, $matches) !== FALSE && !empty($matches)) {
    $entity_type = $matches[1];

    // Use a static trait method through CloudService.
    $entity_type_name = CloudService::convertUnderscoreToWhitespace($entity_type);

    // Check if the permission exists.
    $permission_name = "view any $entity_type_name";
    $permissions = \Drupal::service('user.permissions')->getPermissions();
    if (empty($permissions[$permission_name])) {
      return;
    }

    if ($account->hasPermission($permission_name)) {
      return;
    }

    // Add a uid condition.
    $query->condition("$entity_type.uid", $account->id());
  }
}

/**
 * Implements hook_query_TAG_Alter().
 */
+3 −1
Original line number Diff line number Diff line
@@ -14,9 +14,11 @@ class VmwareHostViewsData extends EntityViewsData {
   */
  public function getViewsData(): array {
    $data = parent::getViewsData();

    $base_table = $this->entityType->getBaseTable() ?: $this->entityType->id();
    // Additional information for Views integration, such as table joins, can be
    // put here.
    // Add access check query tag.
    $data[$base_table]['table']['base']['access query tag'] = 'vmware_entity_views_access';
    return $data;
  }

+3 −2
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ class VmwareVmViewsData extends EntityViewsData {
   */
  public function getViewsData(): array {
    $data = parent::getViewsData();

    $base_table = $this->entityType->getBaseTable() ?: $this->entityType->id();
    // Additional information for Views integration, such as table joins, can be
    // put here.
    $data['vmware_vm']['vm_bulk_form'] = [
@@ -24,7 +24,8 @@ class VmwareVmViewsData extends EntityViewsData {
        'id' => 'vm_bulk_form',
      ],
    ];

    // Add access check query tag.
    $data[$base_table]['table']['base']['access query tag'] = 'vmware_entity_views_access';
    return $data;
  }

+8 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

use Drupal\cloud\Entity\CloudConfig;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Database\Query\AlterableInterface;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
@@ -559,3 +560,10 @@ function vmware_vmware_host_predelete(VmwareHost $entity): void {
  // Delete tags.
  $vmware_service->deleteCreatedByTags($entity, $entity->getHost());
}

/**
 * Implements hook_query_tag_alter().
 */
function vmware_query_vmware_entity_views_access_alter(AlterableInterface $query): void {
  \Drupal::service('cloud')->buildOwnerQueryCondition($query);
}
Loading