Use recursive stylesheet sanitation

62a1919402faa555c3d670d517fa8872be60a898

Cohee <18619528+Cohee1207@users.noreply.github.com>

1 files changed, +22 -12Showing whitespace changes
public/scripts/chats.js+22 -12
@@ -465,18 +465,7 @@ export function decodeStyleTags(text) {
465465 const styleDecodeRegex = /<custom-style>(.+?)<\/custom-style>/gms;
466466 const mediaAllowed = isExternalMediaAllowed();
467467
468- return text.replaceAll(styleDecodeRegex, (_, style) => {
468+ function sanitizeRule(rule) {
469- try {
470- let styleCleaned = unescape(style).replaceAll(/<br\/>/g, '');
471- const ast = css.parse(styleCleaned);
472- const rules = ast?.stylesheet?.rules;
473- if (rules) {
474- for (const rule of rules) {
475- if (rule.type === 'import') {
476- rules.splice(rules.indexOf(rule), 1);
477- }
478-
479- if (rule.type === 'rule') {
480469 if (rule.selectors) {
481470 for (let i = 0; i < rule.selectors.length; i++) {
482471 let selector = rule.selectors[i];
@@ -500,7 +489,28 @@ export function decodeStyleTags(text) {
500489 }
501490 }
502491 }
492+
493+ function sanitizeRuleSet(ruleSet) {
494+ if (ruleSet.type === 'rule') {
495+ sanitizeRule(ruleSet);
503496 }
497+
498+ if (Array.isArray(ruleSet.rules)) {
499+ ruleSet.rules = ruleSet.rules.filter(rule => rule.type !== 'import');
500+
501+ for (const mediaRule of ruleSet.rules) {
502+ sanitizeRuleSet(mediaRule);
503+ }
504+ }
505+ }
506+
507+ return text.replaceAll(styleDecodeRegex, (_, style) => {
508+ try {
509+ let styleCleaned = unescape(style).replaceAll(/<br\/>/g, '');
510+ const ast = css.parse(styleCleaned);
511+ const sheet = ast?.stylesheet;
512+ if (sheet) {
513+ sanitizeRuleSet(ast.stylesheet);
504514 }
505515 return `<style>${css.stringify(ast)}</style>`;
506516 } catch (error) {