From cd2719948a9a24b4035207789c6f99470ddd6565 Mon Sep 17 00:00:00 2001
From: Ted Cooper <12728-elc@users.noreply.drupalcode.org>
Date: Sat, 20 Jan 2024 15:28:20 +0000
Subject: [PATCH] Issue #3412310 by ELC, zengenuity: Setting
 symfony_mailer_lite.settings.default_transport not guaranteed to be set

---
 src/Entity/Transport.php              |  3 ++-
 src/TransportAccessControlHandler.php | 28 +++++++++++++++++++++++++++
 src/TransportListBuilder.php          |  7 ++-----
 3 files changed, 32 insertions(+), 6 deletions(-)
 create mode 100644 src/TransportAccessControlHandler.php

diff --git a/src/Entity/Transport.php b/src/Entity/Transport.php
index c1d176c..c41e647 100644
--- a/src/Entity/Transport.php
+++ b/src/Entity/Transport.php
@@ -19,7 +19,8 @@ use Drupal\symfony_mailer_lite\TransportInterface;
  *       "edit" = "Drupal\symfony_mailer_lite\Form\TransportForm",
  *       "add" = "Drupal\symfony_mailer_lite\Form\TransportAddForm",
  *       "delete" = "Drupal\Core\Entity\EntityDeleteForm"
- *     }
+ *     },
+ *     "access" = "Drupal\symfony_mailer_lite\TransportAccessControlHandler",
  *   },
  *   admin_permission = "administer symfony_mailer_lite configuration",
  *   entity_keys = {
diff --git a/src/TransportAccessControlHandler.php b/src/TransportAccessControlHandler.php
new file mode 100644
index 0000000..a8b32a3
--- /dev/null
+++ b/src/TransportAccessControlHandler.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Drupal\symfony_mailer_lite;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Entity\EntityAccessControlHandler;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Session\AccountInterface;
+
+class TransportAccessControlHandler extends EntityAccessControlHandler {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
+    $parentAccess = parent::checkAccess($entity, $operation, $account);
+
+    switch ($operation) {
+      case 'delete':
+        return AccessResult::allowedIfHasPermission($account, 'administer symfony_mailer_lite configuration')
+          ->andIf(AccessResult::allowedIf(!$entity->isDefault()))
+          ->andIf($parentAccess);
+    }
+
+    return $parentAccess;
+  }
+
+}
diff --git a/src/TransportListBuilder.php b/src/TransportListBuilder.php
index fc09af6..9058f01 100644
--- a/src/TransportListBuilder.php
+++ b/src/TransportListBuilder.php
@@ -77,11 +77,8 @@ class TransportListBuilder extends ConfigEntityListBuilder {
   public function getDefaultOperations(EntityInterface $entity) {
     $operations = parent::getDefaultOperations($entity);
 
-    // Prevent the default transport being deleted.
-    if ($entity->isDefault()) {
-      unset($operations['delete']);
-    }
-    else {
+    // Add op to set default to all non-default transports.
+    if (!$entity->isDefault()) {
       $operations['default'] = [
         'title' => $this->t('Set as default'),
         'url' => Url::fromRoute('entity.symfony_mailer_lite_transport.set_default', [
-- 
GitLab