mm_os 3.3.1 → 4.0.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 (380) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +498 -99
  3. package/README_EN.md +505 -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/{core/com → com}/event/README.md +4 -4
  28. package/com/event/com.json +5 -0
  29. package/{core/com → com}/event/config.tpl.json +18 -18
  30. package/com/event/drive.js +59 -0
  31. package/com/event/index.js +409 -0
  32. package/com/event/script.tpl.js +23 -0
  33. package/com/mqtt/com.json +5 -0
  34. package/{core/com → com}/mqtt/config.tpl.json +3 -5
  35. package/com/mqtt/drive.js +676 -0
  36. package/com/mqtt/index.js +822 -0
  37. package/com/mqtt/mm_mqtt.js +425 -0
  38. package/com/mqtt/script.tpl.js +723 -0
  39. package/com/nav/com.json +5 -0
  40. package/com/nav/config.tpl.json +84 -0
  41. package/com/nav/drive.js +702 -0
  42. package/com/nav/index.js +231 -0
  43. package/{core/com → com}/nav/tpl/admin_pc/page_config.vue +280 -280
  44. package/{core/com → com}/nav/tpl/admin_pc/page_config_form.vue +194 -194
  45. package/com/nav/tpl/admin_pc/page_form.vue +180 -0
  46. package/com/nav/tpl/admin_pc/page_view.vue +124 -0
  47. package/com/nav/tpl/dev_pc/page_default.vue +247 -0
  48. package/com/nav/tpl/dev_pc/page_type.vue +313 -0
  49. package/com/nav/tpl/home_pc/page_default.vue +234 -0
  50. package/com/nav/tpl/home_pc/page_form.vue +137 -0
  51. package/com/nav/tpl/home_pc/page_list.vue +234 -0
  52. package/com/nav/tpl/home_pc/page_nav.vue +221 -0
  53. package/com/nav/tpl/home_pc/page_type.vue +234 -0
  54. package/com/nav/tpl/home_pc/page_view.vue +125 -0
  55. package/com/nav/tpl/home_phone/page_channel.vue +234 -0
  56. package/com/nav/tpl/home_phone/page_default.vue +234 -0
  57. package/com/nav/tpl/home_phone/page_form.vue +137 -0
  58. package/com/nav/tpl/home_phone/page_nav.vue +237 -0
  59. package/com/nav/tpl/home_phone/page_type.vue +234 -0
  60. package/com/nav/tpl/home_phone/page_view.vue +125 -0
  61. package/com/nav/viewmodel.js +446 -0
  62. package/com/param/com.json +5 -0
  63. package/{core/com → com}/param/config.tpl.json +7 -1
  64. package/com/param/drive.js +502 -0
  65. package/com/param/index.js +155 -0
  66. package/com/param/script.tpl.js +12 -0
  67. package/com/pendant/com.json +5 -0
  68. package/{core/com/component → com/pendant}/config.tpl.json +15 -13
  69. package/com/pendant/drive.js +204 -0
  70. package/com/pendant/index.js +441 -0
  71. package/com/pendant/pendant.html +16 -0
  72. package/com/pendant/script.tpl.js +18 -0
  73. package/com/socket/com.json +5 -0
  74. package/com/socket/config.tpl.json +12 -0
  75. package/com/socket/drive.js +651 -0
  76. package/com/socket/index.js +351 -0
  77. package/com/socket/script.tpl.js +41 -0
  78. package/com/sql/com.json +5 -0
  79. package/{core/com → com}/sql/config.tpl.json +13 -9
  80. package/com/sql/drive.js +1259 -0
  81. package/com/sql/index.js +150 -0
  82. package/com/sql/script.tpl.js +47 -0
  83. package/com/static/com.json +5 -0
  84. package/{core/com → com}/static/config.tpl.json +10 -6
  85. package/com/static/drive.js +194 -0
  86. package/com/static/index.js +226 -0
  87. package/com/static/script.tpl.js +28 -0
  88. package/com/task/com.json +5 -0
  89. package/{core/com → com}/task/config.tpl.json +4 -6
  90. package/com/task/drive.js +405 -0
  91. package/com/task/index.js +148 -0
  92. package/com/task/script.tpl.js +37 -0
  93. package/com/template/com.json +5 -0
  94. package/com/template/config.tpl.json +16 -0
  95. package/com/template/drive.js +80 -0
  96. package/com/template/index.js +141 -0
  97. package/com.js +156 -0
  98. package/common/README.md +2 -0
  99. package/common/handler/msg/handler.json +22 -0
  100. package/common/handler/msg/index.js +23 -0
  101. package/common/handler/player/handler.json +22 -0
  102. package/common/handler/player/index.js +287 -0
  103. package/common/handler/user/handler.json +22 -0
  104. package/common/handler/user/index.js +23 -0
  105. package/common/middleware/web_after/index.js +29 -0
  106. package/common/middleware/web_after/middleware.json +9 -0
  107. package/common/middleware/web_base/index.js +113 -0
  108. package/common/middleware/web_base/middleware.json +19 -0
  109. package/common/middleware/web_before/index.js +33 -0
  110. package/common/middleware/web_before/middleware.json +9 -0
  111. package/common/middleware/web_cors/index.js +87 -0
  112. package/common/middleware/web_cors/middleware.json +24 -0
  113. package/common/middleware/web_error/index.js +119 -0
  114. package/common/middleware/web_error/middleware.json +18 -0
  115. package/common/middleware/web_ip/index.js +15 -0
  116. package/common/middleware/web_ip/middleware.json +14 -0
  117. package/common/middleware/web_logger/index.js +156 -0
  118. package/common/middleware/web_logger/middleware.json +14 -0
  119. package/common/middleware/web_main/index.js +24 -0
  120. package/common/middleware/web_main/middleware.json +9 -0
  121. package/common/middleware/web_static/index.js +73 -0
  122. package/common/middleware/web_static/middleware.json +54 -0
  123. package/common/middleware/web_waf/index.js +385 -0
  124. package/common/middleware/web_waf/middleware.json +13 -0
  125. package/common/model/msg/index.js +88 -0
  126. package/common/model/msg/model.json +401 -0
  127. package/common/model/player/index.js +63 -0
  128. package/common/model/player/model.json +185 -0
  129. package/common/model/user/index.js +11 -0
  130. package/common/model/user/model.json +219 -0
  131. package/core/app/config.tpl.json +67 -0
  132. package/core/app/index.js +632 -0
  133. package/core/app/script.tpl.js +52 -0
  134. package/core/channel/index.js +899 -0
  135. package/core/channel/matcher.js +585 -0
  136. package/core/com/config.tpl.json +16 -0
  137. package/core/com/index.js +74 -0
  138. package/core/com/script.tpl.js +5 -0
  139. package/core/component/component.js +42 -0
  140. package/core/component/config.tpl.json +63 -0
  141. package/core/component/index.js +273 -0
  142. package/core/component/script.tpl.js +19 -0
  143. package/core/controller/config.tpl.json +14 -0
  144. package/core/controller/index.js +373 -0
  145. package/core/controller/script.tpl.js +27 -0
  146. package/core/factory/config.tpl.json +14 -0
  147. package/core/factory/entity.js +275 -0
  148. package/core/factory/index.js +241 -0
  149. package/core/factory/script.tpl.js +16 -0
  150. package/core/game/bat/index.js +137 -0
  151. package/core/game/bat/world.js +622 -0
  152. package/core/game/config.tpl.json +16 -0
  153. package/core/game/entity_admin.js +230 -0
  154. package/core/game/index.js +186 -0
  155. package/core/handler/config.tpl.json +22 -0
  156. package/core/handler/index.js +181 -0
  157. package/core/handler/script.tpl.js +23 -0
  158. package/core/logic/config.tpl.json +14 -0
  159. package/core/logic/index.js +59 -0
  160. package/core/logic/script.tpl.js +19 -0
  161. package/core/middleware/config.tpl.json +16 -0
  162. package/core/middleware/index.js +125 -0
  163. package/core/middleware/script.tpl.js +37 -0
  164. package/core/mod/config.tpl.json +22 -0
  165. package/core/mod/index.js +130 -0
  166. package/core/mod/script.tpl.js +34 -0
  167. package/core/model/config.tpl.json +219 -0
  168. package/core/model/index.js +272 -0
  169. package/core/model/model.js +27 -0
  170. package/core/model/script.tpl.js +20 -0
  171. package/core/notifier/config.tpl.json +14 -0
  172. package/core/notifier/index.js +77 -0
  173. package/core/notifier/script.tpl.js +20 -0
  174. package/core/plugin/config.tpl.json +24 -0
  175. package/core/plugin/index.js +232 -0
  176. package/core/plugin/script.tpl.js +51 -0
  177. package/core/pusher/config.tpl.json +14 -0
  178. package/core/pusher/index.js +161 -0
  179. package/core/pusher/script.tpl.js +20 -0
  180. package/core/room/bat/index.js +170 -0
  181. package/core/room/bat/room.js +524 -0
  182. package/core/room/config.tpl.json +20 -0
  183. package/core/room/index.js +249 -0
  184. package/core/room/room.js +61 -0
  185. package/core/scene/config.tpl.json +14 -0
  186. package/core/scene/index.js +466 -0
  187. package/core/scene/loop.js +1255 -0
  188. package/core/scene/map.js +28 -0
  189. package/core/scene/script.tpl.js +22 -0
  190. package/core/sender/config.tpl.json +14 -0
  191. package/core/sender/index.js +79 -0
  192. package/core/sender/script.tpl.js +20 -0
  193. package/core/service/config.tpl.json +14 -0
  194. package/core/service/index.js +100 -0
  195. package/core/service/script.tpl.js +25 -0
  196. package/core/store/config.tpl.json +26 -0
  197. package/core/store/index.js +1755 -0
  198. package/core/store/script.tpl.js +22 -0
  199. package/core/store/sql.js +1464 -0
  200. package/core/system/config.tpl.json +18 -0
  201. package/core/system/index.js +312 -0
  202. package/core/system/script.tpl.js +77 -0
  203. package/core/view/config.tpl.json +14 -0
  204. package/core/view/index.js +91 -0
  205. package/core/view/script.tpl.js +20 -0
  206. package/core/zone/bat/index.js +725 -0
  207. package/core/zone/config.tpl.json +54 -0
  208. package/core/zone/index.js +614 -0
  209. package/core/zone/script.tpl.js +10 -0
  210. package/core/zone/zone_bat.js +136 -0
  211. package/core//345/237/272/347/261/273/346/250/241/345/235/227/346/270/205/345/215/225.md +24 -0
  212. package/index.js +17 -333
  213. package/os.js +57 -0
  214. package/package.json +65 -55
  215. package/server.js +598 -0
  216. package/README.en.md +0 -36
  217. package/conf.json +0 -3
  218. package/core/base/mqtt/index.js +0 -1110
  219. package/core/base/mqtt/lib.js +0 -40
  220. package/core/base/web/index.js +0 -245
  221. package/core/com/api/com.json +0 -4
  222. package/core/com/api/drive.js +0 -668
  223. package/core/com/api/index.js +0 -108
  224. package/core/com/api/oauth.js +0 -158
  225. package/core/com/api/script.js +0 -32
  226. package/core/com/app/README.md +0 -3
  227. package/core/com/app/com.json +0 -4
  228. package/core/com/app/config.tpl.json +0 -16
  229. package/core/com/app/drive.js +0 -309
  230. package/core/com/app/index.js +0 -211
  231. package/core/com/app/script.js +0 -155
  232. package/core/com/cmd/com.json +0 -4
  233. package/core/com/cmd/config.tpl.json +0 -66
  234. package/core/com/cmd/drive.js +0 -513
  235. package/core/com/cmd/index.js +0 -354
  236. package/core/com/cmd/old/5w2h.js +0 -54
  237. package/core/com/cmd/old/drive.js +0 -423
  238. package/core/com/cmd/script.js +0 -11
  239. package/core/com/component/README.md +0 -3
  240. package/core/com/component/com.json +0 -4
  241. package/core/com/component/component.html +0 -16
  242. package/core/com/component/drive.js +0 -197
  243. package/core/com/component/index.js +0 -312
  244. package/core/com/component/script.js +0 -18
  245. package/core/com/db/com.json +0 -4
  246. package/core/com/db/drive.js +0 -1160
  247. package/core/com/db/index.js +0 -176
  248. package/core/com/event/com.json +0 -4
  249. package/core/com/event/drive.js +0 -133
  250. package/core/com/event/index.js +0 -345
  251. package/core/com/event/script.js +0 -26
  252. package/core/com/eventer/com.js +0 -477
  253. package/core/com/eventer/com.json +0 -4
  254. package/core/com/middleware/com.js +0 -154
  255. package/core/com/middleware/com.json +0 -4
  256. package/core/com/middleware/config.tpl.json +0 -8
  257. package/core/com/middleware/script.js +0 -9
  258. package/core/com/mqtt/com.json +0 -4
  259. package/core/com/mqtt/drive.js +0 -600
  260. package/core/com/mqtt/index.js +0 -572
  261. package/core/com/mqtt/mm_mqtt.js +0 -330
  262. package/core/com/mqtt/script.js +0 -604
  263. package/core/com/msg/com.js +0 -296
  264. package/core/com/msg/com.json +0 -4
  265. package/core/com/nav/com.json +0 -4
  266. package/core/com/nav/config.tpl.json +0 -75
  267. package/core/com/nav/drive.js +0 -549
  268. package/core/com/nav/index.js +0 -182
  269. package/core/com/nav/tpl/admin_pc/page_form.vue +0 -180
  270. package/core/com/nav/tpl/admin_pc/page_view.vue +0 -124
  271. package/core/com/nav/tpl/dev_pc/page_default.vue +0 -247
  272. package/core/com/nav/tpl/dev_pc/page_type.vue +0 -313
  273. package/core/com/nav/tpl/home_pc/page_default.vue +0 -234
  274. package/core/com/nav/tpl/home_pc/page_form.vue +0 -137
  275. package/core/com/nav/tpl/home_pc/page_list.vue +0 -234
  276. package/core/com/nav/tpl/home_pc/page_nav.vue +0 -221
  277. package/core/com/nav/tpl/home_pc/page_type.vue +0 -234
  278. package/core/com/nav/tpl/home_pc/page_view.vue +0 -125
  279. package/core/com/nav/tpl/home_phone/page_channel.vue +0 -234
  280. package/core/com/nav/tpl/home_phone/page_default.vue +0 -234
  281. package/core/com/nav/tpl/home_phone/page_form.vue +0 -137
  282. package/core/com/nav/tpl/home_phone/page_nav.vue +0 -237
  283. package/core/com/nav/tpl/home_phone/page_type.vue +0 -234
  284. package/core/com/nav/tpl/home_phone/page_view.vue +0 -125
  285. package/core/com/nav/viewmodel.js +0 -296
  286. package/core/com/param/drive.js +0 -366
  287. package/core/com/param/index.js +0 -80
  288. package/core/com/param/script.js +0 -12
  289. package/core/com/param/test.js +0 -98
  290. package/core/com/plugin/README.md +0 -3
  291. package/core/com/plugin/com.json +0 -4
  292. package/core/com/plugin/config.tpl.json +0 -26
  293. package/core/com/plugin/drive.js +0 -536
  294. package/core/com/plugin/index.js +0 -259
  295. package/core/com/plugin/script.js +0 -213
  296. package/core/com/rpc/com.json +0 -4
  297. package/core/com/rpc/drive.js +0 -160
  298. package/core/com/rpc/index.js +0 -87
  299. package/core/com/rpc/rpc.js +0 -118
  300. package/core/com/socket/com.json +0 -4
  301. package/core/com/socket/config.tpl.json +0 -14
  302. package/core/com/socket/drive.js +0 -403
  303. package/core/com/socket/index.js +0 -62
  304. package/core/com/socket/script.js +0 -42
  305. package/core/com/sql/drive.js +0 -1087
  306. package/core/com/sql/index.js +0 -83
  307. package/core/com/sql/script.js +0 -48
  308. package/core/com/static/com.json +0 -4
  309. package/core/com/static/drive.js +0 -220
  310. package/core/com/static/index.js +0 -149
  311. package/core/com/static/script.js +0 -28
  312. package/core/com/task/com.json +0 -4
  313. package/core/com/task/drive.js +0 -403
  314. package/core/com/task/index.js +0 -110
  315. package/core/com/task/script.js +0 -37
  316. package/core/com/timer/com.js +0 -217
  317. package/core/com/timer/com.json +0 -4
  318. package/core/com/tpl/com.js +0 -19
  319. package/core/com/tpl/com.json +0 -4
  320. package/lib/actions.js +0 -50
  321. package/lib/base.js +0 -361
  322. package/lib/com.js +0 -29
  323. package/lib/ref.js +0 -121
  324. package/middleware/cors/index.js +0 -119
  325. package/middleware/cors/middleware.json +0 -20
  326. package/middleware/csrf/index.js +0 -202
  327. package/middleware/csrf/middleware.json +0 -24
  328. package/middleware/ip_firewall/index.js +0 -476
  329. package/middleware/ip_firewall/middleware.json +0 -109
  330. package/middleware/mqtt_base/index.js +0 -10
  331. package/middleware/mqtt_base/middleware.json +0 -11
  332. package/middleware/security_audit/index.js +0 -543
  333. package/middleware/security_audit/middleware.json +0 -48
  334. package/middleware/waf/index.js +0 -343
  335. package/middleware/waf/middleware.json +0 -10
  336. package/middleware/waf_ddos/index.js +0 -520
  337. package/middleware/waf_ddos/middleware.json +0 -38
  338. package/middleware/waf_xss/index.js +0 -269
  339. package/middleware/waf_xss/middleware.json +0 -18
  340. package/middleware/web_after/index.js +0 -33
  341. package/middleware/web_after/middleware.json +0 -10
  342. package/middleware/web_base/index.js +0 -90
  343. package/middleware/web_base/middleware.json +0 -10
  344. package/middleware/web_before/index.js +0 -27
  345. package/middleware/web_before/middleware.json +0 -10
  346. package/middleware/web_check/index.js +0 -28
  347. package/middleware/web_check/middleware.json +0 -10
  348. package/middleware/web_main/index.js +0 -28
  349. package/middleware/web_main/middleware.json +0 -10
  350. package/middleware/web_proxy/index.js +0 -37
  351. package/middleware/web_proxy/middleware.json +0 -10
  352. package/middleware/web_render/index.js +0 -87
  353. package/middleware/web_render/middleware.json +0 -10
  354. package/middleware/web_socket/index.js +0 -34
  355. package/middleware/web_socket/middleware.json +0 -10
  356. package/middleware/web_static/index.js +0 -115
  357. package/middleware/web_static/middleware.json +0 -10
  358. /package/{core/com → com}/api/README.md +0 -0
  359. /package/{core/com → com}/db/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,476 +0,0 @@
1
- /**
2
- * IP防火墙中间件
3
- * 合并了IP过滤和WAF IP防火墙的功能
4
- * 支持黑白名单、频率限制、自动黑名单等功能
5
- */
6
- class IpFirewallMiddleware {
7
- constructor() {
8
- this.default = {
9
- // 基础功能配置
10
- enable: true,
11
- mode: 'blacklist',
12
- blacklist: [],
13
- whitelist: [],
14
- ignore_paths: [],
15
- log: true,
16
- block_status_code: 403,
17
- block_message: 'Forbidden: Access denied',
18
- enable_cidr: true,
19
- trust_proxy: false,
20
-
21
- // 频率限制配置
22
- request_limit: 1000,
23
- request_duration: 60000,
24
- request_block: true,
25
- blacklist_expire_time: 86400000,
26
- persist_blacklist: true
27
- };
28
- }
29
- }
30
-
31
- IpFirewallMiddleware.prototype.init = function(config) {
32
- this.config = Object.assign({}, this.default, config || {});
33
-
34
- // 初始化持久化黑名单
35
- if (this.config.persist_blacklist) {
36
- this._initBlacklist();
37
- }
38
-
39
- return this;
40
- };
41
-
42
- IpFirewallMiddleware.prototype.run = async function(ctx, next) {
43
- const config = this.config;
44
-
45
- if (!config.enable) {
46
- return await next();
47
- }
48
-
49
- // 检查是否应该忽略该路径
50
- const path = ctx.path;
51
- if (config.ignore_paths.some(p => path.startsWith(p))) {
52
- return await next();
53
- }
54
-
55
- // 获取客户端IP
56
- const client_ip = this._getClientIp(ctx);
57
-
58
- // 检查基础IP过滤
59
- if (!(await this._isIpAllowed(client_ip, config))) {
60
- if (config.log) {
61
- this._logBlockedAccess(ctx, client_ip, 'basic_filter');
62
- }
63
-
64
- ctx.status = config.block_status_code;
65
- ctx.body = {
66
- code: config.block_status_code,
67
- msg: config.block_message
68
- };
69
- return;
70
- }
71
-
72
- // 检查频率限制
73
- if (!(await this._checkRateLimit(client_ip, config))) {
74
- if (config.log) {
75
- this._logBlockedAccess(ctx, client_ip, 'rate_limit');
76
- }
77
-
78
- ctx.status = 429;
79
- ctx.body = '请求频率过高,请稍后再试。';
80
- return;
81
- }
82
-
83
- await next();
84
- };
85
-
86
- IpFirewallMiddleware.prototype._getClientIp = function(ctx) {
87
- let ip = ctx.ip;
88
-
89
- // 如果信任代理,则从X-Forwarded-For头获取真实IP
90
- if (this.config.trust_proxy) {
91
- const forwarded_for = ctx.get('X-Forwarded-For');
92
- if (forwarded_for) {
93
- // 取第一个IP(最原始的客户端IP)
94
- ip = forwarded_for.split(',')[0].trim();
95
- }
96
- }
97
-
98
- // 处理IPv6格式
99
- if (ip.startsWith('::ffff:')) {
100
- ip = ip.substring(7);
101
- }
102
-
103
- // 移除可能的端口号
104
- if (ip && ip.includes(':')) {
105
- ip = ip.split(':')[0];
106
- }
107
-
108
- // 处理IPv6本地地址
109
- if (ip === '::1' || ip === '::ffff:127.0.0.1') {
110
- ip = '127.0.0.1';
111
- }
112
-
113
- return ip;
114
- };
115
-
116
- IpFirewallMiddleware.prototype._isIpAllowed = async function(ip, config) {
117
- // 优先使用全局IP管理器
118
- try {
119
- var { is_ip_in_whitelist, is_ip_in_blacklist } = require('../../tools/ip_manager/ip.manager.global.js');
120
-
121
- if (config.mode === 'whitelist') {
122
- // 白名单模式:只有在白名单中的IP才允许访问
123
- if (await is_ip_in_whitelist(ip)) {
124
- return true;
125
- }
126
- } else {
127
- // 黑名单模式:只有在黑名单中的IP才被阻止
128
- if (await is_ip_in_blacklist(ip)) {
129
- return false;
130
- }
131
- }
132
- } catch (error) {
133
- // 如果全局IP管理器不可用,使用本地配置
134
- if ($.log && $.log.warn) {
135
- $.log.warn('全局IP管理器不可用,使用本地IP过滤配置');
136
- }
137
- }
138
-
139
- // 使用本地配置作为备用
140
- if (config.mode === 'whitelist') {
141
- return this._isIpInList(ip, config.whitelist);
142
- } else {
143
- return !this._isIpInList(ip, config.blacklist);
144
- }
145
- };
146
-
147
- IpFirewallMiddleware.prototype._isIpInList = function(ip, ip_list) {
148
- if (!ip_list || !Array.isArray(ip_list)) {
149
- return false;
150
- }
151
-
152
- // 检查精确匹配
153
- if (ip_list.includes(ip)) {
154
- return true;
155
- }
156
-
157
- // 检查CIDR格式匹配
158
- if (this.config.enable_cidr) {
159
- for (const cidr of ip_list) {
160
- if (this._isIpInCidr(ip, cidr)) {
161
- return true;
162
- }
163
- }
164
- }
165
-
166
- return false;
167
- };
168
-
169
- IpFirewallMiddleware.prototype._isIpInCidr = function(ip, cidr) {
170
- try {
171
- // 简单的CIDR匹配实现
172
- if (!cidr.includes('/')) {
173
- return false;
174
- }
175
-
176
- const [network, prefix_length] = cidr.split('/');
177
- const prefix = parseInt(prefix_length, 10);
178
-
179
- // 将IP地址转换为数字
180
- const ip_num = this._ipToNumber(ip);
181
- const network_num = this._ipToNumber(network);
182
-
183
- if (isNaN(ip_num) || isNaN(network_num)) {
184
- return false;
185
- }
186
-
187
- // 计算掩码
188
- const mask = this._getMask(prefix);
189
-
190
- // 检查IP是否在CIDR范围内
191
- return (ip_num & mask) === (network_num & mask);
192
- } catch (error) {
193
- return false;
194
- }
195
- };
196
-
197
- IpFirewallMiddleware.prototype._ipToNumber = function(ip) {
198
- const parts = ip.split('.');
199
- if (parts.length !== 4) {
200
- return NaN;
201
- }
202
-
203
- return parts.reduce((num, part) => {
204
- return (num << 8) + parseInt(part, 10);
205
- }, 0) >>> 0;
206
- };
207
-
208
- IpFirewallMiddleware.prototype._getMask = function(prefix) {
209
- return (0xffffffff << (32 - prefix)) >>> 0;
210
- };
211
-
212
- IpFirewallMiddleware.prototype._checkRateLimit = async function(ip, config) {
213
- if (!config.request_limit || !config.request_duration) {
214
- return true;
215
- }
216
-
217
- try {
218
- // 检查是否已被黑名单
219
- const is_blacklisted = await $.cache.get(`blacklist_${ip}`);
220
- if (is_blacklisted) {
221
- return false;
222
- }
223
-
224
- var num = 1;
225
- var now = new Date();
226
- var date = now.toStr('yyyy-MM-dd');
227
- var time;
228
- var json;
229
-
230
- var str = await $.cache.get("ip_" + ip);
231
- if (str) {
232
- if (typeof (str) === "string") {
233
- try {
234
- json = JSON.parse(str);
235
- } catch (jsonError) {
236
- if ($.log && $.log.error) {
237
- $.log.error('IP防火墙JSON解析错误:', jsonError);
238
- }
239
- json = null;
240
- }
241
- } else {
242
- json = str;
243
- }
244
-
245
- if (json) {
246
- if (json.date !== date) {
247
- num = 1;
248
- } else {
249
- // 判断时间间隔是否在范围外
250
- if (typeof json.time === 'string') {
251
- const savedTime = new Date(json.time);
252
- if (!isNaN(savedTime.getTime()) && (now - savedTime) > config.request_duration) {
253
- num = 1;
254
- } else {
255
- num = json.num + 1;
256
- if (num > config.request_limit) {
257
- // 超出上限禁止访问,并加入黑名单
258
- if (config.request_block) {
259
- await this._addToBlacklist(ip, config);
260
- }
261
- return false;
262
- }
263
- }
264
- } else {
265
- num = 1;
266
- }
267
- }
268
- }
269
- }
270
-
271
- if (!time) {
272
- time = now.toStr('yyyy-MM-dd hh:mm:ss');
273
- }
274
-
275
- await $.cache.set("ip_" + ip, JSON.stringify({
276
- date,
277
- time,
278
- num
279
- }), config.request_duration);
280
-
281
- return true;
282
- } catch (error) {
283
- if ($.log && $.log.error) {
284
- $.log.error('IP防火墙频率检查错误:', error);
285
- }
286
- return true; // 出错时默认允许通过
287
- }
288
- };
289
-
290
- IpFirewallMiddleware.prototype._addToBlacklist = async function(ip, config) {
291
- const { exec } = require('child_process');
292
- const platform = require('os').platform();
293
-
294
- // 检查是否已在黑名单中
295
- const blacklistKey = `blacklist_${ip}`;
296
- try {
297
- const is_blacklisted = await $.cache.get(blacklistKey);
298
- if (is_blacklisted) {
299
- if ($.log && $.log.info) {
300
- $.log.info(`IP ${ip} 已在黑名单中,无需重复添加`);
301
- }
302
- return;
303
- }
304
- } catch (error) {
305
- if ($.log && $.log.error) {
306
- $.log.error('检查黑名单缓存错误:', error);
307
- }
308
- }
309
-
310
- var cmd;
311
- if (platform == "win32") {
312
- cmd = `netsh advfirewall firewall add rule name="Blacklist ${ip}" dir=in action=block remoteip="${ip}" protocol=any`;
313
- } else {
314
- cmd = `iptables -A INPUT -s ${ip} -j DROP`;
315
- }
316
-
317
- try {
318
- await new Promise((resolve, reject) => {
319
- exec(cmd, (error, stdout, stderr) => {
320
- if (error) {
321
- reject(error);
322
- return;
323
- }
324
- if ($.log && $.log.info) {
325
- $.log.info(`IP ${ip} 已加入防火墙黑名单`);
326
- }
327
- resolve();
328
- });
329
- });
330
-
331
- // 记录到缓存,支持黑名单过期时间
332
- const expire_time = config.blacklist_expire_time || 86400000;
333
- await $.cache.set(blacklistKey, true, expire_time);
334
-
335
- // 记录黑名单IP,便于管理
336
- const blacklistIPsKey = 'blacklisted_ips';
337
- let blacklist_ips = [];
338
- try {
339
- const existing = await $.cache.get(blacklistIPsKey);
340
- if (existing) {
341
- blacklist_ips = typeof existing === 'string' ? JSON.parse(existing) : existing;
342
- }
343
- if (!Array.isArray(blacklist_ips)) {
344
- blacklist_ips = [];
345
- }
346
- if (!blacklist_ips.includes(ip)) {
347
- blacklist_ips.push(ip);
348
- await $.cache.set(blacklistIPsKey, blacklist_ips, 0); // 永不过期
349
- }
350
- } catch (cacheError) {
351
- if ($.log && $.log.error) {
352
- $.log.error('保存黑名单IP列表错误:', cacheError);
353
- }
354
- }
355
- } catch (error) {
356
- if ($.log && $.log.error) {
357
- $.log.error(`添加IP ${ip} 到黑名单失败:`, error);
358
- }
359
- }
360
- };
361
-
362
- IpFirewallMiddleware.prototype._removeFromBlacklist = async function(ip) {
363
- const { exec } = require('child_process');
364
- const platform = require('os').platform();
365
-
366
- var cmd;
367
- if (platform == "win32") {
368
- cmd = `netsh advfirewall firewall delete rule name="Blacklist ${ip}"`;
369
- } else {
370
- cmd = `iptables -D INPUT -s ${ip} -j DROP`;
371
- }
372
-
373
- try {
374
- await new Promise((resolve, reject) => {
375
- exec(cmd, (error, stdout, stderr) => {
376
- if (error) {
377
- if (platform !== "win32") {
378
- reject(error);
379
- return;
380
- }
381
- }
382
- if ($.log && $.log.info) {
383
- $.log.info(`IP ${ip} 已从防火墙黑名单中移除`);
384
- }
385
- resolve();
386
- });
387
- });
388
-
389
- // 从缓存中移除
390
- await $.cache.del(`blacklist_${ip}`);
391
-
392
- // 从黑名单列表中移除
393
- const blacklistIPsKey = 'blacklisted_ips';
394
- try {
395
- const existing = await $.cache.get(blacklistIPsKey);
396
- if (existing) {
397
- let blacklist_ips = typeof existing === 'string' ? JSON.parse(existing) : existing;
398
- if (Array.isArray(blacklist_ips)) {
399
- blacklist_ips = blacklist_ips.filter(ip_item => ip_item !== ip);
400
- await $.cache.set(blacklistIPsKey, blacklist_ips, 0);
401
- }
402
- }
403
- } catch (cacheError) {
404
- if ($.log && $.log.error) {
405
- $.log.error('更新黑名单IP列表错误:', cacheError);
406
- }
407
- }
408
- } catch (error) {
409
- if ($.log && $.log.error) {
410
- $.log.error(`移除IP ${ip} 从黑名单失败:`, error);
411
- }
412
- }
413
- };
414
-
415
- IpFirewallMiddleware.prototype._initBlacklist = async function() {
416
- if (!this.config.persist_blacklist) return;
417
-
418
- try {
419
- const blacklistIPsKey = 'blacklisted_ips';
420
- const existing = await $.cache.get(blacklistIPsKey);
421
- if (existing) {
422
- let blacklist_ips = typeof existing === 'string' ? JSON.parse(existing) : existing;
423
- if (Array.isArray(blacklist_ips) && blacklist_ips.length > 0) {
424
- if ($.log && $.log.info) {
425
- $.log.info(`正在应用 ${blacklist_ips.length} 个持久化的黑名单IP规则...`);
426
- }
427
- for (const ip of blacklist_ips) {
428
- // 重新应用黑名单规则
429
- await this._addToBlacklist(ip, this.config);
430
- }
431
- }
432
- }
433
- } catch (error) {
434
- if ($.log && $.log.error) {
435
- $.log.error('初始化持久化黑名单失败:', error);
436
- }
437
- }
438
- };
439
-
440
- IpFirewallMiddleware.prototype._logBlockedAccess = function(ctx, ip, reason) {
441
- if ($.log && $.log.warn) {
442
- $.log.warn(`IP访问被阻止: IP=${ip}, 路径=${ctx.path}, 方法=${ctx.method}, 原因=${reason}`);
443
- }
444
- };
445
-
446
- // 创建中间件实例
447
- const middleware = new IpFirewallMiddleware();
448
-
449
- // 导出符合系统期望的函数
450
- exports = module.exports = async function(server, config) {
451
- // 初始化中间件
452
- middleware.init(config);
453
-
454
- // 注册中间件到服务器
455
- server.use(middleware.run.bind(middleware));
456
-
457
- // 记录中间件初始化信息
458
- if ($.log && $.log.info) {
459
- $.log.info(`IP防火墙中间件已加载: 启用=${middleware.config.enable}, 模式=${middleware.config.mode}, 频率限制=${middleware.config.request_limit}/${middleware.config.request_duration}ms`);
460
- }
461
-
462
- // 提供手动管理黑名单的API方法
463
- if (!$.ip_firewall) {
464
- $.ip_firewall = {
465
- addBlacklist: middleware._addToBlacklist.bind(middleware),
466
- removeBlacklist: middleware._removeFromBlacklist.bind(middleware),
467
- getClientIP: middleware._getClientIp.bind(middleware),
468
- isInWhitelist: middleware._isIpInList.bind(middleware)
469
- };
470
- }
471
-
472
- return server;
473
- };
474
-
475
- // 保留原始实例,以便其他方式调用
476
- exports.middleware = middleware;
@@ -1,109 +0,0 @@
1
- {
2
- "name": "ip_firewall",
3
- "title": "IP防火墙中间件",
4
- "description": "合并了IP过滤和WAF IP防火墙的功能,支持黑白名单、频率限制、自动黑名单等功能",
5
- "version": "2.0",
6
- "mode": "web",
7
- "process_type": "common_before",
8
- "sort": 10,
9
- "state": 1,
10
- "config": {
11
- "enable": {
12
- "type": "boolean",
13
- "title": "启用IP防火墙",
14
- "description": "是否启用IP防火墙功能",
15
- "value": true
16
- },
17
- "mode": {
18
- "type": "select",
19
- "title": "过滤模式",
20
- "description": "选择IP过滤模式:黑名单模式或白名单模式",
21
- "options": [
22
- {"label": "黑名单模式", "value": "blacklist"},
23
- {"label": "白名单模式", "value": "whitelist"}
24
- ],
25
- "value": "blacklist"
26
- },
27
- "blacklist": {
28
- "type": "array",
29
- "title": "黑名单IP列表",
30
- "description": "在黑名单模式下的禁止访问IP列表,支持CIDR格式",
31
- "value": []
32
- },
33
- "whitelist": {
34
- "type": "array",
35
- "title": "白名单IP列表",
36
- "description": "在白名单模式下的允许访问IP列表,支持CIDR格式",
37
- "value": ["127.0.0.1"]
38
- },
39
- "ignore_paths": {
40
- "type": "array",
41
- "title": "忽略路径",
42
- "description": "在这些路径下不进行IP过滤",
43
- "value": []
44
- },
45
- "log": {
46
- "type": "boolean",
47
- "title": "记录日志",
48
- "description": "是否记录被阻止的访问日志",
49
- "value": true
50
- },
51
- "block_status_code": {
52
- "type": "number",
53
- "title": "阻止状态码",
54
- "description": "IP被阻止时返回的HTTP状态码",
55
- "value": 403
56
- },
57
- "block_message": {
58
- "type": "string",
59
- "title": "阻止消息",
60
- "description": "IP被阻止时返回的消息",
61
- "value": "Forbidden: Access denied"
62
- },
63
- "enable_cidr": {
64
- "type": "boolean",
65
- "title": "启用CIDR支持",
66
- "description": "是否支持CIDR格式的IP段匹配",
67
- "value": true
68
- },
69
- "trust_proxy": {
70
- "type": "boolean",
71
- "title": "信任代理",
72
- "description": "是否信任X-Forwarded-For头获取真实IP",
73
- "value": false
74
- },
75
- "request_limit": {
76
- "type": "number",
77
- "title": "请求限制数量",
78
- "description": "在指定时间内允许的最大请求数",
79
- "value": 1000,
80
- "placeholder": "请输入数字"
81
- },
82
- "request_duration": {
83
- "type": "number",
84
- "title": "统计时间窗口(毫秒)",
85
- "description": "请求计数的时间窗口,单位为毫秒",
86
- "value": 60000,
87
- "placeholder": "请输入毫秒数"
88
- },
89
- "request_block": {
90
- "type": "boolean",
91
- "title": "启用黑名单封禁",
92
- "description": "是否将超限IP添加到系统防火墙黑名单",
93
- "value": true
94
- },
95
- "blacklist_expire_time": {
96
- "type": "number",
97
- "title": "黑名单过期时间(毫秒)",
98
- "description": "IP被添加到黑名单后自动失效的时间,单位为毫秒",
99
- "value": 86400000,
100
- "placeholder": "请输入毫秒数"
101
- },
102
- "persist_blacklist": {
103
- "type": "boolean",
104
- "title": "持久化黑名单",
105
- "description": "系统重启后是否自动重新应用已保存的黑名单规则",
106
- "value": true
107
- }
108
- }
109
- }
@@ -1,10 +0,0 @@
1
- const MQTT = require('mm_mqtt');
2
-
3
- /**
4
- * MQTT基础
5
- * @param {Object} server 服务
6
- * @param {Object} config 配置参数
7
- */
8
- module.exports = function(server, config) {
9
- return server;
10
- };
@@ -1,11 +0,0 @@
1
- {
2
- "mode": "mqtt",
3
- "name": "mqtt_base",
4
- "title": "MQTT通讯器",
5
- "description": "用于MQTT通讯",
6
- "version": "1.0",
7
- "type": "web",
8
- "process_type": "common_before",
9
- "sort": 30,
10
- "state": 1
11
- }