X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fcontent_translation%2Fsrc%2FAccess%2FContentTranslationManageAccessCheck.php;fp=web%2Fcore%2Fmodules%2Fcontent_translation%2Fsrc%2FAccess%2FContentTranslationManageAccessCheck.php;h=bbf0540e90ce0f458c18793f79b3599819637784;hp=6a4be1eb11fe0f94be9b1594298a03aff9087d08;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php b/web/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php index 6a4be1eb1..bbf0540e9 100644 --- a/web/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php +++ b/web/core/modules/content_translation/src/Access/ContentTranslationManageAccessCheck.php @@ -3,6 +3,7 @@ namespace Drupal\content_translation\Access; use Drupal\Core\Access\AccessResult; +use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Language\LanguageInterface; use Drupal\Core\Language\LanguageManagerInterface; @@ -90,15 +91,12 @@ class ContentTranslationManageAccessCheck implements AccessInterface { return AccessResult::allowed()->cachePerPermissions(); } - /* @var \Drupal\content_translation\ContentTranslationHandlerInterface $handler */ - $handler = $this->entityManager->getHandler($entity->getEntityTypeId(), 'translation'); - - // Load translation. - $translations = $entity->getTranslationLanguages(); - $languages = $this->languageManager->getLanguages(); - switch ($operation) { case 'create': + /* @var \Drupal\content_translation\ContentTranslationHandlerInterface $handler */ + $handler = $this->entityManager->getHandler($entity->getEntityTypeId(), 'translation'); + $translations = $entity->getTranslationLanguages(); + $languages = $this->languageManager->getLanguages(); $source_language = $this->languageManager->getLanguage($source) ?: $entity->language(); $target_language = $this->languageManager->getLanguage($target) ?: $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT); $is_new_translation = ($source_language->getId() != $target_language->getId() @@ -109,12 +107,14 @@ class ContentTranslationManageAccessCheck implements AccessInterface { ->andIf($handler->getTranslationAccess($entity, $operation)); case 'delete': + // @todo Remove this in https://www.drupal.org/node/2945956. + /** @var \Drupal\Core\Access\AccessResultInterface $delete_access */ + $delete_access = \Drupal::service('content_translation.delete_access')->checkAccess($entity); + $access = $this->checkAccess($entity, $language, $operation); + return $delete_access->andIf($access); + case 'update': - $has_translation = isset($languages[$language->getId()]) - && $language->getId() != $entity->getUntranslated()->language()->getId() - && isset($translations[$language->getId()]); - return AccessResult::allowedIf($has_translation)->cachePerPermissions()->addCacheableDependency($entity) - ->andIf($handler->getTranslationAccess($entity, $operation)); + return $this->checkAccess($entity, $language, $operation); } } @@ -122,4 +122,30 @@ class ContentTranslationManageAccessCheck implements AccessInterface { return AccessResult::neutral(); } + /** + * Performs access checks for the specified operation. + * + * @param \Drupal\Core\Entity\ContentEntityInterface $entity + * The entity being checked. + * @param \Drupal\Core\Language\LanguageInterface $language + * For an update or delete operation, the language code of the translation + * being updated or deleted. + * @param string $operation + * The operation to be checked. + * + * @return \Drupal\Core\Access\AccessResultInterface + * An access result object. + */ + protected function checkAccess(ContentEntityInterface $entity, LanguageInterface $language, $operation) { + /* @var \Drupal\content_translation\ContentTranslationHandlerInterface $handler */ + $handler = $this->entityManager->getHandler($entity->getEntityTypeId(), 'translation'); + $translations = $entity->getTranslationLanguages(); + $languages = $this->languageManager->getLanguages(); + $has_translation = isset($languages[$language->getId()]) + && $language->getId() != $entity->getUntranslated()->language()->getId() + && isset($translations[$language->getId()]); + return AccessResult::allowedIf($has_translation)->cachePerPermissions()->addCacheableDependency($entity) + ->andIf($handler->getTranslationAccess($entity, $operation)); + } + }