diff --git a/packages/loot-core/src/server/accounts/rules.test.ts b/packages/loot-core/src/server/accounts/rules.test.ts index 859d7ab7e71..468a89dc95f 100644 --- a/packages/loot-core/src/server/accounts/rules.test.ts +++ b/packages/loot-core/src/server/accounts/rules.test.ts @@ -327,6 +327,16 @@ describe('Action', () => { expect(item.notes).toBe('Hey Sarah! You just payed 10'); }); + test('should not escape text', () => { + const action = new Action('set', 'notes', '', { + template: '{{notes}}', + }); + const note = 'Sarah !@#$%^&*()<> Special'; + const item = { notes: note }; + action.exec(item); + expect(item.notes).toBe(note); + }); + describe('regex helper', () => { function testHelper(template: string, expected: unknown) { test(template, () => { diff --git a/packages/loot-core/src/server/accounts/rules.ts b/packages/loot-core/src/server/accounts/rules.ts index f67aa04b88c..8dfee69a322 100644 --- a/packages/loot-core/src/server/accounts/rules.ts +++ b/packages/loot-core/src/server/accounts/rules.ts @@ -565,7 +565,9 @@ export class Action { this.field = field; this.type = typeName; if (options?.template) { - this.handlebarsTemplate = Handlebars.compile(options.template); + this.handlebarsTemplate = Handlebars.compile(options.template, { + noEscape: true, + }); try { this.handlebarsTemplate({}); } catch (e) { diff --git a/upcoming-release-notes/3632.md b/upcoming-release-notes/3632.md new file mode 100644 index 00000000000..60d7ab77370 --- /dev/null +++ b/upcoming-release-notes/3632.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [UnderKoen] +--- + +Fix escaping in action rules templating