@opengis/fastify-table 1.0.34 → 1.0.36

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 (77) hide show
  1. package/.eslintrc.cjs +42 -42
  2. package/Changelog.md +105 -101
  3. package/README.md +26 -26
  4. package/config.js +12 -12
  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 -39
  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/pgClients.js +20 -20
  27. package/policy/funcs/checkPolicy.js +74 -74
  28. package/policy/funcs/sqlInjection.js +33 -33
  29. package/policy/index.js +14 -14
  30. package/redis/client.js +8 -8
  31. package/redis/funcs/getRedis.js +23 -23
  32. package/redis/funcs/redisClients.js +2 -2
  33. package/redis/index.js +19 -19
  34. package/server/migrations/crm.sql +95 -95
  35. package/server/migrations/log.sql +41 -41
  36. package/server/templates/form/test.dataset.form.json +411 -411
  37. package/server/templates/select/test.storage.data.json +2 -2
  38. package/server/templates/table/test.dataset.table.json +24 -24
  39. package/server.js +14 -14
  40. package/table/controllers/data.js +57 -57
  41. package/table/controllers/filter.js +37 -32
  42. package/table/controllers/form.js +10 -10
  43. package/table/controllers/search.js +41 -41
  44. package/table/controllers/suggest.js +60 -60
  45. package/table/controllers/utils/getSelect.js +20 -20
  46. package/table/controllers/utils/getSelectMeta.js +66 -66
  47. package/table/controllers/utils/getTemplate.js +28 -28
  48. package/table/funcs/getFilterSQL/index.js +75 -75
  49. package/table/funcs/getFilterSQL/util/formatValue.js +142 -142
  50. package/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  51. package/table/funcs/getFilterSQL/util/getFilterQuery.js +73 -73
  52. package/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  53. package/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  54. package/table/funcs/metaFormat/getSelectVal.js +20 -20
  55. package/table/funcs/metaFormat/index.js +26 -26
  56. package/table/index.js +42 -42
  57. package/test/api/crud.test.js +56 -56
  58. package/test/api/crud.xss.test.js +71 -71
  59. package/test/api/notification.test.js +37 -37
  60. package/test/api/table.test.js +57 -57
  61. package/test/api/widget.test.js +114 -114
  62. package/test/config.example +18 -18
  63. package/test/funcs/crud.test.js +76 -76
  64. package/test/funcs/notification.test.js +31 -31
  65. package/test/funcs/pg.test.js +34 -34
  66. package/test/funcs/redis.test.js +19 -19
  67. package/test/templates/cls/test.json +9 -9
  68. package/test/templates/form/cp_building.form.json +32 -32
  69. package/test/templates/select/account_id.json +3 -3
  70. package/test/templates/select/storage.data.json +2 -2
  71. package/test/templates/table/gis.dataset.table.json +20 -20
  72. package/widget/controllers/utils/historyFormat.js +76 -76
  73. package/widget/controllers/utils/obj2db.js +13 -13
  74. package/widget/controllers/widget.del.js +41 -41
  75. package/widget/controllers/widget.get.js +77 -77
  76. package/widget/controllers/widget.set.js +64 -64
  77. package/widget/index.js +29 -29
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,105 @@
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.36 - 22.05.2024
4
+
5
+ - fix filter api array processing
6
+
7
+ ## 1.0.31 - 20.05.2024
8
+
9
+ - widget db structure refactor
10
+
11
+ ## 1.0.30 - 17.05.2024
12
+
13
+ - code optimization
14
+
15
+ ## 1.0.29 - 17.05.2024
16
+
17
+ - widget api post (file)
18
+
19
+ ## 1.0.28 - 14.05.2024
20
+
21
+ - dblist api set
22
+
23
+ ## 1.0.27 - 12.05.2024
24
+
25
+ - code optimization
26
+
27
+ ## 1.0.26 - 09.05.2024
28
+
29
+ - fix getTableSql
30
+
31
+ ## 1.0.25 - 08.05.2024
32
+
33
+ - decorator to hook
34
+
35
+ ## 1.0.24 - 07.05.2024
36
+
37
+ - getTemplate page
38
+
39
+ ## 1.0.23 - 07.05.2024
40
+
41
+ - getTemplate funcs
42
+ - dblist api
43
+
44
+ ## 1.0.22 - 03.05.2024
45
+
46
+ - getFilterSQL funcs
47
+
48
+ ## 1.0.21 - 03.05.2024
49
+
50
+ - fix widget db structure
51
+
52
+ ## 1.0.20 - 03.05.2024
53
+
54
+ - fix filter separator
55
+
56
+ ## 1.0.19 - 02.05.2024
57
+
58
+ - widget plugin
59
+ - notification plugin
60
+
61
+ ## 1.0.9 - 29.04.2024
62
+
63
+ - crud token support
64
+ - security - xss restriction
65
+
66
+ ## 1.0.8 - 29.04.2024
67
+
68
+ - filter fix
69
+
70
+ ## 1.0.7 - 26.04.2024
71
+
72
+ - code optimization
73
+
74
+ ## 1.0.6 - 25.04.2024
75
+
76
+ - code optimization
77
+
78
+ ## 1.0.5 - 24.04.2024
79
+
80
+ - code optimization
81
+
82
+ ## 1.0.4 - 20.04.2024
83
+
84
+ - data api - order
85
+ - suggest api - db support
86
+ - del api fix
87
+
88
+ ## 1.0.3 - 17.04.2024
89
+
90
+ - fix unit test
91
+
92
+ ## 1.0.2 - 14.04.2024
93
+
94
+ - fix redis
95
+
96
+ ## 1.0.1 - 14.04.2024
97
+
98
+ - fix redis
99
+
100
+ ## 1.0.0 - 14.04.2024
101
+
102
+ - crud
103
+ - pg
104
+ - redis
105
+ - 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,12 +1,12 @@
1
- import fs from 'fs';
2
-
3
- import { readFile } from 'fs/promises';
4
-
5
- const fileName = ['/data/local/config.json', 'config.json'].find(el => (fs.existsSync(el) ? el : null));
6
- const config = await readFile(fileName).then(el => JSON.parse(el)) || {};
7
-
8
- Object.assign(config, {
9
- allTemplates: config?.allTemplates || {},
10
- });
11
-
12
- export default config;
1
+ import fs from 'fs';
2
+
3
+ import { readFile } from 'fs/promises';
4
+
5
+ const fileName = ['/data/local/config.json', 'config.json'].find(el => (fs.existsSync(el) ? el : null));
6
+ const config = fileName ? await readFile(fileName).then(el => JSON.parse(el)) : {};
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;