From d5e8cf713ad450d5c2db2955036de5c55259a9fe Mon Sep 17 00:00:00 2001
From: Garvin Hicking <gh@faktor-e.de>
Date: Wed, 19 Jun 2024 14:47:11 +0200
Subject: [PATCH] [BUGFIX] Fix backend page tree filter with special characters
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When filtering the page tree with characters that have
special meaning for a regular expression (for example,
")" or "(" or "?" and some others), the filtering would
return a "Page Tree error".

JavaScript does not have something like "preg_quote",
so this uses the escape string provided by the MDN
with fixed special characters.

Resolves: #104092
Releases: main, 12.4, 11.5
Change-Id: I4a29c62eaca8b7643c8ef78dda1d8337b3e1e53a
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/84785
Tested-by: core-ci <typo3@b13.com>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: Jasmina Ließmann <minapokhalo+typo3@gmail.com>
Tested-by: Andreas Kienast <a.fernandez@scripting-base.de>
Reviewed-by: Jasmina Ließmann <minapokhalo+typo3@gmail.com>
Reviewed-by: Andreas Kienast <a.fernandez@scripting-base.de>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 Build/Sources/TypeScript/backend/tree/tree.ts                 | 3 ++-
 typo3/sysext/backend/Resources/Public/JavaScript/tree/tree.js | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/Build/Sources/TypeScript/backend/tree/tree.ts b/Build/Sources/TypeScript/backend/tree/tree.ts
index 59741e47c0c4..f8295ea40f17 100644
--- a/Build/Sources/TypeScript/backend/tree/tree.ts
+++ b/Build/Sources/TypeScript/backend/tree/tree.ts
@@ -1038,7 +1038,8 @@ export class Tree extends LitElement {
     labelNode.textContent = label;
     label = labelNode.innerHTML;
     if (this.searchTerm) {
-      const regexp = new RegExp(this.searchTerm, 'gi');
+      // Escape all meta characters of regular expressions: ( ) [ ] $ * + ? . { } / | ^ -
+      const regexp = new RegExp(this.searchTerm.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&'), 'gi');
       label = label.replace(regexp, '<span class="node-highlight-text">$&</span>');
     }
 
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/tree/tree.js b/typo3/sysext/backend/Resources/Public/JavaScript/tree/tree.js
index 20ddb7d8431b..8565bc159578 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/tree/tree.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/tree/tree.js
@@ -108,7 +108,7 @@ var __decorate=function(e,t,i,o){var s,n=arguments.length,r=n<3?t:null===o?o=Obj
             size="small"
           ></typo3-backend-icon>
         </span>
-        `:html`${nothing}`}createNodeContentLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const i=document.createElement("div");if(i.textContent=t,t=i.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm,"gi");t=t.replace(e,'<span class="node-highlight-text">$&</span>')}return html`
+        `:html`${nothing}`}createNodeContentLabel(e){let t=(e.prefix||"")+e.name+(e.suffix||"");const i=document.createElement("div");if(i.textContent=t,t=i.innerHTML,this.searchTerm){const e=new RegExp(this.searchTerm.replace(/[/\-\\^$*+?.()|[\]{}]/g,"\\$&"),"gi");t=t.replace(e,'<span class="node-highlight-text">$&</span>')}return html`
       <div class="node-contentlabel">
       <div class="node-name" .innerHTML="${t}"></div>
       ${e.note?html`<div class="node-note">${e.note}</div>`:nothing}
-- 
GitLab