diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py
index faf81f3e65..1b79794a64 100644
--- a/frappe/email/doctype/auto_email_report/auto_email_report.py
+++ b/frappe/email/doctype/auto_email_report/auto_email_report.py
@@ -392,7 +392,7 @@ def make_links(columns, data):
def update_field_types(columns):
for col in columns:
if col.fieldtype in ("Link", "Dynamic Link", "Currency") and col.options != "Currency":
- col.fieldtype = "Data"
+ col.fieldtype = "HTML Editor"
col.options = ""
return columns
diff --git a/frappe/tests/test_formatter.py b/frappe/tests/test_formatter.py
index 565c321725..aa3db6b2b0 100644
--- a/frappe/tests/test_formatter.py
+++ b/frappe/tests/test_formatter.py
@@ -1,6 +1,7 @@
import frappe
from frappe import format
from frappe.tests import IntegrationTestCase
+from frappe.utils.formatters import format_value
class TestFormatter(IntegrationTestCase):
@@ -17,3 +18,37 @@ class TestFormatter(IntegrationTestCase):
self.assertEqual(format(100000, df, doc, format="#,###.##"), "$ 100,000.00")
frappe.db.set_default("currency", None)
+
+ def test_safe_formatting(self):
+ """Test that in certain field types, the values are escaped."""
+ payload = ""
+ sanitized_payload = "<script>alert('testing')</script>"
+
+ data_df = frappe._dict({"fieldname": "book_name", "fieldtype": "Data"})
+ self.assertEqual(format_value(payload, data_df), sanitized_payload)
+
+ text_df = frappe._dict({"fieldname": "book_description", "fieldtype": "Text"})
+ self.assertEqual(format_value(payload, text_df), sanitized_payload)
+
+ html_df = frappe._dict({"fieldname": "book_title", "fieldtype": "HTML Editor"})
+ self.assertEqual(format_value(payload, html_df), payload)
+
+ editor_df = frappe._dict({"fieldtype": "Text Editor"})
+ formatted_editor = format_value("Bold", editor_df)
+ self.assertEqual(formatted_editor, "
Bold
")
+
+ ltext_df = frappe._dict({"fieldname": "book_long_description", "fieldtype": "Long Text"})
+ self.assertEqual(format_value(payload, ltext_df), sanitized_payload)
+
+ select_df = frappe._dict({"fieldtype": "Select", "parent": "Task"})
+ value = "Open"
+ self.assertEqual(format_value(value, select_df), "Open")
+ self.assertEqual(format_value(payload, select_df), sanitized_payload)
+
+ link_df = frappe._dict({"fieldtype": "Link", "options": "User"})
+ self.assertEqual(format_value(payload, link_df, doc=None), sanitized_payload)
+ doc = frappe._dict({"__link_titles": {"User::attacker@example.com": "