mm_os 3.3.0 → 4.0.0

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 (380) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +491 -99
  3. package/README_EN.md +498 -0
  4. package/adapter/adapter.js +431 -0
  5. package/adapter/custom_persistence.js +660 -0
  6. package/adapter/mqtt.js +273 -0
  7. package/adapter/socket.js +113 -0
  8. package/adapter/web.js +67 -0
  9. package/adapter/websocket.js +146 -0
  10. package/com/api/com.json +5 -0
  11. package/{core/com → com}/api/config.tpl.json +8 -8
  12. package/com/api/drive.js +708 -0
  13. package/com/api/index.js +198 -0
  14. package/com/api/oauth.js +200 -0
  15. package/com/api/script.tpl.js +32 -0
  16. package/com/cmd/README.md +11 -0
  17. package/com/cmd/com.json +5 -0
  18. package/com/cmd/config.tpl.json +122 -0
  19. package/com/cmd/drive.js +1548 -0
  20. package/com/cmd/index.js +1066 -0
  21. package/com/cmd/msg.json +48 -0
  22. package/com/cmd/nlp.js +525 -0
  23. package/com/cmd/script.tpl.js +32 -0
  24. package/com/db/com.json +5 -0
  25. package/com/db/drive.js +1999 -0
  26. package/com/db/index.js +242 -0
  27. package/com/event/com.json +5 -0
  28. package/{core/com → com}/event/config.tpl.json +8 -8
  29. package/com/event/drive.js +59 -0
  30. package/com/event/index.js +409 -0
  31. package/com/event/script.tpl.js +23 -0
  32. package/com/mqtt/com.json +5 -0
  33. package/{core/com → com}/mqtt/config.tpl.json +3 -5
  34. package/com/mqtt/drive.js +676 -0
  35. package/com/mqtt/index.js +822 -0
  36. package/com/mqtt/mm_mqtt.js +425 -0
  37. package/com/mqtt/script.tpl.js +723 -0
  38. package/com/nav/com.json +5 -0
  39. package/com/nav/config.tpl.json +84 -0
  40. package/com/nav/drive.js +702 -0
  41. package/com/nav/index.js +231 -0
  42. package/{core/com → com}/nav/tpl/admin_pc/page_config.vue +280 -280
  43. package/{core/com → com}/nav/tpl/admin_pc/page_config_form.vue +194 -194
  44. package/com/nav/tpl/admin_pc/page_form.vue +180 -0
  45. package/com/nav/tpl/admin_pc/page_view.vue +124 -0
  46. package/com/nav/tpl/dev_pc/page_default.vue +247 -0
  47. package/com/nav/tpl/dev_pc/page_type.vue +313 -0
  48. package/com/nav/tpl/home_pc/page_default.vue +234 -0
  49. package/com/nav/tpl/home_pc/page_form.vue +137 -0
  50. package/com/nav/tpl/home_pc/page_list.vue +234 -0
  51. package/com/nav/tpl/home_pc/page_nav.vue +221 -0
  52. package/com/nav/tpl/home_pc/page_type.vue +234 -0
  53. package/com/nav/tpl/home_pc/page_view.vue +125 -0
  54. package/com/nav/tpl/home_phone/page_channel.vue +234 -0
  55. package/com/nav/tpl/home_phone/page_default.vue +234 -0
  56. package/com/nav/tpl/home_phone/page_form.vue +137 -0
  57. package/com/nav/tpl/home_phone/page_nav.vue +237 -0
  58. package/com/nav/tpl/home_phone/page_type.vue +234 -0
  59. package/com/nav/tpl/home_phone/page_view.vue +125 -0
  60. package/com/nav/viewmodel.js +446 -0
  61. package/com/param/com.json +5 -0
  62. package/{core/com → com}/param/config.tpl.json +7 -1
  63. package/com/param/drive.js +502 -0
  64. package/com/param/index.js +155 -0
  65. package/com/param/script.tpl.js +12 -0
  66. package/com/pendant/com.json +5 -0
  67. package/{core/com/component → com/pendant}/config.tpl.json +15 -13
  68. package/com/pendant/drive.js +204 -0
  69. package/com/pendant/index.js +441 -0
  70. package/com/pendant/pendant.html +16 -0
  71. package/com/pendant/script.tpl.js +18 -0
  72. package/com/socket/com.json +5 -0
  73. package/com/socket/config.tpl.json +12 -0
  74. package/com/socket/drive.js +651 -0
  75. package/com/socket/index.js +351 -0
  76. package/com/socket/script.tpl.js +41 -0
  77. package/com/sql/com.json +5 -0
  78. package/{core/com → com}/sql/config.tpl.json +13 -9
  79. package/com/sql/drive.js +1259 -0
  80. package/com/sql/index.js +150 -0
  81. package/com/sql/script.tpl.js +47 -0
  82. package/com/static/com.json +5 -0
  83. package/{core/com → com}/static/config.tpl.json +10 -6
  84. package/com/static/drive.js +194 -0
  85. package/com/static/index.js +226 -0
  86. package/com/static/script.tpl.js +28 -0
  87. package/com/task/com.json +5 -0
  88. package/{core/com → com}/task/config.tpl.json +4 -6
  89. package/com/task/drive.js +405 -0
  90. package/com/task/index.js +148 -0
  91. package/com/task/script.tpl.js +37 -0
  92. package/com/template/com.json +5 -0
  93. package/com/template/config.tpl.json +16 -0
  94. package/com/template/drive.js +80 -0
  95. package/com/template/index.js +141 -0
  96. package/com.js +156 -0
  97. package/common/README.md +2 -0
  98. package/common/handler/msg/handler.json +22 -0
  99. package/common/handler/msg/index.js +23 -0
  100. package/common/handler/player/handler.json +22 -0
  101. package/common/handler/player/index.js +287 -0
  102. package/common/handler/user/handler.json +22 -0
  103. package/common/handler/user/index.js +23 -0
  104. package/common/middleware/web_after/index.js +29 -0
  105. package/common/middleware/web_after/middleware.json +9 -0
  106. package/common/middleware/web_base/index.js +113 -0
  107. package/common/middleware/web_base/middleware.json +19 -0
  108. package/common/middleware/web_before/index.js +33 -0
  109. package/common/middleware/web_before/middleware.json +9 -0
  110. package/common/middleware/web_cors/index.js +87 -0
  111. package/common/middleware/web_cors/middleware.json +24 -0
  112. package/common/middleware/web_error/index.js +119 -0
  113. package/common/middleware/web_error/middleware.json +18 -0
  114. package/common/middleware/web_ip/index.js +15 -0
  115. package/common/middleware/web_ip/middleware.json +14 -0
  116. package/common/middleware/web_logger/index.js +156 -0
  117. package/common/middleware/web_logger/middleware.json +14 -0
  118. package/common/middleware/web_main/index.js +24 -0
  119. package/common/middleware/web_main/middleware.json +9 -0
  120. package/common/middleware/web_static/index.js +73 -0
  121. package/common/middleware/web_static/middleware.json +54 -0
  122. package/common/middleware/web_waf/index.js +385 -0
  123. package/common/middleware/web_waf/middleware.json +13 -0
  124. package/common/model/msg/index.js +88 -0
  125. package/common/model/msg/model.json +401 -0
  126. package/common/model/player/index.js +63 -0
  127. package/common/model/player/model.json +185 -0
  128. package/common/model/user/index.js +11 -0
  129. package/common/model/user/model.json +219 -0
  130. package/core/app/config.tpl.json +67 -0
  131. package/core/app/index.js +632 -0
  132. package/core/app/script.tpl.js +52 -0
  133. package/core/channel/index.js +899 -0
  134. package/core/channel/matcher.js +585 -0
  135. package/core/com/config.tpl.json +16 -0
  136. package/core/com/index.js +74 -0
  137. package/core/com/script.tpl.js +5 -0
  138. package/core/component/component.js +42 -0
  139. package/core/component/config.tpl.json +63 -0
  140. package/core/component/index.js +273 -0
  141. package/core/component/script.tpl.js +19 -0
  142. package/core/controller/config.tpl.json +14 -0
  143. package/core/controller/index.js +373 -0
  144. package/core/controller/script.tpl.js +27 -0
  145. package/core/factory/config.tpl.json +14 -0
  146. package/core/factory/entity.js +275 -0
  147. package/core/factory/index.js +241 -0
  148. package/core/factory/script.tpl.js +16 -0
  149. package/core/game/bat/index.js +137 -0
  150. package/core/game/bat/world.js +622 -0
  151. package/core/game/config.tpl.json +16 -0
  152. package/core/game/entity_admin.js +230 -0
  153. package/core/game/index.js +186 -0
  154. package/core/handler/config.tpl.json +22 -0
  155. package/core/handler/index.js +181 -0
  156. package/core/handler/script.tpl.js +23 -0
  157. package/core/logic/config.tpl.json +14 -0
  158. package/core/logic/index.js +59 -0
  159. package/core/logic/script.tpl.js +19 -0
  160. package/core/middleware/config.tpl.json +16 -0
  161. package/core/middleware/index.js +125 -0
  162. package/core/middleware/script.tpl.js +37 -0
  163. package/core/mod/config.tpl.json +22 -0
  164. package/core/mod/index.js +130 -0
  165. package/core/mod/script.tpl.js +34 -0
  166. package/core/model/config.tpl.json +219 -0
  167. package/core/model/index.js +272 -0
  168. package/core/model/model.js +27 -0
  169. package/core/model/script.tpl.js +20 -0
  170. package/core/notifier/config.tpl.json +14 -0
  171. package/core/notifier/index.js +77 -0
  172. package/core/notifier/script.tpl.js +20 -0
  173. package/core/plugin/config.tpl.json +24 -0
  174. package/core/plugin/index.js +232 -0
  175. package/core/plugin/script.tpl.js +51 -0
  176. package/core/pusher/config.tpl.json +14 -0
  177. package/core/pusher/index.js +161 -0
  178. package/core/pusher/script.tpl.js +20 -0
  179. package/core/room/bat/index.js +170 -0
  180. package/core/room/bat/room.js +524 -0
  181. package/core/room/config.tpl.json +20 -0
  182. package/core/room/index.js +249 -0
  183. package/core/room/room.js +61 -0
  184. package/core/scene/config.tpl.json +14 -0
  185. package/core/scene/index.js +466 -0
  186. package/core/scene/loop.js +1255 -0
  187. package/core/scene/map.js +28 -0
  188. package/core/scene/script.tpl.js +22 -0
  189. package/core/sender/config.tpl.json +14 -0
  190. package/core/sender/index.js +79 -0
  191. package/core/sender/script.tpl.js +20 -0
  192. package/core/service/config.tpl.json +14 -0
  193. package/core/service/index.js +100 -0
  194. package/core/service/script.tpl.js +25 -0
  195. package/core/store/config.tpl.json +26 -0
  196. package/core/store/index.js +1755 -0
  197. package/core/store/script.tpl.js +22 -0
  198. package/core/store/sql.js +1464 -0
  199. package/core/system/config.tpl.json +18 -0
  200. package/core/system/index.js +312 -0
  201. package/core/system/script.tpl.js +77 -0
  202. package/core/view/config.tpl.json +14 -0
  203. package/core/view/index.js +91 -0
  204. package/core/view/script.tpl.js +20 -0
  205. package/core/zone/bat/index.js +725 -0
  206. package/core/zone/config.tpl.json +54 -0
  207. package/core/zone/index.js +614 -0
  208. package/core/zone/script.tpl.js +10 -0
  209. package/core/zone/zone_bat.js +136 -0
  210. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +24 -0
  211. package/index.js +17 -314
  212. package/os.js +57 -0
  213. package/package.json +60 -58
  214. package/server.js +598 -0
  215. package/README.en.md +0 -36
  216. package/conf.json +0 -3
  217. package/core/base/mqtt/index.js +0 -1107
  218. package/core/base/mqtt/lib.js +0 -40
  219. package/core/base/web/index.js +0 -243
  220. package/core/com/api/com.json +0 -4
  221. package/core/com/api/drive.js +0 -668
  222. package/core/com/api/index.js +0 -108
  223. package/core/com/api/oauth.js +0 -158
  224. package/core/com/api/script.js +0 -32
  225. package/core/com/app/README.md +0 -3
  226. package/core/com/app/com.json +0 -4
  227. package/core/com/app/config.tpl.json +0 -16
  228. package/core/com/app/drive.js +0 -309
  229. package/core/com/app/index.js +0 -211
  230. package/core/com/app/script.js +0 -155
  231. package/core/com/cmd/com.json +0 -4
  232. package/core/com/cmd/config.tpl.json +0 -66
  233. package/core/com/cmd/drive.js +0 -513
  234. package/core/com/cmd/index.js +0 -354
  235. package/core/com/cmd/old/5w2h.js +0 -54
  236. package/core/com/cmd/old/drive.js +0 -423
  237. package/core/com/cmd/script.js +0 -11
  238. package/core/com/component/README.md +0 -3
  239. package/core/com/component/com.json +0 -4
  240. package/core/com/component/component.html +0 -16
  241. package/core/com/component/drive.js +0 -197
  242. package/core/com/component/index.js +0 -312
  243. package/core/com/component/script.js +0 -18
  244. package/core/com/db/com.json +0 -4
  245. package/core/com/db/drive.js +0 -1160
  246. package/core/com/db/index.js +0 -176
  247. package/core/com/event/com.json +0 -4
  248. package/core/com/event/drive.js +0 -133
  249. package/core/com/event/index.js +0 -345
  250. package/core/com/event/script.js +0 -26
  251. package/core/com/eventer/com.js +0 -477
  252. package/core/com/eventer/com.json +0 -4
  253. package/core/com/middleware/com.js +0 -153
  254. package/core/com/middleware/com.json +0 -4
  255. package/core/com/middleware/config.tpl.json +0 -8
  256. package/core/com/middleware/script.js +0 -9
  257. package/core/com/mqtt/com.json +0 -4
  258. package/core/com/mqtt/drive.js +0 -600
  259. package/core/com/mqtt/index.js +0 -572
  260. package/core/com/mqtt/mm_mqtt.js +0 -330
  261. package/core/com/mqtt/script.js +0 -604
  262. package/core/com/msg/com.js +0 -296
  263. package/core/com/msg/com.json +0 -4
  264. package/core/com/nav/com.json +0 -4
  265. package/core/com/nav/config.tpl.json +0 -75
  266. package/core/com/nav/drive.js +0 -549
  267. package/core/com/nav/index.js +0 -182
  268. package/core/com/nav/tpl/admin_pc/page_form.vue +0 -180
  269. package/core/com/nav/tpl/admin_pc/page_view.vue +0 -124
  270. package/core/com/nav/tpl/dev_pc/page_default.vue +0 -247
  271. package/core/com/nav/tpl/dev_pc/page_type.vue +0 -313
  272. package/core/com/nav/tpl/home_pc/page_default.vue +0 -234
  273. package/core/com/nav/tpl/home_pc/page_form.vue +0 -137
  274. package/core/com/nav/tpl/home_pc/page_list.vue +0 -234
  275. package/core/com/nav/tpl/home_pc/page_nav.vue +0 -221
  276. package/core/com/nav/tpl/home_pc/page_type.vue +0 -234
  277. package/core/com/nav/tpl/home_pc/page_view.vue +0 -125
  278. package/core/com/nav/tpl/home_phone/page_channel.vue +0 -234
  279. package/core/com/nav/tpl/home_phone/page_default.vue +0 -234
  280. package/core/com/nav/tpl/home_phone/page_form.vue +0 -137
  281. package/core/com/nav/tpl/home_phone/page_nav.vue +0 -237
  282. package/core/com/nav/tpl/home_phone/page_type.vue +0 -234
  283. package/core/com/nav/tpl/home_phone/page_view.vue +0 -125
  284. package/core/com/nav/viewmodel.js +0 -296
  285. package/core/com/param/drive.js +0 -366
  286. package/core/com/param/index.js +0 -80
  287. package/core/com/param/script.js +0 -12
  288. package/core/com/param/test.js +0 -98
  289. package/core/com/plugin/README.md +0 -3
  290. package/core/com/plugin/com.json +0 -4
  291. package/core/com/plugin/config.tpl.json +0 -26
  292. package/core/com/plugin/drive.js +0 -536
  293. package/core/com/plugin/index.js +0 -259
  294. package/core/com/plugin/script.js +0 -213
  295. package/core/com/rpc/com.json +0 -4
  296. package/core/com/rpc/drive.js +0 -160
  297. package/core/com/rpc/index.js +0 -87
  298. package/core/com/rpc/rpc.js +0 -118
  299. package/core/com/socket/com.json +0 -4
  300. package/core/com/socket/config.tpl.json +0 -14
  301. package/core/com/socket/drive.js +0 -403
  302. package/core/com/socket/index.js +0 -62
  303. package/core/com/socket/script.js +0 -42
  304. package/core/com/sql/drive.js +0 -1087
  305. package/core/com/sql/index.js +0 -83
  306. package/core/com/sql/script.js +0 -48
  307. package/core/com/static/com.json +0 -4
  308. package/core/com/static/drive.js +0 -220
  309. package/core/com/static/index.js +0 -149
  310. package/core/com/static/script.js +0 -28
  311. package/core/com/task/com.json +0 -4
  312. package/core/com/task/drive.js +0 -403
  313. package/core/com/task/index.js +0 -110
  314. package/core/com/task/script.js +0 -37
  315. package/core/com/timer/com.js +0 -217
  316. package/core/com/timer/com.json +0 -4
  317. package/core/com/tpl/com.js +0 -19
  318. package/core/com/tpl/com.json +0 -4
  319. package/lib/actions.js +0 -50
  320. package/lib/base.js +0 -361
  321. package/lib/com.js +0 -29
  322. package/lib/ref.js +0 -121
  323. package/middleware/mqtt_base/index.js +0 -10
  324. package/middleware/mqtt_base/middleware.json +0 -10
  325. package/middleware/performance/index.js +0 -151
  326. package/middleware/performance/middleware.json +0 -16
  327. package/middleware/security_audit/index.js +0 -549
  328. package/middleware/security_audit/middleware.json +0 -48
  329. package/middleware/security_headers/index.js +0 -487
  330. package/middleware/security_headers/middleware.json +0 -45
  331. package/middleware/waf/index.js +0 -348
  332. package/middleware/waf/middleware.json +0 -10
  333. package/middleware/waf_ddos/index.js +0 -520
  334. package/middleware/waf_ddos/middleware.json +0 -38
  335. package/middleware/waf_ip/index.js +0 -379
  336. package/middleware/waf_ip/middleware.json +0 -49
  337. package/middleware/waf_xss/index.js +0 -269
  338. package/middleware/waf_xss/middleware.json +0 -18
  339. package/middleware/web_after/index.js +0 -33
  340. package/middleware/web_after/middleware.json +0 -9
  341. package/middleware/web_base/index.js +0 -90
  342. package/middleware/web_base/middleware.json +0 -9
  343. package/middleware/web_before/index.js +0 -27
  344. package/middleware/web_before/middleware.json +0 -9
  345. package/middleware/web_check/index.js +0 -28
  346. package/middleware/web_check/middleware.json +0 -9
  347. package/middleware/web_main/index.js +0 -28
  348. package/middleware/web_main/middleware.json +0 -9
  349. package/middleware/web_proxy/index.js +0 -37
  350. package/middleware/web_proxy/middleware.json +0 -9
  351. package/middleware/web_render/index.js +0 -87
  352. package/middleware/web_render/middleware.json +0 -9
  353. package/middleware/web_socket/index.js +0 -34
  354. package/middleware/web_socket/middleware.json +0 -9
  355. package/middleware/web_static/index.js +0 -115
  356. package/middleware/web_static/middleware.json +0 -9
  357. /package/{core/com → com}/api/README.md +0 -0
  358. /package/{core/com → com}/db/README.md +0 -0
  359. /package/{core/com → com}/event/README.md +0 -0
  360. /package/{core/com → com}/mqtt/README.md +0 -0
  361. /package/{core/com → com}/nav/README.md +0 -0
  362. /package/{core/com → com}/nav/tpl/admin_pc/page_channel.vue +0 -0
  363. /package/{core/com → com}/nav/tpl/admin_pc/page_default.vue +0 -0
  364. /package/{core/com → com}/nav/tpl/admin_pc/page_lang.vue +0 -0
  365. /package/{core/com → com}/nav/tpl/admin_pc/page_nav.vue +0 -0
  366. /package/{core/com → com}/nav/tpl/admin_pc/page_table.vue +0 -0
  367. /package/{core/com → com}/nav/tpl/admin_pc/page_type.vue +0 -0
  368. /package/{core/com → com}/nav/tpl/dev_pc/page_channel.vue +0 -0
  369. /package/{core/com → com}/nav/tpl/dev_pc/page_config.vue +0 -0
  370. /package/{core/com → com}/nav/tpl/dev_pc/page_form.vue +0 -0
  371. /package/{core/com → com}/nav/tpl/dev_pc/page_nav.vue +0 -0
  372. /package/{core/com → com}/nav/tpl/dev_pc/page_table.vue +0 -0
  373. /package/{core/com → com}/nav/tpl/home_pc/page_channel.vue +0 -0
  374. /package/{core/com → com}/nav/tpl/home_phone/page_list.vue +0 -0
  375. /package/{core/com → com}/param/README.md +0 -0
  376. /package/{core/com/cmd → com/pendant}/README.md +0 -0
  377. /package/{core/com → com}/socket/README.md +0 -0
  378. /package/{core/com → com}/sql/README.md +0 -0
  379. /package/{core/com → com}/static/README.md +0 -0
  380. /package/{core/com → com}/task/README.md +0 -0
@@ -1,549 +0,0 @@
1
- const mm_expand = require('mm_expand');
2
- const path = require('path');
3
- const fs = require('fs');
4
-
5
- /**
6
- * 综合日志审计系统中间件
7
- * 合并了原log中间件的轻量级HTTP日志和security_audit的安全审计功能
8
- */
9
- class Middleware {
10
- /**
11
- * 构造函数
12
- */
13
- constructor() {
14
- this.logFiles = new Map();
15
- this.default = {
16
- // 启用日志审计
17
- enable: true,
18
- // 日志模式: 'light'(轻量模式,仅记录基本HTTP信息), 'full'(完整审计模式)
19
- log_mode: 'light',
20
- // 日志级别: debug, info, warn, error, critical
21
- log_level: 'info',
22
- // 日志输出方式: file, database, both
23
- output: 'file',
24
- // 文件日志配置
25
- file: {
26
- // 日志目录
27
- dir: './log/security',
28
- // 是否按日期分割日志
29
- daily_rotate: true,
30
- // 日志保留天数
31
- max_days: 30,
32
- // 是否压缩旧日志
33
- compress: true
34
- },
35
- // 数据库日志配置
36
- database: {
37
- // 数据库类型: mongodb, mysql
38
- type: 'mongodb',
39
- // 表名或集合名
40
- collection: 'security_audit_logs'
41
- },
42
- // 需要审计的事件类型(仅在full模式下有效)
43
- events: {
44
- // 认证事件
45
- authentication: true,
46
- // 授权事件
47
- authorization: true,
48
- // 数据访问事件
49
- data_access: true,
50
- // 数据修改事件
51
- data_modification: true,
52
- // 系统事件
53
- system: true,
54
- // 安全事件
55
- security: true,
56
- // API访问事件
57
- api_access: true
58
- },
59
- // 忽略的路径
60
- ignore_paths: ['/health', '/favicon.ico'],
61
- // 敏感数据字段列表,记录时会被脱敏
62
- sensitive_fields: [
63
- 'password', 'passwd', 'pwd',
64
- 'token', 'key', 'secret',
65
- 'credit_card', 'cc', 'cvv',
66
- 'phone', 'mobile',
67
- 'id_card', 'ssn', 'social'
68
- ],
69
- // 最大日志大小(字节)
70
- max_log_size: 10485760, // 10MB
71
- // 是否记录请求体
72
- log_request_body: true,
73
- // 是否记录响应体
74
- log_response_body: false,
75
- // 是否记录详细的用户信息
76
- log_user_details: true,
77
- // 是否记录IP地址
78
- log_ip_address: true,
79
- // 是否记录User-Agent
80
- log_user_agent: true,
81
- // 轻量模式下请求体最大长度
82
- light_log_max_body_length: 1024
83
- };
84
- }
85
-
86
- /**
87
- * 初始化中间件
88
- * @param {Object} config 配置项
89
- * @param {Object} next 下一个中间件
90
- */
91
- init(config, next) {
92
- config = Object.assign({}, this.default, config);
93
- this.config = config;
94
-
95
- // 只有在非轻量模式或输出到文件时才创建日志目录和启动轮转检查
96
- if (config.enable && config.log_mode !== 'light' &&
97
- (config.output === 'file' || config.output === 'both')) {
98
- this.ensureLogDirExists();
99
- this.startLogRotationCheck();
100
- }
101
-
102
- return next(config);
103
- }
104
-
105
- /**
106
- * 执行中间件
107
- * @param {Object} ctx Koa上下文
108
- * @param {Function} next 下一个中间件
109
- */
110
- async run(ctx, next) {
111
- const config = this.config;
112
-
113
- if (!config.enable) {
114
- return await next();
115
- }
116
-
117
- const path = ctx.path;
118
-
119
- // 检查是否应该忽略该路径
120
- if (config.ignore_paths.some(p => path.startsWith(p))) {
121
- return await next();
122
- }
123
-
124
- // 根据日志模式执行不同的处理逻辑
125
- if (config.log_mode === 'light') {
126
- // 轻量模式:仅记录基本HTTP信息(合并了原log中间件的功能)
127
- await this.handleLightLog(ctx, next);
128
- } else {
129
- // 完整审计模式:记录详细的安全审计日志
130
- await this.handleFullAudit(ctx, next);
131
- }
132
- }
133
-
134
- /**
135
- * 处理轻量级日志(原log中间件功能)
136
- * @param {Object} ctx Koa上下文
137
- * @param {Function} next 下一个中间件
138
- */
139
- async handleLightLog(ctx, next) {
140
- try {
141
- const config = this.config;
142
- const url = ctx.path + ctx.querystring;
143
- let body = "";
144
-
145
- if (config.log_request_body && ctx.request.body) {
146
- try {
147
- body = JSON.stringify(ctx.request.body);
148
- if (body.length > config.light_log_max_body_length) {
149
- body = body.substring(0, config.light_log_max_body_length) + "..."
150
- }
151
- } catch (jsonError) {
152
- body = "[无法序列化请求体]";
153
- if ($.log && $.log.error) {
154
- $.log.error('日志中间件JSON序列化错误:', jsonError);
155
- }
156
- }
157
- }
158
-
159
- // 使用系统日志记录HTTP请求
160
- if ($.log && $.log.http) {
161
- $.log.http(`${ctx.method}\t${url}\t${body}`);
162
- }
163
-
164
- await next();
165
- } catch (error) {
166
- // 确保请求可以继续处理
167
- if ($.log && $.log.error) {
168
- $.log.error('log中间件错误:', error);
169
- }
170
- await next();
171
- }
172
- }
173
-
174
- /**
175
- * 处理完整审计日志(原security_audit功能)
176
- * @param {Object} ctx Koa上下文
177
- * @param {Function} next 下一个中间件
178
- */
179
- async handleFullAudit(ctx, next) {
180
- const config = this.config;
181
-
182
- // 记录请求开始时间
183
- const startTime = Date.now();
184
- const requestBody = config.log_request_body ? this.sanitizeData(ctx.request.body) : null;
185
-
186
- try {
187
- await next();
188
-
189
- // 记录API访问事件
190
- if (config.events.api_access) {
191
- const logData = this.createApiAccessLog(ctx, startTime, requestBody);
192
- this.logSecurityEvent('info', 'API_ACCESS', logData);
193
- }
194
- } catch (error) {
195
- // 记录错误事件
196
- const errorLog = this.createErrorLog(ctx, error, startTime, requestBody);
197
- this.logSecurityEvent('error', 'REQUEST_ERROR', errorLog);
198
- throw error;
199
- }
200
- }
201
-
202
- /**
203
- * 确保日志目录存在
204
- */
205
- ensureLogDirExists() {
206
- const logDir = this.getLogDir();
207
- if (!fs.existsSync(logDir)) {
208
- try {
209
- fs.mkdirSync(logDir, { recursive: true });
210
- } catch (error) {
211
- console.error('Failed to create log directory:', error);
212
- }
213
- }
214
- }
215
-
216
- // 其余方法保持不变
217
- getLogDir() {
218
- const baseDir = this.config.file.dir;
219
- return baseDir.startsWith('/') ? baseDir : path.join($.runPath, baseDir);
220
- }
221
-
222
- getLogFileName() {
223
- const config = this.config;
224
- let fileName = 'security_audit';
225
-
226
- if (config.file.daily_rotate) {
227
- const date = new Date();
228
- const dateStr = date.toISOString().split('T')[0];
229
- fileName += `_${dateStr}`;
230
- }
231
-
232
- fileName += '.log';
233
- return path.join(this.getLogDir(), fileName);
234
- }
235
-
236
- async logSecurityEvent(level, eventType, data) {
237
- if (!this.shouldLogLevel(level)) {
238
- return;
239
- }
240
-
241
- const logEntry = {
242
- timestamp: new Date().toISOString(),
243
- level: level,
244
- event_type: eventType,
245
- ...data
246
- };
247
-
248
- if (this.config.output === 'file' || this.config.output === 'both') {
249
- this.writeToFile(logEntry);
250
- }
251
-
252
- if (this.config.output === 'database' || this.config.output === 'both') {
253
- await this.writeToDatabase(logEntry);
254
- }
255
-
256
- if (level === 'error' || level === 'critical') {
257
- console.error('SECURITY AUDIT:', JSON.stringify(logEntry));
258
- } else if (level === 'warn') {
259
- console.warn('SECURITY AUDIT:', JSON.stringify(logEntry));
260
- }
261
- }
262
-
263
- shouldLogLevel(level) {
264
- const levels = ['debug', 'info', 'warn', 'error', 'critical'];
265
- const configLevelIndex = levels.indexOf(this.config.log_level);
266
- const logLevelIndex = levels.indexOf(level);
267
- return logLevelIndex >= configLevelIndex;
268
- }
269
-
270
- writeToFile(logEntry) {
271
- try {
272
- const logFile = this.getLogFileName();
273
- const logLine = JSON.stringify(logEntry) + '\n';
274
-
275
- fs.appendFileSync(logFile, logLine, 'utf8');
276
-
277
- this.checkLogFileSize(logFile);
278
- } catch (error) {
279
- console.error('Failed to write security log to file:', error);
280
- }
281
- }
282
-
283
- async writeToDatabase(logEntry) {
284
- try {
285
- const config = this.config.database;
286
-
287
- if (config.type === 'mongodb' && $.mongodb_admin) {
288
- const db = $.mongodb_admin('sys');
289
- await db.save(config.collection, logEntry);
290
- } else if (config.type === 'mysql' && $.mysql_admin) {
291
- const db = $.mysql_admin('sys');
292
- await db.insert(config.collection, logEntry);
293
- }
294
- } catch (error) {
295
- console.error('Failed to write security log to database:', error);
296
- }
297
- }
298
-
299
- getClientIp(ctx) {
300
- const headers = ctx.headers;
301
- const xForwardedFor = headers['x-forwarded-for'];
302
- if (xForwardedFor) {
303
- const ips = xForwardedFor.split(',').map(ip => ip.trim());
304
- for (let i = 0; i < ips.length; i++) {
305
- const ip = ips[i];
306
- if (ip && ip !== 'unknown' && ip !== '127.0.0.1' && ip !== '::1') {
307
- return ip;
308
- }
309
- }
310
- }
311
-
312
- return headers['x-real-ip'] ||
313
- headers['x-client-ip'] ||
314
- headers['cf-connecting-ip'] ||
315
- headers['fastly-client-ip'] ||
316
- headers['true-client-ip'] ||
317
- ctx.ip;
318
- }
319
-
320
- createApiAccessLog(ctx, startTime, requestBody) {
321
- const config = this.config;
322
- const endTime = Date.now();
323
- const responseTime = endTime - startTime;
324
-
325
- let logData = {
326
- request: {
327
- method: ctx.method,
328
- path: ctx.path,
329
- query: this.sanitizeData(ctx.query),
330
- headers: this.sanitizeHeaders(ctx.headers),
331
- response_time: responseTime
332
- },
333
- response: {
334
- status: ctx.status
335
- }
336
- };
337
-
338
- if (requestBody) {
339
- logData.request.body = requestBody;
340
- }
341
-
342
- if (config.log_response_body && ctx.body && typeof ctx.body === 'object') {
343
- logData.response.body = this.sanitizeData(ctx.body);
344
- }
345
-
346
- if (config.log_ip_address) {
347
- logData.client = {
348
- ip: this.getClientIp(ctx)
349
- };
350
- }
351
-
352
- if (config.log_user_agent && ctx.headers['user-agent']) {
353
- if (!logData.client) logData.client = {};
354
- logData.client.user_agent = ctx.headers['user-agent'];
355
- }
356
-
357
- if (config.log_user_details && ctx.user) {
358
- logData.user = this.sanitizeUserInfo(ctx.user);
359
- }
360
-
361
- return logData;
362
- }
363
-
364
- createErrorLog(ctx, error, startTime, requestBody) {
365
- const baseLog = this.createApiAccessLog(ctx, startTime, requestBody);
366
-
367
- return {
368
- ...baseLog,
369
- error: {
370
- name: error.name,
371
- message: error.message,
372
- stack: error.stack ? error.stack.substring(0, 1000) : null
373
- }
374
- };
375
- }
376
-
377
- sanitizeData(data) {
378
- if (!data || typeof data !== 'object') {
379
- return data;
380
- }
381
-
382
- const sensitiveFields = this.config.sensitive_fields;
383
- const result = Array.isArray(data) ? [] : {};
384
-
385
- for (const key in data) {
386
- const value = data[key];
387
- const lowerKey = key.toLowerCase();
388
-
389
- const isSensitive = sensitiveFields.some(field => lowerKey.includes(field));
390
-
391
- if (isSensitive) {
392
- result[key] = this.maskSensitiveValue(value);
393
- } else if (typeof value === 'object' && value !== null) {
394
- result[key] = this.sanitizeData(value);
395
- } else {
396
- result[key] = value;
397
- }
398
- }
399
-
400
- return result;
401
- }
402
-
403
- maskSensitiveValue(value) {
404
- if (typeof value === 'string') {
405
- if (value.length <= 4) {
406
- return '****';
407
- } else if (value.length <= 10) {
408
- return value.charAt(0) + '*'.repeat(value.length - 2) + value.charAt(value.length - 1);
409
- } else {
410
- return value.substring(0, 3) + '*'.repeat(value.length - 6) + value.substring(value.length - 3);
411
- }
412
- }
413
- return '******';
414
- }
415
-
416
- sanitizeHeaders(headers) {
417
- if (!headers) return {};
418
-
419
- const result = {};
420
- const sensitiveHeaders = ['authorization', 'cookie', 'x-api-key'];
421
-
422
- for (const key in headers) {
423
- const lowerKey = key.toLowerCase();
424
- if (sensitiveHeaders.some(h => lowerKey.includes(h))) {
425
- result[key] = '****';
426
- } else {
427
- result[key] = headers[key];
428
- }
429
- }
430
-
431
- return result;
432
- }
433
-
434
- sanitizeUserInfo(userInfo) {
435
- return this.sanitizeData(userInfo);
436
- }
437
-
438
- checkLogFileSize(logFile) {
439
- try {
440
- const stats = fs.statSync(logFile);
441
- if (stats.size > this.config.max_log_size) {
442
- this.rotateLogFile(logFile);
443
- }
444
- } catch (error) {
445
- console.error('Failed to check log file size:', error);
446
- }
447
- }
448
-
449
- rotateLogFile(logFile) {
450
- try {
451
- const timestamp = new Date().getTime();
452
- const rotatedFile = `${logFile}.${timestamp}`;
453
-
454
- fs.renameSync(logFile, rotatedFile);
455
-
456
- if (this.config.file.compress) {
457
- console.log(`Log file rotated: ${rotatedFile}`);
458
- }
459
- } catch (error) {
460
- console.error('Failed to rotate log file:', error);
461
- }
462
- }
463
-
464
- startLogRotationCheck() {
465
- setInterval(() => {
466
- this.cleanupOldLogs();
467
- }, 3600000);
468
- }
469
-
470
- cleanupOldLogs() {
471
- try {
472
- const logDir = this.getLogDir();
473
- const maxDays = this.config.file.max_days;
474
- const now = Date.now();
475
- const maxAge = maxDays * 24 * 60 * 60 * 1000;
476
-
477
- const files = fs.readdirSync(logDir);
478
- for (const file of files) {
479
- if (file.startsWith('security_audit') && (file.endsWith('.log') || file.endsWith('.log.'))) {
480
- const filePath = path.join(logDir, file);
481
- const stats = fs.statSync(filePath);
482
-
483
- if (now - stats.mtimeMs > maxAge) {
484
- fs.unlinkSync(filePath);
485
- console.log(`Old log file deleted: ${filePath}`);
486
- }
487
- }
488
- }
489
- } catch (error) {
490
- console.error('Failed to cleanup old logs:', error);
491
- }
492
- }
493
-
494
- logAuthentication(action, username, success, additionalInfo = {}) {
495
- if (this.config.events.authentication) {
496
- this.logSecurityEvent(
497
- success ? 'info' : 'warn',
498
- 'AUTHENTICATION',
499
- {
500
- action: action,
501
- username: username,
502
- success: success,
503
- ...additionalInfo
504
- }
505
- );
506
- }
507
- }
508
-
509
- logAuthorization(username, resource, action, success, additionalInfo = {}) {
510
- if (this.config.events.authorization) {
511
- this.logSecurityEvent(
512
- success ? 'info' : 'warn',
513
- 'AUTHORIZATION',
514
- {
515
- username: username,
516
- resource: resource,
517
- action: action,
518
- success: success,
519
- ...additionalInfo
520
- }
521
- );
522
- }
523
- }
524
- }
525
-
526
- // 创建中间件实例
527
- const middleware = new Middleware();
528
-
529
- // 导出符合系统期望的函数
530
- exports = module.exports = function(server, config) {
531
- // 初始化中间件
532
- const middlewareHandler = middleware.init(config, function(config) {
533
- // 返回中间件的run方法作为实际的处理函数
534
- return function(ctx, next) {
535
- return middleware.run(ctx, next);
536
- };
537
- });
538
-
539
- // 直接使用server.use注册中间件
540
- server.use(middlewareHandler);
541
-
542
- return server;
543
- };
544
-
545
- // 保留原始审计方法,供其他模块调用
546
- exports.logAuthentication = middleware.logAuthentication.bind(middleware);
547
- exports.logAuthorization = middleware.logAuthorization.bind(middleware);
548
- exports.logSecurityEvent = middleware.logSecurityEvent.bind(middleware);
549
- exports.middleware = middleware;
@@ -1,48 +0,0 @@
1
- {
2
- "name": "security_audit",
3
- "title": "综合日志审计系统",
4
- "type": "security",
5
- "status": 1,
6
- "sort": 20,
7
- "description": "合并了轻量级HTTP请求日志和安全审计功能的综合日志审计系统",
8
- "config": {
9
- "enable": true,
10
- "log_mode": "light",
11
- "log_level": "info",
12
- "output": "file",
13
- "file": {
14
- "dir": "./log/security",
15
- "daily_rotate": true,
16
- "max_days": 30,
17
- "compress": true
18
- },
19
- "database": {
20
- "type": "mongodb",
21
- "collection": "security_audit_logs"
22
- },
23
- "events": {
24
- "authentication": true,
25
- "authorization": true,
26
- "data_access": true,
27
- "data_modification": true,
28
- "system": true,
29
- "security": true,
30
- "api_access": true
31
- },
32
- "ignore_paths": ["/health", "/favicon.ico", "/static/"],
33
- "sensitive_fields": [
34
- "password", "passwd", "pwd",
35
- "token", "key", "secret",
36
- "credit_card", "cc", "cvv",
37
- "phone", "mobile",
38
- "id_card", "ssn", "social"
39
- ],
40
- "max_log_size": 10485760,
41
- "log_request_body": true,
42
- "log_response_body": false,
43
- "log_user_details": true,
44
- "log_ip_address": true,
45
- "log_user_agent": true,
46
- "light_log_max_body_length": 1024
47
- }
48
- }