From 8f86a2879c05cdbc5f0813d4a4326eaac0f88321 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 13 Apr 2026 12:36:51 +0530 Subject: [PATCH 1/2] fix: replace raw SQL with qb in get_against_jv to prevent SQL injection (cherry picked from commit c133f7156d38a0782a9d791e60ed48586b223ffe) # Conflicts: # erpnext/accounts/doctype/journal_entry/journal_entry.py --- .../doctype/journal_entry/journal_entry.py | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index 01caa360dbe..eba7ecd1020 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -1537,35 +1537,46 @@ def get_payment_entry(ref_doc, args): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs +<<<<<<< HEAD def get_against_jv(doctype, txt, searchfield, start, page_len, filters): +======= +def get_against_jv( + doctype: str, + txt: str, + searchfield: str, + start: int, + page_len: int, + filters: dict, +): +>>>>>>> c133f7156d (fix: replace raw SQL with qb in get_against_jv to prevent SQL injection) if not frappe.db.has_column("Journal Entry", searchfield): return [] - return frappe.db.sql( - f""" - SELECT jv.name, jv.posting_date, jv.user_remark - FROM `tabJournal Entry` jv, `tabJournal Entry Account` jv_detail - WHERE jv_detail.parent = jv.name - AND jv_detail.account = %(account)s - AND IFNULL(jv_detail.party, '') = %(party)s - AND ( - jv_detail.reference_type IS NULL - OR jv_detail.reference_type = '' - ) - AND jv.docstatus = 1 - AND jv.`{searchfield}` LIKE %(txt)s - ORDER BY jv.name DESC - LIMIT %(limit)s offset %(offset)s - """, - dict( - account=filters.get("account"), - party=cstr(filters.get("party")), - txt=f"%{txt}%", - offset=start, - limit=page_len, - ), + JournalEntry = frappe.qb.DocType("Journal Entry") + JournalEntryAccount = frappe.qb.DocType("Journal Entry Account") + + query = ( + frappe.qb.from_(JournalEntry) + .join(JournalEntryAccount) + .on(JournalEntryAccount.parent == JournalEntry.name) + .select(JournalEntry.name, JournalEntry.posting_date, JournalEntry.user_remark) + .where(JournalEntryAccount.account == filters.get("account")) + .where(JournalEntryAccount.reference_type.isnull() | (JournalEntryAccount.reference_type == "")) + .where(JournalEntry.docstatus == 1) + .where(JournalEntry[searchfield].like(f"%{txt}%")) + .orderby(JournalEntry.name, order=frappe.qb.desc) + .limit(page_len) + .offset(start) ) + party = filters.get("party") + if party: + query = query.where(JournalEntryAccount.party == party) + else: + query = query.where(JournalEntryAccount.party.isnull() | (JournalEntryAccount.party == "")) + + return query.run() + @frappe.whitelist() def get_outstanding(args): From 29be73c25641024599bc3782710e2d87936cf343 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 13 Apr 2026 15:21:39 +0530 Subject: [PATCH 2/2] fix: conflicting issue --- .../accounts/doctype/journal_entry/journal_entry.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py index eba7ecd1020..8b6cd3eee23 100644 --- a/erpnext/accounts/doctype/journal_entry/journal_entry.py +++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py @@ -1537,18 +1537,7 @@ def get_payment_entry(ref_doc, args): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -<<<<<<< HEAD def get_against_jv(doctype, txt, searchfield, start, page_len, filters): -======= -def get_against_jv( - doctype: str, - txt: str, - searchfield: str, - start: int, - page_len: int, - filters: dict, -): ->>>>>>> c133f7156d (fix: replace raw SQL with qb in get_against_jv to prevent SQL injection) if not frappe.db.has_column("Journal Entry", searchfield): return []