From 621ad89c646911b2decdd34622a8ade0f22b135d Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 12 Dec 2025 09:48:40 -0500 Subject: [PATCH] [mv3] Better validate hostnames in "Filtering mode details" editor Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/564 --- platform/mv3/extension/css/develop.css | 2 +- platform/mv3/extension/js/dnr-parser.js | 2 +- platform/mv3/extension/js/mode-parser.js | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/platform/mv3/extension/css/develop.css b/platform/mv3/extension/css/develop.css index 55816b6d6..3f165443e 100644 --- a/platform/mv3/extension/css/develop.css +++ b/platform/mv3/extension/css/develop.css @@ -60,7 +60,7 @@ section[data-pane="develop"] > div > * { :root.dark #cm-container .cm-editor .cm-line .ubol-literal { color: #1dae74; } -#cm-container .cm-editor .cm-line.badline:not(.cm-activeLine) { +#cm-container .cm-editor .cm-line.badline { background-color: color-mix(in srgb, var(--info3-ink) 15%, transparent 85%); } diff --git a/platform/mv3/extension/js/dnr-parser.js b/platform/mv3/extension/js/dnr-parser.js index d2652f3f6..14d45bf49 100644 --- a/platform/mv3/extension/js/dnr-parser.js +++ b/platform/mv3/extension/js/dnr-parser.js @@ -515,7 +515,7 @@ export function rulesFromText(text) { if ( indices.length === 0 ) { continue; } const result = ruleFromLines(lines, indices); if ( result.bad ) { - bad.push(...result.bad.slice(4)); + bad.push(...result.bad.slice(0, 4)); } else if ( result.rule ) { rules.push(result.rule); } diff --git a/platform/mv3/extension/js/mode-parser.js b/platform/mv3/extension/js/mode-parser.js index 719a29efe..5fb66318b 100644 --- a/platform/mv3/extension/js/mode-parser.js +++ b/platform/mv3/extension/js/mode-parser.js @@ -89,8 +89,20 @@ const perScopeParsers = { }; const addHostnameToMode = (modes, mode, node) => { - if ( node.list !== true ) { return false; } - modes[mode].push(punycode.toASCII(node.val)); + if ( node.list !== true ) { return node.val === '-'; } + if ( node.key !== undefined ) { return false; } + if ( node.val === undefined ) { return false; } + const hn = punycode.toASCII(node.val.toLowerCase()); + if ( hn.length > 253 ) { return false; } + if ( hn.split('.').some(isInvalidLabel) ) { return false; } + modes[mode].push(hn); +}; + +const isInvalidLabel = label => { + if ( label.length === 0 ) { return true; } + if ( label.length > 63 ) { return true; } + if ( /^[^\da-z]|[^\da-z]$|[^\da-z-]/.test(label) ) { return true; } + return false; }; /******************************************************************************/