mm_os 3.2.9 → 3.3.1

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 (56) hide show
  1. package/README.md +47 -1
  2. package/core/base/mqtt/index.js +1109 -1106
  3. package/core/base/web/index.js +245 -156
  4. package/core/com/event/README.md +4 -4
  5. package/core/com/event/com.json +3 -3
  6. package/core/com/event/config.tpl.json +18 -18
  7. package/core/com/event/drive.js +132 -132
  8. package/core/com/event/index.js +344 -344
  9. package/core/com/event/script.js +25 -25
  10. package/core/com/middleware/com.js +152 -151
  11. package/core/com/socket/config.tpl.json +2 -2
  12. package/core/com/socket/drive.js +2 -2
  13. package/core/com/socket/index.js +1 -1
  14. package/core/com/sql/drive.js +7 -7
  15. package/core/com/static/index.js +1 -1
  16. package/index.js +34 -5
  17. package/middleware/cors/index.js +112 -96
  18. package/middleware/cors/middleware.json +18 -7
  19. package/middleware/csrf/index.js +202 -0
  20. package/middleware/csrf/middleware.json +24 -0
  21. package/middleware/ip_firewall/index.js +476 -0
  22. package/middleware/ip_firewall/middleware.json +109 -0
  23. package/middleware/mqtt_base/middleware.json +2 -1
  24. package/middleware/security_audit/index.js +543 -0
  25. package/middleware/security_audit/middleware.json +48 -0
  26. package/middleware/waf/index.js +273 -7
  27. package/middleware/waf/middleware.json +2 -1
  28. package/middleware/waf_ddos/index.js +520 -0
  29. package/middleware/waf_ddos/middleware.json +38 -0
  30. package/middleware/waf_xss/index.js +269 -0
  31. package/middleware/waf_xss/middleware.json +18 -0
  32. package/middleware/web_after/middleware.json +2 -1
  33. package/middleware/web_base/middleware.json +2 -1
  34. package/middleware/web_before/middleware.json +3 -2
  35. package/middleware/web_check/middleware.json +2 -1
  36. package/middleware/web_main/middleware.json +2 -1
  37. package/middleware/web_proxy/middleware.json +2 -1
  38. package/middleware/web_render/middleware.json +2 -1
  39. package/middleware/web_socket/middleware.json +4 -3
  40. package/middleware/web_static/middleware.json +2 -1
  41. package/package.json +28 -15
  42. package/middleware/log/index.js +0 -32
  43. package/middleware/log/middleware.json +0 -9
  44. package/middleware/performance/index.js +0 -143
  45. package/middleware/performance/middleware.json +0 -16
  46. package/middleware/rate_limit/index.js +0 -112
  47. package/middleware/rate_limit/middleware.json +0 -10
  48. package/middleware/waf_ip/index.js +0 -168
  49. package/middleware/waf_ip/middleware.json +0 -10
  50. package/nodemon.json +0 -31
  51. package/package.txt +0 -1
  52. package/rps.bat +0 -3
  53. package/test.js +0 -10
  54. package/tps.bat +0 -3
  55. package/update.bat +0 -1
  56. package//347/263/273/347/273/237/346/236/266/346/236/204/350/257/204/344/274/260/344/270/216/344/274/230/345/214/226/345/273/272/350/256/256.md +0 -599
@@ -1,345 +1,345 @@
1
- const Index = require('mm_machine').Index;
2
- const Drive = require('./drive');
3
-
4
- /**
5
- * Event事件类
6
- * @extends {Index}
7
- * @class
8
- */
9
- class Event extends Index {
10
- /**
11
- * 构造函数
12
- * @param {Object} scope 作用域
13
- * @param {String} title 标题
14
- * @constructor
15
- */
16
- constructor(scope, title) {
17
- super(scope, __dirname);
18
- this.Drive = Drive;
19
- this.type = "event";
20
- this.title = title;
21
- // 默认启用热更新
22
- this.mode = 3;
23
- /* === 验证 === */
24
- // 验证前
25
- this.list_before = [];
26
- // 验证
27
- this.list_check = [];
28
- // 执行
29
- this.list_main = [];
30
- // 渲染
31
- this.list_render = [];
32
- // 渲染后
33
- this.list_after = [];
34
- }
35
- }
36
-
37
- /**
38
- * 清除事件
39
- * @param {String} stage 阶段
40
- */
41
- Event.prototype.clear = function(stage) {
42
- if (stage) {
43
- if (this[stage]) {
44
- this[stage] = [];
45
- } else {
46
- $.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
47
- }
48
- } else {
49
- this.list_before = [];
50
- this.list_check = [];
51
- this.list_main = [];
52
- this.list_render = [];
53
- this.list_after = [];
54
- }
55
- };
56
-
57
-
58
- /**
59
- * 更新脚本子函数
60
- */
61
- Event.prototype.update_script_sub = async function(list) {
62
- for (var i = 0; i < list.length; i++) {
63
- var o = list[i];
64
- if (o.config.state === 1) {
65
- await o.exec('load');
66
- }
67
- }
68
- }
69
-
70
- /**
71
- * 更新脚本
72
- */
73
- Event.prototype.update_script = async function() {
74
- this.update_script_sub(this.list_before);
75
- this.update_script_sub(this.list_check);
76
- this.update_script_sub(this.list_main);
77
- this.update_script_sub(this.list_render);
78
- this.update_script_sub(this.list_after);
79
- }
80
-
81
- /**
82
- * 加载项
83
- * @param {String} dir 文件路径
84
- * @param {Object} cg 配置参数
85
- * @param {String} file 配置文件
86
- */
87
- Event.prototype.load_item = async function(dir, cg, file) {
88
- if (this.Drive) {
89
- var drive = new this.Drive(dir, this.dir_base.fullname());
90
- drive.mode = this.mode;
91
- if (cg) {
92
- await drive.exec('load_config', file, cg.name);
93
- await drive.exec('set_config', cg);
94
- } else {
95
- await drive.exec('load_config', file);
96
- }
97
- var key = 'list_' + drive.config.stage;
98
- var list = this[key];
99
- if (!list) {
100
- return;
101
- }
102
- list.push(drive);
103
- return drive;
104
- } else {
105
- var json = file.loadJson();
106
- if (!json) {
107
- var fl = this.dir_base + "/config.tpl.json";
108
- if (fl.hasFile()) {
109
- fl.copyFile(file);
110
- json = file.loadJson();
111
- }
112
- }
113
- if (json) {
114
- var key = 'list_' + json.stage;
115
- var list = this[key];
116
- if (!list) {
117
- return;
118
- }
119
- list.push(json);
120
- }
121
- return json;
122
- }
123
- };
124
-
125
- /**
126
- * 事件排序
127
- * @param {String} list 列表
128
- */
129
- Event.prototype.sort_sub = function(list) {
130
- list.sort(function(o1, o2) {
131
- var sort = o1.config.sort - o2.config.sort;
132
- if (sort === 0) {
133
- sort = o2.config.target.length - o1.config.target.length;
134
- }
135
- return sort;
136
- });
137
- };
138
-
139
- /**
140
- * 事件排序
141
- * @param {String} stage 阶段
142
- */
143
- Event.prototype.sort = function(stage) {
144
- if (stage) {
145
- if (this[stage]) {
146
- this[stage] = [];
147
- } else {
148
- $.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
149
- }
150
- } else {
151
- this.sort_sub(this.list_before);
152
- this.sort_sub(this.list_check);
153
- this.sort_sub(this.list_main);
154
- this.sort_sub(this.list_render);
155
- this.sort_sub(this.list_after);
156
- }
157
- };
158
-
159
- /**
160
- * 执行事件
161
- */
162
- Event.prototype.doing = async function(o, ctx, db) {
163
- var ret = o.run(ctx, db);
164
- if (types.isPromise(ret)) {
165
- ret = await ret;
166
- }
167
- if (this.mode > 4) {
168
- o.exec('reload', o.filename);
169
- }
170
- return ret;
171
- }
172
-
173
- /**
174
- * 执行函数
175
- * @param {Array} list 列表
176
- * @param {String} target 目标
177
- * @param {Object} ctx 请求上下文
178
- * @param {Object} db 数据管理器
179
- * @return {Object} 执行结果
180
- */
181
- Event.prototype.run_sub = async function(list, target, ctx, db) {
182
- for (var i = 0, o; o = list[i++];) {
183
- if (o.config.state === 1 && target.has(o.config.target)) {
184
- var ret = await o.run(ctx, db);
185
- if (this.mode > 4) {
186
- o.exec('reload', o.filename);
187
- }
188
- if (ret) {
189
- db.ret = ret;
190
- if (o.config.end) {
191
- break;
192
- }
193
- }
194
- }
195
- }
196
- return db.ret;
197
- };
198
-
199
- /**
200
- * 之前
201
- * @param {String} target 目标
202
- * @param {Object} ctx 请求上下文
203
- * @param {Object} db 数据管理器
204
- * @return {Object} 执行结果
205
- */
206
- Event.prototype.before = async function(target, ctx, db) {
207
- return await this.run_sub(this.list_before, target, ctx, db);
208
- };
209
-
210
- /**
211
- * 验证
212
- * @param {String} target 目标
213
- * @param {Object} ctx 请求上下文
214
- * @param {Object} db 数据管理器
215
- * @return {Object} 执行结果
216
- */
217
- Event.prototype.check = async function(target, ctx, db) {
218
- return await this.run_sub(this.list_check, target, ctx, db);
219
- };
220
-
221
- /**
222
- * 主要
223
- * @param {String} target 目标
224
- * @param {Object} ctx 请求上下文
225
- * @param {Object} db 数据管理器
226
- * @return {Object} 执行结果
227
- */
228
- Event.prototype.main = async function(target, ctx, db) {
229
- return await this.run_sub(this.list_main, target, ctx, db);
230
- };
231
-
232
- /**
233
- * 渲染
234
- * @param {String} target 目标
235
- * @param {Object} ctx 请求上下文
236
- * @param {Object} db 数据管理器
237
- * @return {Object} 执行结果
238
- */
239
- Event.prototype.render = async function(target, ctx, db) {
240
- return await this.run_sub(this.list_render, target, ctx, db);
241
- };
242
-
243
- /**
244
- * 之后
245
- * @param {String} target 目标
246
- * @param {Object} ctx 请求上下文
247
- * @param {Object} db 数据管理器
248
- * @return {Object} 执行结果
249
- */
250
- Event.prototype.after = async function(target, ctx, db) {
251
- return await this.run_sub(this.list_after, target, ctx, db);
252
- };
253
-
254
- /**
255
- * 执行事件
256
- * @param {String} target 目标
257
- * @param {Object} ctx 请求上下文
258
- * @param {Object} db 数据管理器
259
- * @return {Object} 执行结果
260
- */
261
- Event.prototype.run = async function(target, ctx, db) {
262
- if (!db) {
263
- db = {
264
- ret: null
265
- };
266
- }
267
- var ret = await this.before(target, ctx, db);
268
- if (!ret) {
269
- ret = await this.check(target, ctx, db);
270
- if (!ret) {
271
- ret = await this.main(target, ctx, db);
272
- }
273
- ret = await this.render(target, ctx, db);
274
- if (ret) {
275
- ret = await this.after(target, ctx, db);
276
- }
277
- }
278
- return ret;
279
- };
280
-
281
- /**
282
- * @description 获取事件
283
- * @param {String} name 名称
284
- * @param {String} event_type 事件类型
285
- * @return {Object} 返回单项配置
286
- */
287
- Event.prototype.get = function(name, event_type = 'main') {
288
- var obj;
289
- var lt = this['list_' + event_type];
290
- var len = lt.length;
291
- for (var i = 0; i < len; i++) {
292
- var o = lt[i];
293
- if (name === o.config.name) {
294
- obj = o;
295
- break;
296
- }
297
- }
298
- return obj;
299
- };
300
-
301
- /**
302
- * @description 重载脚本和配置
303
- * @param {String} file 文件名
304
- * @return {String} 重载失败返回错误提示,重载成功返回null
305
- */
306
- Event.prototype.reload = async function(name, event_type = 'main') {
307
- var o = this.get(name, event_type);
308
- if (o) {
309
- await o.exec('reload');
310
- return null;
311
- }
312
- return '没有找到模块';
313
- }
314
-
315
- /**
316
- * @module 导出Event类
317
- */
318
- module.exports = Event;
319
-
320
- /**
321
- * Event事件池
322
- */
323
- if (!$.pool.event) {
324
- $.pool.event = {};
325
- }
326
-
327
- function event_admin(scope, title) {
328
- if (!scope) {
329
- scope = $.val.scope + '';
330
- }
331
- var obj = $.pool.event[scope];
332
- if (!obj) {
333
- $.pool.event[scope] = new Event(scope, title);
334
- obj = $.pool.event[scope];
335
- }
336
- return obj;
337
- }
338
-
339
- /**
340
- * Event管理器,用于创建缓存
341
- * @param {String} scope 作用域
342
- * @param {string} title 标题
343
- * @return {Object} 返回一个缓存类
344
- */
1
+ const Index = require('mm_machine').Index;
2
+ const Drive = require('./drive');
3
+
4
+ /**
5
+ * Event事件类
6
+ * @extends {Index}
7
+ * @class
8
+ */
9
+ class Event extends Index {
10
+ /**
11
+ * 构造函数
12
+ * @param {Object} scope 作用域
13
+ * @param {String} title 标题
14
+ * @constructor
15
+ */
16
+ constructor(scope, title) {
17
+ super(scope, __dirname);
18
+ this.Drive = Drive;
19
+ this.type = "event";
20
+ this.title = title;
21
+ // 默认启用热更新
22
+ this.mode = 3;
23
+ /* === 验证 === */
24
+ // 验证前
25
+ this.list_before = [];
26
+ // 验证
27
+ this.list_check = [];
28
+ // 执行
29
+ this.list_main = [];
30
+ // 渲染
31
+ this.list_render = [];
32
+ // 渲染后
33
+ this.list_after = [];
34
+ }
35
+ }
36
+
37
+ /**
38
+ * 清除事件
39
+ * @param {String} stage 阶段
40
+ */
41
+ Event.prototype.clear = function(stage) {
42
+ if (stage) {
43
+ if (this[stage]) {
44
+ this[stage] = [];
45
+ } else {
46
+ $.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
47
+ }
48
+ } else {
49
+ this.list_before = [];
50
+ this.list_check = [];
51
+ this.list_main = [];
52
+ this.list_render = [];
53
+ this.list_after = [];
54
+ }
55
+ };
56
+
57
+
58
+ /**
59
+ * 更新脚本子函数
60
+ */
61
+ Event.prototype.update_script_sub = async function(list) {
62
+ for (var i = 0; i < list.length; i++) {
63
+ var o = list[i];
64
+ if (o.config.state === 1) {
65
+ await o.exec('load');
66
+ }
67
+ }
68
+ }
69
+
70
+ /**
71
+ * 更新脚本
72
+ */
73
+ Event.prototype.update_script = async function() {
74
+ this.update_script_sub(this.list_before);
75
+ this.update_script_sub(this.list_check);
76
+ this.update_script_sub(this.list_main);
77
+ this.update_script_sub(this.list_render);
78
+ this.update_script_sub(this.list_after);
79
+ }
80
+
81
+ /**
82
+ * 加载项
83
+ * @param {String} dir 文件路径
84
+ * @param {Object} cg 配置参数
85
+ * @param {String} file 配置文件
86
+ */
87
+ Event.prototype.load_item = async function(dir, cg, file) {
88
+ if (this.Drive) {
89
+ var drive = new this.Drive(dir, this.dir_base.fullname());
90
+ drive.mode = this.mode;
91
+ if (cg) {
92
+ await drive.exec('load_config', file, cg.name);
93
+ await drive.exec('set_config', cg);
94
+ } else {
95
+ await drive.exec('load_config', file);
96
+ }
97
+ var key = 'list_' + drive.config.stage;
98
+ var list = this[key];
99
+ if (!list) {
100
+ return;
101
+ }
102
+ list.push(drive);
103
+ return drive;
104
+ } else {
105
+ var json = file.loadJson();
106
+ if (!json) {
107
+ var fl = this.dir_base + "/config.tpl.json";
108
+ if (fl.hasFile()) {
109
+ fl.copyFile(file);
110
+ json = file.loadJson();
111
+ }
112
+ }
113
+ if (json) {
114
+ var key = 'list_' + json.stage;
115
+ var list = this[key];
116
+ if (!list) {
117
+ return;
118
+ }
119
+ list.push(json);
120
+ }
121
+ return json;
122
+ }
123
+ };
124
+
125
+ /**
126
+ * 事件排序
127
+ * @param {String} list 列表
128
+ */
129
+ Event.prototype.sort_sub = function(list) {
130
+ list.sort(function(o1, o2) {
131
+ var sort = o1.config.sort - o2.config.sort;
132
+ if (sort === 0) {
133
+ sort = o2.config.target.length - o1.config.target.length;
134
+ }
135
+ return sort;
136
+ });
137
+ };
138
+
139
+ /**
140
+ * 事件排序
141
+ * @param {String} stage 阶段
142
+ */
143
+ Event.prototype.sort = function(stage) {
144
+ if (stage) {
145
+ if (this[stage]) {
146
+ this[stage] = [];
147
+ } else {
148
+ $.log.debug('清空失败,事件发展阶段{0}不存在!'.replace("{0}", stage));
149
+ }
150
+ } else {
151
+ this.sort_sub(this.list_before);
152
+ this.sort_sub(this.list_check);
153
+ this.sort_sub(this.list_main);
154
+ this.sort_sub(this.list_render);
155
+ this.sort_sub(this.list_after);
156
+ }
157
+ };
158
+
159
+ /**
160
+ * 执行事件
161
+ */
162
+ Event.prototype.doing = async function(o, ctx, db) {
163
+ var ret = o.run(ctx, db);
164
+ if (types.isPromise(ret)) {
165
+ ret = await ret;
166
+ }
167
+ if (this.mode > 4) {
168
+ o.exec('reload', o.filename);
169
+ }
170
+ return ret;
171
+ }
172
+
173
+ /**
174
+ * 执行函数
175
+ * @param {Array} list 列表
176
+ * @param {String} target 目标
177
+ * @param {Object} ctx 请求上下文
178
+ * @param {Object} db 数据管理器
179
+ * @return {Object} 执行结果
180
+ */
181
+ Event.prototype.run_sub = async function(list, target, ctx, db) {
182
+ for (var i = 0, o; o = list[i++];) {
183
+ if (o.config.state === 1 && target.has(o.config.target)) {
184
+ var ret = await o.run(ctx, db);
185
+ if (this.mode > 4) {
186
+ o.exec('reload', o.filename);
187
+ }
188
+ if (ret) {
189
+ db.ret = ret;
190
+ if (o.config.end) {
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ }
196
+ return db.ret;
197
+ };
198
+
199
+ /**
200
+ * 之前
201
+ * @param {String} target 目标
202
+ * @param {Object} ctx 请求上下文
203
+ * @param {Object} db 数据管理器
204
+ * @return {Object} 执行结果
205
+ */
206
+ Event.prototype.before = async function(target, ctx, db) {
207
+ return await this.run_sub(this.list_before, target, ctx, db);
208
+ };
209
+
210
+ /**
211
+ * 验证
212
+ * @param {String} target 目标
213
+ * @param {Object} ctx 请求上下文
214
+ * @param {Object} db 数据管理器
215
+ * @return {Object} 执行结果
216
+ */
217
+ Event.prototype.check = async function(target, ctx, db) {
218
+ return await this.run_sub(this.list_check, target, ctx, db);
219
+ };
220
+
221
+ /**
222
+ * 主要
223
+ * @param {String} target 目标
224
+ * @param {Object} ctx 请求上下文
225
+ * @param {Object} db 数据管理器
226
+ * @return {Object} 执行结果
227
+ */
228
+ Event.prototype.main = async function(target, ctx, db) {
229
+ return await this.run_sub(this.list_main, target, ctx, db);
230
+ };
231
+
232
+ /**
233
+ * 渲染
234
+ * @param {String} target 目标
235
+ * @param {Object} ctx 请求上下文
236
+ * @param {Object} db 数据管理器
237
+ * @return {Object} 执行结果
238
+ */
239
+ Event.prototype.render = async function(target, ctx, db) {
240
+ return await this.run_sub(this.list_render, target, ctx, db);
241
+ };
242
+
243
+ /**
244
+ * 之后
245
+ * @param {String} target 目标
246
+ * @param {Object} ctx 请求上下文
247
+ * @param {Object} db 数据管理器
248
+ * @return {Object} 执行结果
249
+ */
250
+ Event.prototype.after = async function(target, ctx, db) {
251
+ return await this.run_sub(this.list_after, target, ctx, db);
252
+ };
253
+
254
+ /**
255
+ * 执行事件
256
+ * @param {String} target 目标
257
+ * @param {Object} ctx 请求上下文
258
+ * @param {Object} db 数据管理器
259
+ * @return {Object} 执行结果
260
+ */
261
+ Event.prototype.run = async function(target, ctx, db) {
262
+ if (!db) {
263
+ db = {
264
+ ret: null
265
+ };
266
+ }
267
+ var ret = await this.before(target, ctx, db);
268
+ if (!ret) {
269
+ ret = await this.check(target, ctx, db);
270
+ if (!ret) {
271
+ ret = await this.main(target, ctx, db);
272
+ }
273
+ ret = await this.render(target, ctx, db);
274
+ if (ret) {
275
+ ret = await this.after(target, ctx, db);
276
+ }
277
+ }
278
+ return ret;
279
+ };
280
+
281
+ /**
282
+ * @description 获取事件
283
+ * @param {String} name 名称
284
+ * @param {String} event_type 事件类型
285
+ * @return {Object} 返回单项配置
286
+ */
287
+ Event.prototype.get = function(name, event_type = 'main') {
288
+ var obj;
289
+ var lt = this['list_' + event_type];
290
+ var len = lt.length;
291
+ for (var i = 0; i < len; i++) {
292
+ var o = lt[i];
293
+ if (name === o.config.name) {
294
+ obj = o;
295
+ break;
296
+ }
297
+ }
298
+ return obj;
299
+ };
300
+
301
+ /**
302
+ * @description 重载脚本和配置
303
+ * @param {String} file 文件名
304
+ * @return {String} 重载失败返回错误提示,重载成功返回null
305
+ */
306
+ Event.prototype.reload = async function(name, event_type = 'main') {
307
+ var o = this.get(name, event_type);
308
+ if (o) {
309
+ await o.exec('reload');
310
+ return null;
311
+ }
312
+ return '没有找到模块';
313
+ }
314
+
315
+ /**
316
+ * @module 导出Event类
317
+ */
318
+ module.exports = Event;
319
+
320
+ /**
321
+ * Event事件池
322
+ */
323
+ if (!$.pool.event) {
324
+ $.pool.event = {};
325
+ }
326
+
327
+ function event_admin(scope, title) {
328
+ if (!scope) {
329
+ scope = $.val.scope + '';
330
+ }
331
+ var obj = $.pool.event[scope];
332
+ if (!obj) {
333
+ $.pool.event[scope] = new Event(scope, title);
334
+ obj = $.pool.event[scope];
335
+ }
336
+ return obj;
337
+ }
338
+
339
+ /**
340
+ * Event管理器,用于创建缓存
341
+ * @param {String} scope 作用域
342
+ * @param {string} title 标题
343
+ * @return {Object} 返回一个缓存类
344
+ */
345
345
  $.event_admin = event_admin;