@qq33357486/oh-my-task 1.4.0 → 1.4.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 (251) hide show
  1. package/README.md +121 -236
  2. package/dist/__tests__/auth-admin.test.d.ts +2 -0
  3. package/dist/__tests__/auth-admin.test.d.ts.map +1 -0
  4. package/dist/__tests__/auth-admin.test.js +440 -0
  5. package/dist/__tests__/auth-admin.test.js.map +1 -0
  6. package/dist/__tests__/auth-login-logout.test.d.ts +2 -0
  7. package/dist/__tests__/auth-login-logout.test.d.ts.map +1 -0
  8. package/dist/__tests__/auth-login-logout.test.js +400 -0
  9. package/dist/__tests__/auth-login-logout.test.js.map +1 -0
  10. package/dist/__tests__/auth-password.test.d.ts +2 -0
  11. package/dist/__tests__/auth-password.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth-password.test.js +419 -0
  13. package/dist/__tests__/auth-password.test.js.map +1 -0
  14. package/dist/__tests__/auth-register.test.d.ts +2 -0
  15. package/dist/__tests__/auth-register.test.d.ts.map +1 -0
  16. package/dist/__tests__/auth-register.test.js +379 -0
  17. package/dist/__tests__/auth-register.test.js.map +1 -0
  18. package/dist/__tests__/auth-tokens.test.d.ts +2 -0
  19. package/dist/__tests__/auth-tokens.test.d.ts.map +1 -0
  20. package/dist/__tests__/auth-tokens.test.js +392 -0
  21. package/dist/__tests__/auth-tokens.test.js.map +1 -0
  22. package/dist/__tests__/db-schema.test.d.ts +2 -0
  23. package/dist/__tests__/db-schema.test.d.ts.map +1 -0
  24. package/dist/__tests__/db-schema.test.js +245 -0
  25. package/dist/__tests__/db-schema.test.js.map +1 -0
  26. package/dist/__tests__/express-server.test.d.ts +2 -0
  27. package/dist/__tests__/express-server.test.d.ts.map +1 -0
  28. package/dist/__tests__/express-server.test.js +119 -0
  29. package/dist/__tests__/express-server.test.js.map +1 -0
  30. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts +2 -0
  31. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.d.ts.map +1 -0
  32. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js +270 -0
  33. package/dist/__tests__/fix-hcaptcha-dev-bypass.test.js.map +1 -0
  34. package/dist/__tests__/mcp/mcp-tools.test.d.ts +2 -0
  35. package/dist/__tests__/mcp/mcp-tools.test.d.ts.map +1 -0
  36. package/dist/__tests__/mcp/mcp-tools.test.js +547 -0
  37. package/dist/__tests__/mcp/mcp-tools.test.js.map +1 -0
  38. package/dist/__tests__/projects.test.d.ts +2 -0
  39. package/dist/__tests__/projects.test.d.ts.map +1 -0
  40. package/dist/__tests__/projects.test.js +406 -0
  41. package/dist/__tests__/projects.test.js.map +1 -0
  42. package/dist/__tests__/schedule.test.d.ts +2 -0
  43. package/dist/__tests__/schedule.test.d.ts.map +1 -0
  44. package/dist/__tests__/schedule.test.js +587 -0
  45. package/dist/__tests__/schedule.test.js.map +1 -0
  46. package/dist/__tests__/tasks-crud.test.d.ts +2 -0
  47. package/dist/__tests__/tasks-crud.test.d.ts.map +1 -0
  48. package/dist/__tests__/tasks-crud.test.js +606 -0
  49. package/dist/__tests__/tasks-crud.test.js.map +1 -0
  50. package/dist/__tests__/tasks-lifecycle.test.d.ts +2 -0
  51. package/dist/__tests__/tasks-lifecycle.test.d.ts.map +1 -0
  52. package/dist/__tests__/tasks-lifecycle.test.js +712 -0
  53. package/dist/__tests__/tasks-lifecycle.test.js.map +1 -0
  54. package/dist/__tests__/versions.test.d.ts +2 -0
  55. package/dist/__tests__/versions.test.d.ts.map +1 -0
  56. package/dist/__tests__/versions.test.js +613 -0
  57. package/dist/__tests__/versions.test.js.map +1 -0
  58. package/dist/api/middleware/auth.d.ts +1 -2
  59. package/dist/api/middleware/auth.d.ts.map +1 -1
  60. package/dist/api/middleware/auth.js +5 -12
  61. package/dist/api/middleware/auth.js.map +1 -1
  62. package/dist/api/middleware/captcha.d.ts +8 -0
  63. package/dist/api/middleware/captcha.d.ts.map +1 -1
  64. package/dist/api/middleware/captcha.js +29 -4
  65. package/dist/api/middleware/captcha.js.map +1 -1
  66. package/dist/api/middleware/ownerCheck.d.ts +0 -5
  67. package/dist/api/middleware/ownerCheck.d.ts.map +1 -1
  68. package/dist/api/middleware/ownerCheck.js +15 -49
  69. package/dist/api/middleware/ownerCheck.js.map +1 -1
  70. package/dist/api/routes/{sops.d.ts → admin.d.ts} +1 -1
  71. package/dist/api/routes/admin.d.ts.map +1 -0
  72. package/dist/api/routes/admin.js +20 -0
  73. package/dist/api/routes/admin.js.map +1 -0
  74. package/dist/api/routes/auth.d.ts.map +1 -1
  75. package/dist/api/routes/auth.js +65 -14
  76. package/dist/api/routes/auth.js.map +1 -1
  77. package/dist/api/routes/config.d.ts.map +1 -1
  78. package/dist/api/routes/config.js +6 -1
  79. package/dist/api/routes/config.js.map +1 -1
  80. package/dist/api/routes/projects.d.ts.map +1 -1
  81. package/dist/api/routes/projects.js +29 -18
  82. package/dist/api/routes/projects.js.map +1 -1
  83. package/dist/api/routes/tasks.d.ts.map +1 -1
  84. package/dist/api/routes/tasks.js +79 -104
  85. package/dist/api/routes/tasks.js.map +1 -1
  86. package/dist/api/routes/tokens.d.ts.map +1 -1
  87. package/dist/api/routes/tokens.js +11 -8
  88. package/dist/api/routes/tokens.js.map +1 -1
  89. package/dist/api/routes/users.d.ts.map +1 -1
  90. package/dist/api/routes/users.js +7 -59
  91. package/dist/api/routes/users.js.map +1 -1
  92. package/dist/api/routes/versions.d.ts.map +1 -1
  93. package/dist/api/routes/versions.js +63 -34
  94. package/dist/api/routes/versions.js.map +1 -1
  95. package/dist/api/server.d.ts.map +1 -1
  96. package/dist/api/server.js +23 -14
  97. package/dist/api/server.js.map +1 -1
  98. package/dist/db/connection.d.ts.map +1 -1
  99. package/dist/db/connection.js +40 -118
  100. package/dist/db/connection.js.map +1 -1
  101. package/dist/mcp/server.d.ts.map +1 -1
  102. package/dist/mcp/server.js +15 -64
  103. package/dist/mcp/server.js.map +1 -1
  104. package/dist/mcp/tools/activate-task.d.ts.map +1 -1
  105. package/dist/mcp/tools/activate-task.js +3 -17
  106. package/dist/mcp/tools/activate-task.js.map +1 -1
  107. package/dist/mcp/tools/{get-next-task.d.ts → auto-schedule.d.ts} +3 -3
  108. package/dist/mcp/tools/auto-schedule.d.ts.map +1 -0
  109. package/dist/mcp/tools/auto-schedule.js +59 -0
  110. package/dist/mcp/tools/auto-schedule.js.map +1 -0
  111. package/dist/mcp/tools/complete-task.d.ts.map +1 -1
  112. package/dist/mcp/tools/complete-task.js +2 -12
  113. package/dist/mcp/tools/complete-task.js.map +1 -1
  114. package/dist/mcp/tools/create-task.d.ts.map +1 -1
  115. package/dist/mcp/tools/create-task.js +33 -38
  116. package/dist/mcp/tools/create-task.js.map +1 -1
  117. package/dist/mcp/tools/create-version.d.ts.map +1 -1
  118. package/dist/mcp/tools/create-version.js +2 -17
  119. package/dist/mcp/tools/create-version.js.map +1 -1
  120. package/dist/mcp/tools/{get-task-context.d.ts → get-current-task.d.ts} +3 -3
  121. package/dist/mcp/tools/get-current-task.d.ts.map +1 -0
  122. package/dist/mcp/tools/get-current-task.js +85 -0
  123. package/dist/mcp/tools/get-current-task.js.map +1 -0
  124. package/dist/mcp/tools/get-task.d.ts.map +1 -1
  125. package/dist/mcp/tools/get-task.js +7 -12
  126. package/dist/mcp/tools/get-task.js.map +1 -1
  127. package/dist/mcp/tools/init-project.d.ts +0 -2
  128. package/dist/mcp/tools/init-project.d.ts.map +1 -1
  129. package/dist/mcp/tools/init-project.js +39 -75
  130. package/dist/mcp/tools/init-project.js.map +1 -1
  131. package/dist/mcp/tools/list-tasks.d.ts.map +1 -1
  132. package/dist/mcp/tools/list-tasks.js +8 -33
  133. package/dist/mcp/tools/list-tasks.js.map +1 -1
  134. package/dist/mcp/tools/list-versions.d.ts.map +1 -1
  135. package/dist/mcp/tools/list-versions.js +16 -25
  136. package/dist/mcp/tools/list-versions.js.map +1 -1
  137. package/dist/mcp/tools/utils/config.js +1 -1
  138. package/dist/mcp/tools/utils/config.js.map +1 -1
  139. package/dist/services/admin.service.d.ts +27 -0
  140. package/dist/services/admin.service.d.ts.map +1 -0
  141. package/dist/services/admin.service.js +88 -0
  142. package/dist/services/admin.service.js.map +1 -0
  143. package/dist/services/config.service.d.ts +1 -0
  144. package/dist/services/config.service.d.ts.map +1 -1
  145. package/dist/services/config.service.js +7 -0
  146. package/dist/services/config.service.js.map +1 -1
  147. package/dist/services/project.service.d.ts +7 -7
  148. package/dist/services/project.service.d.ts.map +1 -1
  149. package/dist/services/project.service.js +47 -40
  150. package/dist/services/project.service.js.map +1 -1
  151. package/dist/services/schedule.service.d.ts +6 -0
  152. package/dist/services/schedule.service.d.ts.map +1 -1
  153. package/dist/services/schedule.service.js +36 -12
  154. package/dist/services/schedule.service.js.map +1 -1
  155. package/dist/services/task.service.d.ts +6 -18
  156. package/dist/services/task.service.d.ts.map +1 -1
  157. package/dist/services/task.service.js +161 -194
  158. package/dist/services/task.service.js.map +1 -1
  159. package/dist/services/token.service.d.ts +1 -0
  160. package/dist/services/token.service.d.ts.map +1 -1
  161. package/dist/services/token.service.js +5 -2
  162. package/dist/services/token.service.js.map +1 -1
  163. package/dist/services/user.service.d.ts +0 -32
  164. package/dist/services/user.service.d.ts.map +1 -1
  165. package/dist/services/user.service.js +13 -110
  166. package/dist/services/user.service.js.map +1 -1
  167. package/dist/services/version.service.d.ts +26 -8
  168. package/dist/services/version.service.d.ts.map +1 -1
  169. package/dist/services/version.service.js +149 -41
  170. package/dist/services/version.service.js.map +1 -1
  171. package/dist/types/index.d.ts +17 -60
  172. package/dist/types/index.d.ts.map +1 -1
  173. package/package.json +4 -13
  174. package/src/db/schema.sql +113 -70
  175. package/dist/api/routes/sops.d.ts.map +0 -1
  176. package/dist/api/routes/sops.js +0 -155
  177. package/dist/api/routes/sops.js.map +0 -1
  178. package/dist/mcp/tools/add-task-note.d.ts +0 -10
  179. package/dist/mcp/tools/add-task-note.d.ts.map +0 -1
  180. package/dist/mcp/tools/add-task-note.js +0 -46
  181. package/dist/mcp/tools/add-task-note.js.map +0 -1
  182. package/dist/mcp/tools/approve-task.d.ts +0 -10
  183. package/dist/mcp/tools/approve-task.d.ts.map +0 -1
  184. package/dist/mcp/tools/approve-task.js +0 -59
  185. package/dist/mcp/tools/approve-task.js.map +0 -1
  186. package/dist/mcp/tools/archive-version.d.ts +0 -10
  187. package/dist/mcp/tools/archive-version.d.ts.map +0 -1
  188. package/dist/mcp/tools/archive-version.js +0 -57
  189. package/dist/mcp/tools/archive-version.js.map +0 -1
  190. package/dist/mcp/tools/assign-task.d.ts +0 -10
  191. package/dist/mcp/tools/assign-task.d.ts.map +0 -1
  192. package/dist/mcp/tools/assign-task.js +0 -53
  193. package/dist/mcp/tools/assign-task.js.map +0 -1
  194. package/dist/mcp/tools/create-sop.d.ts +0 -10
  195. package/dist/mcp/tools/create-sop.d.ts.map +0 -1
  196. package/dist/mcp/tools/create-sop.js +0 -90
  197. package/dist/mcp/tools/create-sop.js.map +0 -1
  198. package/dist/mcp/tools/get-my-tasks.d.ts +0 -10
  199. package/dist/mcp/tools/get-my-tasks.d.ts.map +0 -1
  200. package/dist/mcp/tools/get-my-tasks.js +0 -88
  201. package/dist/mcp/tools/get-my-tasks.js.map +0 -1
  202. package/dist/mcp/tools/get-next-task.d.ts.map +0 -1
  203. package/dist/mcp/tools/get-next-task.js +0 -84
  204. package/dist/mcp/tools/get-next-task.js.map +0 -1
  205. package/dist/mcp/tools/get-sop.d.ts +0 -10
  206. package/dist/mcp/tools/get-sop.d.ts.map +0 -1
  207. package/dist/mcp/tools/get-sop.js +0 -67
  208. package/dist/mcp/tools/get-sop.js.map +0 -1
  209. package/dist/mcp/tools/get-task-context.d.ts.map +0 -1
  210. package/dist/mcp/tools/get-task-context.js +0 -114
  211. package/dist/mcp/tools/get-task-context.js.map +0 -1
  212. package/dist/mcp/tools/helpers.d.ts +0 -10
  213. package/dist/mcp/tools/helpers.d.ts.map +0 -1
  214. package/dist/mcp/tools/helpers.js +0 -17
  215. package/dist/mcp/tools/helpers.js.map +0 -1
  216. package/dist/mcp/tools/list-sops.d.ts +0 -10
  217. package/dist/mcp/tools/list-sops.d.ts.map +0 -1
  218. package/dist/mcp/tools/list-sops.js +0 -57
  219. package/dist/mcp/tools/list-sops.js.map +0 -1
  220. package/dist/mcp/tools/reject-task.d.ts +0 -10
  221. package/dist/mcp/tools/reject-task.d.ts.map +0 -1
  222. package/dist/mcp/tools/reject-task.js +0 -63
  223. package/dist/mcp/tools/reject-task.js.map +0 -1
  224. package/dist/mcp/tools/reschedule.d.ts +0 -17
  225. package/dist/mcp/tools/reschedule.d.ts.map +0 -1
  226. package/dist/mcp/tools/reschedule.js +0 -107
  227. package/dist/mcp/tools/reschedule.js.map +0 -1
  228. package/dist/mcp/tools/start-task.d.ts +0 -10
  229. package/dist/mcp/tools/start-task.d.ts.map +0 -1
  230. package/dist/mcp/tools/start-task.js +0 -42
  231. package/dist/mcp/tools/start-task.js.map +0 -1
  232. package/dist/mcp/tools/submit-for-review.d.ts +0 -10
  233. package/dist/mcp/tools/submit-for-review.d.ts.map +0 -1
  234. package/dist/mcp/tools/submit-for-review.js +0 -64
  235. package/dist/mcp/tools/submit-for-review.js.map +0 -1
  236. package/dist/mcp/tools/update-sop.d.ts +0 -10
  237. package/dist/mcp/tools/update-sop.d.ts.map +0 -1
  238. package/dist/mcp/tools/update-sop.js +0 -113
  239. package/dist/mcp/tools/update-sop.js.map +0 -1
  240. package/dist/mcp/tools/update-task-doc.d.ts +0 -10
  241. package/dist/mcp/tools/update-task-doc.d.ts.map +0 -1
  242. package/dist/mcp/tools/update-task-doc.js +0 -70
  243. package/dist/mcp/tools/update-task-doc.js.map +0 -1
  244. package/dist/mcp/tools/update-task.d.ts +0 -10
  245. package/dist/mcp/tools/update-task.d.ts.map +0 -1
  246. package/dist/mcp/tools/update-task.js +0 -106
  247. package/dist/mcp/tools/update-task.js.map +0 -1
  248. package/dist/services/sop.service.d.ts +0 -53
  249. package/dist/services/sop.service.d.ts.map +0 -1
  250. package/dist/services/sop.service.js +0 -275
  251. package/dist/services/sop.service.js.map +0 -1
@@ -0,0 +1,270 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ import { mkdirSync, rmSync, existsSync, readFileSync } from 'fs';
4
+ import { join } from 'path';
5
+ import { tmpdir } from 'os';
6
+ import request from 'supertest';
7
+ // 每个测试用唯一的临时目录
8
+ let TEST_DIR;
9
+ let TEST_DB_PATH;
10
+ let app;
11
+ // 辅助函数:通过 getDb 设置系统配置(确保单例连接能看到)
12
+ async function setConfigViaGetDb(key, value) {
13
+ const { getDb } = await import('../db/connection.js');
14
+ getDb().prepare(`
15
+ INSERT OR REPLACE INTO system_config (key, value, updated_at)
16
+ VALUES (?, ?, CURRENT_TIMESTAMP)
17
+ `).run(key, value);
18
+ }
19
+ beforeAll(async () => {
20
+ TEST_DIR = join(tmpdir(), `omt-hcaptcha-fix-test-${Date.now()}`);
21
+ TEST_DB_PATH = join(TEST_DIR, 'data', 'data.db');
22
+ mkdirSync(join(TEST_DIR, 'data'), { recursive: true });
23
+ process.env.DB_PATH = TEST_DB_PATH;
24
+ // 初始化数据库
25
+ const db = new Database(TEST_DB_PATH);
26
+ db.pragma('journal_mode = WAL');
27
+ db.pragma('foreign_keys = ON');
28
+ const schemaSql = readFileSync(join(process.cwd(), 'src', 'db', 'schema.sql'), 'utf-8');
29
+ db.exec(schemaSql);
30
+ // 插入一个 admin 用户以允许注册其他用户
31
+ const bcrypt = await import('bcrypt');
32
+ const hash = await bcrypt.default.hash('AdminPass123', 12);
33
+ db.prepare(`
34
+ INSERT INTO users (id, name, email, password_hash, role)
35
+ VALUES (?, ?, ?, ?, ?)
36
+ `).run('admin-1', 'Admin', 'admin@test.com', hash, 'admin');
37
+ db.close();
38
+ // 动态导入 app
39
+ const serverModule = await import('../api/server.js');
40
+ app = serverModule.default;
41
+ });
42
+ afterAll(() => {
43
+ try {
44
+ if (existsSync(TEST_DIR)) {
45
+ rmSync(TEST_DIR, { recursive: true, force: true });
46
+ }
47
+ }
48
+ catch {
49
+ // Windows may not immediately delete
50
+ }
51
+ delete process.env.DB_PATH;
52
+ });
53
+ describe('hCaptcha dev-mode bypass fix', () => {
54
+ describe('VAL-AUTH-029: 数据库配置 hcaptcha_secret_key 开启时,开发环境也要求 captcha token', () => {
55
+ it('hcaptcha_secret_key 有值时,无 captcha token 的注册返回 400', async () => {
56
+ // 通过 getDb 设置配置(确保单例连接能看到)
57
+ await setConfigViaGetDb('hcaptcha_secret_key', 'test-secret-key');
58
+ await setConfigViaGetDb('hcaptcha_site_key', 'test-site-key');
59
+ // 确保 HCAPTCHA_SECRET 环境变量没有设置(开发环境)
60
+ const originalSecret = process.env.HCAPTCHA_SECRET;
61
+ const originalNodeEnv = process.env.NODE_ENV;
62
+ delete process.env.HCAPTCHA_SECRET;
63
+ process.env.NODE_ENV = 'development';
64
+ const res = await request(app)
65
+ .post('/api/auth/register')
66
+ .send({
67
+ name: 'CaptchaUser',
68
+ email: 'captchauser@test.com',
69
+ password: 'CaptchaPass123'
70
+ // 不提供 captcha_token
71
+ });
72
+ expect(res.status).toBe(400);
73
+ expect(res.body.success).toBe(false);
74
+ expect(res.body.error).toMatch(/验证码/);
75
+ // 恢复
76
+ process.env.HCAPTCHA_SECRET = originalSecret;
77
+ process.env.NODE_ENV = originalNodeEnv;
78
+ // 清理数据库配置
79
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
80
+ await setConfigViaGetDb('hcaptcha_site_key', '');
81
+ });
82
+ it('hcaptcha_secret_key 有值时,无 captcha token 的登录返回 400', async () => {
83
+ await setConfigViaGetDb('hcaptcha_secret_key', 'test-secret-key');
84
+ await setConfigViaGetDb('hcaptcha_site_key', 'test-site-key');
85
+ const originalSecret = process.env.HCAPTCHA_SECRET;
86
+ const originalNodeEnv = process.env.NODE_ENV;
87
+ delete process.env.HCAPTCHA_SECRET;
88
+ process.env.NODE_ENV = 'development';
89
+ const res = await request(app)
90
+ .post('/api/auth/login')
91
+ .send({
92
+ email: 'admin@test.com',
93
+ password: 'AdminPass123'
94
+ // 不提供 captcha_token
95
+ });
96
+ expect(res.status).toBe(400);
97
+ expect(res.body.success).toBe(false);
98
+ expect(res.body.error).toMatch(/验证码/);
99
+ process.env.HCAPTCHA_SECRET = originalSecret;
100
+ process.env.NODE_ENV = originalNodeEnv;
101
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
102
+ await setConfigViaGetDb('hcaptcha_site_key', '');
103
+ });
104
+ });
105
+ describe('hcaptcha_secret_key 为空时,跳过 captcha 验证', () => {
106
+ it('hcaptcha_secret_key 为空时,开发环境注册不需要 captcha token', async () => {
107
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
108
+ const originalSecret = process.env.HCAPTCHA_SECRET;
109
+ delete process.env.HCAPTCHA_SECRET;
110
+ const res = await request(app)
111
+ .post('/api/auth/register')
112
+ .send({
113
+ name: 'NoCaptchaUser',
114
+ email: `nocaptcha-${Date.now()}@test.com`,
115
+ password: 'NoCaptchaPass123'
116
+ });
117
+ expect(res.status).toBe(200);
118
+ expect(res.body.success).toBe(true);
119
+ process.env.HCAPTCHA_SECRET = originalSecret;
120
+ });
121
+ it('hcaptcha_secret_key 为空时,开发环境登录不需要 captcha token', async () => {
122
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
123
+ const originalSecret = process.env.HCAPTCHA_SECRET;
124
+ delete process.env.HCAPTCHA_SECRET;
125
+ const res = await request(app)
126
+ .post('/api/auth/login')
127
+ .send({
128
+ email: 'admin@test.com',
129
+ password: 'AdminPass123'
130
+ });
131
+ expect(res.status).toBe(200);
132
+ expect(res.body.success).toBe(true);
133
+ process.env.HCAPTCHA_SECRET = originalSecret;
134
+ });
135
+ });
136
+ describe('环境变量 HCAPTCHA_SECRET 优先级', () => {
137
+ it('HCAPTCHA_SECRET 环境变量设置时,即使数据库无配置也要求 captcha', async () => {
138
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
139
+ const originalSecret = process.env.HCAPTCHA_SECRET;
140
+ process.env.HCAPTCHA_SECRET = 'env-secret-key';
141
+ const res = await request(app)
142
+ .post('/api/auth/register')
143
+ .send({
144
+ name: 'EnvCaptchaUser',
145
+ email: `envcaptcha-${Date.now()}@test.com`,
146
+ password: 'EnvCaptchaPass123'
147
+ });
148
+ expect(res.status).toBe(400);
149
+ expect(res.body.success).toBe(false);
150
+ expect(res.body.error).toMatch(/验证码/);
151
+ process.env.HCAPTCHA_SECRET = originalSecret;
152
+ });
153
+ });
154
+ describe('生产环境行为', () => {
155
+ it('生产环境 + HCAPTCHA_SECRET 环境变量时要求 captcha', async () => {
156
+ const originalSecret = process.env.HCAPTCHA_SECRET;
157
+ const originalNodeEnv = process.env.NODE_ENV;
158
+ process.env.HCAPTCHA_SECRET = 'prod-secret';
159
+ process.env.NODE_ENV = 'production';
160
+ const res = await request(app)
161
+ .post('/api/auth/register')
162
+ .send({
163
+ name: 'ProdCaptchaUser',
164
+ email: `prodcaptcha-${Date.now()}@test.com`,
165
+ password: 'ProdCaptchaPass123'
166
+ });
167
+ expect(res.status).toBe(400);
168
+ expect(res.body.success).toBe(false);
169
+ expect(res.body.error).toMatch(/验证码/);
170
+ process.env.HCAPTCHA_SECRET = originalSecret;
171
+ process.env.NODE_ENV = originalNodeEnv;
172
+ });
173
+ it('生产环境 + 数据库 hcaptcha_secret_key 配置时要求 captcha', async () => {
174
+ await setConfigViaGetDb('hcaptcha_secret_key', 'db-secret-key');
175
+ const originalSecret = process.env.HCAPTCHA_SECRET;
176
+ const originalNodeEnv = process.env.NODE_ENV;
177
+ delete process.env.HCAPTCHA_SECRET;
178
+ process.env.NODE_ENV = 'production';
179
+ const res = await request(app)
180
+ .post('/api/auth/register')
181
+ .send({
182
+ name: 'ProdDbCaptchaUser',
183
+ email: `proddbcaptcha-${Date.now()}@test.com`,
184
+ password: 'ProdDbCaptchaPass123'
185
+ });
186
+ expect(res.status).toBe(400);
187
+ expect(res.body.success).toBe(false);
188
+ expect(res.body.error).toMatch(/验证码/);
189
+ process.env.HCAPTCHA_SECRET = originalSecret;
190
+ process.env.NODE_ENV = originalNodeEnv;
191
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
192
+ });
193
+ it('生产环境无任何 captcha 配置时跳过验证', async () => {
194
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
195
+ const originalSecret = process.env.HCAPTCHA_SECRET;
196
+ const originalNodeEnv = process.env.NODE_ENV;
197
+ delete process.env.HCAPTCHA_SECRET;
198
+ process.env.NODE_ENV = 'production';
199
+ const res = await request(app)
200
+ .post('/api/auth/register')
201
+ .send({
202
+ name: 'ProdNoCaptchaUser',
203
+ email: `prodnocaptcha-${Date.now()}@test.com`,
204
+ password: 'ProdNoCaptchaPass123'
205
+ });
206
+ // 无 captcha 配置时,无论环境都应该跳过验证
207
+ // 注册应该成功(除非邮箱已存在)
208
+ expect([200, 409]).toContain(res.status);
209
+ process.env.HCAPTCHA_SECRET = originalSecret;
210
+ process.env.NODE_ENV = originalNodeEnv;
211
+ });
212
+ });
213
+ });
214
+ describe('Token masking 格式修复', () => {
215
+ it('maskToken 返回 omt_***abc 格式(前4位 + *** + 后3位)', async () => {
216
+ const { maskToken } = await import('../services/token.service.js');
217
+ // 正常长度的 token
218
+ const token = 'omt_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6';
219
+ const masked = maskToken(token);
220
+ // 格式应为 omt_***5d6 (前4位 omt_ + *** + 后3位 5d6)
221
+ expect(masked).toMatch(/^omt_\*{3}[a-f0-9]{3}$/);
222
+ expect(masked).toBe('omt_***5d6');
223
+ });
224
+ it('maskToken 对短 token 返回 ****', async () => {
225
+ const { maskToken } = await import('../services/token.service.js');
226
+ expect(maskToken('')).toBe('****');
227
+ expect(maskToken('short')).toBe('****');
228
+ expect(maskToken('omt_ab')).toBe('****');
229
+ });
230
+ it('GET /api/tokens 返回的 token 格式为 omt_***abc', async () => {
231
+ // 确保 captcha 关闭以便登录
232
+ await setConfigViaGetDb('hcaptcha_secret_key', '');
233
+ const originalSecret = process.env.HCAPTCHA_SECRET;
234
+ delete process.env.HCAPTCHA_SECRET;
235
+ // 登录获取 session
236
+ const loginRes = await request(app)
237
+ .post('/api/auth/login')
238
+ .send({ email: 'admin@test.com', password: 'AdminPass123' });
239
+ expect(loginRes.status).toBe(200);
240
+ let cookie;
241
+ const setCookie = loginRes.headers['set-cookie'];
242
+ if (Array.isArray(setCookie)) {
243
+ cookie = setCookie[0].split(';')[0];
244
+ }
245
+ else if (setCookie) {
246
+ cookie = setCookie.split(';')[0];
247
+ }
248
+ else {
249
+ process.env.HCAPTCHA_SECRET = originalSecret;
250
+ throw new Error('No set-cookie header in login response');
251
+ }
252
+ // 创建 token
253
+ const createRes = await request(app)
254
+ .post('/api/tokens')
255
+ .set('Cookie', cookie)
256
+ .send({ name: 'mask-test' });
257
+ expect(createRes.status).toBe(201);
258
+ // 列出 token
259
+ const listRes = await request(app)
260
+ .get('/api/tokens')
261
+ .set('Cookie', cookie);
262
+ expect(listRes.status).toBe(200);
263
+ const tokenItem = listRes.body.data.tokens.find((t) => t.name === 'mask-test');
264
+ expect(tokenItem).toBeDefined();
265
+ // 新格式:omt_***abc
266
+ expect(tokenItem.token).toMatch(/^omt_\*{3}[a-f0-9]{3}$/);
267
+ process.env.HCAPTCHA_SECRET = originalSecret;
268
+ });
269
+ });
270
+ //# sourceMappingURL=fix-hcaptcha-dev-bypass.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-hcaptcha-dev-bypass.test.js","sourceRoot":"","sources":["../../src/__tests__/fix-hcaptcha-dev-bypass.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mcp/mcp-tools.test.ts"],"names":[],"mappings":""}