From 60f2a21d48e122d29c9996fc2970f7b4e4644556 Mon Sep 17 00:00:00 2001
From: Dave Long <dave@longwaveconsulting.com>
Date: Tue, 12 Sep 2023 21:45:49 +0100
Subject: [PATCH] Issue #3380624 by danflanagan8, lauriii, ioannis.cherouvim:
 Toolbar username lazy builder only XSS filters but doesn't escape user
 display name - stored remote request

---
 core/modules/user/src/ToolbarLinkBuilder.php  |  2 +-
 .../tests/src/Unit/ToolbarLinkBuilderTest.php | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 core/modules/user/tests/src/Unit/ToolbarLinkBuilderTest.php

diff --git a/core/modules/user/src/ToolbarLinkBuilder.php b/core/modules/user/src/ToolbarLinkBuilder.php
index b278db6dba4c..8d989b339e52 100644
--- a/core/modules/user/src/ToolbarLinkBuilder.php
+++ b/core/modules/user/src/ToolbarLinkBuilder.php
@@ -80,7 +80,7 @@ public function renderToolbarLinks() {
    */
   public function renderDisplayName() {
     return [
-      '#markup' => $this->account->getDisplayName(),
+      '#plain_text' => $this->account->getDisplayName(),
     ];
   }
 
diff --git a/core/modules/user/tests/src/Unit/ToolbarLinkBuilderTest.php b/core/modules/user/tests/src/Unit/ToolbarLinkBuilderTest.php
new file mode 100644
index 000000000000..40be72a66645
--- /dev/null
+++ b/core/modules/user/tests/src/Unit/ToolbarLinkBuilderTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Drupal\Tests\user\Unit;
+
+use Drupal\Core\Session\AccountProxyInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\user\ToolbarLinkBuilder;
+
+/**
+ * Tests user's ToolbarLinkBuilder.
+ *
+ * @coversDefaultClass \Drupal\user\ToolbarLinkBuilder
+ * @group user
+ */
+class ToolbarLinkBuilderTest extends UnitTestCase {
+
+  /**
+   * Tests structure of display name render array.
+   *
+   * @covers ::renderDisplayName
+   */
+  public function testRenderDisplayName() {
+    $account = $this->prophesize(AccountProxyInterface::class);
+    $display_name = 'Something suspicious that should be #plain_text, not #markup';
+    $account->getDisplayName()->willReturn($display_name);
+    $toolbar_link_builder = new ToolbarLinkBuilder($account->reveal());
+    $expected = ['#plain_text' => $display_name];
+    $this->assertSame($expected, $toolbar_link_builder->renderDisplayName());
+  }
+
+}
-- 
GitLab