|
|
@@ -36,7 +36,7 @@ class DatabaseQuery(object): |
|
|
|
ignore_permissions=False, user=None, with_comment_count=False, |
|
|
|
join='left join', distinct=False, start=None, page_length=None, limit=None, |
|
|
|
ignore_ifnull=False, save_user_settings=False, save_user_settings_fields=False, |
|
|
|
update=None, add_total_row=None, user_settings=None, reference_doctype=None, return_query=False): |
|
|
|
update=None, add_total_row=None, user_settings=None, reference_doctype=None, return_query=False, strict=True): |
|
|
|
if not ignore_permissions and not frappe.has_permission(self.doctype, "read", user=user): |
|
|
|
frappe.flags.error_message = _('Insufficient Permission for {0}').format(frappe.bold(self.doctype)) |
|
|
|
raise frappe.PermissionError(self.doctype) |
|
|
@@ -80,6 +80,7 @@ class DatabaseQuery(object): |
|
|
|
self.update = update |
|
|
|
self.user_settings_fields = copy.deepcopy(self.fields) |
|
|
|
self.return_query = return_query |
|
|
|
self.strict = strict |
|
|
|
|
|
|
|
# for contextual user permission check |
|
|
|
# to determine which user permission is applicable on link field of specific doctype |
|
|
@@ -115,8 +116,12 @@ class DatabaseQuery(object): |
|
|
|
args.fields = 'distinct ' + args.fields |
|
|
|
args.order_by = '' # TODO: recheck for alternative |
|
|
|
|
|
|
|
query = """select %(fields)s from %(tables)s %(conditions)s |
|
|
|
%(group_by)s %(order_by)s %(limit)s""" % args |
|
|
|
query = """select %(fields)s |
|
|
|
from %(tables)s |
|
|
|
%(conditions)s |
|
|
|
%(group_by)s |
|
|
|
%(order_by)s |
|
|
|
%(limit)s""" % args |
|
|
|
|
|
|
|
if self.return_query: |
|
|
|
return query |
|
|
@@ -240,6 +245,12 @@ class DatabaseQuery(object): |
|
|
|
|
|
|
|
_is_query(field) |
|
|
|
|
|
|
|
if self.strict: |
|
|
|
if re.compile(r".*/\*.*").match(field): |
|
|
|
frappe.throw(_('Illegal SQL Query')) |
|
|
|
|
|
|
|
if re.compile(r".*\s(union).*\s").match(field.lower()): |
|
|
|
frappe.throw(_('Illegal SQL Query')) |
|
|
|
|
|
|
|
def extract_tables(self): |
|
|
|
"""extract tables from fields""" |
|
|
@@ -688,6 +699,8 @@ class DatabaseQuery(object): |
|
|
|
if 'select' in _lower and ' from ' in _lower: |
|
|
|
frappe.throw(_('Cannot use sub-query in order by')) |
|
|
|
|
|
|
|
if re.compile(r".*[^a-z0-9-_ ,`'\"\.\(\)].*").match(_lower): |
|
|
|
frappe.throw(_('Illegal SQL Query')) |
|
|
|
|
|
|
|
for field in parameters.split(","): |
|
|
|
if "." in field and field.strip().startswith("`tab"): |
|
|
@@ -755,6 +768,7 @@ def get_list(doctype, *args, **kwargs): |
|
|
|
kwargs.pop('cmd', None) |
|
|
|
kwargs.pop('ignore_permissions', None) |
|
|
|
kwargs.pop('data', None) |
|
|
|
kwargs.pop('strict', None) |
|
|
|
|
|
|
|
# If doctype is child table |
|
|
|
if frappe.is_table(doctype): |
|
|
|