From 455a861a0d4daa360254917983535e52c5a4f794 Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 15 Jan 2021 14:39:16 +0530 Subject: [PATCH 01/70] fix: do not assume that higher perm level will be set for a doctype --- frappe/model/document.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 3789e20b19..501c9f360d 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -340,6 +340,7 @@ class Document(BaseDocument): if hasattr(self, "__unsaved"): delattr(self, "__unsaved") + self.apply_fieldlevel_read_permissions() return self def copy_attachments_from_amended_from(self): @@ -591,9 +592,18 @@ class Document(BaseDocument): def apply_fieldlevel_read_permissions(self): """Remove values the user is not allowed to read (called when loading in desk)""" + + if frappe.session.user == "Administrator": + return + has_higher_permlevel = False - for p in self.get_permissions(): - if p.permlevel > 0: + + all_fields = self.meta.fields + for table_field in self.meta.get_table_fields(): + all_fields += frappe.get_meta(table_field.options).fields or [] + + for df in all_fields: + if df.permlevel > 0: has_higher_permlevel = True break From 30341d5d53f25407b1d6d06442e4a09a5ef291a2 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 24 Feb 2021 19:54:01 +0530 Subject: [PATCH 02/70] fix: frappe.new_doc won't set default in presence of User Permissions --- frappe/model/create_new.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index e0087a9e40..b1210cb189 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -61,6 +61,9 @@ def set_user_and_static_default_values(doc): doctype_user_permissions = user_permissions.get(df.options, []) # Allowed records for the reference doctype (link field) along with default doc allowed_records, default_doc = filter_allowed_docs_for_doctype(doctype_user_permissions, df.parent, with_default_doc=True) + allowed_records += filter_allowed_docs_for_doctype(doctype_user_permissions, df.options, with_default_doc=False) + + allowed_records = list(set(allowed_records)) user_default_value = get_user_default_value(df, defaults, doctype_user_permissions, allowed_records, default_doc) if user_default_value is not None: From c5cc262ead3465ef7ebe1b500f6cdf6b678cef72 Mon Sep 17 00:00:00 2001 From: marination Date: Wed, 24 Feb 2021 21:08:33 +0530 Subject: [PATCH 03/70] fix: No user Permissions against new doc was not considered - the new doc could not have any User Permissions on it - No restrictions, and hence default must be set --- frappe/model/create_new.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index b1210cb189..c20c7b289d 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -60,10 +60,8 @@ def set_user_and_static_default_values(doc): # user permissions for link options doctype_user_permissions = user_permissions.get(df.options, []) # Allowed records for the reference doctype (link field) along with default doc - allowed_records, default_doc = filter_allowed_docs_for_doctype(doctype_user_permissions, df.parent, with_default_doc=True) - allowed_records += filter_allowed_docs_for_doctype(doctype_user_permissions, df.options, with_default_doc=False) - - allowed_records = list(set(allowed_records)) + allowed_records, default_doc = filter_allowed_docs_for_doctype(doctype_user_permissions, + df.parent, with_default_doc=True) user_default_value = get_user_default_value(df, defaults, doctype_user_permissions, allowed_records, default_doc) if user_default_value is not None: @@ -86,11 +84,17 @@ def get_user_default_value(df, defaults, doctype_user_permissions, allowed_recor # 2 - Look in user defaults user_default = defaults.get(df.fieldname) - is_allowed_user_default = user_default and (not user_permissions_exist(df, doctype_user_permissions) - or user_default in allowed_records) + + allowed_by_user_permission = True + if user_permissions_exist(df, doctype_user_permissions) and allowed_records: + # If allowed records is empty, that means there is *no* User Permission that + # is applicable to this new doctype. + + # If not, check if this field value is allowed via User Permissions. + allowed_by_user_permission = user_default in allowed_records # is this user default also allowed as per user permissions? - if is_allowed_user_default: + if user_default and allowed_by_user_permission: return user_default def get_static_default_value(df, doctype_user_permissions, allowed_records): From 0861b40f3cbc3c95f7948ee3323ff46982a4f471 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Wed, 3 Mar 2021 16:18:49 +0530 Subject: [PATCH 04/70] fix: double signature in emails --- frappe/email/email_body.py | 1 - frappe/templates/emails/standard.html | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 3fb1dfa0da..f8bab0d1a6 100755 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -258,7 +258,6 @@ def get_formatted_html(subject, message, footer=None, print_html=None, "site_url": get_url(), "header": get_header(header), "content": message, - "signature": get_signature(email_account), "footer": get_footer(email_account, footer), "title": subject, "print_html": print_html, diff --git a/frappe/templates/emails/standard.html b/frappe/templates/emails/standard.html index 4a47c9cf90..4c28b5152e 100644 --- a/frappe/templates/emails/standard.html +++ b/frappe/templates/emails/standard.html @@ -37,7 +37,9 @@

{{ content }}

+ {% if signature %}

{{ signature }}

+ {% endif %} From 84fb0737eb2d754ab51dec10862743630745c2ba Mon Sep 17 00:00:00 2001 From: pateljannat Date: Wed, 10 Mar 2021 10:43:11 +0530 Subject: [PATCH 05/70] fix: remove signature from html file --- frappe/templates/emails/standard.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/frappe/templates/emails/standard.html b/frappe/templates/emails/standard.html index 4c28b5152e..2a2093e1e9 100644 --- a/frappe/templates/emails/standard.html +++ b/frappe/templates/emails/standard.html @@ -37,9 +37,6 @@

{{ content }}

- {% if signature %} -

{{ signature }}

- {% endif %} From 2e70c1c77cb88f7a9b87a3728ebc16612d74df0f Mon Sep 17 00:00:00 2001 From: Anupam Date: Tue, 16 Feb 2021 15:25:06 +0530 Subject: [PATCH 06/70] feat: allowed the auto name in Customize Form --- frappe/core/doctype/doctype/doctype.py | 74 +++++++++---------- .../customize_form/customize_form.json | 16 +++- .../doctype/customize_form/customize_form.py | 6 +- 3 files changed, 54 insertions(+), 42 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index cbcfa350f5..3edb66bd42 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -67,7 +67,7 @@ class DocType(Document): self.scrub_field_names() self.set_default_in_list_view() self.set_default_translatable() - self.validate_series() + validate_series(self) self.validate_document_type() validate_fields(self) @@ -238,44 +238,6 @@ class DocType(Document): # unique is automatically an index if d.unique: d.search_index = 0 - def validate_series(self, autoname=None, name=None): - """Validate if `autoname` property is correctly set.""" - if not autoname: autoname = self.autoname - if not name: name = self.name - - if not autoname and self.get("fields", {"fieldname":"naming_series"}): - self.autoname = "naming_series:" - elif self.autoname == "naming_series:" and not self.get("fields", {"fieldname":"naming_series"}): - frappe.throw(_("Invalid fieldname '{0}' in autoname").format(self.autoname)) - - # validate field name if autoname field:fieldname is used - # Create unique index on autoname field automatically. - if autoname and autoname.startswith('field:'): - field = autoname.split(":")[1] - if not field or field not in [ df.fieldname for df in self.fields ]: - frappe.throw(_("Invalid fieldname '{0}' in autoname").format(field)) - else: - for df in self.fields: - if df.fieldname == field: - df.unique = 1 - break - - if autoname and (not autoname.startswith('field:')) \ - and (not autoname.startswith('eval:')) \ - and (not autoname.lower() in ('prompt', 'hash')) \ - and (not autoname.startswith('naming_series:')) \ - and (not autoname.startswith('format:')): - - prefix = autoname.split('.')[0] - used_in = frappe.db.sql(""" - SELECT `name` - FROM `tabDocType` - WHERE `autoname` LIKE CONCAT(%s, '.%%') - AND `name`!=%s - """, (prefix, name)) - if used_in: - frappe.throw(_("Series {0} already used in {1}").format(prefix, used_in[0][0])) - def on_update(self): """Update database schema, make controller templates if `custom` is not set and clear cache.""" try: @@ -666,6 +628,40 @@ class DocType(Document): validate_route_conflict(self.doctype, self.name) +def validate_series(dt): + if not dt.autoname and dt.get("fields", {"fieldname":"naming_series"}): + dt.autoname = "naming_series:" + elif dt.autoname == "naming_series:" and not dt.get("fields", {"fieldname":"naming_series"}): + frappe.throw(_("Invalid fieldname '{0}' in autoname").format(dt.autoname)) + + # validate field name if autoname field:fieldname is used + # Create unique index on autoname field automatically. + if dt.autoname and dt.autoname.startswith('field:'): + field = dt.autoname.split(":")[1] + if not field or field not in [ df.fieldname for df in dt.fields ]: + frappe.throw(_("Invalid fieldname '{0}' in autoname").format(field)) + else: + for df in dt.fields: + if df.fieldname == field: + df.unique = 1 + break + + if dt.autoname and (not dt.autoname.startswith('field:')) \ + and (not dt.autoname.startswith('eval:')) \ + and (not dt.autoname.lower() in ('prompt', 'hash')) \ + and (not dt.autoname.startswith('naming_series:')) \ + and (not dt.autoname.startswith('format:')): + + prefix = dt.autoname.split('.')[0] + used_in = frappe.db.sql(""" + SELECT `name` + FROM `tabDocType` + WHERE `autoname` LIKE CONCAT(%s, '.%%') + AND `name`!=%s + """, (prefix, dt.name)) + if used_in: + frappe.throw(_("Series {0} already used in {1}").format(prefix, used_in[0][0])) + def validate_links_table_fieldnames(meta): """Validate fieldnames in Links table""" if frappe.flags.in_patch: return diff --git a/frappe/custom/doctype/customize_form/customize_form.json b/frappe/custom/doctype/customize_form/customize_form.json index ff102b3c08..77f62b3ec3 100644 --- a/frappe/custom/doctype/customize_form/customize_form.json +++ b/frappe/custom/doctype/customize_form/customize_form.json @@ -23,6 +23,8 @@ "allow_import", "fields_section_break", "fields", + "naming_section", + "autoname", "view_settings_section", "title_field", "image_field", @@ -261,6 +263,18 @@ "fieldtype": "Table", "label": "Actions", "options": "DocType Action" + }, + { + "collapsible": 1, + "fieldname": "naming_section", + "fieldtype": "Section Break", + "label": "Naming" + }, + { + "description": "Naming Options:\n
  1. field:[fieldname] - By Field
  2. naming_series: - By Naming Series (field called naming_series must be present
  3. Prompt - Prompt user for a name
  4. [series] - Series by prefix (separated by a dot); for example PRE.#####
  5. \n
  6. format:EXAMPLE-{MM}morewords{fieldname1}-{fieldname2}-{#####} - Replace all braced words (fieldnames, date words (DD, MM, YY), series) with their value. Outside braces, any characters can be used.
", + "fieldname": "autoname", + "fieldtype": "Data", + "label": "Auto Name" } ], "hide_toolbar": 1, @@ -269,7 +283,7 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2020-09-24 14:16:49.594012", + "modified": "2021-02-16 15:22:11.108256", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form", diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 50acab46b5..74742551a4 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -17,6 +17,7 @@ from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype, che from frappe.custom.doctype.custom_field.custom_field import create_custom_field from frappe.custom.doctype.property_setter.property_setter import delete_property_setter from frappe.model.docfield import supports_translation +from frappe.core.doctype.doctype.doctype import validate_series class CustomizeForm(Document): def on_update(self): @@ -135,7 +136,7 @@ class CustomizeForm(Document): def save_customization(self): if not self.doc_type: return - + validate_series(self) self.flags.update_db = False self.flags.rebuild_doctype_for_global_search = False self.set_property_setters() @@ -485,7 +486,8 @@ doctype_properties = { 'show_preview_popup': 'Check', 'email_append_to': 'Check', 'subject_field': 'Data', - 'sender_field': 'Data' + 'sender_field': 'Data', + 'autoname': 'Data' } docfield_properties = { From 46ff9c6102774521ff4bff032745f350c1428728 Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 12 Mar 2021 12:40:22 +0530 Subject: [PATCH 07/70] fix: Fixed for field default values too + Added tests - made fix for field default values too along with user default values - Commonified validation of default value via User Perm - Added tests for both cases --- .../user_permission/test_user_permission.py | 83 ++++++++++++++++++- frappe/model/create_new.py | 26 ++++-- 2 files changed, 99 insertions(+), 10 deletions(-) diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py index 7e0b4a49c6..a1eb34d1e8 100644 --- a/frappe/core/doctype/user_permission/test_user_permission.py +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -2,7 +2,7 @@ # Copyright (c) 2017, Frappe Technologies and Contributors # See license.txt from __future__ import unicode_literals -from frappe.core.doctype.user_permission.user_permission import add_user_permissions +from frappe.core.doctype.user_permission.user_permission import add_user_permissions, remove_applicable from frappe.permissions import has_user_permission import frappe @@ -17,6 +17,7 @@ class TestUserPermission(unittest.TestCase): 'nested_doc_user@example.com')""") frappe.delete_doc_if_exists("DocType", "Person") frappe.db.sql_ddl("DROP TABLE IF EXISTS `tabPerson`") + frappe.db.sql_ddl("DROP TABLE IF EXISTS `tabDoc A`") def test_default_user_permission_validation(self): user = create_user('test_default_permission@example.com') @@ -153,6 +154,86 @@ class TestUserPermission(unittest.TestCase): self.assertTrue(has_user_permission(frappe.get_doc("Person", parent_record.name), user.name)) self.assertFalse(has_user_permission(frappe.get_doc("Person", child_record.name), user.name)) + def test_user_perm_on_new_doc_with_field_default(self): + """Test User Perm impact on frappe.new_doc. with *field* default value""" + from frappe.core.doctype.doctype.test_doctype import new_doctype + + frappe.set_user('Administrator') + user = create_user("new_doc_test@example.com", "Blogger") + + # make a doctype "Doc A" with 'doctype' link field and default value ToDo + if not frappe.db.exists("DocType", "Doc A"): + doc = new_doctype("Doc A", + fields=[ + { + "label": "DocType", + "fieldname": "doc", + "fieldtype": "Link", + "options": "DocType", + "default": "ToDo" + } + ], unique=0) + doc.insert() + + # make User Perm on DocType 'ToDo' in Assignment Rule (unrelated doctype) + add_user_permissions(get_params(user, "DocType", "ToDo", applicable=["Assignment Rule"])) + frappe.set_user("new_doc_test@example.com") + + new_doc = frappe.new_doc("Doc A") + + # User perm is created on ToDo but for doctype Assignment Rule only + # it should not have impact on Doc A + self.assertEquals(new_doc.doc, "ToDo") + + frappe.set_user('Administrator') + remove_applicable(["Assignment Rule"], "new_doc_test@example.com", "DocType", "ToDo") + + def test_user_perm_on_new_doc_with_user_default(self): + """Test User Perm impact on frappe.new_doc. with *user* default value""" + from frappe.core.doctype.session_default_settings.session_default_settings import (clear_session_defaults, + set_session_default_values) + + frappe.set_user('Administrator') + user = create_user("user_default_test@example.com", "Blogger") + + # make a doctype "Doc A" with 'doctype' link field + if not frappe.db.exists("DocType", "Doc A"): + doc = new_doctype("Doc A", + fields=[ + { + "label": "DocType", + "fieldname": "doc", + "fieldtype": "Link", + "options": "DocType", + } + ], unique=0) + doc.insert() + + # create a 'DocType' session default field + if not frappe.db.exists("Session Default", {"ref_doctype": "DocType"}): + settings = frappe.get_single('Session Default Settings') + settings.append("session_defaults", { + "ref_doctype": "DocType" + }) + settings.save() + + # make User Perm on DocType 'ToDo' in Assignment Rule (unrelated doctype) + add_user_permissions(get_params(user, "DocType", "ToDo", applicable=["Assignment Rule"])) + + # User default Doctype value is ToDo via Session Defaults + frappe.set_user("user_default_test@example.com") + set_session_default_values({"doctype": "ToDo"}) + + new_doc = frappe.new_doc("Doc A") + + # User perm is created on ToDo but for doctype Assignment Rule only + # it should not have impact on WorkFlow + self.assertEquals(new_doc.doc, "ToDo") + + frappe.set_user('Administrator') + clear_session_defaults() + remove_applicable(["Assignment Rule"], "user_default_test@example.com", "DocType", "ToDo") + def create_user(email, role="System Manager"): ''' create user with role system manager ''' if frappe.db.exists('User', email): diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index c20c7b289d..dc4fd97e4c 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -85,13 +85,8 @@ def get_user_default_value(df, defaults, doctype_user_permissions, allowed_recor # 2 - Look in user defaults user_default = defaults.get(df.fieldname) - allowed_by_user_permission = True - if user_permissions_exist(df, doctype_user_permissions) and allowed_records: - # If allowed records is empty, that means there is *no* User Permission that - # is applicable to this new doctype. - - # If not, check if this field value is allowed via User Permissions. - allowed_by_user_permission = user_default in allowed_records + allowed_by_user_permission = validate_value_via_user_permissions(df, doctype_user_permissions, + allowed_records, user_default=user_default) # is this user default also allowed as per user permissions? if user_default and allowed_by_user_permission: @@ -108,8 +103,8 @@ def get_static_default_value(df, doctype_user_permissions, allowed_records): elif not cstr(df.default).startswith(":"): # a simple default value - is_allowed_default_value = (not user_permissions_exist(df, doctype_user_permissions) - or (df.default in allowed_records)) + is_allowed_default_value = validate_value_via_user_permissions(df, doctype_user_permissions, + allowed_records) if df.fieldtype!="Link" or df.options=="User" or is_allowed_default_value: return df.default @@ -117,6 +112,19 @@ def get_static_default_value(df, doctype_user_permissions, allowed_records): elif (df.fieldtype == "Select" and df.options and df.options not in ("[Select]", "Loading...")): return df.options.split("\n")[0] +def validate_value_via_user_permissions(df, doctype_user_permissions, allowed_records, user_default=None): + is_valid = True + # If User Permission exists and allowed records is empty, + # that means there are User Perms, but none applicable to this new doctype. + + if user_permissions_exist(df, doctype_user_permissions) and allowed_records: + # If allowed records is not empty, + # check if this field value is allowed via User Permissions applied to this doctype. + value = user_default if user_default else df.default + is_valid = value in allowed_records + + return is_valid + def set_dynamic_default_values(doc, parent_doc, parentfield): # these values should not be cached user_permissions = get_user_permissions() From 3564eadc61e31cf4055571278f465fa8d9d4398e Mon Sep 17 00:00:00 2001 From: marination Date: Fri, 12 Mar 2021 12:57:27 +0530 Subject: [PATCH 08/70] fix: Sider (make reused import common) --- frappe/core/doctype/user_permission/test_user_permission.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py index a1eb34d1e8..1740d1b1e1 100644 --- a/frappe/core/doctype/user_permission/test_user_permission.py +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals from frappe.core.doctype.user_permission.user_permission import add_user_permissions, remove_applicable from frappe.permissions import has_user_permission +from frappe.core.doctype.doctype.test_doctype import new_doctype import frappe import unittest @@ -156,8 +157,6 @@ class TestUserPermission(unittest.TestCase): def test_user_perm_on_new_doc_with_field_default(self): """Test User Perm impact on frappe.new_doc. with *field* default value""" - from frappe.core.doctype.doctype.test_doctype import new_doctype - frappe.set_user('Administrator') user = create_user("new_doc_test@example.com", "Blogger") From d7bc848a522e236d84377d88b733df286cc0484c Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 11 Mar 2021 23:11:14 +0530 Subject: [PATCH 09/70] test(semgrep): python and javascript translation - Move rules to .github folder to reduce clutter in root folder - separate out rules - add tests for rules - docs for writing more rules --- .github/helper/semgrep_rules/README.md | 38 +++++++++++++ .github/helper/semgrep_rules/security.py | 6 +++ .github/helper/semgrep_rules/security.yml | 10 ++++ .github/helper/semgrep_rules/translate.js | 37 +++++++++++++ .github/helper/semgrep_rules/translate.py | 53 ++++++++++++++++++ .github/helper/semgrep_rules/translate.yml | 63 ++++++++++++++++++++++ .github/workflows/semgrep.yml | 2 +- .semgrep.yml | 29 ---------- 8 files changed, 208 insertions(+), 30 deletions(-) create mode 100644 .github/helper/semgrep_rules/README.md create mode 100644 .github/helper/semgrep_rules/security.py create mode 100644 .github/helper/semgrep_rules/security.yml create mode 100644 .github/helper/semgrep_rules/translate.js create mode 100644 .github/helper/semgrep_rules/translate.py create mode 100644 .github/helper/semgrep_rules/translate.yml delete mode 100644 .semgrep.yml diff --git a/.github/helper/semgrep_rules/README.md b/.github/helper/semgrep_rules/README.md new file mode 100644 index 0000000000..670d8d280f --- /dev/null +++ b/.github/helper/semgrep_rules/README.md @@ -0,0 +1,38 @@ +# Semgrep linting + +## What is semgrep? +Semgrep or "semantic grep" is language agnostic static analysis tool. In simple terms semgrep is syntax-aware `grep`, so unlike regex it doesn't get confused by different ways of writing same thing or whitespaces or code split in multiple lines etc. + +Example: + +To check if a translate function is using f-string or not the regex would be `r"_\(\s*f[\"']"` while equivalent rule in semgrep would be `_(f"...")`. As semgrep knows grammer of language it takes care of unnecessary whitespace, type of quotation marks etc. + +You can read more such examples in `.github/helper/semgrep_rules` directory. + +# Why/when to use this? +We want to maintain quality of contributions, at the same time remembering all the good practices can be pain to deal with while evaluating contributions. Using semgrep if you can translate "best practice" into a rule then it can automate the task for us. + +## Running locally + +Install semgrep using homebrew `brew install semgrep` or pip `pip install semgrep`. + +To run locally use following command: + +`semgrep --config=.github/helper/semgrep_rules [file/folder names]` + +## Testing +semgrep allows testing the tests. Refer to this page: https://semgrep.dev/docs/writing-rules/testing-rules/ + +When writing new rules you should write few positive and few negative cases as shown in the guide and current tests. + +To run current tests: `semgrep --test --test-ignore-todo .github/helper/semgrep_rules` + + +## Reference + +If you are new to Semgrep read following pages to get started on writing/modifying rules: + +- https://semgrep.dev/docs/getting-started/ +- https://semgrep.dev/docs/writing-rules/rule-syntax +- https://semgrep.dev/docs/writing-rules/pattern-examples/ +- https://semgrep.dev/docs/writing-rules/rule-ideas/#common-use-cases diff --git a/.github/helper/semgrep_rules/security.py b/.github/helper/semgrep_rules/security.py new file mode 100644 index 0000000000..f477d7c176 --- /dev/null +++ b/.github/helper/semgrep_rules/security.py @@ -0,0 +1,6 @@ +def function_name(input): + # ruleid: frappe-codeinjection-eval + eval(input) + +# ok: frappe-codeinjection-eval +eval("1 + 1") diff --git a/.github/helper/semgrep_rules/security.yml b/.github/helper/semgrep_rules/security.yml new file mode 100644 index 0000000000..8b21979208 --- /dev/null +++ b/.github/helper/semgrep_rules/security.yml @@ -0,0 +1,10 @@ +rules: +- id: frappe-codeinjection-eval + patterns: + - pattern-not: eval("...") + - pattern: eval(...) + message: | + Detected the use of eval(). eval() can be dangerous if used to evaluate + dynamic content. Avoid it or use safe_eval(). + languages: [python] + severity: ERROR diff --git a/.github/helper/semgrep_rules/translate.js b/.github/helper/semgrep_rules/translate.js new file mode 100644 index 0000000000..7b92fe2dff --- /dev/null +++ b/.github/helper/semgrep_rules/translate.js @@ -0,0 +1,37 @@ +// ruleid: frappe-translation-empty-string +__("") +// ruleid: frappe-translation-empty-string +__('') + +// ok: frappe-translation-js-formatting +__('Welcome {0}, get started with ERPNext in just a few clicks.', [full_name]); + +// ruleid: frappe-translation-js-formatting +__(`Welcome ${full_name}, get started with ERPNext in just a few clicks.`); + +// ok: frappe-translation-js-formatting +__('This is fine'); + + +// ok: frappe-translation-trailing-spaces +__('This is fine'); + +// ruleid: frappe-translation-trailing-spaces +__(' this is not ok '); +// ruleid: frappe-translation-trailing-spaces +__('this is not ok '); +// ruleid: frappe-translation-trailing-spaces +__(' this is not ok'); + +// ok: frappe-translation-js-splitting +__('You have {0} subscribers in your mailing list.', [subscribers.length]) + +// todoruleid: frappe-translation-js-splitting +__('You have') + subscribers.length + __('subscribers in your mailing list.') + +// ruleid: frappe-translation-js-splitting +__('You have' + 'subscribers in your mailing list.') + +// ruleid: frappe-translation-js-splitting +__('You have {0} subscribers' + + 'in your mailing list', [subscribers.length]) diff --git a/.github/helper/semgrep_rules/translate.py b/.github/helper/semgrep_rules/translate.py new file mode 100644 index 0000000000..bd6cd9126c --- /dev/null +++ b/.github/helper/semgrep_rules/translate.py @@ -0,0 +1,53 @@ +# Examples taken from https://frappeframework.com/docs/user/en/translations +# This file is used for testing the tests. + +from frappe import _ + +full_name = "Jon Doe" +# ok: frappe-translation-python-formatting +_('Welcome {0}, get started with ERPNext in just a few clicks.').format(full_name) + +# ruleid: frappe-translation-python-formatting +_('Welcome %s, get started with ERPNext in just a few clicks.' % full_name) +# ruleid: frappe-translation-python-formatting +_('Welcome %(name)s, get started with ERPNext in just a few clicks.' % {'name': full_name}) + +# ruleid: frappe-translation-python-formatting +_('Welcome {0}, get started with ERPNext in just a few clicks.'.format(full_name)) + + +subscribers = ["Jon", "Doe"] +# ok: frappe-translation-python-formatting +_('You have {0} subscribers in your mailing list.').format(len(subscribers)) + +# ruleid: frappe-translation-python-splitting +_('You have') + len(subscribers) + _('subscribers in your mailing list.') + +# ruleid: frappe-translation-python-splitting +_('You have {0} subscribers \ + in your mailing list').format(len(subscribers)) + +# ok: frappe-translation-python-splitting +_('You have {0} subscribers') \ + + 'in your mailing list' + +# ruleid: frappe-translation-trailing-spaces +msg = _(" You have {0} pending invoice ") +# ruleid: frappe-translation-trailing-spaces +msg = _("You have {0} pending invoice ") +# ruleid: frappe-translation-trailing-spaces +msg = _(" You have {0} pending invoice") + +# ok: frappe-translation-trailing-spaces +msg = ' ' + _("You have {0} pending invoices") + ' ' + +# ruleid: frappe-translation-python-formatting +_(f"can not format like this - {subscribers}") +# ruleid: frappe-translation-python-splitting +_(f"what" + f"this is also not cool") + + +# ruleid: frappe-translation-empty-string +_("") +# ruleid: frappe-translation-empty-string +_('') diff --git a/.github/helper/semgrep_rules/translate.yml b/.github/helper/semgrep_rules/translate.yml new file mode 100644 index 0000000000..3737da5a7e --- /dev/null +++ b/.github/helper/semgrep_rules/translate.yml @@ -0,0 +1,63 @@ +rules: +- id: frappe-translation-empty-string + pattern-either: + - pattern: _("") + - pattern: __("") + message: | + Empty string is useless for translation. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [python, javascript, json] + severity: ERROR + +- id: frappe-translation-trailing-spaces + pattern-either: + - pattern: _("=~/(^[ \t]+|[ \t]+$)/") + - pattern: __("=~/(^[ \t]+|[ \t]+$)/") + message: | + Trailing or leading whitespace not allowed in translate strings. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [python, javascript, json] + severity: ERROR + +- id: frappe-translation-python-formatting + pattern-either: + - pattern: _("..." % ...) + - pattern: _("...".format(...)) + - pattern: _(f"...") + message: | + Only positional formatters are allowed and formatting should not be done before translating. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [python] + severity: ERROR + +- id: frappe-translation-js-formatting + patterns: + - pattern: __(`...`) + - pattern-not: __("...") + message: | + Template strings are not allowed for text formatting. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [javascript, json] + severity: ERROR + +- id: frappe-translation-python-splitting + pattern-either: + - pattern: _(...) + ... + _(...) + - pattern: _("..." + "...") + - pattern-regex: '_\([^\)]*\\\s*' + message: | + Do not split strings inside translate function. Do not concatenate using translate functions. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [python] + severity: ERROR + +- id: frappe-translation-js-splitting + pattern-either: + - pattern-regex: '__\([^\)]*[\+\\]\s*' + - pattern: __('...' + '...') + - pattern: __('...') + __('...') + message: | + Do not split strings inside translate function. Do not concatenate using translate functions. + Please refer: https://frappeframework.com/docs/user/en/translations + languages: [javascript, json] + severity: ERROR diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 321dfb567b..1d5694f521 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -19,4 +19,4 @@ jobs: python -m pip install -q semgrep git fetch origin $GITHUB_BASE_REF:$GITHUB_BASE_REF -q files=$(git diff --name-only --diff-filter=d $GITHUB_BASE_REF) - if [ -f .semgrep.yml ]; then semgrep --config=.semgrep.yml --quiet --error $files; fi + [[ -d .github/helper/semgrep_rules ]] && semgrep --config=.github/helper/semgrep_rules --quiet --error $files diff --git a/.semgrep.yml b/.semgrep.yml deleted file mode 100644 index 99d237251e..0000000000 --- a/.semgrep.yml +++ /dev/null @@ -1,29 +0,0 @@ -#Reference: https://semgrep.dev/docs/writing-rules/rule-syntax/ - -rules: -- id: eval - patterns: - - pattern-not: eval("...") - - pattern: eval(...) - message: | - Detected the use of eval(). eval() can be dangerous if used to evaluate - dynamic content. Avoid it or use safe_eval(). - languages: - - python - severity: ERROR - -# translations -- id: frappe-translation-syntax-python - pattern-either: - - pattern: _(f"...") # f-strings not allowed - - pattern: _("..." + "...") # concatenation not allowed - - pattern: _("") # empty string is meaningless - - pattern: _("..." % ...) # Only positional formatters are allowed. - - pattern: _("...".format(...)) # format should not be used before translating - - pattern: _("...") + ... + _("...") # don't split strings - message: | - Incorrect use of translation function detected. - Please refer: https://frappeframework.com/docs/user/en/translations - languages: - - python - severity: ERROR From 7e2b671fa368aea12684044baf5a38d79f6a5299 Mon Sep 17 00:00:00 2001 From: Marica Date: Tue, 16 Mar 2021 11:39:22 +0530 Subject: [PATCH 10/70] fix: Comment in test --- frappe/core/doctype/user_permission/test_user_permission.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py index 1740d1b1e1..8319b0a270 100644 --- a/frappe/core/doctype/user_permission/test_user_permission.py +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -226,7 +226,7 @@ class TestUserPermission(unittest.TestCase): new_doc = frappe.new_doc("Doc A") # User perm is created on ToDo but for doctype Assignment Rule only - # it should not have impact on WorkFlow + # it should not have impact on Doc A self.assertEquals(new_doc.doc, "ToDo") frappe.set_user('Administrator') From 981bc60302a4c81b76831b6fe329dc31d69e918c Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 16 Mar 2021 14:42:45 +0530 Subject: [PATCH 11/70] fix: quill image border overflow issue --- frappe/public/scss/common/quill.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/public/scss/common/quill.scss b/frappe/public/scss/common/quill.scss index fae7eb5502..e5303be5cf 100644 --- a/frappe/public/scss/common/quill.scss +++ b/frappe/public/scss/common/quill.scss @@ -36,7 +36,6 @@ border-bottom-left-radius: var(--border-radius); border-bottom-right-radius: var(--border-radius); overflow: hidden; - position: initial !important; } .ql-snow { From 32c1847a1d358c3727fdd1ff50fc2239fcb98bea Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 17 Mar 2021 14:08:37 +0530 Subject: [PATCH 12/70] fix: remove redundant application of field level permissions --- frappe/model/document.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index f0027e67f1..6110276af1 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -339,7 +339,6 @@ class Document(BaseDocument): if hasattr(self, "__unsaved"): delattr(self, "__unsaved") - self.apply_fieldlevel_read_permissions() return self def copy_attachments_from_amended_from(self): From ee1806828f3e3c00701019b5636f4ee90b6ae02a Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Wed, 17 Mar 2021 18:16:03 +0530 Subject: [PATCH 13/70] chore: Bump develop branch version to v14 (#12600) --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 871d1b9e92..fd15efc641 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -33,7 +33,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '13.0.0-dev' +__version__ = '14.0.0-dev' __title__ = "Frappe Framework" local = Local() From 662f40960493a626c3a167f80d4dc0d336032465 Mon Sep 17 00:00:00 2001 From: Britlog Date: Wed, 17 Mar 2021 13:50:20 +0100 Subject: [PATCH 14/70] feat: Add quoting parameter in the UnicodeWriter constructor (#12578) * Add quoting parameter in the constructor * fix: Use quoting kwarg to pass quoting value Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/utils/csvutils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/utils/csvutils.py b/frappe/utils/csvutils.py index 06ae221255..00163ade5f 100644 --- a/frappe/utils/csvutils.py +++ b/frappe/utils/csvutils.py @@ -107,10 +107,10 @@ def build_csv_response(data, filename): frappe.response["type"] = "csv" class UnicodeWriter: - def __init__(self, encoding="utf-8"): + def __init__(self, encoding="utf-8", quoting=csv.QUOTE_NONNUMERIC): self.encoding = encoding self.queue = StringIO() - self.writer = csv.writer(self.queue, quoting=csv.QUOTE_NONNUMERIC) + self.writer = csv.writer(self.queue, quoting=quoting) def writerow(self, row): if six.PY2: From 0533f47a22ec6022fcdec9d183b43e1a24921ca9 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Wed, 17 Mar 2021 19:05:24 +0530 Subject: [PATCH 15/70] revert: "chore: Bump develop branch version to v14" (#12604) --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index fd15efc641..871d1b9e92 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -33,7 +33,7 @@ if PY2: reload(sys) sys.setdefaultencoding("utf-8") -__version__ = '14.0.0-dev' +__version__ = '13.0.0-dev' __title__ = "Frappe Framework" local = Local() From bf6d336e95c6e0abfdf1f42430837e33be10db3c Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Wed, 17 Mar 2021 14:53:13 +0530 Subject: [PATCH 16/70] fix: update escape_html to escape quotes previous jquery hack didn't escape double quotes. --- frappe/public/js/frappe/utils/utils.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index b0fb39235f..ee206b928f 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -220,8 +220,23 @@ Object.assign(frappe.utils, { }); return out.join(newline); }, + + escape_html: function(txt) { - return $("
").text(txt || "").html(); + let escape_html_mapping = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '/': '/', + '`': '`', + '=': '=' + }; + + return String(txt).replace(/[&<>"'`=/]/g, function(char) { + return escape_html_mapping[char]; + }); }, html2text: function(html) { From 83147018871c0b53aafe0516ea5f00989ad78541 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 17 Mar 2021 19:22:17 +0530 Subject: [PATCH 17/70] feat: print method in utils --- frappe/public/js/frappe/utils/utils.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index b0fb39235f..a5d3fa2175 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1272,4 +1272,27 @@ Object.assign(frappe.utils, { }); return names_for_mentions; }, + print(doctype, docname, print_format, letterhead, lang_code) { + let w = window.open( + frappe.urllib.get_full_url( + '/printview?doctype=' + + encodeURIComponent(doctype) + + '&name=' + + encodeURIComponent(docname) + + '&trigger_print=1' + + '&format=' + + encodeURIComponent(print_format) + + '&no_letterhead=' + + (letterhead ? '0' : '1') + + '&letterhead=' + + encodeURIComponent(letterhead) + + (lang_code ? '&_lang=' + lang_code : '') + ) + ); + + if (!w) { + frappe.msgprint(__('Please enable pop-ups')); + return; + } + } }); From 97e4494a8736e60bb705e726230c4b6f1ef8457d Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Thu, 18 Mar 2021 11:53:53 +0530 Subject: [PATCH 18/70] fix: escape title and filter values in list view - Markdown editor should not be filterable - escape HTML in data-filter attribute --- frappe/public/js/frappe/list/list_view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/list/list_view.js b/frappe/public/js/frappe/list/list_view.js index 396cd983fb..dc0946e17a 100644 --- a/frappe/public/js/frappe/list/list_view.js +++ b/frappe/public/js/frappe/list/list_view.js @@ -747,7 +747,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { ${_value} `; } else if ( - ["Text Editor", "Text", "Small Text", "HTML Editor"].includes( + ["Text Editor", "Text", "Small Text", "HTML Editor", "Markdown Editor"].includes( df.fieldtype ) ) { @@ -756,7 +756,7 @@ frappe.views.ListView = class ListView extends frappe.views.BaseList { `; } else { html = ` + data-filter="${fieldname},=,${frappe.utils.escape_html(value)}"> ${format()} `; } From cf2eacbb3a6a20eaec11d20b39d5f25ae03c5504 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Thu, 18 Mar 2021 12:24:29 +0530 Subject: [PATCH 19/70] fix: Remove list.min.css from hook (#12606) --- frappe/hooks.py | 1 - frappe/public/css/list.css | 527 ------------------------------------- 2 files changed, 528 deletions(-) delete mode 100644 frappe/public/css/list.css diff --git a/frappe/hooks.py b/frappe/hooks.py index 177ac13a45..c06930afd8 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -38,7 +38,6 @@ app_include_js = [ ] app_include_css = [ "/assets/css/desk.min.css", - "/assets/css/list.min.css", "/assets/css/report.min.css", ] diff --git a/frappe/public/css/list.css b/frappe/public/css/list.css deleted file mode 100644 index 88ad147d33..0000000000 --- a/frappe/public/css/list.css +++ /dev/null @@ -1,527 +0,0 @@ -.frappe-list .result, -.frappe-list .no-result, -.frappe-list .freeze { - min-height: calc(100vh - 284px); -} -.freeze-row .level-left, -.freeze-row .level-right, -.freeze-row .list-row-col { - height: 100%; - width: 100%; -} -.freeze-row .list-row-col { - background-color: #d1d8dd; - border-radius: 2px; - animation: 2s breathe infinite; -} -@keyframes breathe { - 0% { - opacity: 0.2; - } - 50% { - opacity: 0.5; - } - 100% { - opacity: 0.2; - } -} -.sort-selector .dropdown:hover { - text-decoration: underline; -} -.filter-list { - position: relative; -} -.filter-list .sort-selector { - position: absolute; - top: 15px; - right: 15px; -} -.tag-filters-area { - padding: 15px 15px 0px; - border-bottom: 1px solid #d1d8dd; -} -.active-tag-filters { - padding-bottom: 4px; - padding-right: 120px; -} -@media (max-width: 767px) { - .active-tag-filters { - padding-right: 80px; - } -} -.active-tag-filters .btn { - margin-bottom: 10px; -} -.active-tag-filters .btn-group { - margin-left: 10px; - /*white-space: nowrap;*/ - font-size: 0; -} -.active-tag-filters .btn-group .btn-default { - background-color: transparent; - border: 1px solid #d1d8dd; - color: #8D99A6; - float: none; -} -.filter-box { - border-bottom: 1px solid #d1d8dd; - padding: 10px 15px 3px; -} -.filter-box .remove-filter { - margin-top: 6px; - margin-left: 15px; -} -.filter-box .filter-field { - padding-right: 15px; - width: calc(100% - 36px); -} -.filter-box .filter-field .frappe-control { - position: relative; -} -@media (min-width: 767px) { - .filter-box .row > div[class*="col-sm-"] { - padding-right: 0px; - } - .filter-field { - width: 65% !important; - } - .filter-field .frappe-control { - position: relative; - } -} -.list-row-container { - border-bottom: 1px solid #d1d8dd; - display: flex; - flex-direction: column; -} -.list-row { - padding: 12px 15px; - height: 40px; - cursor: pointer; - transition: color 0.2s; - -webkit-transition: color 0.2s; -} -.list-row:hover { - background-color: #F7FAFC; -} -.list-row:last-child { - border-bottom: 0px; -} -.list-row .level-left { - flex: 3; - width: 75%; -} -.list-row .level-right { - flex: 1; -} -.list-row-head { - background-color: #F7FAFC; - border-bottom: 1px solid #d1d8dd !important; -} -.list-row-head .list-subject { - font-weight: normal; -} -.list-row-head .checkbox-actions { - display: none; -} -.list-row-col { - flex: 1; - margin-right: 15px; -} -.list-subject { - flex: 2; - justify-content: start; -} -.list-subject .level-item { - margin-right: 8px; -} -.list-subject.seen { - font-weight: normal; -} -.list-row-activity { - justify-content: flex-end; - min-width: 120px; -} -.list-row-activity .avatar:not(.avatar-empty) { - margin: 0; -} -.list-row-activity > span { - display: inline-block; -} -.list-row-activity > span:not(:last-child) { - margin-right: 8px; -} -.list-row-activity .comment-count { - min-width: 35px; -} -.list-paging-area, -.footnote-area { - padding: 10px 15px; - border-top: 1px solid #d1d8dd; - overflow: auto; -} -.progress { - height: 10px; -} -.likes-count { - display: none; -} -.list-liked-by-me { - margin-bottom: 1px; -} -input.list-check-all, -input.list-row-checkbox { - margin-top: 0px; -} -.filterable { - cursor: pointer; -} -.listview-main-section .octicon-heart { - cursor: pointer; -} -.listview-main-section .page-form { - padding-left: 17px; -} -@media (max-width: 991px) { - .listview-main-section .page-form { - padding-left: 25px; - } -} -.listview-main-section .page-form .octicon-search { - float: left; - padding-top: 7px; - margin-left: -4px; - margin-right: -4px; -} -@media (max-width: 991px) { - .listview-main-section .page-form .octicon-search { - margin-left: -12px; - } -} -.like-action.octicon-heart { - color: #ff5858; -} -.list-comment-count { - display: inline-block; - width: 37px; - text-align: left; -} -.result.tags-shown .tag-row { - display: block; -} -.tag-row { - display: none; - margin-left: 50px; -} -.taggle_placeholder { - top: 0; - left: 5px; - font-size: 11px; - color: #8D99A6; -} -.taggle_list { - padding-left: 5px; - margin-bottom: 3px; -} -.taggle_list .taggle { - font-size: 11px; - padding: 2px 4px; - font-weight: normal; - background-color: #F0F4F7; - white-space: normal; -} -.taggle_list .taggle:hover { - padding: 2px 15px 2px 4px; - background: #cfdce5; - transition: all 0.2s; -} -.taggle_list li { - margin-bottom: 0; -} -.taggle_list li .awesomplete > ul > li { - width: 100%; -} -.taggle_list li .awesomplete > ul { - top: 15px; - z-index: 100; -} -.taggle_list .close { - right: 5px; - color: #36414C; - font-size: 11px; -} -.page-form .awesomplete > ul { - min-width: 300px; -} -.taggle_input { - padding: 0; - margin-top: 3px; - font-size: 11px; - max-width: 100px; -} -.image-view-container { - display: flex; - flex-wrap: wrap; -} -.image-view-container .image-view-row { - display: flex; - border-bottom: 1px solid #ebeff2; -} -.image-view-container .image-view-item { - flex: 0 0 25%; - padding: 15px; - border-bottom: 1px solid #EBEFF2; - border-right: 1px solid #EBEFF2; - max-width: 25%; -} -.image-view-container .image-view-item:nth-child(4n) { - border-right: none; -} -.image-view-container .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1), -.image-view-container .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1) ~ .image-view-item { - border-bottom: none; -} -.image-view-container .image-view-header { - margin-bottom: 10px; -} -.image-view-container .image-view-body:hover .zoom-view { - opacity: 0.7; -} -.image-view-container .image-view-body a { - text-decoration: none; -} -.image-view-container .image-field { - display: flex; - align-content: center; - align-items: center; - justify-content: center; - position: relative; - height: 200px; -} -.image-view-container .image-field img { - max-height: 100%; -} -.image-view-container .image-field.no-image { - background-color: #fafbfc; -} -.image-view-container .placeholder-text { - font-size: 72px; - color: #d1d8dd; -} -.image-view-container .zoom-view { - bottom: 10px !important; - right: 10px !important; - width: 36px; - height: 36px; - opacity: 0; - font-size: 16px; - color: #36414C; - position: absolute; -} -@media (max-width: 767px) { - .image-view-container .zoom-view { - opacity: 0.5; - } -} -@media (max-width: 991px) { - .image-view-container .image-view-item { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; - } - .image-view-container .image-view-item:nth-child(3n) { - border-right: none; - } - .image-view-container .image-view-item:nth-last-child(-n + 3):nth-child(3n + 1), - .image-view-container .image-view-item:nth-last-child(-n + 3):nth-child(3n + 1) ~ .image-view-item { - border-bottom: none; - } - .image-view-container .image-view-item:nth-child(4n) { - border-right: 1px solid #EBEFF2; - } - .image-view-container .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1), - .image-view-container .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1) ~ .image-view-item { - border-bottom: 1px solid #EBEFF2; - } -} -.item-selector { - border: 1px solid #d1d8dd; -} -.item-selector .image-view-row { - width: 100%; -} -.item-selector .image-field { - height: 120px; -} -.item-selector .placeholder-text { - font-size: 48px; -} -.image-view-container.three-column .image-view-item { - flex: 0 0 33.33333333%; - max-width: 33.33333333%; -} -.image-view-container.three-column .image-view-item:nth-child(3n) { - border-right: none; -} -.image-view-container.three-column .image-view-item:nth-last-child(-n + 3):nth-child(3n + 1), -.image-view-container.three-column .image-view-item:nth-last-child(-n + 3):nth-child(3n + 1) ~ .image-view-item { - border-bottom: none; -} -.image-view-container.three-column .image-view-item:nth-child(4n) { - border-right: 1px solid #EBEFF2; -} -.image-view-container.three-column .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1), -.image-view-container.three-column .image-view-item:nth-last-child(-n + 4):nth-child(4n + 1) ~ .image-view-item { - border-bottom: 1px solid #EBEFF2; -} -.pswp--svg .pswp__button, -.pswp--svg .pswp__button--arrow--left:before, -.pswp--svg .pswp__button--arrow--right:before { - background-image: url('/assets/frappe/images/default-skin.svg') !important; -} -.pswp--svg .pswp__button--arrow--left, -.pswp--svg .pswp__button--arrow--right { - background: none !important; -} -.pswp__bg { - background-color: #fff !important; -} -.pswp__more-items { - position: absolute; - bottom: 12px; - left: 50%; - transform: translateX(-50%); -} -.pswp__more-item { - display: inline-block; - margin: 5px; - height: 100px; - cursor: pointer; - border: 1px solid #d1d8dd; -} -.pswp__more-item img { - max-height: 100%; -} -.map-view-container { - display: flex; - flex-wrap: wrap; - width: 100%; - height: calc(100vh - 284px); - z-index: 0; -} -.list-paging-area .gantt-view-mode { - margin-left: 15px; - margin-right: 15px; -} -.gantt .details-container .heading { - margin-bottom: 10px; - font-size: 12px; -} -.gantt .details-container .avatar-small { - width: 16px; - height: 16px; -} -.gantt .details-container .standard-image { - display: block; -} -.inbox-attachment, -.inbox-link { - margin-right: 7px; -} -.select-inbox { - padding: 30px 30px; -} -.inbox-value { - padding-top: 2px; -} -.list-items { - width: 100%; -} -.list-item-container { - border-bottom: 1px solid #d1d8dd; -} -.list-item-container:last-child { - border-bottom: none; -} -.list-item-table { - border: 1px solid #d1d8dd; - border-radius: 3px; -} -.list-item { - display: flex; - align-items: center; - cursor: pointer; - height: 40px; - padding-left: 15px; - font-size: 12px; -} -.list-item:hover { - background-color: #F7FAFC; -} -@media (max-width: 767px) { - .list-item { - height: 50px; - padding-left: 10px; - font-size: 14px; - font-weight: normal; - } -} -.list-item--head { - background-color: #F7FAFC; - border-bottom: 1px solid #d1d8dd; - cursor: auto; -} -.list-item input[type=checkbox] { - margin: 0; - margin-right: 5px; - flex: 0 0 12px; -} -.list-item .liked-by, -.list-item .liked-by-filter-button { - display: inline-block; - width: 20px; - margin-right: 10px; -} -.list-item__content { - flex: 1; - margin-right: 15px; - display: flex; - align-items: center; -} -.list-item__content--flex-2 { - flex: 2; -} -.list-item__content--activity { - justify-content: flex-end; - margin-right: 5px; - min-width: 110px; -} -.list-item__content--activity .list-row-modified, -.list-item__content--activity .avatar-small { - margin-right: 10px; -} -.list-item__content--indicator span::before { - height: 12px; - width: 12px; -} -.list-item__content--id { - justify-content: flex-end; -} -.frappe-timestamp { - white-space: nowrap; -} -.file-grid { - display: flex; - flex-wrap: wrap; - align-content: flex-start; -} -.file-grid a { - height: 100%; -} -.file-wrapper { - width: 120px; - flex-direction: column; - align-items: center; -} -.file-title { - margin-top: 5px; -} From aecc43fcd517c5d5e625a3b29db18daf73d8d4f9 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 18 Mar 2021 12:43:06 +0530 Subject: [PATCH 20/70] fix: user profile link in leaderboard --- frappe/desk/leaderboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/leaderboard.py b/frappe/desk/leaderboard.py index 2a981f061b..d651687256 100644 --- a/frappe/desk/leaderboard.py +++ b/frappe/desk/leaderboard.py @@ -47,6 +47,6 @@ def get_energy_point_leaderboard(date_range, company = None, field = None, limit for user in energy_point_users: user_id = user['name'] user['name'] = get_fullname(user['name']) - user['formatted_name'] = '{}'.format(user_id, get_fullname(user_id)) + user['formatted_name'] = '{}'.format(user_id, get_fullname(user_id)) return energy_point_users \ No newline at end of file From 901cbc98f0cde32e3190b5f8616151dbec1c9406 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 18 Mar 2021 14:14:34 +0530 Subject: [PATCH 21/70] fix: Support calling get_context without a param --- frappe/website/context.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frappe/website/context.py b/frappe/website/context.py index 4236971aec..94bcb15e2e 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -50,8 +50,12 @@ def update_controller_context(context, controller): context[prop] = getattr(module, prop) if hasattr(module, "get_context"): + import inspect try: - ret = module.get_context(context) + if inspect.getargspec(module.get_context).args: + ret = module.get_context(context) + else: + ret = module.get_context() if ret: context.update(ret) except (frappe.PermissionError, frappe.DoesNotExistError, frappe.Redirect): From 2b2f7a7d9335f6add686acb2c14022ff5494fad8 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 18 Mar 2021 16:09:17 +0530 Subject: [PATCH 22/70] test: fix relative_time_filters ui test --- frappe/tests/ui_test_helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/tests/ui_test_helpers.py b/frappe/tests/ui_test_helpers.py index 54a5a24acf..f56311b2e3 100644 --- a/frappe/tests/ui_test_helpers.py +++ b/frappe/tests/ui_test_helpers.py @@ -41,12 +41,12 @@ def create_todo_records(): frappe.get_doc({ "doctype": "ToDo", - "date": add_to_date(now(), days=3), + "date": add_to_date(now(), days=7), "description": "this is first todo" }).insert() frappe.get_doc({ "doctype": "ToDo", - "date": add_to_date(now(), days=-3), + "date": add_to_date(now(), days=-7), "description": "this is second todo" }).insert() frappe.get_doc({ From b373c3c40a89792f57349a7fd3f4729ec32d1bf8 Mon Sep 17 00:00:00 2001 From: prssanna Date: Thu, 18 Mar 2021 18:11:50 +0530 Subject: [PATCH 23/70] fix: add owner to group by field options --- frappe/desk/doctype/dashboard_chart/dashboard_chart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index f5d1ee0df5..3b4d5e7be5 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -204,7 +204,7 @@ frappe.ui.form.on('Dashboard Chart', { {label: __('Last Modified On'), value: 'modified'} ]; let value_fields = []; - let group_by_fields = []; + let group_by_fields = [{label: 'Created By', value: 'owner'}]; let aggregate_function_fields = []; let update_form = function() { // update select options From 8fcee4e5f8d69ffbe1b5da606cdd5024a20bc2b1 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 18 Mar 2021 20:24:00 +0530 Subject: [PATCH 24/70] fix: Format currency values in dashboard chart --- frappe/public/js/frappe/widgets/chart_widget.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/widgets/chart_widget.js b/frappe/public/js/frappe/widgets/chart_widget.js index c1f5e6053f..104c457991 100644 --- a/frappe/public/js/frappe/widgets/chart_widget.js +++ b/frappe/public/js/frappe/widgets/chart_widget.js @@ -208,6 +208,7 @@ export default class ChartWidget extends Widget { this.fetch(this.filters, true, this.args).then(data => { if (this.chart_doc.chart_type == "Report") { + this.report_result = data; this.summary = data.report_summary; data = this.get_report_chart_data(data); } @@ -571,6 +572,13 @@ export default class ChartWidget extends Widget { axisOptions: { xIsSeries: this.chart_doc.timeseries, shortenYAxisNumbers: 1 + }, + tooltipOptions: { + formatTooltipY: value => + frappe.format(value, { + fieldtype: this.report_result.chart.fieldtype, + options: this.report_result.chart.options + }, { always_show_decimals: true, inline: true }) } }; @@ -750,4 +758,4 @@ export default class ChartWidget extends Widget { this.dashboard_chart && this.dashboard_chart.draw(true); }); } -} \ No newline at end of file +} From 43c3f76ff6bd69cfecbee0919bd294537b8cf631 Mon Sep 17 00:00:00 2001 From: pateljannat Date: Fri, 19 Mar 2021 10:57:43 +0530 Subject: [PATCH 25/70] fix: added backend signature again --- frappe/email/email_body.py | 5 +++++ frappe/public/js/frappe/views/communication.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index f8bab0d1a6..3dcdf00a8e 100755 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -252,12 +252,17 @@ def get_formatted_html(subject, message, footer=None, print_html=None, if not email_account: email_account = get_outgoing_email_account(False, sender=sender) + signature = None + if "" not in message: + signature = get_signature(email_account) + rendered_email = frappe.get_template("templates/emails/standard.html").render({ "brand_logo": get_brand_logo(email_account) if with_container or header else None, "with_container": with_container, "site_url": get_url(), "header": get_header(header), "content": message, + "signature": signature, "footer": get_footer(email_account, footer), "title": subject, "print_html": print_html, diff --git a/frappe/public/js/frappe/views/communication.js b/frappe/public/js/frappe/views/communication.js index a5f078fc7d..430024a1d0 100755 --- a/frappe/public/js/frappe/views/communication.js +++ b/frappe/public/js/frappe/views/communication.js @@ -718,7 +718,7 @@ frappe.views.CommunicationComposer = Class.extend({ if (!signature) { const res = await this.get_default_outgoing_email_account_signature(); - signature = res.message.signature; + signature = "" + res.message.signature; } if (signature && !frappe.utils.is_html(signature)) { From 20fb4045740d9ff58e3dbef5ef6dcdc560b2782b Mon Sep 17 00:00:00 2001 From: pateljannat Date: Fri, 19 Mar 2021 11:06:53 +0530 Subject: [PATCH 26/70] fix: added signature in html back --- frappe/templates/emails/standard.html | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/templates/emails/standard.html b/frappe/templates/emails/standard.html index 2a2093e1e9..4a47c9cf90 100644 --- a/frappe/templates/emails/standard.html +++ b/frappe/templates/emails/standard.html @@ -37,6 +37,7 @@

{{ content }}

+

{{ signature }}

From e165af787c58519310814daef79270529b57f55e Mon Sep 17 00:00:00 2001 From: prssanna Date: Fri, 19 Mar 2021 12:38:57 +0530 Subject: [PATCH 27/70] fix: add filters to user query --- frappe/core/doctype/user/user.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index c103ad7e4a..de80d47497 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -863,8 +863,8 @@ def reset_password(user): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs def user_query(doctype, txt, searchfield, start, page_len, filters): - from frappe.desk.reportview import get_match_cond - + from frappe.desk.reportview import get_match_cond, get_filters_cond + conditions=[] user_type_condition = "and user_type = 'System User'" if filters and filters.get('ignore_user_type'): user_type_condition = '' @@ -878,17 +878,22 @@ def user_query(doctype, txt, searchfield, start, page_len, filters): AND `name` NOT IN ({standard_users}) AND ({key} LIKE %(txt)s OR CONCAT_WS(' ', first_name, middle_name, last_name) LIKE %(txt)s) - {mcond} + {fcond} {mcond} ORDER BY CASE WHEN `name` LIKE %(txt)s THEN 0 ELSE 1 END, CASE WHEN concat_ws(' ', first_name, middle_name, last_name) LIKE %(txt)s THEN 0 ELSE 1 END, NAME asc - LIMIT %(page_len)s OFFSET %(start)s""".format( + LIMIT %(page_len)s OFFSET %(start)s + """.format( user_type_condition = user_type_condition, standard_users=", ".join([frappe.db.escape(u) for u in STANDARD_USERS]), - key=searchfield, mcond=get_match_cond(doctype)), - dict(start=start, page_len=page_len, txt=txt)) + key=searchfield, + fcond=get_filters_cond(doctype, filters, conditions), + mcond=get_match_cond(doctype) + ), + dict(start=start, page_len=page_len, txt=txt) + ) def get_total_users(): """Returns total no. of system users""" From 19a092feecd27660712ae1609d0a84fb585be517 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Fri, 19 Mar 2021 14:24:57 +0530 Subject: [PATCH 28/70] chore: Update frappe-charts (#12617) --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 40bed18cb7..55f3a6a443 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "driver.js": "^0.9.8", "express": "^4.17.1", "fast-deep-equal": "^2.0.1", - "frappe-charts": "^2.0.0-rc10", + "frappe-charts": "^2.0.0-rc11", "frappe-datatable": "^1.15.3", "frappe-gantt": "^0.5.0", "fuse.js": "^3.4.6", diff --git a/yarn.lock b/yarn.lock index 921c174e6c..f9fbc849b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2467,10 +2467,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -frappe-charts@^2.0.0-rc10: - version "2.0.0-rc10" - resolved "https://registry.yarnpkg.com/frappe-charts/-/frappe-charts-2.0.0-rc10.tgz#6e4cfbb99eb48374f78c0c048e1b04f278a3848a" - integrity sha512-qj1yFdBF7e0aW6xES/SK7cb4plimcm63ENG/0HOMKprijNj0V938/v9uhe1lSATvuqu65pPkHNbt93zfCLx9gQ== +frappe-charts@^2.0.0-rc11: + version "2.0.0-rc11" + resolved "https://registry.yarnpkg.com/frappe-charts/-/frappe-charts-2.0.0-rc11.tgz#0724fa0d43593362c075c3805ebbbe1a608fcef7" + integrity sha512-DY3tThT1lNGcJlRMOtIhnILtSm5h1iKysWhZAyj7yrGiOnOWbZpYx/NZzXZYwtRrWwMlYiLX2ylV76qo31ONsg== frappe-datatable@^1.15.3: version "1.15.3" From f3a60c44b38e940999caf105ce6784796a2311b4 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 19 Mar 2021 18:56:21 +0530 Subject: [PATCH 29/70] test: Set user as admin before test begins --- frappe/website/doctype/blog_post/test_blog_post.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/website/doctype/blog_post/test_blog_post.py b/frappe/website/doctype/blog_post/test_blog_post.py index cdf53122b2..cdac654dae 100644 --- a/frappe/website/doctype/blog_post/test_blog_post.py +++ b/frappe/website/doctype/blog_post/test_blog_post.py @@ -13,6 +13,9 @@ from frappe.website.doctype.blog_post.blog_post import get_blog_list from frappe.website.website_generator import WebsiteGenerator class TestBlogPost(unittest.TestCase): + def setUp(self): + frappe.set_user('Administrator') + def test_generator_view(self): pages = frappe.get_all('Blog Post', fields=['name', 'route'], filters={'published': 1, 'route': ('!=', '')}, limit =1) @@ -97,6 +100,7 @@ def make_test_blog(category_title="Test Blog Category"): doctype = 'Blogger', short_name='test-blogger', full_name='Test Blogger')).insert() + test_blog = frappe.get_doc(dict( doctype = 'Blog Post', blog_category = category_name, From ac7b40a7e37cc47cf5c4ab67baa05b9eb760b223 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 19 Mar 2021 18:57:31 +0530 Subject: [PATCH 30/70] fix: Do not show progress bar in CI environ --- frappe/utils/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index 728028622b..55bc574b8e 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -403,6 +403,14 @@ def call_hook_method(hook, *args, **kwargs): return out def update_progress_bar(txt, i, l): + if os.environ.get("CI"): + if i == 0: + sys.stdout.write(txt) + + sys.stdout.write(".") + sys.stdout.flush() + return + if not getattr(frappe.local, 'request', None): lt = len(txt) try: From e43a0d141d4237dd4ac596e907994619936edb3d Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 19 Mar 2021 19:19:56 +0530 Subject: [PATCH 31/70] chore: Ignore cypress setup for server tests --- .github/workflows/ci-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 665e7b6c10..ffc9cf6b73 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -101,6 +101,7 @@ jobs: ${{ runner.os }}-yarn- - name: Cache cypress binary + if: matrix.TYPE == 'ui' uses: actions/cache@v2 with: path: ~/.cache From 55daa0b424aca758658485b6e79f85e59696ec90 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Sat, 20 Mar 2021 00:29:27 +0530 Subject: [PATCH 32/70] fix: Reset Blog Post customization --- frappe/website/doctype/blog_post/test_blog_post.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/website/doctype/blog_post/test_blog_post.py b/frappe/website/doctype/blog_post/test_blog_post.py index cdac654dae..f0fc484a31 100644 --- a/frappe/website/doctype/blog_post/test_blog_post.py +++ b/frappe/website/doctype/blog_post/test_blog_post.py @@ -11,10 +11,11 @@ from frappe.website.render import render from frappe.utils import random_string from frappe.website.doctype.blog_post.blog_post import get_blog_list from frappe.website.website_generator import WebsiteGenerator +from frappe.custom.doctype.customize_form.customize_form import reset_customization class TestBlogPost(unittest.TestCase): def setUp(self): - frappe.set_user('Administrator') + reset_customization('Blog Post') def test_generator_view(self): pages = frappe.get_all('Blog Post', fields=['name', 'route'], From 962f9b94b1a7f83f1255388894e3168c280c2a38 Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Sat, 20 Mar 2021 00:54:27 +0530 Subject: [PATCH 33/70] test: allow adding multiple roles while creating user (#12616) --- .../user_permission/test_user_permission.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/frappe/core/doctype/user_permission/test_user_permission.py b/frappe/core/doctype/user_permission/test_user_permission.py index 7e0b4a49c6..d41781157b 100644 --- a/frappe/core/doctype/user_permission/test_user_permission.py +++ b/frappe/core/doctype/user_permission/test_user_permission.py @@ -153,16 +153,20 @@ class TestUserPermission(unittest.TestCase): self.assertTrue(has_user_permission(frappe.get_doc("Person", parent_record.name), user.name)) self.assertFalse(has_user_permission(frappe.get_doc("Person", child_record.name), user.name)) -def create_user(email, role="System Manager"): +def create_user(email, *roles): ''' create user with role system manager ''' if frappe.db.exists('User', email): return frappe.get_doc('User', email) - else: - user = frappe.new_doc('User') - user.email = email - user.first_name = email.split("@")[0] - user.add_roles(role) - return user + + user = frappe.new_doc('User') + user.email = email + user.first_name = email.split("@")[0] + + if not roles: + roles = ('System Manager',) + + user.add_roles(*roles) + return user def get_params(user, doctype, docname, is_default=0, hide_descendants=0, applicable=None): ''' Return param to insert ''' From 67f34644f701e6672fa3f1e204836e77f924a29c Mon Sep 17 00:00:00 2001 From: Prssanna Desai Date: Sat, 20 Mar 2021 00:58:48 +0530 Subject: [PATCH 34/70] revert: "fix: include space and tab in special characters to match to encode url" (#12619) Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/public/js/frappe/router.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js index c800f31d55..d9bd24d1b4 100644 --- a/frappe/public/js/frappe/router.js +++ b/frappe/public/js/frappe/router.js @@ -335,7 +335,10 @@ frappe.router = { return null; } else { a = String(a); - a = encodeURIComponent(a); + if (a && a.match(/[%'"]/)) { + // if special chars, then encode + a = encodeURIComponent(a); + } return a; } }).join('/'); From 572b5d670caf7d7a63d9c4170a864f44f2dbe1b3 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Sat, 20 Mar 2021 07:51:28 +0530 Subject: [PATCH 35/70] revert: "test: encoding @ since we encode each url" (#12625) --- cypress/integration/table_multiselect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/table_multiselect.js b/cypress/integration/table_multiselect.js index bdcf5d1ff0..faa72d63a5 100644 --- a/cypress/integration/table_multiselect.js +++ b/cypress/integration/table_multiselect.js @@ -45,6 +45,6 @@ context('Table MultiSelect', () => { cy.get(`.list-subject:contains("table multiselect")`).last().find('a').click(); cy.get('.frappe-control[data-fieldname="users"] .form-control .tb-selected-value').as('existing_value'); cy.get('@existing_value').find('.btn-link-to-form').click(); - cy.location('pathname').should('contain', '/user/test%40erpnext.com'); + cy.location('pathname').should('contain', '/user/test@erpnext.com'); }); }); From 0827fba2d84eeb7e9d0f1c4f3058f156aa561a75 Mon Sep 17 00:00:00 2001 From: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> Date: Mon, 22 Mar 2021 10:56:18 +0530 Subject: [PATCH 36/70] chore: Update stale.yml config --- .github/stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index dd1ab9e9e7..2d776759e4 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,7 +1,7 @@ # Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 10 +daysUntilStale: 7 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. @@ -28,7 +28,7 @@ markComment: > you can always reopen the PR when you're ready. Thank you for contributing. # Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 +limitPerRun: 10 # Limit to only `issues` or `pulls` only: pulls From e6b9f277689d2c6648c98cf64fb670ac0d1ff9d0 Mon Sep 17 00:00:00 2001 From: Fisher Yu <12823863+szufisher@users.noreply.github.com> Date: Mon, 22 Mar 2021 14:25:54 +0800 Subject: [PATCH 37/70] fix: copy paste rows more than 50 (one page) (#12548) * fix: copy paste rows more than one page fix the copy paste more than one page rows(50) * fix: ESLint Space before blocks * fix: bypass non value field type * fix: ESLint * fix: ESLint Co-authored-by: Suraj Shetty <13928957+surajshetty3416@users.noreply.github.com> --- frappe/public/js/frappe/form/controls/table.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index bde08e4cee..0373564074 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -19,6 +19,7 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ var cur_table_field =$(e.target).closest('div [data-fieldtype="Table"]').data('fieldname'); var cur_field = $(e.target).data('fieldname'); var cur_grid= cur_frm.get_field(cur_table_field).grid; + var grid_pagination = cur_grid.grid_pagination; var cur_grid_rows = cur_grid.grid_rows; var cur_doctype = cur_grid.doctype; var cur_row_docname =$(e.target).closest('div .grid-row').data('name'); @@ -30,17 +31,18 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ if (!pastedData) return; var data = frappe.utils.csv_to_array(pastedData,'\t'); if (data.length === 1 & data[0].length === 1) return; - if (data.length > 100){ - data = data.slice(0, 100); - frappe.msgprint(__('For performance, only the first 100 rows were processed.')); + if (data.length > 500) { + data = data.slice(0, 500); + frappe.msgprint(__('For performance, only the first 500 rows were processed.')); } var fieldnames = []; - var get_field = function(name_or_label){ + var get_field = function(name_or_label) { var fieldname; $.each(cur_grid.meta.fields,(ci,field)=>{ name_or_label = name_or_label.toLowerCase() if (field.fieldname.toLowerCase() === name_or_label || - (field.label && field.label.toLowerCase() === name_or_label)){ + (field.label && !in_list(frappe.model.no_value_type, field.fieldtype) && + field.label.toLowerCase() === name_or_label)) { fieldname = field.fieldname; return false; } @@ -71,6 +73,9 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ if (row_idx > cur_frm.doc[cur_table_field].length){ cur_grid.add_new_row(); } + if (row_idx > 1 && (row_idx - 1) % grid_pagination.page_length === 0) { + grid_pagination.go_to_page(grid_pagination.page_index + 1); + } var cur_row = cur_grid_rows[row_idx - 1]; row_idx ++; var row_name = cur_row.doc.name; From 6827b6b3a083a4a48f94dc754cab012aab98313e Mon Sep 17 00:00:00 2001 From: prssanna Date: Mon, 22 Mar 2021 11:58:41 +0530 Subject: [PATCH 38/70] fix: include space and tab in special characters to match to encode url --- frappe/public/js/frappe/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js index d9bd24d1b4..e4c0f0c55c 100644 --- a/frappe/public/js/frappe/router.js +++ b/frappe/public/js/frappe/router.js @@ -335,7 +335,7 @@ frappe.router = { return null; } else { a = String(a); - if (a && a.match(/[%'"]/)) { + if (a && a.match(/[%'"\s\t]/)) { // if special chars, then encode a = encodeURIComponent(a); } From c33d4a8077d24372bcabc98efb1b1c320f9a8021 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 22 Mar 2021 12:33:23 +0530 Subject: [PATCH 39/70] refactor: Grid paste code - Simplify code - Make paste code non-blocking - Remove row limit validation --- .../public/js/frappe/form/controls/table.js | 110 +++++++++--------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index 0373564074..9d2dd4f7c4 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -12,80 +12,82 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ parent: this.wrapper, control: this }); - if(this.frm) { + if (this.frm) { this.frm.grids[this.frm.grids.length] = this; } - this.$wrapper.on('paste',':text', function(e) { - var cur_table_field =$(e.target).closest('div [data-fieldtype="Table"]').data('fieldname'); - var cur_field = $(e.target).data('fieldname'); - var cur_grid= cur_frm.get_field(cur_table_field).grid; - var grid_pagination = cur_grid.grid_pagination; - var cur_grid_rows = cur_grid.grid_rows; - var cur_doctype = cur_grid.doctype; - var cur_row_docname =$(e.target).closest('div .grid-row').data('name'); - var row_idx = locals[cur_doctype][cur_row_docname].idx; - var clipboardData, pastedData; - // Get pasted data via clipboard API - clipboardData = e.clipboardData || window.clipboardData || e.originalEvent.clipboardData; - pastedData = clipboardData.getData('Text'); - if (!pastedData) return; - var data = frappe.utils.csv_to_array(pastedData,'\t'); + this.$wrapper.on('paste', ':text', e => { + const cur_table_field = this.df.fieldname; + const cur_field = $(e.target).data('fieldname'); + const cur_grid = this.grid; + const grid_pagination = cur_grid.grid_pagination; + const cur_grid_rows = cur_grid.grid_rows; + const cur_doctype = cur_grid.doctype; + const cur_row_docname = $(e.target).closest('div .grid-row').data('name'); + let row_idx = locals[cur_doctype][cur_row_docname].idx; + let clipboard_data = e.clipboardData || window.clipboardData || e.originalEvent.clipboardData; + let pasted_data = clipboard_data.getData('Text'); + if (!pasted_data) return; + + let data = frappe.utils.csv_to_array(pasted_data, '\t'); + if (data.length === 1 & data[0].length === 1) return; - if (data.length > 500) { - data = data.slice(0, 500); - frappe.msgprint(__('For performance, only the first 500 rows were processed.')); - } - var fieldnames = []; - var get_field = function(name_or_label) { - var fieldname; - $.each(cur_grid.meta.fields,(ci,field)=>{ + + let fieldnames = []; + let get_field = function(name_or_label) { + let fieldname; + cur_grid.meta.fields.forEach(field => { name_or_label = name_or_label.toLowerCase() if (field.fieldname.toLowerCase() === name_or_label || - (field.label && !in_list(frappe.model.no_value_type, field.fieldtype) && + (field.label && !in_list(frappe.model.no_value_type, field.fieldtype) && field.label.toLowerCase() === name_or_label)) { - fieldname = field.fieldname; - return false; + fieldname = field.fieldname; + return false; } }); return fieldname; } - if (get_field(data[0][0])){ // for raw data with column header - $.each(data[0], (ci, column)=>{fieldnames.push(get_field(column));}); + + // for raw data with column header + if (get_field(data[0][0])) { + data[0].forEach(column =>{ + fieldnames.push(get_field(column)); + }); data.shift(); - } - else{ // no column header, map to the existing visible columns - var visible_columns = cur_grid_rows[0].get_visible_columns(); - var find; - $.each(visible_columns, (ci, column)=>{ - if (column.fieldname === cur_field) find = true; - find && fieldnames.push(column.fieldname); + } else { + // no column header, map to the existing visible columns + let visible_columns = cur_grid_rows[0].get_visible_columns(); + visible_columns.forEach(column => { + if (column.fieldname === cur_field) { + fieldnames.push(column.fieldname); + } }) } - $.each(data, function(i, row) { - var blank_row = true; - $.each(row, function(ci, value) { - if(value) { - blank_row = false; - return false; - } - }); - if(!blank_row) { - if (row_idx > cur_frm.doc[cur_table_field].length){ - cur_grid.add_new_row(); + + data.forEach((row, i) => { + let blank_row = !row.filter(Boolean).length; + if (blank_row) return + setTimeout(() => { + if (row_idx > this.frm.doc[cur_table_field].length) { + this.grid.add_new_row(); } if (row_idx > 1 && (row_idx - 1) % grid_pagination.page_length === 0) { grid_pagination.go_to_page(grid_pagination.page_index + 1); } - var cur_row = cur_grid_rows[row_idx - 1]; + const cur_row = cur_grid_rows[row_idx - 1]; row_idx ++; - var row_name = cur_row.doc.name; - $.each(row, function(ci, value) { - if (fieldnames[ci]) frappe.model.set_value(cur_doctype, row_name, fieldnames[ci], value); + const row_name = cur_row.doc.name; + row.forEach((value, ci) => { + if (fieldnames[ci]) { + frappe.model.set_value(cur_doctype, row_name, fieldnames[ci], value); + let progress = i + 1; + frappe.show_progress(__('Processing'), i + 1, data.length); + if (progress == data.length) { + frappe.hide_progress(); + } + } }); - frappe.show_progress(__('Processing'), i, data.length); - } + }, 0); }); - frappe.hide_progress(); return false; // Prevent the default handler from running. }); }, From 56c1c734fbd9e72535de6b7c185aff390393c8df Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 22 Mar 2021 13:05:00 +0530 Subject: [PATCH 40/70] refactor: Get field code --- .../public/js/frappe/form/controls/table.js | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index 9d2dd4f7c4..f7ad66b05a 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -33,19 +33,26 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ if (data.length === 1 & data[0].length === 1) return; let fieldnames = []; - let get_field = function(name_or_label) { + let get_field = field_name => { let fieldname; - cur_grid.meta.fields.forEach(field => { - name_or_label = name_or_label.toLowerCase() - if (field.fieldname.toLowerCase() === name_or_label || - (field.label && !in_list(frappe.model.no_value_type, field.fieldtype) && - field.label.toLowerCase() === name_or_label)) { - fieldname = field.fieldname; - return false; - } + cur_grid.meta.fields.some(field => { + if (frappe.model.no_value_type.includes(field.fieldtype)) { + return false + } + + field_name = field_name.toLowerCase() + const is_field_matching = (field_name) => { + return field.fieldname.toLowerCase() === field_name + || (field.label || "").toLowerCase() === field_name + } + + if (is_field_matching()) { + fieldname = field.fieldname; + return true; + } }); return fieldname; - } + }; // for raw data with column header if (get_field(data[0][0])) { @@ -65,7 +72,7 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ data.forEach((row, i) => { let blank_row = !row.filter(Boolean).length; - if (blank_row) return + if (blank_row) return; setTimeout(() => { if (row_idx > this.frm.doc[cur_table_field].length) { this.grid.add_new_row(); From 6f725c620969c0b71221e6e834ab16bf99519332 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 22 Mar 2021 13:13:48 +0530 Subject: [PATCH 41/70] style: Add missing semicolon --- frappe/public/js/frappe/form/controls/table.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index f7ad66b05a..f2e40c4b01 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -37,14 +37,14 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ let fieldname; cur_grid.meta.fields.some(field => { if (frappe.model.no_value_type.includes(field.fieldtype)) { - return false + return false; } - field_name = field_name.toLowerCase() + field_name = field_name.toLowerCase(); const is_field_matching = (field_name) => { return field.fieldname.toLowerCase() === field_name - || (field.label || "").toLowerCase() === field_name - } + || (field.label || "").toLowerCase() === field_name; + }; if (is_field_matching()) { fieldname = field.fieldname; From 55a8667c5671947aff6a8836d22a100059b0fff0 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 22 Mar 2021 14:10:38 +0530 Subject: [PATCH 42/70] refactor: Fix variable name & formatting --- .../public/js/frappe/form/controls/table.js | 103 +++++++++--------- 1 file changed, 53 insertions(+), 50 deletions(-) diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index f2e40c4b01..f974a90119 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -12,92 +12,95 @@ frappe.ui.form.ControlTable = frappe.ui.form.Control.extend({ parent: this.wrapper, control: this }); + if (this.frm) { this.frm.grids[this.frm.grids.length] = this; } + this.$wrapper.on('paste', ':text', e => { - const cur_table_field = this.df.fieldname; - const cur_field = $(e.target).data('fieldname'); - const cur_grid = this.grid; - const grid_pagination = cur_grid.grid_pagination; - const cur_grid_rows = cur_grid.grid_rows; - const cur_doctype = cur_grid.doctype; - const cur_row_docname = $(e.target).closest('div .grid-row').data('name'); - let row_idx = locals[cur_doctype][cur_row_docname].idx; + const table_field = this.df.fieldname; + const grid = this.grid; + const grid_pagination = grid.grid_pagination; + const grid_rows = grid.grid_rows; + const doctype = grid.doctype; + const row_docname = $(e.target).closest('.grid-row').data('name'); + let clipboard_data = e.clipboardData || window.clipboardData || e.originalEvent.clipboardData; let pasted_data = clipboard_data.getData('Text'); + if (!pasted_data) return; let data = frappe.utils.csv_to_array(pasted_data, '\t'); - - if (data.length === 1 & data[0].length === 1) return; - let fieldnames = []; - let get_field = field_name => { - let fieldname; - cur_grid.meta.fields.some(field => { - if (frappe.model.no_value_type.includes(field.fieldtype)) { - return false; - } - - field_name = field_name.toLowerCase(); - const is_field_matching = (field_name) => { - return field.fieldname.toLowerCase() === field_name - || (field.label || "").toLowerCase() === field_name; - }; - - if (is_field_matching()) { - fieldname = field.fieldname; - return true; - } - }); - return fieldname; - }; - // for raw data with column header - if (get_field(data[0][0])) { - data[0].forEach(column =>{ - fieldnames.push(get_field(column)); + if (this.get_field(data[0][0])) { + data[0].forEach(column => { + fieldnames.push(this.get_field(column)); }); data.shift(); } else { // no column header, map to the existing visible columns - let visible_columns = cur_grid_rows[0].get_visible_columns(); + const visible_columns = grid_rows[0].get_visible_columns(); visible_columns.forEach(column => { - if (column.fieldname === cur_field) { + if (column.fieldname === $(e.target).data('fieldname')) { fieldnames.push(column.fieldname); } - }) + }); } + let row_idx = locals[doctype][row_docname].idx; data.forEach((row, i) => { let blank_row = !row.filter(Boolean).length; if (blank_row) return; + setTimeout(() => { - if (row_idx > this.frm.doc[cur_table_field].length) { + if (row_idx > this.frm.doc[table_field].length) { this.grid.add_new_row(); } if (row_idx > 1 && (row_idx - 1) % grid_pagination.page_length === 0) { grid_pagination.go_to_page(grid_pagination.page_index + 1); } - const cur_row = cur_grid_rows[row_idx - 1]; - row_idx ++; - const row_name = cur_row.doc.name; - row.forEach((value, ci) => { - if (fieldnames[ci]) { - frappe.model.set_value(cur_doctype, row_name, fieldnames[ci], value); - let progress = i + 1; - frappe.show_progress(__('Processing'), i + 1, data.length); - if (progress == data.length) { - frappe.hide_progress(); - } + + const row_name = grid_rows[row_idx - 1].doc.name; + row.forEach((value, data_index) => { + if (fieldnames[data_index]) { + frappe.model.set_value(doctype, row_name, fieldnames[data_index], value); } }); + row_idx++; + + let progress = i + 1; + frappe.show_progress(__('Processing'), progress, data.length); + if (progress === data.length) { + frappe.hide_progress(); + } }, 0); }); return false; // Prevent the default handler from running. }); }, + get_field(field_name) { + let fieldname; + this.grid.meta.fields.some(field => { + if (frappe.model.no_value_type.includes(field.fieldtype)) { + return false; + } + + field_name = field_name.toLowerCase(); + const is_field_matching = field_name => { + return ( + field.fieldname.toLowerCase() === field_name || + (field.label || '').toLowerCase() === field_name + ); + }; + + if (is_field_matching()) { + fieldname = field.fieldname; + return true; + } + }); + return fieldname; + }, refresh_input: function() { this.grid.refresh(); }, From d319beb0b60560d8bf30339cc427a7a00dbf4a91 Mon Sep 17 00:00:00 2001 From: leela Date: Mon, 22 Mar 2021 18:34:26 +0530 Subject: [PATCH 43/70] fix: Login is failing when allow_login_using_mobile_number is set When allow_login_using_mobile_number is set, we are doing auth validation With respect to mobile_no with the assumption that all logins use mobile number for validation and that is not really the case. Fix is, if auth username does not match with any mobile number, then go for username validation to find the user. --- frappe/core/doctype/user/user.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index de80d47497..d365441b7f 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -536,9 +536,15 @@ class User(Document): """Find the user by credentials. """ login_with_mobile = cint(frappe.db.get_value("System Settings", "System Settings", "allow_login_using_mobile_number")) - filter = {"mobile_no": user_name} if login_with_mobile else {"name": user_name} - user = frappe.db.get_value("User", filters=filter, fieldname=['name', 'enabled'], as_dict=True) or {} + user = None + if login_with_mobile: + filter = {"mobile_no": user_name} + user = frappe.db.get_value("User", filters=filter, fieldname=['name', 'enabled'], as_dict=True) + if not user: + filter = {"name": user_name} + user = frappe.db.get_value("User", filters=filter, fieldname=['name', 'enabled'], as_dict=True) + if not user: return From b22f53e74bea6e0dd0c5b585c2209618e6eecaa3 Mon Sep 17 00:00:00 2001 From: leela Date: Mon, 22 Mar 2021 18:35:22 +0530 Subject: [PATCH 44/70] test: basic authentication test is added --- frappe/tests/test_auth.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frappe/tests/test_auth.py b/frappe/tests/test_auth.py index c0f61b4863..662ddc10fc 100644 --- a/frappe/tests/test_auth.py +++ b/frappe/tests/test_auth.py @@ -4,7 +4,24 @@ from __future__ import unicode_literals import time import unittest + +import frappe from frappe.auth import LoginAttemptTracker +from frappe.frappeclient import FrappeClient + + +class TestAuth(unittest.TestCase): + def test_admin_login(self): + # Make sure that authentication works when allow_login_using_mobile_number is set to 0 + frappe.db.set_value("System Settings", "System Settings", "allow_login_using_mobile_number", 0) + frappe.db.commit() + FrappeClient(frappe.get_site_config().host_name, "Administrator", "admin", verify=False) + + # Make sure that authentication works when allow_login_using_mobile_number is set to 1 + frappe.db.set_value("System Settings", "System Settings", "allow_login_using_mobile_number", 1) + frappe.db.commit() + FrappeClient(frappe.get_site_config().host_name, "Administrator", "admin", verify=False) + class TestLoginAttemptTracker(unittest.TestCase): def test_account_lock(self): From d9bb0c7a9931393c37d1befdf944d3ebdfe16218 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 23 Mar 2021 09:54:02 +0530 Subject: [PATCH 45/70] fix: Remove 'ignore_user_type' from user filter --- frappe/core/doctype/user/user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index d365441b7f..c55b96e8db 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -874,6 +874,7 @@ def user_query(doctype, txt, searchfield, start, page_len, filters): user_type_condition = "and user_type = 'System User'" if filters and filters.get('ignore_user_type'): user_type_condition = '' + filters.pop('ignore_user_type') txt = "%{}%".format(txt) return frappe.db.sql("""SELECT `name`, CONCAT_WS(' ', first_name, middle_name, last_name) From 607dcce21bfccca2252b597d3f045d8cc44bdf3a Mon Sep 17 00:00:00 2001 From: Anupam Date: Tue, 23 Mar 2021 11:14:10 +0530 Subject: [PATCH 46/70] feat: allowed the auto name in Customize Form --- frappe/core/doctype/doctype/doctype.py | 30 +++++++++++-------- .../doctype/customize_form/customize_form.py | 2 +- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 3edb66bd42..c0a82c594a 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -628,17 +628,23 @@ class DocType(Document): validate_route_conflict(self.doctype, self.name) -def validate_series(dt): - if not dt.autoname and dt.get("fields", {"fieldname":"naming_series"}): +def validate_series(dt, autoname=None, name=None): + """Validate if `autoname` property is correctly set.""" + if not autoname: + autoname = dt.autoname + if not name: + name = dt.name + + if not autoname and dt.get("fields", {"fieldname":"naming_series"}): dt.autoname = "naming_series:" elif dt.autoname == "naming_series:" and not dt.get("fields", {"fieldname":"naming_series"}): frappe.throw(_("Invalid fieldname '{0}' in autoname").format(dt.autoname)) # validate field name if autoname field:fieldname is used # Create unique index on autoname field automatically. - if dt.autoname and dt.autoname.startswith('field:'): - field = dt.autoname.split(":")[1] - if not field or field not in [ df.fieldname for df in dt.fields ]: + if autoname and autoname.startswith('field:'): + field = autoname.split(":")[1] + if not field or field not in [df.fieldname for df in dt.fields]: frappe.throw(_("Invalid fieldname '{0}' in autoname").format(field)) else: for df in dt.fields: @@ -646,19 +652,19 @@ def validate_series(dt): df.unique = 1 break - if dt.autoname and (not dt.autoname.startswith('field:')) \ - and (not dt.autoname.startswith('eval:')) \ - and (not dt.autoname.lower() in ('prompt', 'hash')) \ - and (not dt.autoname.startswith('naming_series:')) \ - and (not dt.autoname.startswith('format:')): + if autoname and (not autoname.startswith('field:')) \ + and (not autoname.startswith('eval:')) \ + and (not autoname.lower() in ('prompt', 'hash')) \ + and (not autoname.startswith('naming_series:')) \ + and (not autoname.startswith('format:')): - prefix = dt.autoname.split('.')[0] + prefix = autoname.split('.')[0] used_in = frappe.db.sql(""" SELECT `name` FROM `tabDocType` WHERE `autoname` LIKE CONCAT(%s, '.%%') AND `name`!=%s - """, (prefix, dt.name)) + """, (prefix, name)) if used_in: frappe.throw(_("Series {0} already used in {1}").format(prefix, used_in[0][0])) diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 74742551a4..ad8d80e675 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/frappe/custom/doctype/customize_form/customize_form.py @@ -136,7 +136,7 @@ class CustomizeForm(Document): def save_customization(self): if not self.doc_type: return - validate_series(self) + validate_series(self, self.autoname, self.doc_type) self.flags.update_db = False self.flags.rebuild_doctype_for_global_search = False self.set_property_setters() From d0ba1e0c4c1393b517a594bf4213966d54adebb2 Mon Sep 17 00:00:00 2001 From: prssanna Date: Tue, 23 Mar 2021 13:53:45 +0530 Subject: [PATCH 47/70] test: debug failing tests --- .github/workflows/ci-tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index ffc9cf6b73..da79e9662d 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -130,6 +130,9 @@ jobs: DB: ${{ matrix.DB }} TYPE: ${{ matrix.TYPE }} + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + - name: Run Tests run: cd ~/frappe-bench/ && ${{ matrix.RUN_COMMAND }} env: From 6e22902ae14026ff4a2cf8c9201ad89640ed1fbc Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 23 Mar 2021 14:26:00 +0530 Subject: [PATCH 48/70] fix: Make scrolling separate for sidebar and main content --- frappe/public/scss/desk/desktop.scss | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/frappe/public/scss/desk/desktop.scss b/frappe/public/scss/desk/desktop.scss index 4dad0a4349..eaa9c7a7f7 100644 --- a/frappe/public/scss/desk/desktop.scss +++ b/frappe/public/scss/desk/desktop.scss @@ -733,3 +733,18 @@ body { height: 200px; } } + +[data-page-route="Workspaces"] { + @media (min-width: map-get($grid-breakpoints, "lg")) { + .layout-main { + height: calc(100vh - var(--navbar-height) - var(--page-head-height) - 5px); + .layout-side-section, .layout-main-section-wrapper { + height: 100%; + overflow-y: scroll; + } + .desk-sidebar { + margin-bottom: var(--margin-2xl); + } + } + } +} From 228cbb1a17a82ba94c9384ac2d8770a7530b4140 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 23 Mar 2021 14:26:26 +0530 Subject: [PATCH 49/70] fix: Mobile view for workspace --- frappe/public/scss/desk/desktop.scss | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frappe/public/scss/desk/desktop.scss b/frappe/public/scss/desk/desktop.scss index eaa9c7a7f7..ac58f203ea 100644 --- a/frappe/public/scss/desk/desktop.scss +++ b/frappe/public/scss/desk/desktop.scss @@ -485,6 +485,19 @@ body { } } } + + @media (max-width: map-get($grid-breakpoints, "sm")) { + .widget-body { + flex-direction: column; + .onboarding-steps-wrapper { + min-width: none; + } + .onboarding-step-preview { + padding-left: 0; + padding-top: var(--padding-lg); + } + } + } } &.shortcut-widget-box { From cee30d2fa7b097db55141f985d4d6315f6566394 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 23 Mar 2021 18:24:01 +0530 Subject: [PATCH 50/70] ci: ignore safe_eval paths --- .github/helper/semgrep_rules/security.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/helper/semgrep_rules/security.yml b/.github/helper/semgrep_rules/security.yml index 8b21979208..1937fc0e52 100644 --- a/.github/helper/semgrep_rules/security.yml +++ b/.github/helper/semgrep_rules/security.yml @@ -8,3 +8,7 @@ rules: dynamic content. Avoid it or use safe_eval(). languages: [python] severity: ERROR + paths: + exclude: + - frappe/__init__.py + - frappe/commands/utils.py From 7e5f86789ce62835430f3f227c46c4d289537619 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 23 Mar 2021 19:53:05 +0530 Subject: [PATCH 51/70] fix: Do not check permlevel > 0 - while creating has_access_to list --- frappe/model/document.py | 2 +- frappe/model/meta.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 6110276af1..2117cd8f87 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -649,7 +649,7 @@ class Document(BaseDocument): self._has_access_to[permission_type] = [] roles = frappe.get_roles() for perm in self.get_permissions(): - if perm.role in roles and perm.permlevel > 0 and perm.get(permission_type): + if perm.role in roles and perm.get(permission_type): if perm.permlevel not in self._has_access_to[permission_type]: self._has_access_to[permission_type].append(perm.permlevel) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 5dc7ca2d4d..7f58c28397 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -454,7 +454,7 @@ class Meta(Document): has_access_to = [] roles = frappe.get_roles() for perm in self.get_permissions(parenttype): - if perm.role in roles and perm.permlevel > 0 and perm.get(permission_type): + if perm.role in roles and perm.get(permission_type): if perm.permlevel not in has_access_to: has_access_to.append(perm.permlevel) From 994818959bf6f60308d34fb4f7e95653640f9a65 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Tue, 23 Mar 2021 19:53:53 +0530 Subject: [PATCH 52/70] ci: Remove tmate --- .github/workflows/ci-tests.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index da79e9662d..ffc9cf6b73 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -130,9 +130,6 @@ jobs: DB: ${{ matrix.DB }} TYPE: ${{ matrix.TYPE }} - - name: Setup tmate session - uses: mxschmitt/action-tmate@v3 - - name: Run Tests run: cd ~/frappe-bench/ && ${{ matrix.RUN_COMMAND }} env: From 6dcc00ad95f5bad8d455d8f1dd17984ce750bb59 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 24 Mar 2021 09:39:18 +0530 Subject: [PATCH 53/70] ci: Trigger ssh for gha based on label --- .github/workflows/ci-tests.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index ffc9cf6b73..bfe2002f69 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -1,6 +1,10 @@ name: CI -on: [pull_request, workflow_dispatch, push] +on: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + workflow_dispatch: + push: jobs: test: @@ -130,6 +134,10 @@ jobs: DB: ${{ matrix.DB }} TYPE: ${{ matrix.TYPE }} + - name: Setup tmate session + if: contains(github.event.pull_request.labels.*.name, 'debug-gha') + uses: mxschmitt/action-tmate@v3 + - name: Run Tests run: cd ~/frappe-bench/ && ${{ matrix.RUN_COMMAND }} env: From 514d7480e6bee585b243827a78ae440de6a67c83 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 24 Mar 2021 09:43:36 +0530 Subject: [PATCH 54/70] fix: Do not validate permlevel for admin --- frappe/model/document.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 2117cd8f87..18f39e7f61 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -625,6 +625,9 @@ class Document(BaseDocument): if self.flags.ignore_permissions or frappe.flags.in_install: return + if frappe.session.user == "Administrator": + return + has_access_to = self.get_permlevel_access() high_permlevel_fields = self.meta.get_high_permlevel_fields() @@ -645,13 +648,13 @@ class Document(BaseDocument): if not hasattr(self, "_has_access_to"): self._has_access_to = {} - if not self._has_access_to.get(permission_type): - self._has_access_to[permission_type] = [] - roles = frappe.get_roles() - for perm in self.get_permissions(): - if perm.role in roles and perm.get(permission_type): - if perm.permlevel not in self._has_access_to[permission_type]: - self._has_access_to[permission_type].append(perm.permlevel) + # if not self._has_access_to.get(permission_type): + self._has_access_to[permission_type] = [] + roles = frappe.get_roles() + for perm in self.get_permissions(): + if perm.role in roles and perm.get(permission_type): + if perm.permlevel not in self._has_access_to[permission_type]: + self._has_access_to[permission_type].append(perm.permlevel) return self._has_access_to[permission_type] From 98b1b5be978c672440c6c7190a1c179ad8fd7a5f Mon Sep 17 00:00:00 2001 From: Snyk bot Date: Wed, 24 Mar 2021 06:46:01 +0200 Subject: [PATCH 55/70] chore(Snyk): Security upgrade snyk from 1.431.1 to 1.465.0 (#12653) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-HOSTEDGITINFO-1088355 --- package.json | 2 +- yarn.lock | 996 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 760 insertions(+), 238 deletions(-) diff --git a/package.json b/package.json index 55f3a6a443..8e2989d1d7 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "qz-tray": "^2.0.8", "redis": "^2.8.0", "showdown": "^1.9.1", - "snyk": "^1.425.4", + "snyk": "^1.465.0", "socket.io": "^2.4.0", "superagent": "^3.8.2", "touch": "^3.1.0", diff --git a/yarn.lock b/yarn.lock index f9fbc849b2..3999616099 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,6 +34,45 @@ enabled "2.0.x" kuler "^2.0.0" +"@deepcode/dcignore@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@deepcode/dcignore/-/dcignore-1.0.2.tgz#39e4a3df7dde8811925330506e4bb3fbf3c288d8" + integrity sha512-DPgxtHuJwBORpqRkPXzzOT+uoPRVJmaN7LR+pmeL6DQM90kj6G6GFUH1i/YpRH8NbML8ZGEDwB9f9u4UwD2pzg== + +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== + dependencies: + "@nodelib/fs.stat" "2.0.4" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + dependencies: + "@nodelib/fs.scandir" "2.1.4" + fastq "^1.6.0" + +"@octetstream/promisify@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octetstream/promisify/-/promisify-2.0.2.tgz#29ac3bd7aefba646db670227f895d812c1a19615" + integrity sha512-7XHoRB61hxsz8lBQrjC1tq/3OEIgpvGWg6DKAdwi7WRzruwkmsdwmOoUXbU4Dtd4RSOMDwed0SkP3y8UlMt1Bg== + +"@open-policy-agent/opa-wasm@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@open-policy-agent/opa-wasm/-/opa-wasm-1.2.0.tgz#481b766093f70b00efefbee1e4192f375fd34ca2" + integrity sha512-CtUBTnzvDrT0NASa8IuGQTxFGgt2vxbLnMYuTA+uDFxOcA4uK4mGFgrhHJtxUZnWHiwemOvKKSY3BMCo7qiAsQ== + dependencies: + sprintf-js "^1.1.2" + utf8 "^3.0.0" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -44,23 +83,12 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg== -"@snyk/cli-interface@2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.9.1.tgz#e0466d183e7d4a13112ba098b1702a0d628dd380" - integrity sha512-2zHRvEt4S0DO+hPRX3hp5ssELouJqgb/JUTmPDMr/32r//qooSTxojwSvAK2A6VYgYOHuo1S3VTpsSP/ywkPXA== +"@snyk/cli-interface@2.11.0", "@snyk/cli-interface@^2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.11.0.tgz#9df68c8cd54de5dff69f0ab797a188541d9c8965" + integrity sha512-T3xfDqrEFKclHGdJx4/5+D5F7e76/99f33guE4RTlVITBhy7VVnjz4t/NDr3UYqcC0MgAmiC4bSVYHnlshuwJw== dependencies: - "@snyk/dep-graph" "1.19.4" - "@types/graphlib" "^2.1.7" - tslib "^1.9.3" - -"@snyk/cli-interface@2.9.2", "@snyk/cli-interface@^2.9.1", "@snyk/cli-interface@^2.9.2": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.9.2.tgz#defbeafd5fa7fa5ab1c39d57f1d379b2fbfc9860" - integrity sha512-C64bGtcQbh7941l7qgXFJ+FJIZdQtBHkPhKfGtUlCCMbC0FK0oaUmp6d7YPQxT4dEnkQdtlBT/eA2F6qIKbEng== - dependencies: - "@snyk/dep-graph" "1.19.4" - "@types/graphlib" "^2.1.7" - tslib "^1.9.3" + "@types/graphlib" "^2" "@snyk/cli-interface@^2.0.3": version "2.3.2" @@ -69,17 +97,48 @@ dependencies: tslib "^1.9.3" -"@snyk/cocoapods-lockfile-parser@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.5.2.tgz#7f441ecf2fb9c0b488db7e392447d2c520b60cef" - integrity sha512-fIiUNCmhDp7lVKTs/nHCnLK1roMkG15HhuQhtZXxiFW3EZ5H9IqMdtrxqjXuzVWt7X2h7lbF5OMBzD07NODtug== +"@snyk/cli-interface@^2.9.1", "@snyk/cli-interface@^2.9.2": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.9.2.tgz#defbeafd5fa7fa5ab1c39d57f1d379b2fbfc9860" + integrity sha512-C64bGtcQbh7941l7qgXFJ+FJIZdQtBHkPhKfGtUlCCMbC0FK0oaUmp6d7YPQxT4dEnkQdtlBT/eA2F6qIKbEng== dependencies: "@snyk/dep-graph" "1.19.4" + "@types/graphlib" "^2.1.7" + tslib "^1.9.3" + +"@snyk/cocoapods-lockfile-parser@3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.6.2.tgz#803ae9466f408c48ba7c5a8ec51b9dbac6f633b3" + integrity sha512-ca2JKOnSRzYHJkhOB9gYmdRZHmd02b/uBd/S0D5W+L9nIMS7sUBV5jfhKwVgrYPIpVNIc0XCI9rxK4TfkQRpiA== + dependencies: + "@snyk/dep-graph" "^1.23.1" "@types/js-yaml" "^3.12.1" js-yaml "^3.13.1" - source-map-support "^0.5.7" tslib "^1.10.0" +"@snyk/code-client@3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@snyk/code-client/-/code-client-3.1.5.tgz#019ef3b4d2f53f02f890d2df933fc7c2cf5cf4a5" + integrity sha512-bJb00zZ7956MzIjW/4DPaMolk2/r7eox+5Bvq0bpcu1NFUFYYQPZeEPsPgh5YzK4te2v6W5hZBtjUUNIY+AQYg== + dependencies: + "@deepcode/dcignore" "^1.0.2" + "@snyk/fast-glob" "^3.2.6-patch" + "@types/flat-cache" "^2.0.0" + "@types/lodash.chunk" "^4.2.6" + "@types/lodash.omit" "^4.5.6" + "@types/lodash.union" "^4.6.6" + "@types/micromatch" "^4.0.1" + "@types/sarif" "^2.1.3" + "@types/uuid" "^8.3.0" + axios "^0.21.1" + ignore "^5.1.8" + lodash.chunk "^4.2.0" + lodash.omit "^4.5.0" + lodash.union "^4.6.0" + micromatch "^4.0.2" + queue "^6.0.1" + uuid "^8.3.2" + "@snyk/composer-lockfile-parser@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.4.1.tgz#2f7c93ad367520322b16d9490a208fec08445e0e" @@ -90,7 +149,7 @@ lodash.invert "^4.3.0" lodash.isempty "^4.4.0" -"@snyk/dep-graph@1.19.4", "@snyk/dep-graph@^1.19.3", "@snyk/dep-graph@^1.19.4": +"@snyk/dep-graph@1.19.4", "@snyk/dep-graph@^1.19.3": version "1.19.4" resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.19.4.tgz#d156c482bfdfba7505f1cf3e8a80b86dd9f45383" integrity sha512-h3MMhjVm3BuIruwpDBqnMowKOG9viwr3TJHdIxTHulWKWSsPTTW1AAP3/RaK+UBp1y/Ua9yzeHncKIrzBdT5Nw== @@ -102,15 +161,29 @@ source-map-support "^0.5.19" tslib "^1.13.0" -"@snyk/dep-graph@^1.19.5": - version "1.20.0" - resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.20.0.tgz#258ae85f8a066dc63af4444cfca8b8d092b94bc0" - integrity sha512-/TOzXGh+JFgAu8pWdo1oLFKDNfFk99TnSQG2lbEu+vKLI2ZrGAk9oGO0geNogAN7Ib4EDQOEhgb7YwqwL7aA7w== +"@snyk/dep-graph@^1.21.0", "@snyk/dep-graph@^1.23.0", "@snyk/dep-graph@^1.23.1", "@snyk/dep-graph@^1.27.1": + version "1.28.0" + resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.28.0.tgz#d68c0576cb3562c6e819ca8a8c7ac29ee11d9776" + integrity sha512-Oup9nAvb558jdNvbZah/vaBtOtCcizkdeS+OBQeBIqIffyer4mc4juSn4b1SFjCpu7AG7piio8Lj8k1B9ps6Tg== dependencies: - graphlib "^2.1.8" + event-loop-spinner "^2.1.0" + lodash.clone "^4.5.0" + lodash.constant "^3.0.0" + lodash.filter "^4.6.0" + lodash.foreach "^4.5.0" + lodash.isempty "^4.4.0" lodash.isequal "^4.5.0" + lodash.isfunction "^3.0.9" + lodash.isundefined "^3.0.1" + lodash.keys "^4.2.0" + lodash.map "^4.6.0" + lodash.reduce "^4.6.0" + lodash.size "^4.2.0" + lodash.transform "^4.6.0" + lodash.union "^4.6.0" + lodash.values "^4.3.0" object-hash "^2.0.3" - semver "^6.0.0" + semver "^7.0.0" tslib "^1.13.0" "@snyk/docker-registry-v2-client@1.13.9": @@ -122,37 +195,97 @@ parse-link-header "^1.0.1" tslib "^1.10.0" +"@snyk/fast-glob@^3.2.6-patch": + version "3.2.6-patch" + resolved "https://registry.yarnpkg.com/@snyk/fast-glob/-/fast-glob-3.2.6-patch.tgz#a0866bedb17f95255e4050dad08daeaff0f4caa8" + integrity sha512-E/Pfdze/WFfxwyuTFcfhQN1SwyUsc43yuCoW63RVBCaxTD6OzhVD2Pvc/Sy7BjiWUfmelzyKkIBpoow8zZX7Zg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + "@snyk/glob-parent" "^5.1.2-patch.1" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + "@snyk/gemfile@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.2.0.tgz#919857944973cce74c650e5428aaf11bcd5c0457" integrity sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA== -"@snyk/java-call-graph-builder@1.16.2": - version "1.16.2" - resolved "https://registry.yarnpkg.com/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.16.2.tgz#a9f9a34107759cf2be847a114a759e347cef44e8" - integrity sha512-tJF+dY/wTfexwYuCgFB3RpWl4RGcf2H9RT9yurkTVi5wwKfvcNwZMUMwSlTDEFOqwmAsJ7e0uNVRlkPQHekCcQ== +"@snyk/glob-parent@^5.1.2-patch.1": + version "5.1.2-patch.1" + resolved "https://registry.yarnpkg.com/@snyk/glob-parent/-/glob-parent-5.1.2-patch.1.tgz#87733b4ab282043fa7915200bc94cb391df6d44f" + integrity sha512-OkUPdHgxIWKAAzceG1nraNA0kgI+eS0I9wph8tll9UL0slD2mIWSj4mAqroGovaEXm8nHedoUfuDRGEb6wnzCQ== dependencies: - ci-info "^2.0.0" - debug "^4.1.1" - glob "^7.1.6" - graphlib "^2.1.8" - jszip "^3.2.2" - needle "^2.3.3" - progress "^2.0.3" - snyk-config "^4.0.0-rc.2" - source-map-support "^0.5.7" - temp-dir "^2.0.0" - tslib "^1.9.3" + is-glob "^4.0.1" -"@snyk/java-call-graph-builder@1.16.5": - version "1.16.5" - resolved "https://registry.yarnpkg.com/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.16.5.tgz#e57302cc6dc93f1adff7abe1e5eecff26d8a41f4" - integrity sha512-6H4hkq/qYljJoH1QnZsTRPMqp9Kt5AOEZYGJAeSHkhJdfUYSLtqwN4WsU6yVR3vWAaDQ8Lllp3m6EL7nstMPZA== +"@snyk/graphlib@2.1.9-patch.3", "@snyk/graphlib@^2.1.9-patch.3": + version "2.1.9-patch.3" + resolved "https://registry.yarnpkg.com/@snyk/graphlib/-/graphlib-2.1.9-patch.3.tgz#b8edb2335af1978db7f3cb1f28f5d562960acf23" + integrity sha512-bBY9b9ulfLj0v2Eer0yFYa3syVeIxVKl2EpxSrsVeT4mjA0CltZyHsF0JjoaGXP27nItTdJS5uVsj1NA+3aE+Q== dependencies: + lodash.clone "^4.5.0" + lodash.constant "^3.0.0" + lodash.filter "^4.6.0" + lodash.foreach "^4.5.0" + lodash.has "^4.5.2" + lodash.isempty "^4.4.0" + lodash.isfunction "^3.0.9" + lodash.isundefined "^3.0.1" + lodash.keys "^4.2.0" + lodash.map "^4.6.0" + lodash.reduce "^4.6.0" + lodash.size "^4.2.0" + lodash.transform "^4.6.0" + lodash.union "^4.6.0" + lodash.values "^4.3.0" + +"@snyk/inquirer@^7.3.3-patch": + version "7.3.3-patch" + resolved "https://registry.yarnpkg.com/@snyk/inquirer/-/inquirer-7.3.3-patch.tgz#ef84d531724c53b755e8dd454e1a3c2ccdcfc0bf" + integrity sha512-aWiQSOacH2lOpJ1ard9ErABcH4tdJogdr+mg1U67iZJOPO9n2gFgAwz1TQJDyPkv4/A5mh4hT2rg03Uq+KBn2Q== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash.assign "^4.2.0" + lodash.assignin "^4.2.0" + lodash.clone "^4.5.0" + lodash.defaults "^4.2.0" + lodash.filter "^4.6.0" + lodash.find "^4.6.0" + lodash.findindex "^4.6.0" + lodash.flatten "^4.4.0" + lodash.isboolean "^3.0.3" + lodash.isfunction "^3.0.9" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.last "^3.0.0" + lodash.map "^4.6.0" + lodash.omit "^4.5.0" + lodash.set "^4.3.2" + lodash.sum "^4.0.2" + lodash.uniq "^4.5.0" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +"@snyk/java-call-graph-builder@1.19.1": + version "1.19.1" + resolved "https://registry.yarnpkg.com/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.19.1.tgz#1d579d782df3bb5f9d5171cc35180596cd90aa8b" + integrity sha512-bxjHef5Qm3pNc+BrFlxMudmSSbOjA395ZqBddc+dvsFHoHeyNbiY56Y1JSGUlTgjRM+PKNPBiCuELTSMaROeZg== + dependencies: + "@snyk/graphlib" "2.1.9-patch.3" ci-info "^2.0.0" debug "^4.1.1" glob "^7.1.6" - graphlib "^2.1.8" jszip "^3.2.2" needle "^2.3.3" progress "^2.0.3" @@ -161,6 +294,26 @@ temp-dir "^2.0.0" tmp "^0.2.1" tslib "^1.9.3" + xml-js "^1.6.11" + +"@snyk/java-call-graph-builder@1.20.0": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.20.0.tgz#ffca734cf7ce276a69277963149358190eaac3e5" + integrity sha512-NX8bpIu7oG5cuSSm6WvtxqcCuJs2gRjtKhtuSeF1p5TYXyESs3FXQ0nHjfY90LiyTTc+PW/UBq6SKbBA6bCBww== + dependencies: + "@snyk/graphlib" "2.1.9-patch.3" + ci-info "^2.0.0" + debug "^4.1.1" + glob "^7.1.6" + jszip "^3.2.2" + needle "^2.3.3" + progress "^2.0.3" + snyk-config "^4.0.0-rc.2" + source-map-support "^0.5.7" + temp-dir "^2.0.0" + tmp "^0.2.1" + tslib "^1.9.3" + xml-js "^1.6.11" "@snyk/rpm-parser@^2.0.0": version "2.0.0" @@ -169,14 +322,14 @@ dependencies: event-loop-spinner "^2.0.0" -"@snyk/snyk-cocoapods-plugin@2.5.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.5.1.tgz#af4e749ee1420c1596345fefae3c5eb48b84ecb0" - integrity sha512-A+1xHD+SpmXQa0p+dWmiApFZtz/y37qAW9aWmFx2B1j7fwRBf9Qr89/6RbJOznf1a4nEitjzE3fa98yNZk/MNg== +"@snyk/snyk-cocoapods-plugin@2.5.2": + version "2.5.2" + resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.5.2.tgz#cd724fcd637cb3af76187bf7254819b6079489f6" + integrity sha512-WHhnwyoGOhjFOjBXqUfszD84SErrtjHjium/4xFbqKpEE+yuwxs8OwV/S29BtxhYiGtjpD1azv5QtH30VUMl0A== dependencies: - "@snyk/cli-interface" "^2.9.2" - "@snyk/cocoapods-lockfile-parser" "3.5.2" - "@snyk/dep-graph" "^1.19.4" + "@snyk/cli-interface" "^2.11.0" + "@snyk/cocoapods-lockfile-parser" "3.6.2" + "@snyk/dep-graph" "^1.23.1" source-map-support "^0.5.7" tslib "^2.0.0" @@ -204,6 +357,11 @@ dependencies: defer-to-connect "^2.0.0" +"@types/braces@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.0.tgz#7da1c0d44ff1c7eb660a36ec078ea61ba7eb42cb" + integrity sha512-TbH79tcyi9FHwbyboOKeRachRq63mSuWYXOflsNO9ZyE5ClQ/JaozNKl+aWUq87qPNsXasXxi2AbgfwIJ+8GQw== + "@types/cacheable-request@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" @@ -229,16 +387,16 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/graphlib@^2.1.7": +"@types/flat-cache@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/flat-cache/-/flat-cache-2.0.0.tgz#64e5d3b426c392b603a208a55bdcc7d920ce6e57" + integrity sha512-fHeEsm9hvmZ+QHpw6Fkvf19KIhuqnYLU6vtWLjd5BsMd/qVi7iTkMioDZl0mQmfNRA1A6NwvhrSRNr9hGYZGww== + +"@types/graphlib@^2", "@types/graphlib@^2.1.7": version "2.1.7" resolved "https://registry.yarnpkg.com/@types/graphlib/-/graphlib-2.1.7.tgz#e6a47a4f43511f5bad30058a669ce5ce93bfd823" integrity sha512-K7T1n6U2HbTYu+SFHlBjz/RH74OA2D/zF1qlzn8uXbvB4uRg7knOM85ugS2bbXI1TXMh7rLqk4OVRwIwEBaixg== -"@types/hosted-git-info@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@types/hosted-git-info/-/hosted-git-info-2.7.0.tgz#5199b4df62d53f51d60520d61513eaa4b2dd3d3d" - integrity sha512-OW/D8GqCyQtH8F7xDdDxzPJTBgknZeZhlCakUcBCya2rYPRN53F+0YJVwSPyiyAhrknnjkl3P9qVk0oBI4S1qw== - "@types/http-cache-semantics@*": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" @@ -256,6 +414,39 @@ dependencies: "@types/node" "*" +"@types/lodash.chunk@^4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@types/lodash.chunk/-/lodash.chunk-4.2.6.tgz#9d35f05360b0298715d7f3d9efb34dd4f77e5d2a" + integrity sha512-SPlusB7jxXyGcTXYcUdWr7WmhArO/rmTq54VN88iKMxGUhyg79I4Q8n4riGn3kjaTjOJrVlHhxgX/d7woak5BQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.omit@^4.5.6": + version "4.5.6" + resolved "https://registry.yarnpkg.com/@types/lodash.omit/-/lodash.omit-4.5.6.tgz#f2a9518259e481a48ff7ec423420fa8fd58933e2" + integrity sha512-KXPpOSNX2h0DAG2w7ajpk7TXvWF28ZHs5nJhOJyP0BQHkehgr948RVsToItMme6oi0XJkp19CbuNXkIX8FiBlQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.union@^4.6.6": + version "4.6.6" + resolved "https://registry.yarnpkg.com/@types/lodash.union/-/lodash.union-4.6.6.tgz#2f77f2088326ed147819e9e384182b99aae8d4b0" + integrity sha512-Wu0ZEVNcyCz8eAn6TlUbYWZoGbH9E+iOHxAZbwUoCEXdUiy6qpcz5o44mMXViM4vlPLLCPlkAubEP1gokoSZaw== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.168" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== + +"@types/micromatch@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.1.tgz#9381449dd659fc3823fd2a4190ceacc985083bc7" + integrity sha512-my6fLBvpY70KattTNzYOK6KU1oR1+UCz9ug/JbcF5UrEmeCt9P7DV2t7L8+t18mMPINqGQCE4O8PLOPbI84gxw== + dependencies: + "@types/braces" "*" + "@types/node@*": version "13.7.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.4.tgz#76c3cb3a12909510f52e5dc04a6298cdf9504ffd" @@ -266,16 +457,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" integrity sha512-wa09itaLE8L705aXd8F80jnFpxz3Y1/KRHfKsYL2bPc0XF+wEWu8sR9n5bmeu8Ba1N9z2GRNzm/YdHcghLkLKg== -"@types/node@^6.14.4": - version "6.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" - integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== - -"@types/node@^6.14.7": - version "6.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.10.tgz#d9ce598127eb0cc02821476862d11389cb01f6a4" - integrity sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA== - "@types/q@^1.5.1": version "1.5.1" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.1.tgz#48fd98c1561fe718b61733daed46ff115b496e18" @@ -288,10 +469,15 @@ dependencies: "@types/node" "*" -"@types/semver@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" - integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== +"@types/sarif@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/sarif/-/sarif-2.1.3.tgz#1f9c16033f1461536ac014284920350109614c02" + integrity sha512-zf+EoIplTkQW2TV2mwtJtlI0g540Z3Rs9tX9JqRAtyjnDCqkP+eMTgWCj3PGNbQpi+WXAjvC3Ou/dvvX2sLK4w== + +"@types/uuid@^8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" + integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== "@vue/component-compiler-utils@^1.2.1": version "1.3.1" @@ -635,6 +821,13 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" @@ -1017,6 +1210,11 @@ child-process@^1.0.2: resolved "https://registry.yarnpkg.com/child-process/-/child-process-1.0.2.tgz#98974dc7ed1ee4c6229f8e305fa7313a6885a7f2" integrity sha1-mJdNx+0e5MYin44wX6cxOmiFp/I= +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -1653,7 +1851,14 @@ debug@4, debug@^4.1.1, debug@~4.1.0: dependencies: ms "^2.1.1" -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.0.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^3.1.0, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -1814,12 +2019,12 @@ docker-modem@2.1.3: split-ca "^1.0.1" ssh2 "^0.8.7" -dockerfile-ast@0.0.30: - version "0.0.30" - resolved "https://registry.yarnpkg.com/dockerfile-ast/-/dockerfile-ast-0.0.30.tgz#74cbcd65e389852d752c5687117255ea622583ad" - integrity sha512-QOeP5NjbjoSLtnMz6jzBLsrKtywLEVPoCOAwA54cQpulyKb1gBnZ63tr6Amq8oVDvu5PXa3aifBVw+wcoCGHKg== +dockerfile-ast@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dockerfile-ast/-/dockerfile-ast-0.2.0.tgz#13cc4a6fe3aea30a4104622b30f49a0fe3a5c038" + integrity sha512-iQyp12k1A4tF3sEfLAq2wfFPKdpoiGTJeuiu2Y1bdEqIZu0DfSSL2zm0fk7a/UHeQkngnYaRRGuON+C+2LO1Fw== dependencies: - vscode-languageserver-types "^3.15.1" + vscode-languageserver-types "^3.16.0" dom-serializer@0: version "0.1.1" @@ -2170,6 +2375,13 @@ event-loop-spinner@^2.0.0: dependencies: tslib "^1.10.0" +event-loop-spinner@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/event-loop-spinner/-/event-loop-spinner-2.1.0.tgz#75f501d585105c6d57f174073b39af1b6b3a1567" + integrity sha512-RJ10wL8/F9AlfBgRCvYctJIXSb9XkVmSCK3GGUvPD3dJrvTjDeDT0tmhcbEC6I2NEjNM9xD38HQJ4F/f/gb4VQ== + dependencies: + tslib "^2.1.0" + eventemitter3@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba" @@ -2352,6 +2564,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + dependencies: + reusify "^1.0.4" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -2426,6 +2645,11 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== +follow-redirects@^1.10.0: + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -2505,6 +2729,13 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2750,7 +2981,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== -graphlib@2.1.8, graphlib@^2.1.8: +graphlib@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== @@ -2899,6 +3130,15 @@ hasha@^2.2.0: is-stream "^1.0.1" pinkie-promise "^2.0.0" +hcl-to-json@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/hcl-to-json/-/hcl-to-json-0.1.1.tgz#39674aa2a5a4d2b4c2b6762c8196af4af4f12903" + integrity sha512-sj1RPsdgX/ilBGZGnyjbSHQbRe20hyA6VDXYBGJedHSCdwSWkr/7tr85N7FGeM7KvBjIQX7Gl897bo0Ug73Z/A== + dependencies: + debug "^3.0.1" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -2931,11 +3171,6 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -hosted-git-info@^2.7.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - hosted-git-info@^3.0.4: version "3.0.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03" @@ -3047,6 +3282,11 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ignore@^5.1.8: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -3134,25 +3374,6 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -3320,7 +3541,7 @@ is-extendable@^1.0.1: dependencies: is-plain-object "^2.0.4" -is-extglob@^2.1.0: +is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -3354,6 +3575,13 @@ is-glob@^3.0.0: dependencies: is-extglob "^2.1.0" +is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-gzip@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" @@ -3908,6 +4136,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= + lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -3918,6 +4151,36 @@ lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.constant@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.constant/-/lodash.constant-3.0.0.tgz#bfe05cce7e515b3128925d6362138420bd624910" + integrity sha1-v+Bczn5RWzEokl1jYhOEIL1iSRA= + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.endswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + integrity sha1-/tWawXOO0+I27dcGTsRWRIs3vAk= + +lodash.filter@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= + +lodash.find@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + +lodash.findindex@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" + integrity sha1-oyRd7mH7m24GJLU1ElYku2nBEQY= + lodash.findkey@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.findkey/-/lodash.findkey-4.6.0.tgz#83058e903b51cbb759d09ccf546dea3ea39c4718" @@ -3933,11 +4196,31 @@ lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + +lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.groupby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" + integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= + +lodash.has@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" + integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= + lodash.invert@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.invert/-/lodash.invert-4.3.0.tgz#8ffe20d4b616f56bea8f1aa0c6ebd80dcf742aee" @@ -3953,6 +4236,11 @@ lodash.isarray@^3.0.0: resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + lodash.isempty@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" @@ -3963,11 +4251,41 @@ lodash.isequal@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" + integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.istypedarray@^3.0.0: version "3.0.6" resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" integrity sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I= +lodash.isundefined@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" + integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -3977,6 +4295,16 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" + integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= + +lodash.last@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.last/-/lodash.last-3.0.0.tgz#242f663112dd4c6e63728c60a3c909d1bdadbd4c" + integrity sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw= + lodash.map@^3.0.0: version "3.1.4" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-3.1.4.tgz#b483acd1b786c5c7b492c495f7b5266229bc00c2" @@ -3988,6 +4316,11 @@ lodash.map@^3.0.0: lodash.isarray "^3.0.0" lodash.keys "^3.0.0" +lodash.map@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -3998,6 +4331,16 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA= + +lodash.orderby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" + integrity sha1-5pfwTOXXhSL1TZM4syuBozk+TrM= + lodash.pairs@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.pairs/-/lodash.pairs-3.0.1.tgz#bbe08d5786eeeaa09a15c91ebf0dcb7d2be326a9" @@ -4015,22 +4358,62 @@ lodash.pluck@^3.1.2: lodash.isarray "^3.0.0" lodash.map "^3.0.0" +lodash.reduce@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= +lodash.size@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.size/-/lodash.size-4.2.0.tgz#71fe75ed3eabdb2bcb73a1b0b4f51c392ee27b86" + integrity sha1-cf517T6r2yvLc6GwtPUcOS7ie4Y= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.sum@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lodash.sum/-/lodash.sum-4.0.2.tgz#ad90e397965d803d4f1ff7aa5b2d0197f3b4637b" + integrity sha1-rZDjl5ZdgD1PH/eqWy0Bl/O0Y3s= + lodash.topairs@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.topairs/-/lodash.topairs-4.3.0.tgz#3b6deaa37d60fb116713c46c5f17ea190ec48d64" integrity sha1-O23qo31g+xFnE8RsXxfqGQ7EjWQ= +lodash.transform@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" + integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= + +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= + +lodash.values@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" + integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= + +lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -4212,12 +4595,17 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@4.0.2: +micromatch@4.0.2, micromatch@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== @@ -4322,6 +4710,21 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minipass@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -4344,7 +4747,7 @@ mkdirp@0.5.1, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -4446,10 +4849,10 @@ ndarray@^1.0.13, ndarray@^1.0.18: iota-array "^1.0.0" is-buffer "^1.0.2" -needle@2.5.0, needle@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" - integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== +needle@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== dependencies: debug "^3.2.6" iconv-lite "^0.4.4" @@ -4464,6 +4867,15 @@ needle@^2.3.3: iconv-lite "^0.4.4" sax "^1.2.4" +needle@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" + integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -5025,7 +5437,7 @@ phantomjs-prebuilt@^2.1.16: request-progress "^2.0.1" which "^1.2.10" -picomatch@^2.0.5: +picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -5497,6 +5909,18 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/promise-fs/-/promise-fs-2.1.1.tgz#0b725a592c165ff16157d1f13640ba390637e557" + integrity sha512-43p7e4QzAQ3w6eyN0+gbBL7jXiZFWLWYITg9wIObqkBySu/a5K1EDcQ/S6UyB/bmiZWDA4NjTbcopKLTaKcGSw== + dependencies: + "@octetstream/promisify" "2.0.2" + +promise-queue@^2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/promise-queue/-/promise-queue-2.2.5.tgz#2f6f5f7c0f6d08109e967659c79b88a9ed5e93b4" + integrity sha1-L29ffA9tCBCelnZZx5uIqe1ek7Q= + promise.series@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" @@ -5626,6 +6050,18 @@ querystring@^0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -6080,6 +6516,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rgb-regex@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" @@ -6205,6 +6646,13 @@ run-async@^2.4.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rxjs@^6.6.0: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" @@ -6269,11 +6717,18 @@ semver-diff@^3.1.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -6471,17 +6926,7 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -snyk-config@4.0.0-rc.2: - version "4.0.0-rc.2" - resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-4.0.0-rc.2.tgz#c6c94afe733e9063df546cd71a7adf6957135594" - integrity sha512-HIXpMCRp5IdQDFH/CY6WqOUt5X5Ec55KC9dFVjlMLe/2zeqsImJn1vbjpE5uBoLYIdYi1SteTqtsJhyJZWRK8g== - dependencies: - async "^3.2.0" - debug "^4.1.1" - lodash.merge "^4.6.2" - minimist "^1.2.5" - -snyk-config@^4.0.0-rc.2: +snyk-config@4.0.0, snyk-config@^4.0.0-rc.2: version "4.0.0" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-4.0.0.tgz#21d459f19087991246cc07a7ffb4501dce6f4159" integrity sha512-E6jNe0oUjjzVASWBOAc/mA23DhbzABDF9MI6UZvl0gylh2NSXSXw2/LjlqMNOKL2c1qkbSkzLOdIX5XACoLCAQ== @@ -6502,24 +6947,24 @@ snyk-cpp-plugin@2.2.1: hosted-git-info "^3.0.7" tslib "^2.0.0" -snyk-docker-plugin@4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-4.12.0.tgz#137a159baf627debef6178cfb8b40941a81a7168" - integrity sha512-iN5GUTpMR4dx/hmjxh1GnJ9vrMpbOUhD8gsdWgFPZ5Qg+ImPQ2WBJBal/hyfkauM0TaKQEAgIwT6xZ1ovaIvWQ== +snyk-docker-plugin@4.19.3: + version "4.19.3" + resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-4.19.3.tgz#14569f25c52a3fc71a20f80f5beac4ccdc326c11" + integrity sha512-5WkXyT7uY5NrTOvEqxeMqb6dDcskT3c/gbHUTOyPuvE6tMut+OOYK8RRXbwZFeLzpS8asq4e1R7U7syYG3VXwg== dependencies: - "@snyk/dep-graph" "^1.19.4" + "@snyk/dep-graph" "^1.21.0" "@snyk/rpm-parser" "^2.0.0" "@snyk/snyk-docker-pull" "3.2.3" chalk "^2.4.2" debug "^4.1.1" docker-modem "2.1.3" - dockerfile-ast "0.0.30" + dockerfile-ast "0.2.0" elfy "^1.0.0" event-loop-spinner "^2.0.0" gunzip-maybe "^1.4.2" mkdirp "^1.0.4" - semver "^6.1.0" - snyk-nodejs-lockfile-parser "1.30.1" + semver "^7.3.4" + snyk-nodejs-lockfile-parser "1.30.2" tar-stream "^2.1.0" tmp "^0.2.1" tslib "^1" @@ -6533,33 +6978,33 @@ snyk-go-parser@1.4.1: toml "^3.0.0" tslib "^1.10.0" -snyk-go-plugin@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.16.2.tgz#aa3d57fee79d4f2c6bb2282ec94609123fd2ed1d" - integrity sha512-FAM56z3bl1iuxeqkCEA/jyZ2hpwkQK8xQxQbhR+QppEK5lole7w1PQyWYgZAJ9oRY/BU32zdRAJwGuZbhk7G2Q== +snyk-go-plugin@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.17.0.tgz#56d0c92d7def29ba4c3c2030c5830093e3b0dd26" + integrity sha512-1jAYPRgMapO2BYL+HWsUq5gsAiDGmI0Pn7omc0lk24tcUOMhUB+1hb0u9WBMNzHvXBjevBkjOctjpnt2hMKN6Q== dependencies: - "@snyk/dep-graph" "1.19.4" + "@snyk/dep-graph" "^1.23.1" + "@snyk/graphlib" "2.1.9-patch.3" debug "^4.1.1" - graphlib "2.1.8" snyk-go-parser "1.4.1" tmp "0.2.1" tslib "^1.10.0" -snyk-gradle-plugin@3.10.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.10.2.tgz#f3e104d42989e49b5c05818f005cae8c544c9803" - integrity sha512-gTFKL0BLUN54asUQ4OIoa4lATGn27VZwWDJGQ0VuqSaaoy8I5W16Cbn/KN95oIKa7tgwrmasPLd5uviFWzo/Qw== +snyk-gradle-plugin@3.13.2: + version "3.13.2" + resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.13.2.tgz#c5166f6a9416702cf024cc11e3b88acf198111c8" + integrity sha512-t7lBFgWwS3KU7SgmAeTJnTR44Wew84/IvNbNZ2fF0f+lXd1kZxMG1Ty2brETvxpl+U2JxC8ISILohGXsET+ySg== dependencies: - "@snyk/cli-interface" "2.9.1" - "@snyk/dep-graph" "^1.19.4" - "@snyk/java-call-graph-builder" "1.16.2" + "@snyk/cli-interface" "2.11.0" + "@snyk/dep-graph" "^1.23.1" + "@snyk/java-call-graph-builder" "1.20.0" "@types/debug" "^4.1.4" chalk "^3.0.0" debug "^4.1.1" tmp "0.2.1" tslib "^2.0.0" -snyk-module@3.1.0: +snyk-module@3.1.0, snyk-module@^3.0.0, snyk-module@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-3.1.0.tgz#3e088ff473ddf0d4e253a46ea6749d76d8e6e7ba" integrity sha512-HHuOYEAACpUpkFgU8HT57mmxmonaJ4O3YADoSkVhnhkmJ+AowqZyJOau703dYHNrq2DvQ7qYw81H7yyxS1Nfjw== @@ -6567,46 +7012,29 @@ snyk-module@3.1.0: debug "^4.1.1" hosted-git-info "^3.0.4" -snyk-module@^1.6.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-1.9.1.tgz#b2a78f736600b0ab680f1703466ed7309c980804" - integrity sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA== +snyk-mvn-plugin@2.25.3: + version "2.25.3" + resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.25.3.tgz#fb7f6fa1d565b9f07c032e8b34e6308c310b2a27" + integrity sha512-JAxOThX51JDbgMMjp3gQDVi07G9VgTYSF06QC7f5LNA0zoXNr743e2rm78RGw5bqE3JRjZxEghiLHPPuvS5DDg== dependencies: - debug "^3.1.0" - hosted-git-info "^2.7.1" - -snyk-module@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-2.1.0.tgz#80d9e9b64f202ae753ed3b33b372ca6f5ec323da" - integrity sha512-K5xeA39vLbm23Y/29wFEhKGvo7FwV4x9XhCP5gB22dBPyYiCCNiDERX4ofHQvtM6q96cL0hIroMdlbctv/0nPw== - dependencies: - "@types/hosted-git-info" "^2.7.0" - "@types/node" "^6.14.7" - debug "^3.1.0" - hosted-git-info "^2.7.1" - -snyk-mvn-plugin@2.23.4: - version "2.23.4" - resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.23.4.tgz#3f43601058aa51e8a0f9e272a7c186cad4b26950" - integrity sha512-1dWqvFu6eo2KsXFDqRF28JFwrdzpc0k+GwpIqv7vF2kHarsMxnLnT/akhjbKzs+xlRTNFvqdKhEQxjdq2nSD1Q== - dependencies: - "@snyk/cli-interface" "2.9.1" - "@snyk/java-call-graph-builder" "1.16.5" + "@snyk/cli-interface" "2.11.0" + "@snyk/dep-graph" "^1.23.1" + "@snyk/java-call-graph-builder" "1.19.1" debug "^4.1.1" glob "^7.1.6" needle "^2.5.0" tmp "^0.1.0" tslib "1.11.1" -snyk-nodejs-lockfile-parser@1.30.1: - version "1.30.1" - resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.30.1.tgz#5d54180ae818ddbe8c2b55329528c4d68e390235" - integrity sha512-QyhE4pmy7GI7fQrVmZ+qrQB8GGSbxN7OoYueS4BEP9nDxIyH4dJAz8dME5zOUeUxh3frcgBWoWgZoSzE4VOYpg== +snyk-nodejs-lockfile-parser@1.30.2: + version "1.30.2" + resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.30.2.tgz#8dbb64c42382aeaf4488c36e48c1e48eb75a1584" + integrity sha512-wI3VXVYO/ok0uaQm5i+Koo4rKBNilYC/QRIQFlyGbZXf+WBdRcTBKVDfTy8uNfUhMRSGzd84lNclMnetU9Y+vw== dependencies: + "@snyk/graphlib" "2.1.9-patch.3" "@yarnpkg/lockfile" "^1.1.0" event-loop-spinner "^2.0.0" got "11.4.0" - graphlib "2.1.8" lodash.clonedeep "^4.5.0" lodash.flatmap "^4.5.0" lodash.isempty "^4.4.0" @@ -6618,15 +7046,34 @@ snyk-nodejs-lockfile-parser@1.30.1: uuid "^8.3.0" yaml "^1.9.2" -snyk-nuget-plugin@1.19.4: - version "1.19.4" - resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.19.4.tgz#cd1163a29f8002d54a965eab9e256345c97d4174" - integrity sha512-6BvLJc7gpNdfPJSnvpmTL4BrbaOVbXh/9q1FNMs5OVp8NbnZ3l97iM+bpQXWTJHOa3BJBZz7iEg+3suH4AWoWw== +snyk-nodejs-lockfile-parser@1.31.1: + version "1.31.1" + resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.31.1.tgz#badd9fbf8f58f0bd090e5378997cbe4548033664" + integrity sha512-MU1V2zS5ziLGMUL6PXxPvJuZ281wvawjQQ1c8TW697Jjkhd8hPZcW4IzMu52ok0zsmQcVZh8sVniBEHIePCfLQ== + dependencies: + "@snyk/graphlib" "2.1.9-patch.3" + "@yarnpkg/lockfile" "^1.1.0" + event-loop-spinner "^2.0.0" + got "11.4.0" + lodash.clonedeep "^4.5.0" + lodash.flatmap "^4.5.0" + lodash.isempty "^4.4.0" + lodash.set "^4.3.2" + lodash.topairs "^4.3.0" + p-map "2.1.0" + snyk-config "^4.0.0-rc.2" + tslib "^1.9.3" + uuid "^8.3.0" + yaml "^1.9.2" + +snyk-nuget-plugin@1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.21.0.tgz#d9d3976cf0b4572ae97c47f758f84fc43040216f" + integrity sha512-c/JYF3sZzMN/lYz171zrEkVcPqDVcUTVgKIKHiL8nhhuFKxZQ1gzqOgk+lnfN31TLoTNQsZ3DhW/WY+4zEALvw== dependencies: debug "^4.1.1" dotnet-deps-parser "5.0.0" jszip "3.4.0" - lodash "^4.17.20" snyk-paket-parser "1.6.0" tslib "^1.11.2" xml2js "^0.4.17" @@ -6647,50 +7094,48 @@ snyk-php-plugin@1.9.2: "@snyk/composer-lockfile-parser" "^1.4.1" tslib "1.11.1" -snyk-poetry-lockfile-parser@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/snyk-poetry-lockfile-parser/-/snyk-poetry-lockfile-parser-1.1.1.tgz#3f062953802916f6ae1767ec13dd1892fff0541e" - integrity sha512-G3LX27V2KUsKObwVN4vDDjrYr5BERad9pXHAf+SST5+vZsdPUUZjd1ZUIrHgCv7IQhwq+7mZrtqedY5x7+LIGA== +snyk-poetry-lockfile-parser@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/snyk-poetry-lockfile-parser/-/snyk-poetry-lockfile-parser-1.1.6.tgz#bab5a279c103cbcca8eb86ab87717b115592881e" + integrity sha512-MoekbWOZPj9umfukjk2bd2o3eRj0OyO+58sxq9crMtHmTlze4h0/Uj4+fb0JFPBOtBO3c2zwbA+dvFQmpKoOTA== dependencies: "@snyk/cli-interface" "^2.9.2" - "@snyk/dep-graph" "^1.19.5" + "@snyk/dep-graph" "^1.23.0" debug "^4.2.0" toml "^3.0.0" tslib "^2.0.0" -snyk-policy@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.14.1.tgz#4e48ea993573aca18e8d883b8c62171b9d35a3e0" - integrity sha512-C5vSkoBYxPnaqb218sm4m6N5s1BhIXlldpIX5xRNnZ0QkDwVj3dy/PfgwxRgVQh7QFGa1ajbvKmsGmm4RRsN8g== +snyk-policy@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.19.0.tgz#0cbc442d9503970fb3afea938f57d57993a914ad" + integrity sha512-XYjhOTRPFA7NfDUsH6uH1fbML2OgSFsqdUPbud7x01urNP9CHXgUgAD4NhKMi3dVQK+7IdYadWt0wrFWw4y+qg== dependencies: debug "^4.1.1" email-validator "^2.0.4" js-yaml "^3.13.1" lodash.clonedeep "^4.5.0" + promise-fs "^2.1.1" semver "^6.0.0" - snyk-module "^2.0.2" - snyk-resolve "^1.0.1" - snyk-try-require "^1.3.1" - then-fs "^2.0.0" + snyk-module "^3.0.0" + snyk-resolve "^1.1.0" + snyk-try-require "^2.0.0" -snyk-python-plugin@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.19.1.tgz#91febcd260094a9d900bc54bf200aa0c2632613a" - integrity sha512-JoOUHnA76L3pekCblSuE9jQ9CuA5jt+GqXpsLQbEIZ0FQQTBa+0F7vfolg3Q7+s1it4ZdtgSbSWrlxCngIJt8g== +snyk-python-plugin@1.19.7: + version "1.19.7" + resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.19.7.tgz#d7e536694a481fd48e7d0cc8e7753c3f15a9c8be" + integrity sha512-twAGoIgJVSLVzMkuT/n5l9ZDvhMbWH7De6flWiHQB/grthfl3vJDzLCxiTa+6H/IEEYNSv6F/nSrfNh9UbW5/A== dependencies: "@snyk/cli-interface" "^2.0.3" - snyk-poetry-lockfile-parser "^1.1.1" + snyk-poetry-lockfile-parser "^1.1.6" tmp "0.0.33" -snyk-resolve-deps@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz#ef20fb578a4c920cc262fb73dd292ff21215f52d" - integrity sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ== +snyk-resolve-deps@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-4.7.2.tgz#11e7051110dadd8756819594bb30e6b88777a8b4" + integrity sha512-Bmtr7QdRL2b3Js+mPDmvXbkprOpzO8aUFXqR0nJKAOlUVQqZ84yiuT0n/mssEiJJ0vP+k0kZvTeiTwgio4KZRg== dependencies: - "@types/node" "^6.14.4" - "@types/semver" "^5.5.0" ansicolors "^0.3.2" - debug "^3.2.5" + debug "^4.1.1" lodash.assign "^4.2.0" lodash.assignin "^4.2.0" lodash.clone "^4.5.0" @@ -6699,13 +7144,21 @@ snyk-resolve-deps@4.4.0: lodash.set "^4.3.2" lru-cache "^4.0.0" semver "^5.5.1" - snyk-module "^1.6.0" + snyk-module "^3.1.0" snyk-resolve "^1.0.0" snyk-tree "^1.0.0" snyk-try-require "^1.1.1" then-fs "^2.0.0" -snyk-resolve@1.0.1, snyk-resolve@^1.0.0, snyk-resolve@^1.0.1: +snyk-resolve@1.1.0, snyk-resolve@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.1.0.tgz#52740cb01ba477851086855f9857b3a44296ee0e" + integrity sha512-OZMF8I8TOu0S58Z/OS9mr8jkEzGAPByCsAkrWlcmZgPaE0RsxVKVIFPhbMNy/JlYswgGDYYIEsNw+e0j1FnTrw== + dependencies: + debug "^4.1.1" + promise-fs "^2.1.1" + +snyk-resolve@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.0.1.tgz#eaa4a275cf7e2b579f18da5b188fe601b8eed9ab" integrity sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw== @@ -6731,7 +7184,7 @@ snyk-tree@^1.0.0: dependencies: archy "^1.0.0" -snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1: +snyk-try-require@1.3.1, snyk-try-require@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-1.3.1.tgz#6e026f92e64af7fcccea1ee53d524841e418a212" integrity sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI= @@ -6741,15 +7194,28 @@ snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1: lru-cache "^4.0.0" then-fs "^2.0.0" -snyk@^1.425.4: - version "1.431.1" - resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.431.1.tgz#1e360dae1b63d83f74fe90979f7b9a0fb1607aa7" - integrity sha512-OW48lG89ffLsSZPHwsjfdqQcu3XG6aRQOkwASPCgTAGcVcnXzS9XHB89h0gLsDzk0fZRskEVgYpvXdh4RFjNqA== +snyk-try-require@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-2.0.1.tgz#076ae9bc505d64d28389452ce19fcac28f26655a" + integrity sha512-VCOfFIvqLMXgCXEdooQgu3A40XYIFBnj0X8Y01RJ5iAbu08b4WKGN/uAKaRVF30dABS4EcjsalmCO+YlKUPEIA== dependencies: - "@snyk/cli-interface" "2.9.2" - "@snyk/dep-graph" "1.19.4" + debug "^4.1.1" + lodash.clonedeep "^4.3.0" + lru-cache "^5.1.1" + +snyk@^1.465.0: + version "1.509.0" + resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.509.0.tgz#7af0ef470cc429ffe9b2b44860d291e0542bfcab" + integrity sha512-3vdfa79Phr16O6Laun5zkNOxhQ7VIPeqb+aWwREkY3xOldLiZmOgQxfwKkllc/kImDmxB1CdDmRRwSJvPGMJ3Q== + dependencies: + "@open-policy-agent/opa-wasm" "^1.2.0" + "@snyk/cli-interface" "2.11.0" + "@snyk/code-client" "3.1.5" + "@snyk/dep-graph" "^1.27.1" "@snyk/gemfile" "1.2.0" - "@snyk/snyk-cocoapods-plugin" "2.5.1" + "@snyk/graphlib" "^2.1.9-patch.3" + "@snyk/inquirer" "^7.3.3-patch" + "@snyk/snyk-cocoapods-plugin" "2.5.2" abbrev "^1.1.1" ansi-escapes "3.2.0" chalk "^2.4.2" @@ -6757,35 +7223,52 @@ snyk@^1.425.4: configstore "^5.0.1" debug "^4.1.1" diff "^4.0.1" - graphlib "^2.1.8" - inquirer "^7.3.3" - lodash "^4.17.20" + hcl-to-json "^0.1.1" + lodash.assign "^4.2.0" + lodash.camelcase "^4.3.0" + lodash.clonedeep "^4.5.0" + lodash.endswith "^4.2.1" + lodash.flatten "^4.4.0" + lodash.flattendeep "^4.4.0" + lodash.get "^4.4.2" + lodash.groupby "^4.6.0" + lodash.isempty "^4.4.0" + lodash.isobject "^3.0.2" + lodash.map "^4.6.0" + lodash.omit "^4.5.0" + lodash.orderby "^4.6.0" + lodash.sortby "^4.7.0" + lodash.uniq "^4.5.0" + lodash.upperfirst "^4.3.1" + lodash.values "^4.3.0" micromatch "4.0.2" - needle "2.5.0" + needle "2.6.0" open "^7.0.3" os-name "^3.0.0" + promise-queue "^2.2.5" proxy-agent "^3.1.1" proxy-from-env "^1.0.0" semver "^6.0.0" - snyk-config "4.0.0-rc.2" + snyk-config "4.0.0" snyk-cpp-plugin "2.2.1" - snyk-docker-plugin "4.12.0" - snyk-go-plugin "1.16.2" - snyk-gradle-plugin "3.10.2" + snyk-docker-plugin "4.19.3" + snyk-go-plugin "1.17.0" + snyk-gradle-plugin "3.13.2" snyk-module "3.1.0" - snyk-mvn-plugin "2.23.4" - snyk-nodejs-lockfile-parser "1.30.1" - snyk-nuget-plugin "1.19.4" + snyk-mvn-plugin "2.25.3" + snyk-nodejs-lockfile-parser "1.31.1" + snyk-nuget-plugin "1.21.0" snyk-php-plugin "1.9.2" - snyk-policy "1.14.1" - snyk-python-plugin "1.19.1" - snyk-resolve "1.0.1" - snyk-resolve-deps "4.4.0" + snyk-policy "1.19.0" + snyk-python-plugin "1.19.7" + snyk-resolve "1.1.0" + snyk-resolve-deps "4.7.2" snyk-sbt-plugin "2.11.0" snyk-tree "^1.0.0" snyk-try-require "1.3.1" source-map-support "^0.5.11" strip-ansi "^5.2.0" + tar "^6.1.0" tempfile "^2.0.0" update-notifier "^4.1.0" uuid "^3.3.2" @@ -6956,6 +7439,11 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -7344,6 +7832,18 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" +tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -7554,6 +8054,11 @@ tslib@^2.0.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== +tslib@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -7719,6 +8224,11 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7752,6 +8262,11 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -7801,10 +8316,10 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806" integrity sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g== -vscode-languageserver-types@^3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== +vscode-languageserver-types@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" + integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== vue-router@^2.0.0: version "2.8.1" @@ -7965,6 +8480,13 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml-js@^1.6.11: + version "1.6.11" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" + integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== + dependencies: + sax "^1.2.4" + xml2js@0.4.23, xml2js@^0.4.17: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" From 91c9dce6c0b27122bcdf9e37474f636968e0bb1c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Wed, 24 Mar 2021 10:58:56 +0530 Subject: [PATCH 56/70] fix: Create copy of meta fields for checks --- frappe/model/document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 18f39e7f61..7fe7da672e 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -596,7 +596,7 @@ class Document(BaseDocument): has_higher_permlevel = False - all_fields = self.meta.fields + all_fields = self.meta.fields.copy() for table_field in self.meta.get_table_fields(): all_fields += frappe.get_meta(table_field.options).fields or [] From 8be8d4ba554563b4aec5b27b47b0c22580428ad9 Mon Sep 17 00:00:00 2001 From: Aditya Hase Date: Wed, 24 Mar 2021 11:53:14 +0530 Subject: [PATCH 57/70] fix(Workspace): Remove forced scrollbar --- frappe/public/scss/desk/desktop.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/scss/desk/desktop.scss b/frappe/public/scss/desk/desktop.scss index ac58f203ea..1bb91090e6 100644 --- a/frappe/public/scss/desk/desktop.scss +++ b/frappe/public/scss/desk/desktop.scss @@ -753,7 +753,7 @@ body { height: calc(100vh - var(--navbar-height) - var(--page-head-height) - 5px); .layout-side-section, .layout-main-section-wrapper { height: 100%; - overflow-y: scroll; + overflow-y: auto; } .desk-sidebar { margin-bottom: var(--margin-2xl); From 4ba781936320fccaa77f23aed6bf7a10d922d97f Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 24 Mar 2021 12:38:42 +0530 Subject: [PATCH 58/70] test: test field level permissions before role permission is defined --- frappe/tests/test_form_load.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/frappe/tests/test_form_load.py b/frappe/tests/test_form_load.py index c962b192b3..b382fa7381 100644 --- a/frappe/tests/test_form_load.py +++ b/frappe/tests/test_form_load.py @@ -42,11 +42,27 @@ class TestFormLoad(unittest.TestCase): blog_post_property_setter = make_property_setter('Blog Post', 'published', 'permlevel', 1, 'Int') reset('Blog Post') + + # test field level permission before role level permissions are defined + frappe.set_user(user.name) + blog_doc = get_blog(blog.name) + + self.assertEqual(blog_doc.published, None) + + # this will be ignored because user does not + # have write access on `published` field (or on permlevel 1 fields) + blog_doc.published = 1 + blog_doc.save() + + # since published field has higher permlevel + self.assertEqual(blog_doc.published, 0) + + # test field level permission after role level permissions are defined + frappe.set_user('Administrator') add('Blog Post', 'Website Manager', 1) update('Blog Post', 'Website Manager', 1, 'write', 1) frappe.set_user(user.name) - blog_doc = get_blog(blog.name) self.assertEqual(blog_doc.name, blog.name) From 45e7943928814ede5ee4980616825b31042bf127 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 24 Mar 2021 12:41:33 +0530 Subject: [PATCH 59/70] style: remove commented out line --- frappe/model/document.py | 1 - 1 file changed, 1 deletion(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 7fe7da672e..50025597c4 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -648,7 +648,6 @@ class Document(BaseDocument): if not hasattr(self, "_has_access_to"): self._has_access_to = {} - # if not self._has_access_to.get(permission_type): self._has_access_to[permission_type] = [] roles = frappe.get_roles() for perm in self.get_permissions(): From 8d8886f6c13eeb1ab777eda91af3c944c3786530 Mon Sep 17 00:00:00 2001 From: prssanna Date: Wed, 24 Mar 2021 16:39:31 +0530 Subject: [PATCH 60/70] fix: missing help links in navbar help dropdown --- frappe/public/js/frappe/ui/toolbar/navbar.html | 3 ++- frappe/public/js/frappe/ui/toolbar/toolbar.js | 3 ++- frappe/public/js/frappe/utils/help_links.js | 10 +++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/frappe/public/js/frappe/ui/toolbar/navbar.html b/frappe/public/js/frappe/ui/toolbar/navbar.html index 2f22bf5909..73767d2019 100644 --- a/frappe/public/js/frappe/ui/toolbar/navbar.html +++ b/frappe/public/js/frappe/ui/toolbar/navbar.html @@ -68,7 +68,8 @@