diff --git a/docs/en_US/release_notes_9_0.rst b/docs/en_US/release_notes_9_0.rst index ec02804a0..756ad2de3 100644 --- a/docs/en_US/release_notes_9_0.rst +++ b/docs/en_US/release_notes_9_0.rst @@ -22,6 +22,7 @@ New features | `Issue #6513 `_ - Change button labels and color in delete confirmation dialog for all objects to improve UX. | `Issue #7708 `_ - Enhanced pgAdmin 4 with support for Workspace layouts. + | `Issue #8332 `_ - Added the MAINTAIN privilege for PostgreSQL version 17 and above. Housekeeping ************ @@ -35,6 +36,7 @@ Bug fixes | `Issue #8072 `_ - Fixed an issue where Schema Diff not produce difference script for Index definition with where condition. | `Issue #8142 `_ - Correct the documentation for the MFA configuration. | `Issue #8165 `_ - Fixed an issue where error message from the database server need space between two sentences. + | `Issue #8199 `_ - Fixed an issue where query tool throws utf-8 decode error when using cursor with binary data. | `Issue #8208 `_ - Allow deleting the entry while creating/adding new label to enumeration type. | `Issue #8209 `_ - Fixed an issue where properties dialog throwing an error for Materialized View. | `Issue #8254 `_ - Fix a formatting issue in View/Edit tool generated SQL where some filters are applied. @@ -43,3 +45,4 @@ Bug fixes | `Issue #8273 `_ - Fixed an issue where copying query tool output cell is not working if any SQL text is selected. | `Issue #8299 `_ - Ensure master password pop up is not shown on setting MASTER_PASSWORD_REQUIRED to false. | `Issue #8309 `_ - Remove the option "With no data (concurrently)" from Refresh MATERIALIZED VIEW context menu. + | `Issue #8320 `_ - Fix an issue where wrong information is shown after using the filter on the Dashboard> State tab. diff --git a/runtime/yarn.lock b/runtime/yarn.lock index 76c0385ea..f29377cff 100644 --- a/runtime/yarn.lock +++ b/runtime/yarn.lock @@ -53,12 +53,12 @@ __metadata: languageName: node linkType: hard -"@eslint/core@npm:^0.9.0": - version: 0.9.1 - resolution: "@eslint/core@npm:0.9.1" +"@eslint/core@npm:^0.10.0": + version: 0.10.0 + resolution: "@eslint/core@npm:0.10.0" dependencies: "@types/json-schema": ^7.0.15 - checksum: 33c8159842cc3a646caa267c008cb567ca60e0220bcdcf6e426128409953b8f6a9b142246db616c71d06331edf769c192d7e2792b3f19c2a6b8179e491512d89 + checksum: 851fa099b3fef00e7ff8ece14523aff0822d3e1b47b047ab0a0d898e80c1362a22aa8b7778727231c383246932ecb63de79b4448ec1e500901c578580b087573 languageName: node linkType: hard @@ -79,10 +79,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.17.0": - version: 9.17.0 - resolution: "@eslint/js@npm:9.17.0" - checksum: b68a14ff518ffa12e3b85fa9c72b818faeff092285acfbf02da2d0fb12a681b76651638881e98845f2df2ed346ed0d33faeb1d9caac163daf232c223b7efe89c +"@eslint/js@npm:9.18.0": + version: 9.18.0 + resolution: "@eslint/js@npm:9.18.0" + checksum: a47cfcc684f87094992fe4a5c5e54018393231d8d42bd2150a08eb167813a6bf8d7c7ccbc9611933e5f782ff3b96a06c9be8d19342965cadd4530a45521b8981 languageName: node linkType: hard @@ -93,12 +93,13 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.2.3": - version: 0.2.4 - resolution: "@eslint/plugin-kit@npm:0.2.4" +"@eslint/plugin-kit@npm:^0.2.5": + version: 0.2.5 + resolution: "@eslint/plugin-kit@npm:0.2.5" dependencies: + "@eslint/core": ^0.10.0 levn: ^0.4.1 - checksum: 5693465dca5fc6f27b090f987b51bc738f48c6a6b5678dcc1791522921834206388b462578edd362d458e8de6dcd21cce1a2e8cff47d1512411ba0389112c231 + checksum: 423db33e67ff16f6db71bf8bfc8d5b0c2c4fe6f2209131e5886a573bf994bfc72ab4f825068d6521f186247731d4c9d48eb42a5e5ce389c6faa275752c0e9459 languageName: node linkType: hard @@ -199,20 +200,20 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.10.2 - resolution: "@types/node@npm:22.10.2" + version: 22.10.6 + resolution: "@types/node@npm:22.10.6" dependencies: undici-types: ~6.20.0 - checksum: b22401e6e7d1484e437d802c72f5560e18100b1257b9ad0574d6fe05bebe4dbcb620ea68627d1f1406775070d29ace8b6b51f57e7b1c7b8bafafe6da7f29c843 + checksum: 3bf26c7df8b7f0085f7a53d1f4ee124f8af01c7e4c072c3c10ec0ba91a03611fce124fed279f512b1ff259835bee5589e02f1ba0914ca6b372a7f99aef5faa3c languageName: node linkType: hard "@types/node@npm:^20.9.0": - version: 20.17.10 - resolution: "@types/node@npm:20.17.10" + version: 20.17.12 + resolution: "@types/node@npm:20.17.12" dependencies: undici-types: ~6.19.2 - checksum: 44cfa7cd9a4ebb8f74efa4b89cf963ca0e522121a7d24d8121d40872bbcfd607eaccdc203c4fe92c8b587125be9ca7b071fe4f9b356f263434b8a8512dbebef0 + checksum: 0c0dbeb4e1480a23071ec38e97bb3d776e0ae9828174bf45f9edcf277caa955945cb10d31d84f7a73c66aaf92ae2e022be6331bd00a4bed1f2ad9639a411d17e languageName: node linkType: hard @@ -626,15 +627,15 @@ __metadata: linkType: hard "electron@npm:latest": - version: 33.2.1 - resolution: "electron@npm:33.2.1" + version: 33.3.1 + resolution: "electron@npm:33.3.1" dependencies: "@electron/get": ^2.0.0 "@types/node": ^20.9.0 extract-zip: ^2.0.1 bin: electron: cli.js - checksum: c5b7d5fe56f831da5d14be9d24d0a29fdb392d5b4e593b31200a9c01e6260d87bba1216c4cc17297b2f4838e0893428464b9e2ca71c3eaff499dbff1981c0670 + checksum: 338b0ae0984b004ba9b387d27c39b146a04689b2afd7e19260599464c67f597a7ea87d0e46b86ffedafc5f66aa4423c0c0dddfa69873379608c447ea232a0acc languageName: node linkType: hard @@ -735,16 +736,16 @@ __metadata: linkType: hard "eslint@npm:^9.17.0": - version: 9.17.0 - resolution: "eslint@npm:9.17.0" + version: 9.18.0 + resolution: "eslint@npm:9.18.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.12.1 "@eslint/config-array": ^0.19.0 - "@eslint/core": ^0.9.0 + "@eslint/core": ^0.10.0 "@eslint/eslintrc": ^3.2.0 - "@eslint/js": 9.17.0 - "@eslint/plugin-kit": ^0.2.3 + "@eslint/js": 9.18.0 + "@eslint/plugin-kit": ^0.2.5 "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 "@humanwhocodes/retry": ^0.4.1 @@ -779,7 +780,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 0caae58c53bf4dc9b4893d75e62339e4c40fe5589652a3cb63f30a15bad1f34f8f784ca4fca471bbffedabee516a9f9620ebc33818b55e1b715e8f000865c851 + checksum: 5e05ae9d25a42ae8cad86a0118ea45107b42446f3614cd0ba822affa3eb85d746e0820529b1fde72820f24aa3c3447d3260505a5ee5e95be1b8b7455740a2256 languageName: node linkType: hard @@ -884,9 +885,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.3 - resolution: "fast-uri@npm:3.0.3" - checksum: c52e6c86465f5c240e84a4485fb001088cc743d261a4b54b0050ce4758b1648bdbe53da1328ef9620149dca1435e3de64184f226d7c0a3656cb5837b3491e149 + version: 3.0.5 + resolution: "fast-uri@npm:3.0.5" + checksum: b56cda8e7355bad9adcc3c2eacd94cb592eaa9536497a4779a9527784f4f95a3755f30525c63583bd85807c493b396ac89926c970f19a60905ed875121ca78fd languageName: node linkType: hard @@ -1696,9 +1697,9 @@ __metadata: linkType: hard "type-fest@npm:^4.18.2, type-fest@npm:^4.20.0": - version: 4.30.2 - resolution: "type-fest@npm:4.30.2" - checksum: 861f7ae761fa11194743318a486c04b369f6f39060c8c24a099880478efa5c7562b72ad88c38fb7d7dc57111fb378b8922fceddaff363cfc002c6005a99d6bb6 + version: 4.32.0 + resolution: "type-fest@npm:4.32.0" + checksum: 0010e2fbe040e46f9d3a76a97e8917e5f0c9a5d7883529a3916fac5c2d2638429864b7dfc083d2c7883894e3c8cee026f91d0301c64fa74c1c0c2dafb488e3c6 languageName: node linkType: hard @@ -1750,9 +1751,9 @@ __metadata: linkType: hard "when-exit@npm:^2.1.1": - version: 2.1.3 - resolution: "when-exit@npm:2.1.3" - checksum: d4242a15148df89e08e518b4c372580516d45a6ab527f14643a3789c6edb9ccfc788b1d717728c1a33c85dc53badefb511a3ee704ea61c4e86f693f3bf7666f2 + version: 2.1.4 + resolution: "when-exit@npm:2.1.4" + checksum: d77635a0ed43bb63b3b41930637db16fb1e4e8630f5c6efd4aa669322c32b36ba750b7484991f806d3ac56f4e21cdf3925f82fff289b90706cc21e6745038a26 languageName: node linkType: hard diff --git a/web/package.json b/web/package.json index b49fbed6e..eb435957c 100644 --- a/web/package.json +++ b/web/package.json @@ -8,7 +8,7 @@ "license": "PostgreSQL", "devDependencies": { "@babel/core": "^7.10.2", - "@babel/eslint-parser": "^7.24.7", + "@babel/eslint-parser": "^7.26.5", "@babel/eslint-plugin": "^7.24.7", "@babel/plugin-proposal-object-rest-spread": "^7.10.1", "@babel/plugin-syntax-jsx": "^7.16.0", @@ -85,7 +85,7 @@ "@projectstorm/react-diagrams": "^7.0.4", "@simonwep/pickr": "^1.5.1", "@szhsin/react-menu": "^4.2.2", - "@tanstack/react-query": "5.62.15", + "@tanstack/react-query": "5.64.0", "@tanstack/react-table": "^8.16.0", "@tanstack/react-virtual": "^3.8.4", "@types/classnames": "^2.3.4", @@ -151,7 +151,7 @@ "uplot-react": "^1.1.4", "valid-filename": "^4.0.0", "wkx": "^0.5.0", - "zustand": "^5.0.1" + "zustand": "^5.0.3" }, "resolutions": { "rc-resize-observer": "1.4.0" diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py index fbcfb2794..3cfed8f10 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py @@ -420,6 +420,11 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, 'triggers/sql/{0}/#{1}#'.format(self.manager.server_type, self.manager.version) + self.allowed_privileges = ["a", "r", "w", "d", "D", "x", "t"] + if self.manager.version >= 170000: + self.allowed_privileges = \ + ["a", "r", "w", "d", "D", "x", "t", "m"] + return f(*args, **kwargs) return wrap @@ -914,7 +919,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, # Parse Privileges if 'relacl' in data: data['relacl'] = parse_priv_to_db(data['relacl'], - ["a", "r", "w", "x"]) + self.allowed_privileges) SQL = render_template("/".join([self.template_path, self._CREATE_SQL]), @@ -991,7 +996,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, return internal_server_error(errormsg=str(e)) @staticmethod - def _parse_privileges(data): + def _parse_privileges(data, allowed_privileges): """ Parser privilege data as per type. :param data: Data. @@ -999,13 +1004,13 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, """ if 'relacl' in data and 'added' in data['relacl']: data['relacl']['added'] = parse_priv_to_db( - data['relacl']['added'], ["a", "r", "w", "x"]) + data['relacl']['added'], allowed_privileges) if 'relacl' in data and 'changed' in data['relacl']: data['relacl']['changed'] = parse_priv_to_db( - data['relacl']['changed'], ["a", "r", "w", "x"]) + data['relacl']['changed'], allowed_privileges) if 'relacl' in data and 'deleted' in data['relacl']: data['relacl']['deleted'] = parse_priv_to_db( - data['relacl']['deleted'], ["a", "r", "w", "x"]) + data['relacl']['deleted'], allowed_privileges) @staticmethod def _check_old_col_ops(old_col_frmt_options, option, col): @@ -1120,7 +1125,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, data['schema'] = old_data['basensp'] # Parse Privileges - ForeignTableView._parse_privileges(data) + ForeignTableView._parse_privileges(data, self.allowed_privileges) # If ftsrvname is changed while comparing two schemas # then we need to drop foreign table and recreate it @@ -1175,7 +1180,7 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, # Parse Privileges if 'relacl' in data: data['relacl'] = parse_priv_to_db(data['relacl'], - ["a", "r", "w", "x"]) + self.allowed_privileges) sql = render_template("/".join([self.template_path, self._CREATE_SQL]), data=data, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.ui.js index 6a085f1df..4290f338d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/static/js/foreign_table.ui.js @@ -17,6 +17,7 @@ import VariableSchema from 'top/browser/server_groups/servers/static/js/variable import _ from 'lodash'; import { getNodePrivilegeRoleSchema } from '../../../../../static/js/privilege.ui'; import { getNodeAjaxOptions } from '../../../../../../../static/js/node_ajax'; +import { getPrivilegesForTableAndLikeObjects } from '../../../tables/static/js/table.ui'; export default class ForeignTableSchema extends BaseUISchema { @@ -50,6 +51,7 @@ export default class ForeignTableSchema extends BaseUISchema { nodeInfo: null, ...fieldOptions, }; + this.nodeInfo = this.fieldOptions.nodeInfo; this.columnsObj = getNodeColumnSchema(this.fieldOptions.nodeInfo, this.fieldOptions.nodeData, this.fieldOptions.pgBrowser); } @@ -222,7 +224,7 @@ export default class ForeignTableSchema extends BaseUISchema { }, { id: 'relacl', label: gettext('Privileges'), type: 'collection', - schema: this.getPrivilegeRoleSchema(['a','r','w','x']), + schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(obj.getServerVersion())), uniqueCol : ['grantee', 'grantor'], editable: false, group: gettext('Security'), mode: ['edit', 'create'], diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/acl.sql index 22afdb795..4f340a189 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/templates/foreign_tables/sql/default/acl.sql @@ -11,6 +11,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/17_plus/test_foreign_table.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/17_plus/test_foreign_table.json new file mode 100644 index 000000000..0ae716a00 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/17_plus/test_foreign_table.json @@ -0,0 +1,285 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create FDW for foreign table", + "endpoint": "NODE-foreign_data_wrapper.obj", + "sql_endpoint": "NODE-foreign_data_wrapper.sql_id", + "data": { + "name": "test_fdw_for_foreign_table", + "fdwacl": [], + "fdwoptions": [] + }, + "store_object_id": "True" + }, + { + "type": "create", + "name": "Create foreign server for foreign table", + "endpoint": "NODE-foreign_server.obj", + "sql_endpoint": "NODE-foreign_server.sql_id", + "data": { + "name":"test_fs_for_foreign_table" + }, + "store_object_id": "True" + }, + { + "type": "create", + "name": "Create Foreign Table with all options", + "endpoint": "NODE-foreign_table.obj", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql", + "data": { + "name": "FT1_$%{}[]()&*^!@\"'`\\/#", + "owner":"postgres", + "schema": "public", + "basensp":"public", + "description":"Test Comment", + "ftsrvname":"test_fs_for_foreign_table", + "columns":[{ + "name":"col1", + "cltype":"bigint", + "coloptions":[] + },{ + "name":"col2", + "cltype":"text", + "coloptions":[] + }], + "constraints":[{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }], + "ftoptions":[{ + "option":"schema_name", + "value":"public" + },{ + "option":"table_name", + "value":"test_table" + }], + "relacl":[{ + "grantee":"PUBLIC", + "grantor":"postgres", + "privileges":[{ + "privilege_type":"a", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"w", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"x", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"d", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"D", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"t", + "privilege":true, + "with_grant":false + }, { + "privilege_type":"m", + "privilege":true, + "with_grant":false + }] + }] + }, + "expected_sql_file": "create_foreign_table_with_all_options.sql", + "expected_msql_file": "create_foreign_table_with_all_options_msql.sql" + }, { + "type": "delete", + "name": "Drop foreign table", + "endpoint": "NODE-foreign_table.delete_id" + }, + { + "type": "create", + "name": "Create Foreign Table", + "endpoint": "NODE-foreign_table.obj", + "sql_endpoint": "NODE-foreign_table.sql_id", + "data": { + "name": "FT1_$%{}[]()&*^!@\"'`\\/#", + "owner": "postgres", + "schema": "public", + "basensp": "public", + "ftsrvname": "test_fs_for_foreign_table", + "columns": [] + } + }, + { + "type": "alter", + "name": "Alter Foreign Table comment and add columns", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "description":"Test Comment", + "columns": { + "added": [{ + "name":"col1", + "cltype":"bigint", + "coloptions":[], + "attnotnull": true + },{ + "name":"col2", + "cltype":"text", + "coloptions":[] + }] + } + }, + "expected_sql_file": "alter_comment_add_columns.sql", + "expected_msql_file": "alter_comment_add_columns_msql.sql" + }, + { + "type": "alter", + "name": "Alter Foreign Table add constraints and options", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "constraints": { + "added": [{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }] + }, + "ftoptions": { + "added": [{ + "option":"schema_name", + "value":"public" + },{ + "option":"table_name", + "value":"test_table" + }] + } + }, + "expected_sql_file": "alter_add_cons_opts.sql", + "expected_msql_file": "alter_add_cons_opts_msql.sql" + }, + { + "type": "alter", + "name": "Alter Foreign Table add privileges", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "relacl":{ + "added": [{ + "grantee":"PUBLIC", + "grantor":"postgres", + "privileges":[{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + }] + }] + } + }, + "expected_sql_file": "alter_add_priv.sql", + "expected_msql_file": "alter_add_priv_msql.sql" + }, + { + "type": "alter", + "name": "Alter Foreign Table change option and column", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "ftoptions": { + "changed": [{ + "option":"schema_name", + "value":"test_public" + }] + }, + "columns": { + "changed": [{ + "name": "col1", + "attnum": 1, + "attoptions": null, + "attnotnull":false, + "attstattarget": 10, + "collname": "", + "coloptions": [], + "cltype": "integer" + }], + "deleted": [{ + "name":"col2", + "cltype":"text" + }] + } + }, + "expected_sql_file": "alter_col_opts.sql", + "expected_msql_file": "alter_col_opts_msql.sql" + }, + { + "type": "alter", + "name": "Alter Foreign Table remove option, constraint, privileges", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "relacl":{ + "deleted": [{ + "grantee":"PUBLIC", + "grantor":"postgres", + "privileges":[{ + "privilege_type":"a", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + }] + }] + }, + "constraints": { + "deleted": [{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }] + }, + "ftoptions": { + "deleted": [{ + "option":"schema_name", + "value":"public" + }] + } + }, + "expected_sql_file": "alter_remove_opts_priv_cons.sql", + "expected_msql_file": "alter_remove_opts_priv_cons_msql.sql" + }, { + "type": "delete", + "name": "Drop foreign table", + "endpoint": "NODE-foreign_table.delete_id" + }, { + "type": "delete", + "name": "Drop foreign server", + "endpoint": "NODE-foreign_server.delete_id", + "data": { + "name": "test_fs_for_foreign_table" + } + }, { + "type": "delete", + "name": "Drop FDW", + "endpoint": "NODE-foreign_data_wrapper.delete_id", + "data": { + "name": "test_fdw_for_foreign_table" + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/default/test_foreign_table.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/default/test_foreign_table.json index 92d79c7ef..4f0076176 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/default/test_foreign_table.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/pg/default/test_foreign_table.json @@ -76,6 +76,18 @@ "privilege_type":"x", "privilege":true, "with_grant":false + },{ + "privilege_type":"d", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"D", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"t", + "privilege":true, + "with_grant":false }] }] }, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/17_plus/test_foreign_table.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/17_plus/test_foreign_table.json new file mode 100644 index 000000000..f748287a2 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/17_plus/test_foreign_table.json @@ -0,0 +1,278 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create FDW for foreign table", + "endpoint": "NODE-foreign_data_wrapper.obj", + "sql_endpoint": "NODE-foreign_data_wrapper.sql_id", + "data": { + "name": "test_fdw_for_foreign_table", + "fdwacl": [], + "fdwoptions": [] + }, + "store_object_id": "True" + }, { + "type": "create", + "name": "Create foreign server for foreign table", + "endpoint": "NODE-foreign_server.obj", + "sql_endpoint": "NODE-foreign_server.sql_id", + "data": { + "name":"test_fs_for_foreign_table" + }, + "store_object_id": "True" + }, { + "type": "create", + "name": "Create Foreign Table with all options", + "endpoint": "NODE-foreign_table.obj", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql", + "data": { + "name": "FT1_$%{}[]()&*^!@\"'`\\/#", + "owner":"enterprisedb", + "schema": "public", + "basensp":"public", + "description":"Test Comment", + "ftsrvname":"test_fs_for_foreign_table", + "columns":[{ + "name":"col1", + "cltype":"bigint", + "coloptions":[] + },{ + "name":"col2", + "cltype":"text", + "coloptions":[] + }], + "constraints":[{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }], + "ftoptions":[{ + "option":"schema_name", + "value":"public" + },{ + "option":"table_name", + "value":"test_table" + }], + "relacl":[{ + "grantee":"PUBLIC", + "grantor":"enterprisedb", + "privileges":[{ + "privilege_type":"a", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"w", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"x", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"d", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"D", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"t", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"m", + "privilege":true, + "with_grant":false + }] + }] + }, + "expected_sql_file": "create_foreign_table_with_all_options.sql", + "expected_msql_file": "create_foreign_table_with_all_options_msql.sql" + }, { + "type": "delete", + "name": "Drop foreign table", + "endpoint": "NODE-foreign_table.delete_id" + }, + { + "type": "create", + "name": "Create Foreign Table", + "endpoint": "NODE-foreign_table.obj", + "sql_endpoint": "NODE-foreign_table.sql_id", + "data": { + "name": "FT1_$%{}[]()&*^!@\"'`\\/#", + "owner": "enterprisedb", + "schema": "public", + "basensp": "public", + "ftsrvname": "test_fs_for_foreign_table", + "columns": [] + } + }, { + "type": "alter", + "name": "Alter Foreign Table comment and add columns", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "description":"Test Comment", + "columns": { + "added": [{ + "name":"col1", + "cltype":"bigint", + "coloptions":[], + "attnotnull": true + },{ + "name":"col2", + "cltype":"text", + "coloptions":[] + }] + } + }, + "expected_sql_file": "alter_comment_add_columns.sql", + "expected_msql_file": "alter_comment_add_columns_msql.sql" + },{ + "type": "alter", + "name": "Alter Foreign Table add constraints and options", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "constraints": { + "added": [{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }] + }, + "ftoptions": { + "added": [{ + "option":"schema_name", + "value":"public" + },{ + "option":"table_name", + "value":"test_table" + }] + } + }, + "expected_sql_file": "alter_add_cons_opts.sql", + "expected_msql_file": "alter_add_cons_opts_msql.sql" + }, { + "type": "alter", + "name": "Alter Foreign Table add privileges", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "relacl":{ + "added": [{ + "grantee":"PUBLIC", + "grantor":"enterprisedb", + "privileges":[{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + }] + }] + } + }, + "expected_sql_file": "alter_add_priv.sql", + "expected_msql_file": "alter_add_priv_msql.sql" + }, { + "type": "alter", + "name": "Alter Foreign Table change option and column", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "ftoptions": { + "changed": [{ + "option":"schema_name", + "value":"test_public" + }] + }, + "columns": { + "changed": [{ + "name": "col1", + "attnum": 1, + "attoptions": null, + "attnotnull":false, + "attstattarget": 10, + "collname": "", + "coloptions": [], + "cltype": "integer" + }], + "deleted": [{ + "name":"col2", + "cltype":"text" + }] + } + }, + "expected_sql_file": "alter_col_opts.sql", + "expected_msql_file": "alter_col_opts_msql.sql" + }, { + "type": "alter", + "name": "Alter Foreign Table remove option, constraint, privileges", + "endpoint": "NODE-foreign_table.obj_id", + "sql_endpoint": "NODE-foreign_table.sql_id", + "msql_endpoint": "NODE-foreign_table.msql_id", + "data": { + "relacl":{ + "deleted": [{ + "grantee":"PUBLIC", + "grantor":"enterprisedb", + "privileges":[{ + "privilege_type":"a", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"r", + "privilege":true, + "with_grant":false + }] + }] + }, + "constraints": { + "deleted": [{ + "conname":"cons1", + "consrc":"true", + "connoinherit":true, + "convalidated":true + }] + }, + "ftoptions": { + "deleted": [{ + "option":"schema_name", + "value":"public" + }] + } + }, + "expected_sql_file": "alter_remove_opts_priv_cons.sql", + "expected_msql_file": "alter_remove_opts_priv_cons_msql.sql" + }, { + "type": "delete", + "name": "Drop foreign table", + "endpoint": "NODE-foreign_table.delete_id" + }, { + "type": "delete", + "name": "Drop foreign server", + "endpoint": "NODE-foreign_server.delete_id", + "data": { + "name": "test_fs_for_foreign_table" + } + }, { + "type": "delete", + "name": "Drop FDW", + "endpoint": "NODE-foreign_data_wrapper.delete_id", + "data": { + "name": "test_fdw_for_foreign_table" + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/default/test_foreign_table.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/default/test_foreign_table.json index 77efbd33f..3e6b9ca0d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/default/test_foreign_table.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/tests/ppas/default/test_foreign_table.json @@ -74,6 +74,18 @@ "privilege_type":"x", "privilege":true, "with_grant":false + },{ + "privilege_type":"d", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"D", + "privilege":true, + "with_grant":false + },{ + "privilege_type":"t", + "privilege":true, + "with_grant":false }] }] }, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js index af1f32747..94dc5f056 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.js @@ -88,7 +88,8 @@ define('pgadmin.node.schema', [ roles:() => getNodeListByName('role', treeNodeInfo, itemNodeData, { cacheLevel: 'database' }), - server_info: pgBrowser.serverInfo[treeNodeInfo.server._id] + server_info: pgBrowser.serverInfo[treeNodeInfo.server._id], + nodeInfo: treeNodeInfo, }, { namespaceowner: pgBrowser.serverInfo[treeNodeInfo.server._id].user.name diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.ui.js index 833d4b95b..fb204b744 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/static/js/schema.ui.js @@ -88,7 +88,7 @@ export default class PGSchema extends BaseUISchema { type: 'nested-tab', group: gettext('Default privileges'), mode: ['create','edit'], - schema: new DefaultPrivSchema(pgSchemaObj.getPrivilegeRoleSchema) + schema: new DefaultPrivSchema(pgSchemaObj.getPrivilegeRoleSchema, pgSchemaObj.fieldOptions.nodeInfo) } ]; } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.ui.js index 1ea5900fe..cd96f080b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.ui.js @@ -11,7 +11,7 @@ import gettext from 'sources/gettext'; import BaseUISchema from 'sources/SchemaView/base_schema.ui'; import SecLabelSchema from 'top/browser/server_groups/servers/static/js/sec_label.ui'; import _ from 'lodash'; -import { ConstraintsSchema } from '../../../static/js/table.ui'; +import { ConstraintsSchema, getPrivilegesForTableAndLikeObjects } from '../../../static/js/table.ui'; import { PartitionKeysSchema, PartitionsSchema } from '../../../static/js/partition.utils.ui'; import { getNodePrivilegeRoleSchema } from '../../../../../../static/js/privilege.ui'; import { getNodeAjaxOptions, getNodeListByName } from '../../../../../../../../static/js/node_ajax'; @@ -429,7 +429,7 @@ export default class PartitionTableSchema extends BaseUISchema { }, { id: 'relacl', label: gettext('Privileges'), type: 'collection', - group: gettext('Security'), schema: this.getPrivilegeRoleSchema(['a','r','w','d','D','x','t']), + group: gettext('Security'), schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(this.getServerVersion())), mode: ['edit', 'create'], canAdd: true, canDelete: true, uniqueCol : ['grantee'], },{ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js index ffab6fe8f..7b3b05214 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js @@ -24,6 +24,14 @@ import { getNodeExclusionConstraintSchema } from '../../constraints/exclusion_co import { getNodePrivilegeRoleSchema } from '../../../../../static/js/privilege.ui'; import pgAdmin from 'sources/pgadmin'; +export function getPrivilegesForTableAndLikeObjects(server_version) { + if (server_version && server_version >= 170000) { + return ['a', 'r', 'w', 'd', 'D', 'x', 't', 'm']; + } + + return ['a', 'r', 'w', 'd', 'D', 'x', 't']; +} + export function getNodeTableSchema(treeNodeInfo, itemNodeData, pgBrowser) { const spcname = () => getNodeListByName( 'tablespace', treeNodeInfo, itemNodeData, {}, (m) => { @@ -713,7 +721,7 @@ export default class TableSchema extends BaseUISchema { /* Create PK if none */ return {primary_key: [ obj.constraintsObj.primaryKeyObj.getNewData({ - columns: [{column: columnData.name, + columns: [{column: columnData.name, }], }) ]}; @@ -1022,7 +1030,7 @@ export default class TableSchema extends BaseUISchema { }, { id: 'relacl', label: gettext('Privileges'), type: 'collection', - group: 'security_group', schema: this.getPrivilegeRoleSchema(['a','r','w','d','D','x','t']), + group: 'security_group', schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(this.getServerVersion())), mode: ['edit', 'create'], canAdd: true, canDelete: true, uniqueCol : ['grantee'], },{ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/acl.sql index a9f2bfa49..f3eabe01f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/acl.sql @@ -10,6 +10,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py index b5cc536b8..c5f180e2c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py @@ -148,6 +148,8 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): # Supported ACL for table self.acl = ['a', 'r', 'w', 'd', 'D', 'x', 't'] + if ver >= 170000: + self.acl = ['a', 'r', 'w', 'd', 'D', 'x', 't', 'm'] # Supported ACL for columns self.column_acl = ['a', 'r', 'w', 'x'] diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/17_plus/allowed_privs.json new file mode 100644 index 000000000..4d879c704 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/pg/17_plus/allowed_privs.json @@ -0,0 +1,30 @@ +{# List of allowed privileges for PostgreSQL 9.2 or later #} +{# + Format for allowed privileges is: + "acl_col": { + "type": "name", + "acl": [...] + } +#} +{ + "nspacl": { + "type": "DATABASE", + "acl": ["c", "C", "T"] + }, + "deftblacl": { + "type": "TABLE", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + }, + "defseqacl": { + "type": "SEQUENCE", + "acl": ["U", "r", "w"] + }, + "deffuncacl": { + "type": "FUNCTION", + "acl": ["X"] + }, + "deftypeacl": { + "type": "TYPE", + "acl": ["U"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/17_plus/allowed_privs.json new file mode 100644 index 000000000..a2361833a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/catalog/ppas/17_plus/allowed_privs.json @@ -0,0 +1,30 @@ +{# List of allowed privileges for PPAS 9.2 or later #} +{# + Format for allowed privileges is: + "acl_col": { + "type": "name", + "acl": [...] + } +#} +{ + "nspacl": { + "type": "DATABASE", + "acl": ["c", "C", "T"] + }, + "deftblacl": { + "type": "TABLE", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + }, + "defseqacl": { + "type": "SEQUENCE", + "acl": ["U", "r", "w"] + }, + "deffuncacl": { + "type": "FUNCTION", + "acl": ["X"] + }, + "deftypeacl": { + "type": "TYPE", + "acl": ["U"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/17_plus/allowed_privs.json new file mode 100644 index 000000000..8529890da --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/17_plus/allowed_privs.json @@ -0,0 +1,30 @@ +{# List of allowed privileges for PostgreSQL 9.2 or later #} +{# + Format for allowed privileges is: + "acl_col": { + "type": "name", + "acl": [...] + } +#} +{ + "nspacl": { + "type": "SCHEMA", + "acl": ["C", "U"] + }, + "deftblacl": { + "type": "TABLE", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + }, + "defseqacl": { + "type": "SEQUENCE", + "acl": ["U", "r", "w"] + }, + "deffuncacl": { + "type": "FUNCTION", + "acl": ["X"] + }, + "deftypeacl": { + "type": "TYPE", + "acl": ["U"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/default/sql/defacl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/default/sql/defacl.sql index bb7a1dffe..427608609 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/default/sql/defacl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/pg/default/sql/defacl.sql @@ -16,6 +16,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/17_plus/allowed_privs.json new file mode 100644 index 000000000..0ec1c2152 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/17_plus/allowed_privs.json @@ -0,0 +1,30 @@ +{# List of allowed privileges for PPAS 9.2 or later #} +{# + Format for allowed privileges is: + "acl_col": { + "type": "name", + "acl": [...] + } +#} +{ + "nspacl": { + "type": "SCHEMA", + "acl": ["C", "U"] + }, + "deftblacl": { + "type": "TABLE", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + }, + "defseqacl": { + "type": "SEQUENCE", + "acl": ["U", "r", "w"] + }, + "deffuncacl": { + "type": "FUNCTION", + "acl": ["X"] + }, + "deftypeacl": { + "type": "TYPE", + "acl": ["U"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/default/sql/defacl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/default/sql/defacl.sql index 18448b9ad..4a1e92108 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/default/sql/defacl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/ppas/default/sql/defacl.sql @@ -19,6 +19,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/pg/17_plus/test_schema.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/pg/17_plus/test_schema.json new file mode 100644 index 000000000..86fc0e7fe --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/pg/17_plus/test_schema.json @@ -0,0 +1,320 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Schema With All Options", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#", + "description": "This is a test comment", + "nspacl": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }], + "seclabels": [], + "deftblacl": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "d", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "D", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "x", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "t", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false + }] + }], + "defseqacl": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }], + "deffuncacl": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "X", + "privilege": true, + "with_grant": false + }] + }], + "deftypeacl": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + }, + "expected_sql_file": "create_schema_all_options.sql", + "expected_msql_file": "create_schema_all_options_msql.sql" + }, { + "type": "delete", + "name": "Drop Schema with all options", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Schema with comments", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#", + "description": "This is a test comment" + }, + "expected_sql_file": "create_schema_with_comment.sql", + "expected_msql_file": "create_schema_with_comment_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Name", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "name": "test_schema1_$%{}[]()&*^!@\"\"'`\\/#" + }, + "expected_sql_file": "alter_schema_name.sql", + "expected_msql_file": "alter_schema_name_msql.sql" + }, + { + "type": "delete", + "name": "Drop Schema", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema1_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Schema", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "alter", + "name": "Alert Schema Add Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftblacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "deffuncacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "X", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftypeacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_add_priv.sql", + "expected_msql_file": "alter_schema_add_priv_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Update Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftblacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_update_priv.sql", + "expected_msql_file": "alter_schema_update_priv_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Drop Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftypeacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_drop_priv.sql", + "expected_msql_file": "alter_schema_drop_priv_msql.sql" + }, + { + "type": "delete", + "name": "Drop Schema", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/ppas/17_plus/test_schema.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/ppas/17_plus/test_schema.json new file mode 100644 index 000000000..1620bc7fc --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tests/ppas/17_plus/test_schema.json @@ -0,0 +1,319 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Schema With All Options", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#", + "description": "This is a test comment", + "nspacl": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }], + "seclabels": [], + "deftblacl": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "a", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "d", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "D", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "x", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "t", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false + }] + }], + "defseqacl": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }], + "deffuncacl": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "X", + "privilege": true, + "with_grant": false + }] + }], + "deftypeacl": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + }, + "expected_sql_file": "create_schema_all_options.sql", + "expected_msql_file": "create_schema_all_options_msql.sql" + }, { + "type": "delete", + "name": "Drop Schema with all options", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Schema with comments", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#", + "description": "This is a test comment" + }, + "expected_sql_file": "create_schema_with_comment.sql", + "expected_msql_file": "create_schema_with_comment_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Name", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "name": "test_schema1_$%{}[]()&*^!@\"\"'`\\/#" + }, + "expected_sql_file": "alter_schema_name.sql", + "expected_msql_file": "alter_schema_name_msql.sql" + }, + { + "type": "delete", + "name": "Drop Schema", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema1_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Schema", + "endpoint": "NODE-schema.obj", + "sql_endpoint": "NODE-schema.sql_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + }, { + "type": "alter", + "name": "Alert Schema Add Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftblacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "deffuncacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "X", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftypeacl": { + "added": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_add_priv.sql", + "expected_msql_file": "alter_schema_add_priv_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Update Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftblacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "changed": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_update_priv.sql", + "expected_msql_file": "alter_schema_update_priv_msql.sql" + }, { + "type": "alter", + "name": "Alert Schema Drop Privileges", + "endpoint": "NODE-schema.obj_id", + "sql_endpoint": "NODE-schema.sql_id", + "msql_endpoint": "NODE-schema.msql_id", + "data": { + "nspacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "C", + "privilege": true, + "with_grant": false + }] + }] + }, + "defseqacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }, { + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + }, + "deftypeacl": { + "deleted": [{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges": [{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_schema_drop_priv.sql", + "expected_msql_file": "alter_schema_drop_priv_msql.sql" + }, { + "type": "delete", + "name": "Drop Schema", + "endpoint": "NODE-schema.obj_id", + "data": { + "name": "test_schema_$%{}[]()&*^!@\"\"'`\\/#" + } + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.ui.js index a4485f936..f5875c949 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/mview.ui.js @@ -12,6 +12,7 @@ import gettext from 'sources/gettext'; import BaseUISchema from 'sources/SchemaView/base_schema.ui'; import SecLabelSchema from '../../../../../static/js/sec_label.ui'; import { isEmptyString } from 'sources/validators'; +import { getPrivilegesForTableAndLikeObjects } from '../../../tables/static/js/table.ui'; export default class MViewSchema extends BaseUISchema { @@ -119,7 +120,7 @@ export default class MViewSchema extends BaseUISchema { }, { id: 'datacl', label: gettext('Privileges'), type: 'collection', - schema: this.getPrivilegeRoleSchema(['a', 'r', 'w', 'd', 'D', 'x', 't']), + schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(this.getServerVersion())), uniqueCol : ['grantee'], editable: false, group: gettext('Security'), mode: ['edit', 'create'], diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.ui.js index b36693cd1..8d12c475c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/static/js/view.ui.js @@ -12,6 +12,7 @@ import gettext from 'sources/gettext'; import BaseUISchema from 'sources/SchemaView/base_schema.ui'; import SecLabelSchema from '../../../../../static/js/sec_label.ui'; import { isEmptyString } from 'sources/validators'; +import { getPrivilegesForTableAndLikeObjects } from '../../../tables/static/js/table.ui'; export default class ViewSchema extends BaseUISchema { @@ -103,7 +104,7 @@ export default class ViewSchema extends BaseUISchema { { id: 'datacl', label: gettext('Privileges'), type: 'collection', - schema: this.getPrivilegeRoleSchema(['a', 'r', 'w', 'd', 'D', 'x', 't']), + schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(this.getServerVersion())), uniqueCol : ['grantee'], editable: false, group: gettext('Security'), mode: ['edit', 'create'], diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/17_plus/allowed_privs.json new file mode 100644 index 000000000..6dd555145 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/17_plus/allowed_privs.json @@ -0,0 +1,6 @@ +{ + "datacl": { + "type": "MVIEW", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/acl.sql index a658b1764..53d6083d7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/default/sql/acl.sql @@ -14,6 +14,7 @@ FROM CASE d.privilege_type WHEN 'DELETE' THEN 'd' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TRIGGER' THEN 't' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/17_plus/allowed_privs.json new file mode 100644 index 000000000..6dd555145 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/17_plus/allowed_privs.json @@ -0,0 +1,6 @@ +{ + "datacl": { + "type": "MVIEW", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/acl.sql index a658b1764..53d6083d7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/default/sql/acl.sql @@ -14,6 +14,7 @@ FROM CASE d.privilege_type WHEN 'DELETE' THEN 'd' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TRIGGER' THEN 't' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/17_plus/allowed_privs.json new file mode 100644 index 000000000..8e8c3f39a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/17_plus/allowed_privs.json @@ -0,0 +1,6 @@ +{ + "datacl": { + "type": "VIEW", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/acl.sql index c999dabae..7ed5318ee 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/default/sql/acl.sql @@ -12,6 +12,7 @@ FROM CASE d.privilege_type WHEN 'DELETE' THEN 'd' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TRIGGER' THEN 't' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/17_plus/allowed_privs.json new file mode 100644 index 000000000..8e8c3f39a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/17_plus/allowed_privs.json @@ -0,0 +1,6 @@ +{ + "datacl": { + "type": "VIEW", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/acl.sql index c999dabae..7ed5318ee 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/default/sql/acl.sql @@ -12,6 +12,7 @@ FROM CASE d.privilege_type WHEN 'DELETE' THEN 'd' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TRIGGER' THEN 't' diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.ui.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.ui.js index 0bfc99953..209dfe8cd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.ui.js @@ -11,18 +11,21 @@ import _ from 'lodash'; import gettext from 'sources/gettext'; import BaseUISchema from 'sources/SchemaView/base_schema.ui'; import SecLabelSchema from '../../../static/js/sec_label.ui'; +import { getPrivilegesForTableAndLikeObjects } from '../../schemas/tables/static/js/table.ui'; + export class DefaultPrivSchema extends BaseUISchema { - constructor(getPrivilegeRoleSchema) { + constructor(getPrivilegeRoleSchema, nodeInfo) { super(); this.getPrivilegeRoleSchema = getPrivilegeRoleSchema; + this.nodeInfo = nodeInfo; } get baseFields() { return [ { id: 'deftblacl', type: 'collection', group: gettext('Tables'), - schema: this.getPrivilegeRoleSchema(['a', 'r', 'w', 'd', 'D', 'x', 't']), + schema: this.getPrivilegeRoleSchema(getPrivilegesForTableAndLikeObjects(this.getServerVersion())), mode: ['edit', 'create'], canAdd: true, canDelete: true, uniqueCol : ['grantee', 'grantor'], @@ -293,7 +296,7 @@ export default class DatabaseSchema extends BaseUISchema { },{ type: 'nested-tab', group: gettext('Default Privileges'), mode: ['edit'], - schema: new DefaultPrivSchema(this.getPrivilegeRoleSchema), + schema: new DefaultPrivSchema(this.getPrivilegeRoleSchema, this.nodeInfo), }, { id: 'schema_res', label: gettext('Schema restriction'), diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/17_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/17_plus/allowed_privs.json new file mode 100644 index 000000000..0d0c6c64c --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/17_plus/allowed_privs.json @@ -0,0 +1,26 @@ +{# List down allowed privileges for PostgreSQL/PPAS 9.1, or less #} +{# + Format for allowed privileges are: + "acl_col": { + "type": "name", + "acl": [...] + } +#} +{ + "datacl": { + "type": "DATABASE", + "acl": ["c", "C", "T"] + }, + "deftblacl": { + "type": "TABLE", + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] + }, + "defseqacl": { + "type": "SEQUENCE", + "acl": ["U", "r", "w"] + }, + "deffuncacl": { + "type": "FUNCTION", + "acl": ["X"] + } +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/acl.sql index 9207cafa5..00bfadfdd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/acl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/acl.sql @@ -11,6 +11,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/defacl.sql b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/defacl.sql index 2527a5d36..3dfc7df09 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/defacl.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/templates/databases/sql/default/defacl.sql @@ -17,6 +17,7 @@ FROM WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' @@ -55,6 +56,7 @@ FROM( WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' @@ -117,6 +119,7 @@ FROM( WHEN 'DELETE' THEN 'd' WHEN 'EXECUTE' THEN 'X' WHEN 'INSERT' THEN 'a' + WHEN 'MAINTAIN' THEN 'm' WHEN 'REFERENCES' THEN 'x' WHEN 'SELECT' THEN 'r' WHEN 'TEMPORARY' THEN 'T' diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/pg/17_plus/test_database.json b/web/pgadmin/browser/server_groups/servers/databases/tests/pg/17_plus/test_database.json index 12bcdbea6..1bacac234 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/tests/pg/17_plus/test_database.json +++ b/web/pgadmin/browser/server_groups/servers/databases/tests/pg/17_plus/test_database.json @@ -123,7 +123,7 @@ } ] } - + }, "expected_sql_file": "alter_default_db_privileges_types.sql" }, @@ -137,7 +137,7 @@ "data": { "deffuncacl": {"added":[{"grantee":"PUBLIC","privileges":[{"privilege_type":"X","privilege":true,"with_grant":false}],"grantor":"postgres"}]}, "deftypeacl": {"added":[{"grantee":"PUBLIC","privileges":[{"privilege_type":"U","privilege":true,"with_grant":false}],"grantor":"postgres"}]}, - "deftblacl":{"added":[{"grantee":"postgres","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"grantor":"postgres"}],"deleted":[{"grantor":"postgres","grantee":"PUBLIC","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false,"cid":"nn626"},{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn627"},{"privilege_type":"w","privilege":true,"with_grant":false,"cid":"nn628"},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]}, + "deftblacl":{"added":[{"grantee":"postgres","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false},{"privilege_type":"m","privilege":true,"with_grant":false}],"grantor":"postgres"}],"deleted":[{"grantor":"postgres","grantee":"PUBLIC","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false,"cid":"nn626"},{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn627"},{"privilege_type":"w","privilege":true,"with_grant":false,"cid":"nn628"},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]}, "defseqacl":{"added":[{"grantee":"postgres","privileges":[{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"U","privilege":true,"with_grant":false}],"grantor":"postgres"}],"deleted":[{"grantor":"postgres","grantee":"PUBLIC","privileges":[{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn673"},{"privilege_type":"U","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]} }, "expected_sql_file": "alter_default_db_privileges_reset_all.sql" @@ -200,6 +200,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -310,6 +314,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -421,6 +429,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -531,6 +543,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -582,4 +598,3 @@ } ] } - \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/tests/ppas/17_plus/test_database.json b/web/pgadmin/browser/server_groups/servers/databases/tests/ppas/17_plus/test_database.json index 2cc4d1eef..55968694f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/tests/ppas/17_plus/test_database.json +++ b/web/pgadmin/browser/server_groups/servers/databases/tests/ppas/17_plus/test_database.json @@ -94,7 +94,6 @@ {"privilege_type":"r","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}] }, "deftblacl": {"deleted":[{"grantor":"enterprisedb","grantee":"PUBLIC","privileges":[{"privilege_type":"r","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]} - }, "expected_sql_file": "alter_default_db_privileges_sequences.sql", "expected_msql_file": "alter_default_db_privileges_sequences_msql.sql" @@ -123,7 +122,7 @@ } ] } - + }, "expected_sql_file": "alter_default_db_privileges_types.sql" }, @@ -137,7 +136,7 @@ "data": { "deffuncacl": {"added":[{"grantee":"PUBLIC","privileges":[{"privilege_type":"X","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}]}, "deftypeacl": {"added":[{"grantee":"PUBLIC","privileges":[{"privilege_type":"U","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}]}, - "deftblacl":{"added":[{"grantee":"enterprisedb","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}],"deleted":[{"grantor":"enterprisedb","grantee":"PUBLIC","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false,"cid":"nn626"},{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn627"},{"privilege_type":"w","privilege":true,"with_grant":false,"cid":"nn628"},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]}, + "deftblacl":{"added":[{"grantee":"enterprisedb","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false},{"privilege_type":"m","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}],"deleted":[{"grantor":"enterprisedb","grantee":"PUBLIC","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false,"cid":"nn626"},{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn627"},{"privilege_type":"w","privilege":true,"with_grant":false,"cid":"nn628"},{"privilege_type":"d","privilege":true,"with_grant":false},{"privilege_type":"D","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false},{"privilege_type":"t","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]}, "defseqacl":{"added":[{"grantee":"enterprisedb","privileges":[{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"U","privilege":true,"with_grant":false}],"grantor":"enterprisedb"}],"deleted":[{"grantor":"enterprisedb","grantee":"PUBLIC","privileges":[{"privilege_type":"r","privilege":true,"with_grant":false,"cid":"nn673"},{"privilege_type":"U","privilege":true,"with_grant":false}],"acltype":"defaultacls"}]} }, "expected_sql_file": "alter_default_db_privileges_reset_all.sql" @@ -200,6 +199,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -310,6 +313,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -421,6 +428,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -531,6 +542,10 @@ "privilege_type": "t", "privilege": true, "with_grant": false + }, { + "privilege_type": "m", + "privilege": true, + "with_grant": false }] }], "defseqacl": [{ @@ -582,4 +597,3 @@ } ] } - \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/utils.py b/web/pgadmin/browser/server_groups/servers/utils.py index d3469a4ec..4bf188715 100644 --- a/web/pgadmin/browser/server_groups/servers/utils.py +++ b/web/pgadmin/browser/server_groups/servers/utils.py @@ -120,7 +120,8 @@ def parse_priv_to_db(str_privileges, allowed_acls=[]): 'x': 'REFERENCES', 't': 'TRIGGER', 'U': 'USAGE', - 'X': 'EXECUTE' + 'X': 'EXECUTE', + 'm': 'MAINTAIN' } privileges = [] diff --git a/web/pgadmin/static/js/components/Privilege.jsx b/web/pgadmin/static/js/components/Privilege.jsx index f261b7fea..96bd3b51e 100644 --- a/web/pgadmin/static/js/components/Privilege.jsx +++ b/web/pgadmin/static/js/components/Privilege.jsx @@ -43,6 +43,7 @@ export default function Privilege({value, onChange, controlProps}) { 't': 'TRIGGER', 'U': 'USAGE', 'X': 'EXECUTE', + 'm': 'MAINTAIN', }; let all = false; let allWithGrant = false; diff --git a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/pg/default/acl.json b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/pg/default/acl.json index 6c9a5fed8..2eb29af23 100644 --- a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/pg/default/acl.json +++ b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/pg/default/acl.json @@ -13,11 +13,11 @@ }, "table": { "type": "TABLE", - "acl": ["a", "r", "w", "d", "D", "x", "t"] + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] }, "foreign_table": { "type": "FOREIGN TABLE", - "acl": ["a", "r", "w","x"] + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] }, "sequence": { "type": "SEQUENCE", diff --git a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/ppas/default/acl.json b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/ppas/default/acl.json index bb42cdf92..73f591ca0 100644 --- a/web/pgadmin/tools/grant_wizard/templates/grant_wizard/ppas/default/acl.json +++ b/web/pgadmin/tools/grant_wizard/templates/grant_wizard/ppas/default/acl.json @@ -13,11 +13,11 @@ }, "table": { "type": "TABLE", - "acl": ["a", "r", "w", "d", "D", "x", "t"] + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] }, "foreign_table": { "type": "FOREIGN TABLE", - "acl": ["a", "r", "w","x"] + "acl": ["a", "r", "w", "d", "D", "x", "t", "m"] }, "sequence": { "type": "SEQUENCE", diff --git a/web/yarn.lock b/web/yarn.lock index 84a2c88c1..020e0d4af 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -33,10 +33,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0": - version: 7.26.3 - resolution: "@babel/compat-data@npm:7.26.3" - checksum: 85c5a9fb365231688c7faeb977f1d659da1c039e17b416f8ef11733f7aebe11fe330dce20c1844cacf243766c1d643d011df1d13cac9eda36c46c6c475693d21 +"@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.0, @babel/compat-data@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/compat-data@npm:7.26.5" + checksum: 7aaac0e79cf6f38478b877b1185413390bfe8ce9f2a19f906cfdf898df82f5a932579bee49c5d0d0a6fd838c715ff59d4958bfd161ef0e857e5eb083efb707b4 languageName: node linkType: hard @@ -63,9 +63,9 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.24.7": - version: 7.25.9 - resolution: "@babel/eslint-parser@npm:7.25.9" +"@babel/eslint-parser@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/eslint-parser@npm:7.26.5" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 @@ -73,7 +73,7 @@ __metadata: peerDependencies: "@babel/core": ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: dd2afa122b62a5b07c1e71d1c23b2cd4d655d96609eb2ba1b1ae3ec6f415f4365b77d6669ff859aa7b75952fb63a1d29c5db6e5811fc4012841491cb2dee36e4 + checksum: 3ed969eabc940aa29a2e5bef525674b47ebccb8dfe686737e84fed2b09fbf4bd23c2503936ed340bde2a870fc1917668ec7ab357b97bab504aceb84e9608d213 languageName: node linkType: hard @@ -89,16 +89,16 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.3, @babel/generator@npm:^7.7.2": - version: 7.26.3 - resolution: "@babel/generator@npm:7.26.3" +"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5, @babel/generator@npm:^7.7.2": + version: 7.26.5 + resolution: "@babel/generator@npm:7.26.5" dependencies: - "@babel/parser": ^7.26.3 - "@babel/types": ^7.26.3 + "@babel/parser": ^7.26.5 + "@babel/types": ^7.26.5 "@jridgewell/gen-mapping": ^0.3.5 "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^3.0.2 - checksum: fb09fa55c66f272badf71c20a3a2cee0fa1a447fed32d1b84f16a668a42aff3e5f5ddc6ed5d832dda1e952187c002ca1a5cdd827022efe591b6ac44cada884ea + checksum: baa42a98cd01efa3ae3634a6caa81d0738e5e0bdba4efbf1ac735216c8d7cf6bdffeab69c468e6ab2063b07db402346113def4962719746756518432f83c53ba languageName: node linkType: hard @@ -112,15 +112,15 @@ __metadata: linkType: hard "@babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" + version: 7.26.5 + resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: - "@babel/compat-data": ^7.25.9 + "@babel/compat-data": ^7.26.5 "@babel/helper-validator-option": ^7.25.9 browserslist: ^4.24.0 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: 3af536e2db358b38f968abdf7d512d425d1018fef2f485d6f131a57a7bcaed32c606b4e148bb230e1508fa42b5b2ac281855a68eb78270f54698c48a83201b9b + checksum: 6bc0107613bf1d4d21913606e8e517194e5099a24db2a8374568e56ef4626e8140f9b8f8a4aabc35479f5904459a0aead2a91ee0dc63aae110ccbc2bc4b4fda1 languageName: node linkType: hard @@ -211,10 +211,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.25.9 - resolution: "@babel/helper-plugin-utils@npm:7.25.9" - checksum: e19ec8acf0b696756e6d84531f532c5fe508dce57aa68c75572a77798bd04587a844a9a6c8ea7d62d673e21fdc174d091c9097fb29aea1c1b49f9c6eaa80f022 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.26.5 + resolution: "@babel/helper-plugin-utils@npm:7.26.5" + checksum: 4771fbb1711c624c62d12deabc2ed7435a6e6994b6ce09d5ede1bc1bf19be59c3775461a1e693bdd596af865685e87bb2abc778f62ceadc1b2095a8e2aa74180 languageName: node linkType: hard @@ -232,15 +232,15 @@ __metadata: linkType: hard "@babel/helper-replace-supers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-replace-supers@npm:7.25.9" + version: 7.26.5 + resolution: "@babel/helper-replace-supers@npm:7.26.5" dependencies: "@babel/helper-member-expression-to-functions": ^7.25.9 "@babel/helper-optimise-call-expression": ^7.25.9 - "@babel/traverse": ^7.25.9 + "@babel/traverse": ^7.26.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: 84f40e12520b7023e52d289bf9d569a06284879fe23bbbacad86bec5d978b2669769f11b073fcfeb1567d8c547168323005fda88607a4681ecaeb4a5cdd48bb9 + checksum: c5ab31b29c7cc09e30278f8860ecdb873ce6c84b5c08bc5239c369c7c4fe9f0a63cda61b55b7bbd20edb4e5dc32e73087cc3c57d85264834bd191551d1499185 languageName: node linkType: hard @@ -296,14 +296,14 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/parser@npm:7.26.3" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/parser@npm:7.26.5" dependencies: - "@babel/types": ^7.26.3 + "@babel/types": ^7.26.5 bin: parser: ./bin/babel-parser.js - checksum: e2bff2e9fa6540ee18fecc058bc74837eda2ddcecbe13454667314a93fc0ba26c1fb862c812d84f6d5f225c3bd8d191c3a42d4296e287a882c4e1f82ff2815ff + checksum: 663aebf27c1dc04813e6c1d6e8e8fcb2954163ec297a95bdb3f1d0c2a0f04b504bddc09588fe4b176b43fad28c8a4b2914838a1edffdd426537a42f3ac644f1e languageName: node linkType: hard @@ -650,13 +650,13 @@ __metadata: linkType: hard "@babel/plugin-transform-block-scoped-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9" + version: 7.26.5 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-plugin-utils": ^7.26.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bf31896556b33a80f017af3d445ceb532ec0f5ca9d69bc211a963ac92514d172d5c24c5ac319f384d9dfa7f1a4d8dc23032c2fe3e74f98a59467ecd86f7033ae + checksum: f2046c09bf8e588bfb1a6342d0eee733189102cf663ade27adb0130f3865123af5816b40a55ec8d8fa09271b54dfdaf977cd2f8e0b3dc97f18e690188d5a2174 languageName: node linkType: hard @@ -945,13 +945,13 @@ __metadata: linkType: hard "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9" + version: 7.26.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" dependencies: - "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-plugin-utils": ^7.26.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 26e03b1c2c0408cc300e46d8f8cb639653ff3a7b03456d0d8afbb53c44f33a89323f51d99991dade3a5676921119bbdf869728bb7911799b5ef99ffafa2cdd24 + checksum: 752837d532b85c41f6bb868e83809605f513bc9a3b8e88ac3d43757c9bf839af4f246874c1c6d6902bb2844d355efccae602c3856098911f8abdd603672f8379 languageName: node linkType: hard @@ -1229,17 +1229,17 @@ __metadata: linkType: hard "@babel/plugin-transform-typescript@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/plugin-transform-typescript@npm:7.26.3" + version: 7.26.5 + resolution: "@babel/plugin-transform-typescript@npm:7.26.5" dependencies: "@babel/helper-annotate-as-pure": ^7.25.9 "@babel/helper-create-class-features-plugin": ^7.25.9 - "@babel/helper-plugin-utils": ^7.25.9 + "@babel/helper-plugin-utils": ^7.26.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9 "@babel/plugin-syntax-typescript": ^7.25.9 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 38ab210e80d4fc4eaa27e88705a961d53f5eae1dcd0ef8794affe3002fec557404e8bb29ca22d18e691a75690e3bcadbfeb8207a830f15cf83231ab5fd1ea08b + checksum: d022c1ca9ee5a420c374efb209eaca4f94c06851edeea2b3577dad52ea6692b6b33d00217b33a74d91bd62381ace471e26cc6153bbc681b3af1b1436431ff9c0 languageName: node linkType: hard @@ -1433,28 +1433,28 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9": - version: 7.26.4 - resolution: "@babel/traverse@npm:7.26.4" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5": + version: 7.26.5 + resolution: "@babel/traverse@npm:7.26.5" dependencies: "@babel/code-frame": ^7.26.2 - "@babel/generator": ^7.26.3 - "@babel/parser": ^7.26.3 + "@babel/generator": ^7.26.5 + "@babel/parser": ^7.26.5 "@babel/template": ^7.25.9 - "@babel/types": ^7.26.3 + "@babel/types": ^7.26.5 debug: ^4.3.1 globals: ^11.1.0 - checksum: dcdf51b27ab640291f968e4477933465c2910bfdcbcff8f5315d1f29b8ff861864f363e84a71fb489f5e9708e8b36b7540608ce019aa5e57ef7a4ba537e62700 + checksum: 28f28037ec6bb72ded695b2bd79c373f13dc993a408c6037c3d46a1234360342a688c031f9ed4fc8528183892a63b54edce0b516e723fb3dffd606da75496cdc languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.3, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.26.3 - resolution: "@babel/types@npm:7.26.3" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": + version: 7.26.5 + resolution: "@babel/types@npm:7.26.5" dependencies: "@babel/helper-string-parser": ^7.25.9 "@babel/helper-validator-identifier": ^7.25.9 - checksum: 195f428080dcaadbcecc9445df7f91063beeaa91b49ccd78f38a5af6b75a6a58391d0c6614edb1ea322e57889a1684a0aab8e667951f820196901dd341f931e9 + checksum: 65dc14aa32ace22655c5edadeb99df80776c09cd93c105feaf49cc0583f3116aff0581b7eab630888c39ba61151f251c1399ec982b93585b0d1d1bf4a45b54f9 languageName: node linkType: hard @@ -1478,14 +1478,14 @@ __metadata: linkType: hard "@codemirror/commands@npm:^6.0.0": - version: 6.7.1 - resolution: "@codemirror/commands@npm:6.7.1" + version: 6.8.0 + resolution: "@codemirror/commands@npm:6.8.0" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.4.0 "@codemirror/view": ^6.27.0 "@lezer/common": ^1.1.0 - checksum: 507ae0cc7f3a7bd869bca0de7e942ecb2bc0bd95a42484e5b06835ebf8caf7626c39d2bea26cefab99d07ab83ba5934afd2d07ce00dac4190aca014523f3c97e + checksum: 7d819bab4830ec7b8c5dffdec4b035dfa664bfd1d2675e639e08a459df65f45be111e1b8b569b1a8a3253d5980cf2ecf4394d8a13509996cca1b65cc16d47a4e languageName: node linkType: hard @@ -1550,22 +1550,22 @@ __metadata: linkType: hard "@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.4.0, @codemirror/state@npm:^6.5.0": - version: 6.5.0 - resolution: "@codemirror/state@npm:6.5.0" + version: 6.5.1 + resolution: "@codemirror/state@npm:6.5.1" dependencies: "@marijn/find-cluster-break": ^1.0.0 - checksum: f7fbed072cc67bf250f7d231668a00b988748cacaaa2ce3ea74ff13c7c392db76000e7d517933521cc6ad9dc3651c7b6d33accab3e3d4b9816cd3c5714661a84 + checksum: b7d6de9a87d5b55dadfadaeb6e1c991e0a91845d3cdd0bd953391f05363fcbaf21de79a4eec2816ab8c3e31293faeca82cc2bb729d080779df94b14e28ae0d8a languageName: node linkType: hard "@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.35.0": - version: 6.36.1 - resolution: "@codemirror/view@npm:6.36.1" + version: 6.36.2 + resolution: "@codemirror/view@npm:6.36.2" dependencies: "@codemirror/state": ^6.5.0 style-mod: ^4.1.0 w3c-keyname: ^2.2.4 - checksum: 77728cbc6f07f16abc4b98c487b6fad522781c928e4b31597b28d54364da6aa5542ed7c9b5c77b90bec5095527c3c062450f156f54fc8ddbcacdf86b4b32c608 + checksum: a58c64b623ddc65bb864917297f3b37f8e95280deec442024c43a9513b26352c829665c5d98e4dfcae104e8ecdfdb774d94a395a29da98a919c83482d2c14152 languageName: node linkType: hard @@ -1772,12 +1772,12 @@ __metadata: languageName: node linkType: hard -"@eslint/core@npm:^0.9.0": - version: 0.9.1 - resolution: "@eslint/core@npm:0.9.1" +"@eslint/core@npm:^0.10.0": + version: 0.10.0 + resolution: "@eslint/core@npm:0.10.0" dependencies: "@types/json-schema": ^7.0.15 - checksum: 33c8159842cc3a646caa267c008cb567ca60e0220bcdcf6e426128409953b8f6a9b142246db616c71d06331edf769c192d7e2792b3f19c2a6b8179e491512d89 + checksum: 851fa099b3fef00e7ff8ece14523aff0822d3e1b47b047ab0a0d898e80c1362a22aa8b7778727231c383246932ecb63de79b4448ec1e500901c578580b087573 languageName: node linkType: hard @@ -1798,10 +1798,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.17.0": - version: 9.17.0 - resolution: "@eslint/js@npm:9.17.0" - checksum: b68a14ff518ffa12e3b85fa9c72b818faeff092285acfbf02da2d0fb12a681b76651638881e98845f2df2ed346ed0d33faeb1d9caac163daf232c223b7efe89c +"@eslint/js@npm:9.18.0": + version: 9.18.0 + resolution: "@eslint/js@npm:9.18.0" + checksum: a47cfcc684f87094992fe4a5c5e54018393231d8d42bd2150a08eb167813a6bf8d7c7ccbc9611933e5f782ff3b96a06c9be8d19342965cadd4530a45521b8981 languageName: node linkType: hard @@ -1812,31 +1812,32 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.2.3": - version: 0.2.4 - resolution: "@eslint/plugin-kit@npm:0.2.4" +"@eslint/plugin-kit@npm:^0.2.5": + version: 0.2.5 + resolution: "@eslint/plugin-kit@npm:0.2.5" dependencies: + "@eslint/core": ^0.10.0 levn: ^0.4.1 - checksum: 5693465dca5fc6f27b090f987b51bc738f48c6a6b5678dcc1791522921834206388b462578edd362d458e8de6dcd21cce1a2e8cff47d1512411ba0389112c231 + checksum: 423db33e67ff16f6db71bf8bfc8d5b0c2c4fe6f2209131e5886a573bf994bfc72ab4f825068d6521f186247731d4c9d48eb42a5e5ce389c6faa275752c0e9459 languageName: node linkType: hard "@floating-ui/core@npm:^1.6.0": - version: 1.6.8 - resolution: "@floating-ui/core@npm:1.6.8" + version: 1.6.9 + resolution: "@floating-ui/core@npm:1.6.9" dependencies: - "@floating-ui/utils": ^0.2.8 - checksum: 82faa6ea9d57e466779324e51308d6d49c098fb9d184a08d9bb7f4fad83f08cc070fc491f8d56f0cad44a16215fb43f9f829524288413e6c33afcb17303698de + "@floating-ui/utils": ^0.2.9 + checksum: 21cbcac72a40172399570dedf0eb96e4f24b0d829980160e8d14edf08c2955ac6feffb7b94e1530c78fb7944635e52669c9257ad08570e0295efead3b5a9af91 languageName: node linkType: hard "@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.0.1": - version: 1.6.12 - resolution: "@floating-ui/dom@npm:1.6.12" + version: 1.6.13 + resolution: "@floating-ui/dom@npm:1.6.13" dependencies: "@floating-ui/core": ^1.6.0 - "@floating-ui/utils": ^0.2.8 - checksum: 956514ed100c0c853e73ace9e3c877b7e535444d7c31326f687a7690d49cb1e59ef457e9c93b76141aea0d280e83ed5a983bb852718b62eea581f755454660f6 + "@floating-ui/utils": ^0.2.9 + checksum: eabab9d860d3b5beab1c2d6936287efc4d9ab352de99062380589ef62870d59e8730397489c34a96657e128498001b5672330c4a9da0159fe8b2401ac59fe314 languageName: node linkType: hard @@ -1852,10 +1853,10 @@ __metadata: languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.8": - version: 0.2.8 - resolution: "@floating-ui/utils@npm:0.2.8" - checksum: deb98bba017c4e073c7ad5740d4dec33a4d3e0942d412e677ac0504f3dade15a68fc6fd164d43c93c0bb0bcc5dc5015c1f4080dfb1a6161140fe660624f7c875 +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: d518b80cec5a323e54a069a1dd99a20f8221a4853ed98ac16c75275a0cc22f75de4f8ac5b121b4f8990bd45da7ad1fb015b9a1e4bac27bb1cd62444af84e9784 languageName: node linkType: hard @@ -2490,12 +2491,12 @@ __metadata: linkType: hard "@mui/x-date-pickers@npm:^7.23.2": - version: 7.23.3 - resolution: "@mui/x-date-pickers@npm:7.23.3" + version: 7.23.6 + resolution: "@mui/x-date-pickers@npm:7.23.6" dependencies: "@babel/runtime": ^7.25.7 "@mui/utils": ^5.16.6 || ^6.0.0 - "@mui/x-internals": 7.23.0 + "@mui/x-internals": 7.23.6 "@types/react-transition-group": ^4.4.11 clsx: ^2.1.1 prop-types: ^15.8.1 @@ -2506,7 +2507,7 @@ __metadata: "@mui/material": ^5.15.14 || ^6.0.0 "@mui/system": ^5.15.14 || ^6.0.0 date-fns: ^2.25.0 || ^3.2.0 || ^4.0.0 - date-fns-jalali: ^2.13.0-0 || ^3.2.0-0 + date-fns-jalali: ^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0 dayjs: ^1.10.7 luxon: ^3.0.2 moment: ^2.29.4 @@ -2533,19 +2534,19 @@ __metadata: optional: true moment-jalaali: optional: true - checksum: 923ce6909ea9b5eac0e2c322e68ad9d9b762db6991e2dc31e49ac82694b705cee2b4bc20967fd738119c3caa610eafb5da1a73040dc5e878f1abb4aab065a408 + checksum: 5ea654d0908e6ce5a7e62a7fbf2a7ad4bd47239a198bcd951856b5d5f0397c942c67c8b24d460a300b6f53324b03e62709d37544be8b7e2774a7cfb05b9a498f languageName: node linkType: hard -"@mui/x-internals@npm:7.23.0": - version: 7.23.0 - resolution: "@mui/x-internals@npm:7.23.0" +"@mui/x-internals@npm:7.23.6": + version: 7.23.6 + resolution: "@mui/x-internals@npm:7.23.6" dependencies: "@babel/runtime": ^7.25.7 "@mui/utils": ^5.16.6 || ^6.0.0 peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 2af6f344ca6c7a503d5bb99757496b64cb15aeedf78d60faae77bf147c2c18e9cc674ad9865ad48843562a440a429c32e1362a6a3588bf5904ca39071dd44a85 + checksum: 7f843a8c431554040351a12b895f9d7ccfbf1cc98daef863d4b74145f03b3d49a2c2924d89f0f4b299e4c5d63acb0983d40654981b0124e4151b788b26f4eb41 languageName: node linkType: hard @@ -3015,33 +3016,33 @@ __metadata: linkType: hard "@szhsin/react-menu@npm:^4.2.2": - version: 4.2.3 - resolution: "@szhsin/react-menu@npm:4.2.3" + version: 4.2.4 + resolution: "@szhsin/react-menu@npm:4.2.4" dependencies: prop-types: ^15.7.2 react-transition-state: ^2.1.2 peerDependencies: react: ">=16.14.0" react-dom: ">=16.14.0" - checksum: 890409f1ea7dc79e4d9178186d14f6536f427d3ac3b442d98507d101bb8e1bb87f5ee941d088f0c89144cd16625ffd138f813f78961be200056fae5b61cc0680 + checksum: 2b779f8cfe46129788510440bc3df9b3d6d5aa223a4a5f8c9bcafdff156cd9ae99bccbfb9a260595e3e5570df1581b1d3fff17946d001a129335c2088115eeba languageName: node linkType: hard -"@tanstack/query-core@npm:5.62.15": - version: 5.62.15 - resolution: "@tanstack/query-core@npm:5.62.15" - checksum: aac6b76e5a7797d8b4b561e460ff3582c262dc0c14c1730182f138c7215724d09cb6e1c987e105076dd039c2e72b32f62d108ed5bd3b7184b10ce8cef2eeb747 +"@tanstack/query-core@npm:5.64.0": + version: 5.64.0 + resolution: "@tanstack/query-core@npm:5.64.0" + checksum: a489552af41419f9561baaff15073d63a4cf8634b5a9f4a484364a70734b6e37f7460560acccf61ef4b631ac4b6008000c4f13996b905f219b8099bd8343451c languageName: node linkType: hard -"@tanstack/react-query@npm:5.62.15": - version: 5.62.15 - resolution: "@tanstack/react-query@npm:5.62.15" +"@tanstack/react-query@npm:5.64.0": + version: 5.64.0 + resolution: "@tanstack/react-query@npm:5.64.0" dependencies: - "@tanstack/query-core": 5.62.15 + "@tanstack/query-core": 5.64.0 peerDependencies: react: ^18 || ^19 - checksum: 7a53d0c568803d61f01ebb62bdbdfad96d16f654fcd3126b7f992f93f18929d2376606bcdceb105b17ce2aa0d8ea695cd78038313ecb7a100229512d90d7b5cd + checksum: d6676fd1481753af1c348c8084057f9c879a8ac69c5cd5ae3f90ae29a6734a32511de90b2b02f9ac31da1ca475ecd72d2fb5e06d01dfa78c78d59919d32364d5 languageName: node linkType: hard @@ -3341,11 +3342,11 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.10.5 - resolution: "@types/node@npm:22.10.5" + version: 22.10.6 + resolution: "@types/node@npm:22.10.6" dependencies: undici-types: ~6.20.0 - checksum: 3b0e966df4e130edac3ad034f1cddbe134e70f11556062468c9fbd749a3b07a44445a3a75a7eec68a104930bf05d4899f1a418c4ae48493d2c8c1544d8594bcc + checksum: 3bf26c7df8b7f0085f7a53d1f4ee124f8af01c7e4c072c3c10ec0ba91a03611fce124fed279f512b1ff259835bee5589e02f1ba0914ca6b372a7f99aef5faa3c languageName: node linkType: hard @@ -3437,15 +3438,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.19.1" +"@typescript-eslint/eslint-plugin@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.20.0" dependencies: "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.19.1 - "@typescript-eslint/type-utils": 8.19.1 - "@typescript-eslint/utils": 8.19.1 - "@typescript-eslint/visitor-keys": 8.19.1 + "@typescript-eslint/scope-manager": 8.20.0 + "@typescript-eslint/type-utils": 8.20.0 + "@typescript-eslint/utils": 8.20.0 + "@typescript-eslint/visitor-keys": 8.20.0 graphemer: ^1.4.0 ignore: ^5.3.1 natural-compare: ^1.4.0 @@ -3454,64 +3455,64 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 07774aeb373882c9177b0da061dde12f08202107696d9947f11819f3e4b6223f922d944f1c8967438685041a9b0a5a61cfed1d246bb168b8a31c8ec1792c2405 + checksum: f029bfcce3dc12d7b539f86142857d680e06d798eca213d9fb564685d12b479205b7f40b4996e30e3f7301c7bb6d15484741352f54ddd00d74a07ea2aca53cf6 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/parser@npm:8.19.1" +"@typescript-eslint/parser@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/parser@npm:8.20.0" dependencies: - "@typescript-eslint/scope-manager": 8.19.1 - "@typescript-eslint/types": 8.19.1 - "@typescript-eslint/typescript-estree": 8.19.1 - "@typescript-eslint/visitor-keys": 8.19.1 + "@typescript-eslint/scope-manager": 8.20.0 + "@typescript-eslint/types": 8.20.0 + "@typescript-eslint/typescript-estree": 8.20.0 + "@typescript-eslint/visitor-keys": 8.20.0 debug: ^4.3.4 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: a321f03ecdf1b80da6b574cf15225d77b7d15835b8ebfdbfc98b3d8aa881c0ce23b7050c35f03aa0528db8a00ccca69391eeba4f7a10ed579b29e77c7bf3c368 + checksum: 00b265ed42ee1d8eb715f9978d701be0958baf7a5be9de74a1b58c09c78e3558e1e6352c4476ec8ea376c28f1437de0b58b3e1e2a9975c489f2ecd369a9050eb languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/scope-manager@npm:8.19.1" +"@typescript-eslint/scope-manager@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/scope-manager@npm:8.20.0" dependencies: - "@typescript-eslint/types": 8.19.1 - "@typescript-eslint/visitor-keys": 8.19.1 - checksum: 972ee3bc3339f549e206f01b3db30b71d99090b4d581ff1b73ce833d95e4e2f6520f7f227174c53393a2646980068463daaaeb945e417458cf6f37d60e31c173 + "@typescript-eslint/types": 8.20.0 + "@typescript-eslint/visitor-keys": 8.20.0 + checksum: d90d89f3dc8394e44652526b88c81a977b251702a9dc5be89ac0bf7412d79d18879e03c2d6018980a09bc7c50d28dbf91ba06e056e081e6000783d69bd280761 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/type-utils@npm:8.19.1" +"@typescript-eslint/type-utils@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/type-utils@npm:8.20.0" dependencies: - "@typescript-eslint/typescript-estree": 8.19.1 - "@typescript-eslint/utils": 8.19.1 + "@typescript-eslint/typescript-estree": 8.20.0 + "@typescript-eslint/utils": 8.20.0 debug: ^4.3.4 ts-api-utils: ^2.0.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 9345ba9f2399adc9b45a8b41e68749be4485cfd4e24558c42eb2a12199610370473307bc823e6715e4d1f136cd3f9a0a61a05a27bc4ce664468eab7f76efb549 + checksum: 705a166dc2846f7fe79a123ee623da213a20289fba9c0cbbcc894fe7caaa1d4ddc81bf54db9dc918c29a34294a05768c38a4f00762ba3745e0e94e2e2963f104 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/types@npm:8.19.1" - checksum: 76756b9c5496e1463255aa3c881eaec51a6fe718894b91f49929e9e7e258111d86a9c38a9c76b5ada29293a4cb60b96cffac82a203ec47053aa138f298ffab67 +"@typescript-eslint/types@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/types@npm:8.20.0" + checksum: 4cb0af48411f282db33e7110e2f97de874c637e7b90ded91b77304e96f49663ca4b7308afc569bdd93766fe5f2c194686e32078d5513b5ba4e7d56191998190c languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.19.1" +"@typescript-eslint/typescript-estree@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.20.0" dependencies: - "@typescript-eslint/types": 8.19.1 - "@typescript-eslint/visitor-keys": 8.19.1 + "@typescript-eslint/types": 8.20.0 + "@typescript-eslint/visitor-keys": 8.20.0 debug: ^4.3.4 fast-glob: ^3.3.2 is-glob: ^4.0.3 @@ -3520,32 +3521,32 @@ __metadata: ts-api-utils: ^2.0.0 peerDependencies: typescript: ">=4.8.4 <5.8.0" - checksum: 982ac1735d076c595c3b6bfb4c2d02a41bb3cc27d8d05bdac9a08e9f007be3f151ded0f7e691de00b2aa86458e1cd5ef49cf1c19dd38d24269b1f107db2a700b + checksum: 9690df2d4ec90966b8d5752ad0f1658a951fe76ea3cae8e6935e698715a25c1eb0b118fa8e044065f04ea9f6bef41d991de5298590ef2a4aa98d435bf1df6e15 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.19.1, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.19.1 - resolution: "@typescript-eslint/utils@npm:8.19.1" +"@typescript-eslint/utils@npm:8.20.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.20.0 + resolution: "@typescript-eslint/utils@npm:8.20.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 - "@typescript-eslint/scope-manager": 8.19.1 - "@typescript-eslint/types": 8.19.1 - "@typescript-eslint/typescript-estree": 8.19.1 + "@typescript-eslint/scope-manager": 8.20.0 + "@typescript-eslint/types": 8.20.0 + "@typescript-eslint/typescript-estree": 8.20.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 745c24b9538c2c4e41cda0cfe73b78d1a8aaec3958ece128cf086f1e8d09f3f53b3299610570ae5a921300c05e43d181eda099acfb3218fadf3b310bf49b290e + checksum: 5c9d72eb0d4014e41de1faa4597371f19362ce47a491359be408bfba899277f8d5660f014651f7bd41435158ae4655ade205e92f175e2355ca51a07af35a53ed languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.19.1": - version: 8.19.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.19.1" +"@typescript-eslint/visitor-keys@npm:8.20.0": + version: 8.20.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.20.0" dependencies: - "@typescript-eslint/types": 8.19.1 + "@typescript-eslint/types": 8.20.0 eslint-visitor-keys: ^4.2.0 - checksum: dc68a7e46cd73579c81ec5594315a8564fcc74984b3d399331e66abd48db956acfa24d445660f133609d7a969a88819ca73ded493f109f42ba659958df52be7e + checksum: d0bf89e431a686197c517fbb7d63ce4c8ef31e6629a545fd08198c67810ddd68c047c01fcfed8ffc3fe438654a2647b3dedf28f04beac23a65614b2e788d929a languageName: node linkType: hard @@ -3840,9 +3841,9 @@ __metadata: linkType: hard "ace-builds@npm:^1.36.2": - version: 1.37.2 - resolution: "ace-builds@npm:1.37.2" - checksum: 4dd7029e0a2d72e05a540da56e58ba0eaf4f5037c1dabdb419b85d34964795c28271a33a3b6d40f743fde7fa87092da56753755b1bf9094ce699bf2d6c160a6d + version: 1.37.4 + resolution: "ace-builds@npm:1.37.4" + checksum: 66010b802cc40860f0a17e5a405a5b1dcae636c04fe9f33be8aea1b6079c3e216dbae451fe7079a24b1346d19a5f253a6e98437ad39504dfdcf57aaa17169484 languageName: node linkType: hard @@ -4866,9 +4867,9 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2": - version: 4.24.3 - resolution: "browserslist@npm:4.24.3" +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.3": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: caniuse-lite: ^1.0.30001688 electron-to-chromium: ^1.5.73 @@ -4876,7 +4877,7 @@ __metadata: update-browserslist-db: ^1.1.1 bin: browserslist: cli.js - checksum: 016efc9953350e3a7212edcfdd72210cb33b339c1a974a77c0715eb67d23d7e5cd0a073ce1c801ab09235d8c213425ca51b92d41bbb829b833872b45f885fe7c + checksum: 64074bf6cf0a9ae3094d753270e3eae9cf925149db45d646f0bc67bacc2e46d7ded64a4e835b95f5fdcf0350f63a83c3755b32f80831f643a47f0886deb8a065 languageName: node linkType: hard @@ -5133,9 +5134,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001690 - resolution: "caniuse-lite@npm:1.0.30001690" - checksum: f2c1b595f15d8de4d9ccd155d61ac9f00ac62f1515870505a0186266fd52aef169fcddc90d8a4814e52b77107244806466fadc2c216662f23f1022a430e735ee + version: 1.0.30001692 + resolution: "caniuse-lite@npm:1.0.30001692" + checksum: 484113e3fabbe223fff0380c25c861da265a34c3f75bb5af1f254423b43e713a3c7f0c313167df52fb203f42ea68bd0df8a9e73642becfe1e9fa5734b5fc55a5 languageName: node linkType: hard @@ -5546,11 +5547,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1": - version: 3.39.0 - resolution: "core-js-compat@npm:3.39.0" + version: 3.40.0 + resolution: "core-js-compat@npm:3.40.0" dependencies: - browserslist: ^4.24.2 - checksum: 2d7d087c3271d711d03a55203d4756f6288317a1ce35cdc8bafaf1833ef21fd67a92a50cff8dcf7df1325ac63720906ab3cf514c85b238c95f65fca1040f6ad6 + browserslist: ^4.24.3 + checksum: 7ad00607c481ab2ded13d72be9ca5db5bbf42e221a175e905fb425e1ef520864aea28736c7283f57e9552d570eb6204bed87fbc8b9eab0fcfd9a7830dacccd43 languageName: node linkType: hard @@ -6575,9 +6576,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.73": - version: 1.5.78 - resolution: "electron-to-chromium@npm:1.5.78" - checksum: 84034073990470a9bad79bbe9c7b3fcc7a92aea9ccb745ce411415562e2112ad089e924817c7e34ba9e08e581b9fc88f33c3acdc6d6ef2812d559bd5cfb6f801 + version: 1.5.80 + resolution: "electron-to-chromium@npm:1.5.80" + checksum: b13b553345df4de777051a68fdea3912ef7e9024c7d065feb989a31ad940716d8fee44d98cd24a55555e540a624ba0f0511538df98fb53d4ae07ee49d82da65d languageName: node linkType: hard @@ -6830,11 +6831,11 @@ __metadata: linkType: hard "es-object-atoms@npm:^1.0.0": - version: 1.0.0 - resolution: "es-object-atoms@npm:1.0.0" + version: 1.0.1 + resolution: "es-object-atoms@npm:1.0.1" dependencies: es-errors: ^1.3.0 - checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + checksum: 3db1c784f2690904675a13c8ffa4768270e54e3400dfb5603e1dedfe2fb07999ba58121a871b7cdb62de974a4131f540fc41b058efb7c10e8f4cf9832221f9c3 languageName: node linkType: hard @@ -6935,8 +6936,8 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.37.3": - version: 7.37.3 - resolution: "eslint-plugin-react@npm:7.37.3" + version: 7.37.4 + resolution: "eslint-plugin-react@npm:7.37.4" dependencies: array-includes: ^3.1.8 array.prototype.findlast: ^1.2.5 @@ -6958,7 +6959,7 @@ __metadata: string.prototype.repeat: ^1.0.0 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - checksum: 670dcee215f560a394b8b9966aecfc3c5ee5c15603a690f5333b0e16863275958f9c1853b12355eb0e36ef74dfac8bf645e4f440cb9b985a3bae2ac09d5ed55a + checksum: 8a37bdc9b347bf3a1273fef73dfbc39279cc3e58441940a5e13b3ba4e82b34132d1d1172db9d6746f153ee981280bd6bd06a9065fb453388c68f4bebe0d9f839 languageName: node linkType: hard @@ -7024,16 +7025,16 @@ __metadata: linkType: hard "eslint@npm:^9.17.0": - version: 9.17.0 - resolution: "eslint@npm:9.17.0" + version: 9.18.0 + resolution: "eslint@npm:9.18.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.12.1 "@eslint/config-array": ^0.19.0 - "@eslint/core": ^0.9.0 + "@eslint/core": ^0.10.0 "@eslint/eslintrc": ^3.2.0 - "@eslint/js": 9.17.0 - "@eslint/plugin-kit": ^0.2.3 + "@eslint/js": 9.18.0 + "@eslint/plugin-kit": ^0.2.5 "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 "@humanwhocodes/retry": ^0.4.1 @@ -7068,7 +7069,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 0caae58c53bf4dc9b4893d75e62339e4c40fe5589652a3cb63f30a15bad1f34f8f784ca4fca471bbffedabee516a9f9620ebc33818b55e1b715e8f000865c851 + checksum: 5e05ae9d25a42ae8cad86a0118ea45107b42446f3614cd0ba822affa3eb85d746e0820529b1fde72820f24aa3c3447d3260505a5ee5e95be1b8b7455740a2256 languageName: node linkType: hard @@ -7308,9 +7309,9 @@ __metadata: linkType: hard "fast-equals@npm:^5.0.1": - version: 5.2.1 - resolution: "fast-equals@npm:5.2.1" - checksum: f986ff7e5b4db1a8261be1c94ce5f4ab81dc5abcdaad9250ed2637779097b50f975e2cf0154a587a20322b76f8ab0e17936ec117fb15a5ec8811e118b4c4320b + version: 5.2.2 + resolution: "fast-equals@npm:5.2.2" + checksum: 7156bcade0be5ee4dc335969d255a5815348d57080e1876fa1584451eafd0c92588de5f5840e55f81841b6d907ade2a49a46e4ec33e6f7a283a209c0fd8f8a59 languageName: node linkType: hard @@ -11001,7 +11002,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.0.0, nanoid@npm:^3.3.7": +"nanoid@npm:^3.0.0, nanoid@npm:^3.3.8": version: 3.3.8 resolution: "nanoid@npm:3.3.8" bin: @@ -11840,7 +11841,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -11931,14 +11932,14 @@ __metadata: linkType: hard "postcss-calc@npm:^10.0.2": - version: 10.0.2 - resolution: "postcss-calc@npm:10.0.2" + version: 10.1.0 + resolution: "postcss-calc@npm:10.1.0" dependencies: - postcss-selector-parser: ^6.1.2 + postcss-selector-parser: ^7.0.0 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.4.38 - checksum: 79edb49f007736cb35ee0de76c334185cf9c8fb10edae5a9fc437ddd0ef52c88dc80fbda0f9830f3ecb0a5318a409e31b7f44e1db6b3054dd790665b76299e85 + checksum: 0d4f6c7a7df759c87e410fb9e010e49f666dc749d2326be6c40dce61a13ee04118500cd340049a2abe470b85680c5d0c98f2e9f626847f794adb7093701b14c2 languageName: node linkType: hard @@ -12329,13 +12330,13 @@ __metadata: linkType: hard "postcss@npm:^8.4.31, postcss@npm:^8.4.33, postcss@npm:^8.4.38": - version: 8.4.49 - resolution: "postcss@npm:8.4.49" + version: 8.5.0 + resolution: "postcss@npm:8.5.0" dependencies: - nanoid: ^3.3.7 + nanoid: ^3.3.8 picocolors: ^1.1.1 source-map-js: ^1.2.1 - checksum: eb5d6cbdca24f50399aafa5d2bea489e4caee4c563ea1edd5a2485bc5f84e9ceef3febf170272bc83a99c31d23a316ad179213e853f34c2a7a8ffa534559d63a + checksum: 00cd3ad373fcbef960273124556c1a989877bfa4244c9095ba2e7bedb450328bc4cbd3429fbc54dfdd882b414fde311ca28fa476db11e18a0110789812c58152 languageName: node linkType: hard @@ -12727,8 +12728,8 @@ __metadata: linkType: hard "rc-overflow@npm:^1.2.0, rc-overflow@npm:^1.2.8": - version: 1.3.2 - resolution: "rc-overflow@npm:1.3.2" + version: 1.4.1 + resolution: "rc-overflow@npm:1.4.1" dependencies: "@babel/runtime": ^7.11.1 classnames: ^2.2.1 @@ -12737,7 +12738,7 @@ __metadata: peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 7041f72e881ead9a484bddb6b6b6eb94455911f6b1cb06b16979ffe7d79e81058d5c77d0ca3f14faa0d1e43c81b966e65ed11678d09c2344cfd84dcfd803e620 + checksum: d0b5417a346934dfb510b169063448408d5daf4f95d85e15d7a7e7f8c27bd7343dd473b28e6b01b52d31cd1b4efb7cf0d31c7c732a5dedf632812ff5bea367f3 languageName: node linkType: hard @@ -13562,7 +13563,7 @@ __metadata: resolution: "root-workspace-0b6124@workspace:." dependencies: "@babel/core": ^7.10.2 - "@babel/eslint-parser": ^7.24.7 + "@babel/eslint-parser": ^7.26.5 "@babel/eslint-plugin": ^7.24.7 "@babel/plugin-proposal-class-properties": ^7.10.4 "@babel/plugin-proposal-object-rest-spread": ^7.10.1 @@ -13589,7 +13590,7 @@ __metadata: "@simonwep/pickr": ^1.5.1 "@svgr/webpack": ^8.1.0 "@szhsin/react-menu": ^4.2.2 - "@tanstack/react-query": 5.62.15 + "@tanstack/react-query": 5.64.0 "@tanstack/react-table": ^8.16.0 "@tanstack/react-virtual": ^3.8.4 "@testing-library/dom": 10.4.0 @@ -13703,7 +13704,7 @@ __metadata: webpack-cli: ^5.1.4 wkx: ^0.5.0 yarn-audit-html: 7.3.2 - zustand: ^5.0.1 + zustand: ^5.0.3 languageName: unknown linkType: soft @@ -14719,9 +14720,9 @@ __metadata: linkType: hard "stylis@npm:^4.3.4": - version: 4.3.4 - resolution: "stylis@npm:4.3.4" - checksum: 7e3a482c7bba6e0e9e3187972e958acf800b1abe99f23e081fcb5dea8e4a05eca44286c1381ce2bc7179245ddbd7bf1f74237ed413fce7491320a543bcfebda9 + version: 4.3.5 + resolution: "stylis@npm:4.3.5" + checksum: ab7342ee0ebfbb37f7c40846fb0cb231eda849beaa766e19be6a54add9f43a616b306071755b1a655c8c91c6c77b175513efe7439807dcc47f9498c7ba3c2783 languageName: node linkType: hard @@ -15272,36 +15273,36 @@ __metadata: linkType: hard "typescript-eslint@npm:^8.8.0": - version: 8.19.1 - resolution: "typescript-eslint@npm:8.19.1" + version: 8.20.0 + resolution: "typescript-eslint@npm:8.20.0" dependencies: - "@typescript-eslint/eslint-plugin": 8.19.1 - "@typescript-eslint/parser": 8.19.1 - "@typescript-eslint/utils": 8.19.1 + "@typescript-eslint/eslint-plugin": 8.20.0 + "@typescript-eslint/parser": 8.20.0 + "@typescript-eslint/utils": 8.20.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.8.0" - checksum: 60d22b3c2378c56749f48df3b154a6c8645c25968f16c5f4517bbca2f182178623b085190cc8475641e09ee34f9211d5c126c89083f822b07ae8ab17bba2097d + checksum: d8b4fbfcbbc0336821ab032cf942427eb9e11607bd340165bef75c7cb850d00c13187e92b29f05e3ada953a437da880ffb00414925da8bcba3faca00d4c646f1 languageName: node linkType: hard "typescript@npm:^5.4.5": - version: 5.7.2 - resolution: "typescript@npm:5.7.2" + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b55300c4cefee8ee380d14fa9359ccb41ff8b54c719f6bc49b424899d662a5ce62ece390ce769568c7f4d14af844085255e63788740084444eb12ef423b13433 + checksum: 6c38b1e989918e576f0307e6ee013522ea480dfce5f3ca85c9b2d8adb1edeffd37f4f30cd68de0c38a44563d12ba922bdb7e36aa2dac9c51de5d561e6e9a2e9c languageName: node linkType: hard "typescript@patch:typescript@^5.4.5#~builtin": - version: 5.7.2 - resolution: "typescript@patch:typescript@npm%3A5.7.2#~builtin::version=5.7.2&hash=5786d5" + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#~builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e9fa1fd1f4203d399a5264e8612f9a64d9daf4ea7c926f346e11f6c8137acc6e29386c171c6b4085950ce714243be1627f60e76e5bd135124e226ce55309380f + checksum: 081eb086b0247a54cd8d61e34c10c3325037b0fdf00e135738d923e4e79f492e128be31ed03980039874ef1aa2e6fded8067f7be0cd92790efd2576e1d70e723 languageName: node linkType: hard @@ -15470,16 +15471,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.1.1": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" + version: 1.1.2 + resolution: "update-browserslist-db@npm:1.1.2" dependencies: escalade: ^3.2.0 - picocolors: ^1.1.0 + picocolors: ^1.1.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e + checksum: 088d2bad8ddeaeccd82d87d3f6d736d5256d697b725ffaa2b601dfd0ec16ba5fad20db8dcdccf55396e1a36194236feb69e3f5cce772e5be15a5e4261ff2815d languageName: node linkType: hard @@ -16248,9 +16249,9 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^5.0.1": - version: 5.0.2 - resolution: "zustand@npm:5.0.2" +"zustand@npm:^5.0.3": + version: 5.0.3 + resolution: "zustand@npm:5.0.3" peerDependencies: "@types/react": ">=18.0.0" immer: ">=9.0.6" @@ -16265,6 +16266,6 @@ __metadata: optional: true use-sync-external-store: optional: true - checksum: b8c3bf776112fc606b716bda9d65642300fd8f9d13d8f2264a811492d266afed1e0348aaaecc7f4c6f52090a46dcca040fcddc6cea0e4b2f21dc798dd3bf7d92 + checksum: 72da39ac3017726c3562c615a0f76cee0c9ea678d664f82ee7669f8cb5e153ee81059363473094e4154d73a2935ee3459f6792d1ec9d08d2e72ebe641a16a6ba languageName: node linkType: hard