From 8f86a2879c05cdbc5f0813d4a4326eaac0f88321 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 13 Apr 2026 12:36:51 +0530 Subject: [PATCH] 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):