@opengis/fastify-table 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/.eslintrc.cjs +42 -42
  2. package/Changelog.md +101 -101
  3. package/README.md +26 -26
  4. package/config.js +12 -11
  5. package/crud/controllers/deleteCrud.js +14 -14
  6. package/crud/controllers/insert.js +29 -29
  7. package/crud/controllers/update.js +31 -31
  8. package/crud/controllers/utils/checkXSS.js +45 -45
  9. package/crud/controllers/utils/xssInjection.js +72 -72
  10. package/crud/funcs/dataDelete.js +15 -15
  11. package/crud/funcs/dataInsert.js +24 -24
  12. package/crud/funcs/dataUpdate.js +24 -24
  13. package/crud/funcs/getOpt.js +10 -10
  14. package/crud/funcs/getToken.js +27 -27
  15. package/crud/funcs/isFileExists.js +13 -13
  16. package/crud/funcs/setOpt.js +16 -16
  17. package/crud/funcs/setToken.js +53 -53
  18. package/crud/index.js +29 -29
  19. package/helper.js +28 -28
  20. package/index.js +39 -41
  21. package/notification/controllers/userNotifications.js +19 -19
  22. package/notification/funcs/addNotification.js +8 -8
  23. package/notification/index.js +19 -19
  24. package/package.json +22 -22
  25. package/pg/funcs/getPG.js +29 -29
  26. package/pg/index.js +1 -1
  27. package/pg/pgClients.js +20 -20
  28. package/policy/funcs/checkPolicy.js +74 -74
  29. package/policy/funcs/sqlInjection.js +33 -33
  30. package/policy/index.js +14 -14
  31. package/redis/client.js +8 -8
  32. package/redis/funcs/getRedis.js +23 -23
  33. package/redis/funcs/redisClients.js +2 -2
  34. package/redis/index.js +19 -19
  35. package/server/migrations/crm.sql +95 -79
  36. package/server/migrations/log.sql +41 -41
  37. package/server/templates/form/test.dataset.form.json +411 -411
  38. package/server/templates/select/test.storage.data.json +2 -2
  39. package/server/templates/table/test.dataset.table.json +24 -24
  40. package/server.js +14 -14
  41. package/table/controllers/data.js +57 -57
  42. package/table/controllers/filter.js +32 -32
  43. package/table/controllers/form.js +10 -10
  44. package/table/controllers/search.js +41 -41
  45. package/table/controllers/suggest.js +60 -60
  46. package/table/controllers/utils/getSelect.js +20 -20
  47. package/table/controllers/utils/getSelectMeta.js +66 -66
  48. package/table/controllers/utils/getTemplate.js +28 -28
  49. package/table/funcs/getFilterSQL/index.js +75 -75
  50. package/table/funcs/getFilterSQL/util/formatValue.js +142 -142
  51. package/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  52. package/table/funcs/getFilterSQL/util/getFilterQuery.js +73 -73
  53. package/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  54. package/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  55. package/table/funcs/metaFormat/getSelectVal.js +20 -20
  56. package/table/funcs/metaFormat/index.js +26 -26
  57. package/table/index.js +42 -42
  58. package/test/api/crud.test.js +56 -56
  59. package/test/api/crud.xss.test.js +71 -71
  60. package/test/api/notification.test.js +37 -37
  61. package/test/api/table.test.js +57 -57
  62. package/test/api/widget.test.js +114 -114
  63. package/test/config.example +18 -18
  64. package/test/funcs/crud.test.js +76 -76
  65. package/test/funcs/notification.test.js +31 -31
  66. package/test/funcs/pg.test.js +34 -34
  67. package/test/funcs/redis.test.js +19 -19
  68. package/test/templates/cls/test.json +9 -9
  69. package/test/templates/form/cp_building.form.json +32 -32
  70. package/test/templates/select/account_id.json +3 -3
  71. package/test/templates/select/storage.data.json +2 -2
  72. package/test/templates/table/gis.dataset.table.json +20 -20
  73. package/widget/controllers/utils/historyFormat.js +76 -76
  74. package/widget/controllers/utils/obj2db.js +13 -13
  75. package/widget/controllers/widget.del.js +41 -41
  76. package/widget/controllers/widget.get.js +77 -77
  77. package/widget/controllers/widget.set.js +64 -64
  78. package/widget/index.js +29 -29
  79. package/dblist/controllers/createItem.js +0 -32
  80. package/dblist/controllers/deleteItem.js +0 -14
  81. package/dblist/controllers/readItems.js +0 -10
  82. package/dblist/controllers/setItem.js +0 -21
  83. package/dblist/controllers/updateItem.js +0 -25
  84. package/dblist/controllers/utils/checkItem.js +0 -24
  85. package/dblist/controllers/utils/formatData.js +0 -7
  86. package/dblist/index.js +0 -49
  87. package/test/api/dblist.test.js +0 -59
package/.eslintrc.cjs CHANGED
@@ -1,42 +1,42 @@
1
- /* eslint-env node */
2
-
3
- module.exports = {
4
- env: {
5
- node: true,
6
- },
7
- root: true,
8
- extends: [
9
- 'eslint:recommended',
10
- 'airbnb-base',
11
-
12
- ],
13
- rules: {
14
- 'brace-style': [2, 'stroustrup', { allowSingleLine: true }],
15
- 'vue/max-attributes-per-line': 0,
16
- 'vue/valid-v-for': 0,
17
-
18
- // allow async-await
19
- 'generator-star-spacing': 'off',
20
-
21
- // allow paren-less arrow functions
22
- 'arrow-parens': 0,
23
- 'one-var': 0,
24
- 'max-len': 0,
25
- 'import/first': 0,
26
- 'import/named': 2,
27
- 'import/namespace': 2,
28
- 'import/default': 2,
29
- 'import/export': 2,
30
- 'import/extensions': 0,
31
- 'no-console': ['warn', { allow: ['warn', 'error'] }],
32
- 'import/no-unresolved': 0,
33
- 'import/no-extraneous-dependencies': 0,
34
- 'linebreak-style': ['error', 'unix'],
35
- // allow debugger during development
36
- 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
37
- },
38
-
39
- parserOptions: {
40
- ecmaVersion: 'latest',
41
- },
42
- };
1
+ /* eslint-env node */
2
+
3
+ module.exports = {
4
+ env: {
5
+ node: true,
6
+ },
7
+ root: true,
8
+ extends: [
9
+ 'eslint:recommended',
10
+ 'airbnb-base',
11
+
12
+ ],
13
+ rules: {
14
+ 'brace-style': [2, 'stroustrup', { allowSingleLine: true }],
15
+ 'vue/max-attributes-per-line': 0,
16
+ 'vue/valid-v-for': 0,
17
+
18
+ // allow async-await
19
+ 'generator-star-spacing': 'off',
20
+
21
+ // allow paren-less arrow functions
22
+ 'arrow-parens': 0,
23
+ 'one-var': 0,
24
+ 'max-len': 0,
25
+ 'import/first': 0,
26
+ 'import/named': 2,
27
+ 'import/namespace': 2,
28
+ 'import/default': 2,
29
+ 'import/export': 2,
30
+ 'import/extensions': 0,
31
+ 'no-console': ['warn', { allow: ['warn', 'error'] }],
32
+ 'import/no-unresolved': 0,
33
+ 'import/no-extraneous-dependencies': 0,
34
+ 'linebreak-style': ['error', 'unix'],
35
+ // allow debugger during development
36
+ 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
37
+ },
38
+
39
+ parserOptions: {
40
+ ecmaVersion: 'latest',
41
+ },
42
+ };
package/Changelog.md CHANGED
@@ -1,101 +1,101 @@
1
- # fastify-table
2
-
3
- ## 1.0.31 - 20.05.2024
4
-
5
- - widget db structure refactor
6
-
7
- ## 1.0.30 - 17.05.2024
8
-
9
- - code optimization
10
-
11
- ## 1.0.29 - 17.05.2024
12
-
13
- - widget api post (file)
14
-
15
- ## 1.0.28 - 14.05.2024
16
-
17
- - dblist api set
18
-
19
- ## 1.0.27 - 12.05.2024
20
-
21
- - code optimization
22
-
23
- ## 1.0.26 - 09.05.2024
24
-
25
- - fix getTableSql
26
-
27
- ## 1.0.25 - 08.05.2024
28
-
29
- - decorator to hook
30
-
31
- ## 1.0.24 - 07.05.2024
32
-
33
- - getTemplate page
34
-
35
- ## 1.0.23 - 07.05.2024
36
-
37
- - getTemplate funcs
38
- - dblist api
39
-
40
- ## 1.0.22 - 03.05.2024
41
-
42
- - getFilterSQL funcs
43
-
44
- ## 1.0.21 - 03.05.2024
45
-
46
- - fix widget db structure
47
-
48
- ## 1.0.20 - 03.05.2024
49
-
50
- - fix filter separator
51
-
52
- ## 1.0.19 - 02.05.2024
53
-
54
- - widget plugin
55
- - notification plugin
56
-
57
- ## 1.0.9 - 29.04.2024
58
-
59
- - crud token support
60
- - security - xss restriction
61
-
62
- ## 1.0.8 - 29.04.2024
63
-
64
- - filter fix
65
-
66
- ## 1.0.7 - 26.04.2024
67
-
68
- - code optimization
69
-
70
- ## 1.0.6 - 25.04.2024
71
-
72
- - code optimization
73
-
74
- ## 1.0.5 - 24.04.2024
75
-
76
- - code optimization
77
-
78
- ## 1.0.4 - 20.04.2024
79
-
80
- - data api - order
81
- - suggest api - db support
82
- - del api fix
83
-
84
- ## 1.0.3 - 17.04.2024
85
-
86
- - fix unit test
87
-
88
- ## 1.0.2 - 14.04.2024
89
-
90
- - fix redis
91
-
92
- ## 1.0.1 - 14.04.2024
93
-
94
- - fix redis
95
-
96
- ## 1.0.0 - 14.04.2024
97
-
98
- - crud
99
- - pg
100
- - redis
101
- - table
1
+ # fastify-table
2
+
3
+ ## 1.0.31 - 20.05.2024
4
+
5
+ - widget db structure refactor
6
+
7
+ ## 1.0.30 - 17.05.2024
8
+
9
+ - code optimization
10
+
11
+ ## 1.0.29 - 17.05.2024
12
+
13
+ - widget api post (file)
14
+
15
+ ## 1.0.28 - 14.05.2024
16
+
17
+ - dblist api set
18
+
19
+ ## 1.0.27 - 12.05.2024
20
+
21
+ - code optimization
22
+
23
+ ## 1.0.26 - 09.05.2024
24
+
25
+ - fix getTableSql
26
+
27
+ ## 1.0.25 - 08.05.2024
28
+
29
+ - decorator to hook
30
+
31
+ ## 1.0.24 - 07.05.2024
32
+
33
+ - getTemplate page
34
+
35
+ ## 1.0.23 - 07.05.2024
36
+
37
+ - getTemplate funcs
38
+ - dblist api
39
+
40
+ ## 1.0.22 - 03.05.2024
41
+
42
+ - getFilterSQL funcs
43
+
44
+ ## 1.0.21 - 03.05.2024
45
+
46
+ - fix widget db structure
47
+
48
+ ## 1.0.20 - 03.05.2024
49
+
50
+ - fix filter separator
51
+
52
+ ## 1.0.19 - 02.05.2024
53
+
54
+ - widget plugin
55
+ - notification plugin
56
+
57
+ ## 1.0.9 - 29.04.2024
58
+
59
+ - crud token support
60
+ - security - xss restriction
61
+
62
+ ## 1.0.8 - 29.04.2024
63
+
64
+ - filter fix
65
+
66
+ ## 1.0.7 - 26.04.2024
67
+
68
+ - code optimization
69
+
70
+ ## 1.0.6 - 25.04.2024
71
+
72
+ - code optimization
73
+
74
+ ## 1.0.5 - 24.04.2024
75
+
76
+ - code optimization
77
+
78
+ ## 1.0.4 - 20.04.2024
79
+
80
+ - data api - order
81
+ - suggest api - db support
82
+ - del api fix
83
+
84
+ ## 1.0.3 - 17.04.2024
85
+
86
+ - fix unit test
87
+
88
+ ## 1.0.2 - 14.04.2024
89
+
90
+ - fix redis
91
+
92
+ ## 1.0.1 - 14.04.2024
93
+
94
+ - fix redis
95
+
96
+ ## 1.0.0 - 14.04.2024
97
+
98
+ - crud
99
+ - pg
100
+ - redis
101
+ - table
package/README.md CHANGED
@@ -1,26 +1,26 @@
1
- # fastify-table
2
-
3
- [![NPM version](https://img.shields.io/npm/v/@opengis/fastify-table)](https://www.npmjs.com/package/@opengis/fastify-table)
4
- [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/)
5
-
6
- It standardizes the entire form building process, while taking care of everything from rendering to validation and processing:
7
-
8
- - pg
9
- - redis
10
- - crud
11
-
12
- ## Install
13
-
14
- ```bash
15
- npm i @opengis/fastify-table
16
- ```
17
-
18
- ## Usage
19
-
20
- ```js
21
- fastify.register(import('@opengis/fastify-table'), config);
22
- ```
23
-
24
- ## Documenation
25
-
26
- For a detailed understanding fastify-table, its features, and how to use them, refer to our [Documentation](https://apidocs.softpro.ua/gis.storage/).
1
+ # fastify-table
2
+
3
+ [![NPM version](https://img.shields.io/npm/v/@opengis/fastify-table)](https://www.npmjs.com/package/@opengis/fastify-table)
4
+ [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/)
5
+
6
+ It standardizes the entire form building process, while taking care of everything from rendering to validation and processing:
7
+
8
+ - pg
9
+ - redis
10
+ - crud
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm i @opengis/fastify-table
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ ```js
21
+ fastify.register(import('@opengis/fastify-table'), config);
22
+ ```
23
+
24
+ ## Documenation
25
+
26
+ For a detailed understanding fastify-table, its features, and how to use them, refer to our [Documentation](https://apidocs.softpro.ua/gis.storage/).
package/config.js CHANGED
@@ -1,11 +1,12 @@
1
- import fs from 'fs';
2
-
3
- const config = fs.existsSync('config.json')
4
- ? JSON.parse(fs.readFileSync('config.json'))
5
- : {};
6
-
7
- Object.assign(config, {
8
- allTemplates: config?.allTemplates || {},
9
- });
10
-
11
- export default config;
1
+ import fs from 'fs';
2
+
3
+ const config = (fs.existsSync('/data/local/config.json') ? JSON.parse(fs.readFileSync('/data/local/config.json')) : null)
4
+ || (fs.existsSync('config.json')
5
+ ? JSON.parse(fs.readFileSync('config.json'))
6
+ : {})();
7
+
8
+ Object.assign(config, {
9
+ allTemplates: config?.allTemplates || {},
10
+ });
11
+
12
+ export default config;
@@ -1,14 +1,14 @@
1
- import dataDelete from '../funcs/dataDelete.js';
2
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
3
-
4
- export default async function deleteCrud(req) {
5
- const loadTemplate = await getTemplate('table', req.params.table);
6
- const { table } = loadTemplate || req.params || {};
7
- const { id } = req.params || {};
8
-
9
- if (!table) return { status: 404, message: 'table is required' };
10
-
11
- const data = await dataDelete({ table, id });
12
-
13
- return { rowCount: data.rowCount, msg: !data.rowCount ? data : null };
14
- }
1
+ import dataDelete from '../funcs/dataDelete.js';
2
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
3
+
4
+ export default async function deleteCrud(req) {
5
+ const loadTemplate = await getTemplate('table', req.params.table);
6
+ const { table } = loadTemplate || req.params || {};
7
+ const { id } = req.params || {};
8
+
9
+ if (!table) return { status: 404, message: 'table is required' };
10
+
11
+ const data = await dataDelete({ table, id });
12
+
13
+ return { rowCount: data.rowCount, msg: !data.rowCount ? data : null };
14
+ }
@@ -1,29 +1,29 @@
1
- import dataInsert from '../funcs/dataInsert.js';
2
- import getToken from '../funcs/getToken.js';
3
- import checkXSS from './utils/checkXSS.js';
4
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
-
6
- export default async function insert(req) {
7
- const loadTemplate = await getTemplate('table', req.params.table);
8
- const { table } = loadTemplate || req.params || {};
9
- if (!table) return { status: 404, message: 'table is required' };
10
-
11
- const { funcs, session, params } = req;
12
- const tokenDataString = await getToken({
13
- funcs, session, token: params.table, mode: 'a', json: 0,
14
- });
15
-
16
- const { form, add } = JSON.parse(tokenDataString || '{}');
17
-
18
- const formData = form ? await getTemplate('form', form) : {};
19
-
20
- const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
21
-
22
- if (xssCheck.error && formData?.xssCheck !== false) {
23
- req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
24
- return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
25
- }
26
-
27
- const res = await dataInsert({ table: add || table, data: req.body });
28
- return { rows: res.rows };
29
- }
1
+ import dataInsert from '../funcs/dataInsert.js';
2
+ import getToken from '../funcs/getToken.js';
3
+ import checkXSS from './utils/checkXSS.js';
4
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
+
6
+ export default async function insert(req) {
7
+ const loadTemplate = await getTemplate('table', req.params.table);
8
+ const { table } = loadTemplate || req.params || {};
9
+ if (!table) return { status: 404, message: 'table is required' };
10
+
11
+ const { funcs, session, params } = req;
12
+ const tokenDataString = await getToken({
13
+ funcs, session, token: params.table, mode: 'a', json: 0,
14
+ });
15
+
16
+ const { form, add } = JSON.parse(tokenDataString || '{}');
17
+
18
+ const formData = form ? await getTemplate('form', form) : {};
19
+
20
+ const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
21
+
22
+ if (xssCheck.error && formData?.xssCheck !== false) {
23
+ req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
24
+ return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
25
+ }
26
+
27
+ const res = await dataInsert({ table: add || table, data: req.body });
28
+ return { rows: res.rows };
29
+ }
@@ -1,31 +1,31 @@
1
- import dataUpdate from '../funcs/dataUpdate.js';
2
- import getToken from '../funcs/getToken.js';
3
- import checkXSS from './utils/checkXSS.js';
4
- import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
-
6
- export default async function update(req) {
7
- const loadTemplate = await getTemplate('table', req.params.table);
8
- const { table } = loadTemplate || req.params || {};
9
- const { id } = req.params || {};
10
- if (!req.params?.table) return { message: 'table is required', status: 404 };
11
- if (!id) return { message: 'id is required', status: 404 };
12
-
13
- const { funcs, session, params } = req;
14
- const tokenDataString = await getToken({
15
- funcs, session, token: params.table, mode: 'w', json: 0,
16
- });
17
-
18
- const tokenData = JSON.parse(tokenDataString || '{}');
19
-
20
- const formData = tokenData?.form ? await getTemplate('form', tokenData.form) : {};
21
-
22
- const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
23
-
24
- if (xssCheck.error && formData?.xssCheck !== false) {
25
- req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
26
- return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
27
- }
28
-
29
- const res = await dataUpdate({ table: tokenData?.table || table, id: tokenData?.id || id, data: req.body });
30
- return res;
31
- }
1
+ import dataUpdate from '../funcs/dataUpdate.js';
2
+ import getToken from '../funcs/getToken.js';
3
+ import checkXSS from './utils/checkXSS.js';
4
+ import getTemplate from '../../table/controllers/utils/getTemplate.js';
5
+
6
+ export default async function update(req) {
7
+ const loadTemplate = await getTemplate('table', req.params.table);
8
+ const { table } = loadTemplate || req.params || {};
9
+ const { id } = req.params || {};
10
+ if (!req.params?.table) return { message: 'table is required', status: 404 };
11
+ if (!id) return { message: 'id is required', status: 404 };
12
+
13
+ const { funcs, session, params } = req;
14
+ const tokenDataString = await getToken({
15
+ funcs, session, token: params.table, mode: 'w', json: 0,
16
+ });
17
+
18
+ const tokenData = JSON.parse(tokenDataString || '{}');
19
+
20
+ const formData = tokenData?.form ? await getTemplate('form', tokenData.form) : {};
21
+
22
+ const xssCheck = checkXSS({ body: req.body, schema: formData?.schema });
23
+
24
+ if (xssCheck.error && formData?.xssCheck !== false) {
25
+ req.log.warn({ name: 'injection/xss', msg: xssCheck.error, table }, req);
26
+ return { message: 'Дані містять заборонені символи. Приберіть їх та спробуйте ще раз', status: 409 };
27
+ }
28
+
29
+ const res = await dataUpdate({ table: tokenData?.table || table, id: tokenData?.id || id, data: req.body });
30
+ return res;
31
+ }
@@ -1,45 +1,45 @@
1
- /* import sqlInjection from '../../../policy/funcs/sqlInjection.js'; */
2
- import xssInjection from './xssInjection.js';
3
-
4
- /* const checkList = xssInjection.concat(sqlInjection); */
5
-
6
- // RTE - rich text editor
7
-
8
- function checkXSS({ body, schema = {} }) {
9
- const data = typeof body === 'string' ? body : JSON.stringify(body);
10
- const stopWords = xssInjection.filter((el) => data.toLowerCase().includes(el));
11
-
12
- // check sql injection
13
- const stopSpecialSymbols = data.match(/\p{S}OR\p{S}|\p{P}OR\p{P}| OR |\+OR\+/gi);
14
- if (stopSpecialSymbols?.length) stopSpecialSymbols?.forEach((el) => stopWords.push(el));
15
-
16
- // escape arrows on non-RTE
17
- Object.keys(body)
18
- .filter((key) => ['<', '>'].find((el) => body[key]?.includes?.(el))
19
- && !['Summernote', 'Tiny', 'Ace'].includes(schema[key]?.type))
20
- ?.forEach((key) => {
21
- Object.assign(body, { [key]: body[key].replace(/</g, '&lt;').replace(/>/g, '&gt;') });
22
- });
23
- // try { } catch (err) { return { error: err.toString() }; }
24
-
25
- if (!stopWords.length) return { body };
26
-
27
- const disabledCheckFields = Object.keys(schema)?.filter((el) => schema[el]?.xssCheck === false); // exclude specific columns
28
-
29
- // check RTE
30
- /* const richTextFields = Object.keys(schema).filter((el) => ['Summernote', 'Tiny', 'Ace'].includes(schema[el]?.type));
31
- richTextFields.filter((key) => !checkList.find((el) => body[key].includes(el)))?.forEach((key) => {
32
- disabledCheckFields.push(key);
33
- }); */
34
-
35
- const field = Object.keys(body)
36
- ?.find((key) => body[key]
37
- && !disabledCheckFields.includes(key)
38
- && body[key].toLowerCase().includes(stopWords[0]));
39
- if (field) {
40
- return { error: `rule: ${stopWords[0]} | attr: ${field} | val: ${body[field]}`, body };
41
- }
42
- return { body };
43
- }
44
-
45
- export default checkXSS;
1
+ /* import sqlInjection from '../../../policy/funcs/sqlInjection.js'; */
2
+ import xssInjection from './xssInjection.js';
3
+
4
+ /* const checkList = xssInjection.concat(sqlInjection); */
5
+
6
+ // RTE - rich text editor
7
+
8
+ function checkXSS({ body, schema = {} }) {
9
+ const data = typeof body === 'string' ? body : JSON.stringify(body);
10
+ const stopWords = xssInjection.filter((el) => data.toLowerCase().includes(el));
11
+
12
+ // check sql injection
13
+ const stopSpecialSymbols = data.match(/\p{S}OR\p{S}|\p{P}OR\p{P}| OR |\+OR\+/gi);
14
+ if (stopSpecialSymbols?.length) stopSpecialSymbols?.forEach((el) => stopWords.push(el));
15
+
16
+ // escape arrows on non-RTE
17
+ Object.keys(body)
18
+ .filter((key) => ['<', '>'].find((el) => body[key]?.includes?.(el))
19
+ && !['Summernote', 'Tiny', 'Ace'].includes(schema[key]?.type))
20
+ ?.forEach((key) => {
21
+ Object.assign(body, { [key]: body[key].replace(/</g, '&lt;').replace(/>/g, '&gt;') });
22
+ });
23
+ // try { } catch (err) { return { error: err.toString() }; }
24
+
25
+ if (!stopWords.length) return { body };
26
+
27
+ const disabledCheckFields = Object.keys(schema)?.filter((el) => schema[el]?.xssCheck === false); // exclude specific columns
28
+
29
+ // check RTE
30
+ /* const richTextFields = Object.keys(schema).filter((el) => ['Summernote', 'Tiny', 'Ace'].includes(schema[el]?.type));
31
+ richTextFields.filter((key) => !checkList.find((el) => body[key].includes(el)))?.forEach((key) => {
32
+ disabledCheckFields.push(key);
33
+ }); */
34
+
35
+ const field = Object.keys(body)
36
+ ?.find((key) => body[key]
37
+ && !disabledCheckFields.includes(key)
38
+ && body[key].toLowerCase().includes(stopWords[0]));
39
+ if (field) {
40
+ return { error: `rule: ${stopWords[0]} | attr: ${field} | val: ${body[field]}`, body };
41
+ }
42
+ return { body };
43
+ }
44
+
45
+ export default checkXSS;