@walavave/cc98-cli 0.1.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 (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/api/client.d.ts +57 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +298 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/endpoints.d.ts +48 -0
  8. package/dist/api/endpoints.d.ts.map +1 -0
  9. package/dist/api/endpoints.js +53 -0
  10. package/dist/api/endpoints.js.map +1 -0
  11. package/dist/api/types.d.ts +35 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +2 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/api/webvpn.d.ts +40 -0
  16. package/dist/api/webvpn.d.ts.map +1 -0
  17. package/dist/api/webvpn.js +259 -0
  18. package/dist/api/webvpn.js.map +1 -0
  19. package/dist/cli/commands/account.d.ts +2 -0
  20. package/dist/cli/commands/account.d.ts.map +1 -0
  21. package/dist/cli/commands/account.js +81 -0
  22. package/dist/cli/commands/account.js.map +1 -0
  23. package/dist/cli/commands/board.d.ts +2 -0
  24. package/dist/cli/commands/board.d.ts.map +1 -0
  25. package/dist/cli/commands/board.js +61 -0
  26. package/dist/cli/commands/board.js.map +1 -0
  27. package/dist/cli/commands/cache.d.ts +2 -0
  28. package/dist/cli/commands/cache.d.ts.map +1 -0
  29. package/dist/cli/commands/cache.js +68 -0
  30. package/dist/cli/commands/cache.js.map +1 -0
  31. package/dist/cli/commands/forum.d.ts +2 -0
  32. package/dist/cli/commands/forum.d.ts.map +1 -0
  33. package/dist/cli/commands/forum.js +38 -0
  34. package/dist/cli/commands/forum.js.map +1 -0
  35. package/dist/cli/commands/login.d.ts +2 -0
  36. package/dist/cli/commands/login.d.ts.map +1 -0
  37. package/dist/cli/commands/login.js +98 -0
  38. package/dist/cli/commands/login.js.map +1 -0
  39. package/dist/cli/commands/logout.d.ts +2 -0
  40. package/dist/cli/commands/logout.d.ts.map +1 -0
  41. package/dist/cli/commands/logout.js +20 -0
  42. package/dist/cli/commands/logout.js.map +1 -0
  43. package/dist/cli/commands/me.d.ts +2 -0
  44. package/dist/cli/commands/me.d.ts.map +1 -0
  45. package/dist/cli/commands/me.js +9 -0
  46. package/dist/cli/commands/me.js.map +1 -0
  47. package/dist/cli/commands/message.d.ts +2 -0
  48. package/dist/cli/commands/message.d.ts.map +1 -0
  49. package/dist/cli/commands/message.js +42 -0
  50. package/dist/cli/commands/message.js.map +1 -0
  51. package/dist/cli/commands/notice.d.ts +2 -0
  52. package/dist/cli/commands/notice.d.ts.map +1 -0
  53. package/dist/cli/commands/notice.js +30 -0
  54. package/dist/cli/commands/notice.js.map +1 -0
  55. package/dist/cli/commands/post.d.ts +2 -0
  56. package/dist/cli/commands/post.d.ts.map +1 -0
  57. package/dist/cli/commands/post.js +37 -0
  58. package/dist/cli/commands/post.js.map +1 -0
  59. package/dist/cli/commands/search.d.ts +2 -0
  60. package/dist/cli/commands/search.d.ts.map +1 -0
  61. package/dist/cli/commands/search.js +13 -0
  62. package/dist/cli/commands/search.js.map +1 -0
  63. package/dist/cli/commands/topic.d.ts +2 -0
  64. package/dist/cli/commands/topic.d.ts.map +1 -0
  65. package/dist/cli/commands/topic.js +196 -0
  66. package/dist/cli/commands/topic.js.map +1 -0
  67. package/dist/cli/commands/update.d.ts +2 -0
  68. package/dist/cli/commands/update.d.ts.map +1 -0
  69. package/dist/cli/commands/update.js +24 -0
  70. package/dist/cli/commands/update.js.map +1 -0
  71. package/dist/cli/commands/user.d.ts +2 -0
  72. package/dist/cli/commands/user.d.ts.map +1 -0
  73. package/dist/cli/commands/user.js +90 -0
  74. package/dist/cli/commands/user.js.map +1 -0
  75. package/dist/cli/commands/vpn.d.ts +2 -0
  76. package/dist/cli/commands/vpn.d.ts.map +1 -0
  77. package/dist/cli/commands/vpn.js +177 -0
  78. package/dist/cli/commands/vpn.js.map +1 -0
  79. package/dist/cli/context.d.ts +9 -0
  80. package/dist/cli/context.d.ts.map +1 -0
  81. package/dist/cli/context.js +26 -0
  82. package/dist/cli/context.js.map +1 -0
  83. package/dist/cli/options.d.ts +6 -0
  84. package/dist/cli/options.d.ts.map +1 -0
  85. package/dist/cli/options.js +22 -0
  86. package/dist/cli/options.js.map +1 -0
  87. package/dist/cli/parse.d.ts +15 -0
  88. package/dist/cli/parse.d.ts.map +1 -0
  89. package/dist/cli/parse.js +55 -0
  90. package/dist/cli/parse.js.map +1 -0
  91. package/dist/cli/prompt.d.ts +4 -0
  92. package/dist/cli/prompt.d.ts.map +1 -0
  93. package/dist/cli/prompt.js +53 -0
  94. package/dist/cli/prompt.js.map +1 -0
  95. package/dist/cli/router.d.ts +2 -0
  96. package/dist/cli/router.d.ts.map +1 -0
  97. package/dist/cli/router.js +90 -0
  98. package/dist/cli/router.js.map +1 -0
  99. package/dist/config.d.ts +10 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +74 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/main.d.ts +3 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +17 -0
  106. package/dist/main.js.map +1 -0
  107. package/dist/storage/cache-store.d.ts +62 -0
  108. package/dist/storage/cache-store.d.ts.map +1 -0
  109. package/dist/storage/cache-store.js +233 -0
  110. package/dist/storage/cache-store.js.map +1 -0
  111. package/dist/storage/paths.d.ts +5 -0
  112. package/dist/storage/paths.d.ts.map +1 -0
  113. package/dist/storage/paths.js +17 -0
  114. package/dist/storage/paths.js.map +1 -0
  115. package/dist/storage/token-store.d.ts +39 -0
  116. package/dist/storage/token-store.d.ts.map +1 -0
  117. package/dist/storage/token-store.js +177 -0
  118. package/dist/storage/token-store.js.map +1 -0
  119. package/dist/storage/vpn-store.d.ts +16 -0
  120. package/dist/storage/vpn-store.d.ts.map +1 -0
  121. package/dist/storage/vpn-store.js +72 -0
  122. package/dist/storage/vpn-store.js.map +1 -0
  123. package/dist/tui/account-modal.d.ts +31 -0
  124. package/dist/tui/account-modal.d.ts.map +1 -0
  125. package/dist/tui/account-modal.js +97 -0
  126. package/dist/tui/account-modal.js.map +1 -0
  127. package/dist/tui/ansi.d.ts +20 -0
  128. package/dist/tui/ansi.d.ts.map +1 -0
  129. package/dist/tui/ansi.js +28 -0
  130. package/dist/tui/ansi.js.map +1 -0
  131. package/dist/tui/app-data.d.ts +22 -0
  132. package/dist/tui/app-data.d.ts.map +1 -0
  133. package/dist/tui/app-data.js +828 -0
  134. package/dist/tui/app-data.js.map +1 -0
  135. package/dist/tui/app-runtime.d.ts +27 -0
  136. package/dist/tui/app-runtime.d.ts.map +1 -0
  137. package/dist/tui/app-runtime.js +874 -0
  138. package/dist/tui/app-runtime.js.map +1 -0
  139. package/dist/tui/app.d.ts +2 -0
  140. package/dist/tui/app.d.ts.map +1 -0
  141. package/dist/tui/app.js +172 -0
  142. package/dist/tui/app.js.map +1 -0
  143. package/dist/tui/cached-client.d.ts +41 -0
  144. package/dist/tui/cached-client.d.ts.map +1 -0
  145. package/dist/tui/cached-client.js +78 -0
  146. package/dist/tui/cached-client.js.map +1 -0
  147. package/dist/tui/canvas.d.ts +26 -0
  148. package/dist/tui/canvas.d.ts.map +1 -0
  149. package/dist/tui/canvas.js +204 -0
  150. package/dist/tui/canvas.js.map +1 -0
  151. package/dist/tui/downloads.d.ts +2 -0
  152. package/dist/tui/downloads.d.ts.map +1 -0
  153. package/dist/tui/downloads.js +81 -0
  154. package/dist/tui/downloads.js.map +1 -0
  155. package/dist/tui/image-preview.d.ts +19 -0
  156. package/dist/tui/image-preview.d.ts.map +1 -0
  157. package/dist/tui/image-preview.js +217 -0
  158. package/dist/tui/image-preview.js.map +1 -0
  159. package/dist/tui/interactions.d.ts +5 -0
  160. package/dist/tui/interactions.d.ts.map +1 -0
  161. package/dist/tui/interactions.js +25 -0
  162. package/dist/tui/interactions.js.map +1 -0
  163. package/dist/tui/keymap.d.ts +7 -0
  164. package/dist/tui/keymap.d.ts.map +1 -0
  165. package/dist/tui/keymap.js +262 -0
  166. package/dist/tui/keymap.js.map +1 -0
  167. package/dist/tui/layout.d.ts +29 -0
  168. package/dist/tui/layout.d.ts.map +1 -0
  169. package/dist/tui/layout.js +82 -0
  170. package/dist/tui/layout.js.map +1 -0
  171. package/dist/tui/renderer.d.ts +9 -0
  172. package/dist/tui/renderer.d.ts.map +1 -0
  173. package/dist/tui/renderer.js +375 -0
  174. package/dist/tui/renderer.js.map +1 -0
  175. package/dist/tui/terminal.d.ts +41 -0
  176. package/dist/tui/terminal.d.ts.map +1 -0
  177. package/dist/tui/terminal.js +162 -0
  178. package/dist/tui/terminal.js.map +1 -0
  179. package/dist/tui/text.d.ts +10 -0
  180. package/dist/tui/text.d.ts.map +1 -0
  181. package/dist/tui/text.js +158 -0
  182. package/dist/tui/text.js.map +1 -0
  183. package/dist/tui/theme.d.ts +56 -0
  184. package/dist/tui/theme.d.ts.map +1 -0
  185. package/dist/tui/theme.js +95 -0
  186. package/dist/tui/theme.js.map +1 -0
  187. package/dist/tui/tui-model.d.ts +126 -0
  188. package/dist/tui/tui-model.d.ts.map +1 -0
  189. package/dist/tui/tui-model.js +54 -0
  190. package/dist/tui/tui-model.js.map +1 -0
  191. package/dist/tui/ubb-renderer.d.ts +12 -0
  192. package/dist/tui/ubb-renderer.d.ts.map +1 -0
  193. package/dist/tui/ubb-renderer.js +196 -0
  194. package/dist/tui/ubb-renderer.js.map +1 -0
  195. package/dist/update.d.ts +17 -0
  196. package/dist/update.d.ts.map +1 -0
  197. package/dist/update.js +88 -0
  198. package/dist/update.js.map +1 -0
  199. package/dist/version.d.ts +6 -0
  200. package/dist/version.d.ts.map +1 -0
  201. package/dist/version.js +6 -0
  202. package/dist/version.js.map +1 -0
  203. package/docs/images/tui.png +0 -0
  204. package/docs/images/tui2.png +0 -0
  205. package/package.json +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/api/endpoints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface AuthToken {
2
+ access_token?: string;
3
+ refresh_token?: string;
4
+ error?: string;
5
+ error_description?: string;
6
+ }
7
+ export interface WebVpnOptions {
8
+ mode?: "auto" | "vpn" | "direct";
9
+ cookies?: Record<string, string>;
10
+ credentials?: {
11
+ username: string;
12
+ password: string;
13
+ };
14
+ }
15
+ export interface ClientOptions {
16
+ tokenStore: {
17
+ getAccessToken(): Promise<string | undefined>;
18
+ getRefreshToken(): Promise<string | undefined>;
19
+ getCurrentAccount?(): Promise<{
20
+ account: string;
21
+ refreshToken?: string;
22
+ } | undefined>;
23
+ save(tokens: {
24
+ accessToken: string;
25
+ refreshToken?: string;
26
+ }): Promise<void>;
27
+ saveAccount?(account: string, tokens: {
28
+ accessToken: string;
29
+ refreshToken?: string;
30
+ }): Promise<unknown>;
31
+ };
32
+ webVpn?: WebVpnOptions;
33
+ }
34
+ export type JsonObject = Record<string, unknown>;
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE;QACV,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC9C,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC/C,iBAAiB,CAAC,IAAI,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACzG,CAAC;IACF,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/api/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ export interface WebVpnLoginResult {
2
+ success: boolean;
3
+ message?: string;
4
+ needCaptcha?: boolean;
5
+ needConfirm?: boolean;
6
+ captchaId?: string;
7
+ }
8
+ export interface WebVpnStatus {
9
+ enabled: boolean;
10
+ loggedIn: boolean;
11
+ inCampusNetwork?: boolean;
12
+ }
13
+ export declare class WebVpnService {
14
+ private cookies;
15
+ private loggedIn;
16
+ private webVpnEnabled;
17
+ constructor(cookies?: Record<string, string>);
18
+ get isLoggedIn(): boolean;
19
+ get isEnabled(): boolean;
20
+ set enabled(value: boolean);
21
+ loadCookies(cookies: Record<string, string>): void;
22
+ getCookies(): Record<string, string>;
23
+ checkNetwork(): Promise<boolean>;
24
+ login(username: string, password: string): Promise<WebVpnLoginResult>;
25
+ confirmLogin(): Promise<WebVpnLoginResult>;
26
+ logout(): Promise<void>;
27
+ convertUrl(url: string): string;
28
+ fetch(url: string, options?: RequestInit): Promise<Response>;
29
+ getStatus(): WebVpnStatus;
30
+ private fetchWithRedirects;
31
+ private getHeaders;
32
+ private updateCookies;
33
+ private get userAgent();
34
+ private get;
35
+ private post;
36
+ private parseLoginPage;
37
+ private aesEncrypt;
38
+ private buildPassword;
39
+ }
40
+ //# sourceMappingURL=webvpn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webvpn.d.ts","sourceRoot":"","sources":["../../src/api/webvpn.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAM5C,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAUlD,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAI9B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAchC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmDrE,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAgB1C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAU7B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAmBzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAItE,SAAS,IAAI,YAAY;YAOX,kBAAkB;IA8BhC,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,aAAa;IAoBrB,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,259 @@
1
+ import { createCipheriv } from "node:crypto";
2
+ const WEBVPN_BASE = "https://webvpn.zju.edu.cn";
3
+ const MIRROR_URL = "https://mirrors.zju.edu.cn/api/is_campus_network";
4
+ const URL_KEY = "wrdvpnisthebest!";
5
+ const PWD_KEY = "wrdvpnisawesome!";
6
+ export class WebVpnService {
7
+ cookies = new Map();
8
+ loggedIn = false;
9
+ webVpnEnabled = false;
10
+ constructor(cookies) {
11
+ if (cookies) {
12
+ this.loadCookies(cookies);
13
+ }
14
+ }
15
+ get isLoggedIn() {
16
+ return this.loggedIn;
17
+ }
18
+ get isEnabled() {
19
+ return this.webVpnEnabled;
20
+ }
21
+ set enabled(value) {
22
+ this.webVpnEnabled = value;
23
+ }
24
+ loadCookies(cookies) {
25
+ this.cookies.clear();
26
+ for (const [name, value] of Object.entries(cookies)) {
27
+ if (name && value) {
28
+ this.cookies.set(name, value);
29
+ }
30
+ }
31
+ this.loggedIn = this.cookies.size > 0;
32
+ }
33
+ getCookies() {
34
+ return Object.fromEntries(this.cookies.entries());
35
+ }
36
+ async checkNetwork() {
37
+ try {
38
+ const response = await fetch(MIRROR_URL, {
39
+ headers: {
40
+ "User-Agent": this.userAgent
41
+ }
42
+ });
43
+ const text = await response.text();
44
+ return text === "1" || text === "2";
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ async login(username, password) {
51
+ try {
52
+ const loginPage = await this.get(`${WEBVPN_BASE}/login`);
53
+ const html = await loginPage.text();
54
+ const { csrf, captchaId } = this.parseLoginPage(html);
55
+ if (!csrf) {
56
+ return { success: false, message: "获取 CSRF token 失败" };
57
+ }
58
+ const encryptedPassword = this.buildPassword(PWD_KEY, password);
59
+ const formData = new URLSearchParams({
60
+ _csrf: csrf,
61
+ auth_type: "local",
62
+ sms_code: "",
63
+ captcha: "",
64
+ needCaptcha: "false",
65
+ captcha_id: captchaId || "",
66
+ username,
67
+ password: encryptedPassword
68
+ });
69
+ const loginResponse = await this.post(`${WEBVPN_BASE}/do-login`, formData.toString(), {
70
+ "Content-Type": "application/x-www-form-urlencoded"
71
+ });
72
+ const result = await loginResponse.json();
73
+ if (result.success) {
74
+ this.loggedIn = true;
75
+ return { success: true };
76
+ }
77
+ if (result.error === "NEED_CONFIRM") {
78
+ return { success: false, needConfirm: true, message: "需要确认登录" };
79
+ }
80
+ if (result.error === "CAPTCHA_FAILED") {
81
+ return {
82
+ success: false,
83
+ needCaptcha: true,
84
+ captchaId: String(result.description || ""),
85
+ message: "需要验证码"
86
+ };
87
+ }
88
+ return { success: false, message: String(result.message || result.error || "登录失败") };
89
+ }
90
+ catch (error) {
91
+ return { success: false, message: error instanceof Error ? error.message : "登录出错" };
92
+ }
93
+ }
94
+ async confirmLogin() {
95
+ try {
96
+ const response = await this.post(`${WEBVPN_BASE}/do-confirm-login`, "");
97
+ const result = await response.json();
98
+ if (result.success) {
99
+ this.loggedIn = true;
100
+ return { success: true };
101
+ }
102
+ return { success: false, message: String(result.error || "确认失败") };
103
+ }
104
+ catch (error) {
105
+ return { success: false, message: error instanceof Error ? error.message : "确认出错" };
106
+ }
107
+ }
108
+ async logout() {
109
+ try {
110
+ await this.get(`${WEBVPN_BASE}/logout`);
111
+ this.loggedIn = false;
112
+ this.cookies.clear();
113
+ }
114
+ catch {
115
+ // Ignore logout failures.
116
+ }
117
+ }
118
+ convertUrl(url) {
119
+ const uri = new URL(url);
120
+ if (uri.origin === WEBVPN_BASE) {
121
+ return url;
122
+ }
123
+ const scheme = uri.protocol.slice(0, -1);
124
+ const host = uri.hostname;
125
+ const port = uri.port ? parseInt(uri.port, 10) : 0;
126
+ const isSpecialPort = port > 0 &&
127
+ !(scheme === "http" && port === 80) &&
128
+ !(scheme === "https" && port === 443);
129
+ const property = isSpecialPort ? `${scheme}-${port}` : scheme;
130
+ const encryptedHost = this.buildPassword(URL_KEY, host);
131
+ const path = [property, encryptedHost].map((segment) => encodeURIComponent(segment)).join("/");
132
+ return `${WEBVPN_BASE}/${path}${uri.pathname}${uri.search}`;
133
+ }
134
+ async fetch(url, options = {}) {
135
+ return this.fetchWithRedirects(url, options, 0);
136
+ }
137
+ getStatus() {
138
+ return {
139
+ enabled: this.enabled,
140
+ loggedIn: this.loggedIn
141
+ };
142
+ }
143
+ async fetchWithRedirects(url, options, redirectCount) {
144
+ if (redirectCount > 10) {
145
+ throw new Error("too many WebVPN redirects");
146
+ }
147
+ const targetUrl = this.webVpnEnabled ? this.convertUrl(url) : url;
148
+ const headers = new Headers(this.getHeaders());
149
+ for (const [name, value] of new Headers(options.headers).entries()) {
150
+ headers.set(name, value);
151
+ }
152
+ const response = await fetch(targetUrl, {
153
+ ...options,
154
+ headers,
155
+ redirect: "manual"
156
+ });
157
+ if (response.status >= 300 && response.status < 400) {
158
+ const location = response.headers.get("location");
159
+ if (location) {
160
+ this.updateCookies(response);
161
+ const nextUrl = new URL(location, response.url || targetUrl).toString();
162
+ return this.fetchWithRedirects(nextUrl, redirectOptions(options, response.status), redirectCount + 1);
163
+ }
164
+ }
165
+ this.updateCookies(response);
166
+ return response;
167
+ }
168
+ getHeaders() {
169
+ const headers = {
170
+ "User-Agent": this.userAgent,
171
+ Referer: WEBVPN_BASE
172
+ };
173
+ if (this.cookies.size > 0) {
174
+ headers.Cookie = Array.from(this.cookies.entries())
175
+ .map(([key, value]) => `${key}=${value}`)
176
+ .join("; ");
177
+ }
178
+ return headers;
179
+ }
180
+ updateCookies(response) {
181
+ const headers = response.headers;
182
+ const setCookies = headers.getSetCookie?.() || splitSetCookieHeader(headers.get("set-cookie"));
183
+ for (const cookie of setCookies) {
184
+ const [nameValue] = cookie.split(";");
185
+ if (!nameValue) {
186
+ continue;
187
+ }
188
+ const separator = nameValue.indexOf("=");
189
+ if (separator < 1) {
190
+ continue;
191
+ }
192
+ const name = nameValue.slice(0, separator).trim();
193
+ const value = nameValue.slice(separator + 1).trim();
194
+ if (name && value) {
195
+ this.cookies.set(name, value);
196
+ }
197
+ }
198
+ }
199
+ get userAgent() {
200
+ return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36";
201
+ }
202
+ get(url) {
203
+ return this.fetch(url, { method: "GET" });
204
+ }
205
+ post(url, body, headers) {
206
+ return this.fetch(url, {
207
+ method: "POST",
208
+ body,
209
+ headers: headers || {}
210
+ });
211
+ }
212
+ parseLoginPage(html) {
213
+ const csrfMatch = html.match(/name="_csrf"[^>]*value="([^"]+)"/);
214
+ const captchaMatch = html.match(/name="captcha_id"[^>]*value="([^"]+)"/);
215
+ return {
216
+ csrf: csrfMatch?.[1] || "",
217
+ captchaId: captchaMatch?.[1] || ""
218
+ };
219
+ }
220
+ aesEncrypt(plaintext, key, iv) {
221
+ const keyBuffer = Buffer.from(key.padEnd(16, " ").slice(0, 16));
222
+ const ivBuffer = Buffer.from(iv.padEnd(16, " ").slice(0, 16));
223
+ const plainBytes = Buffer.from(plaintext, "utf8");
224
+ const padLen = 16 - (plainBytes.length % 16);
225
+ const padded = padLen === 16 ? plainBytes : Buffer.concat([plainBytes, Buffer.alloc(padLen)]);
226
+ const cipher = createCipheriv("aes-128-cfb", keyBuffer, ivBuffer);
227
+ cipher.setAutoPadding(false);
228
+ const encrypted = Buffer.concat([cipher.update(padded), cipher.final()]);
229
+ return encrypted.toString("hex").toLowerCase();
230
+ }
231
+ buildPassword(prefix, plaintext) {
232
+ const prefixHex = Buffer.from(prefix, "ascii").toString("hex");
233
+ const fullEncrypted = this.aesEncrypt(plaintext, prefix, prefix);
234
+ const sliceLength = 2 * plaintext.length;
235
+ return prefixHex + fullEncrypted.slice(0, Math.min(fullEncrypted.length, sliceLength));
236
+ }
237
+ }
238
+ function splitSetCookieHeader(value) {
239
+ if (!value) {
240
+ return [];
241
+ }
242
+ return value.split(/,(?=\s*[^;,=\s]+=[^;,]*)/);
243
+ }
244
+ function redirectOptions(options, status) {
245
+ const method = options.method?.toUpperCase();
246
+ if ((status === 301 || status === 302 || status === 303) && method && method !== "GET" && method !== "HEAD") {
247
+ const headers = new Headers(options.headers);
248
+ headers.delete("content-type");
249
+ headers.delete("content-length");
250
+ return {
251
+ ...options,
252
+ method: "GET",
253
+ body: undefined,
254
+ headers
255
+ };
256
+ }
257
+ return options;
258
+ }
259
+ //# sourceMappingURL=webvpn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webvpn.js","sourceRoot":"","sources":["../../src/api/webvpn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function accountCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/account.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuElE"}
@@ -0,0 +1,81 @@
1
+ import { TokenStore } from "../../storage/token-store.js";
2
+ export async function accountCommand(args) {
3
+ const [subcommand, ...rest] = args;
4
+ const tokenStore = new TokenStore();
5
+ switch (subcommand) {
6
+ case undefined:
7
+ case "--help":
8
+ case "-h":
9
+ case "help":
10
+ printAccountHelp();
11
+ return;
12
+ case "list": {
13
+ const current = await tokenStore.getCurrentAccountName();
14
+ const accounts = await tokenStore.listAccounts();
15
+ console.log(JSON.stringify({
16
+ current,
17
+ accounts: accounts.map((account) => ({
18
+ account: account.account,
19
+ userId: account.userId,
20
+ username: account.username,
21
+ displayName: account.displayName,
22
+ createdAt: account.createdAt,
23
+ updatedAt: account.updatedAt,
24
+ current: account.account === current
25
+ }))
26
+ }, null, 2));
27
+ return;
28
+ }
29
+ case "current": {
30
+ const current = await tokenStore.getCurrentAccount();
31
+ console.log(JSON.stringify(current ? {
32
+ account: current.account,
33
+ userId: current.userId,
34
+ username: current.username,
35
+ displayName: current.displayName,
36
+ createdAt: current.createdAt,
37
+ updatedAt: current.updatedAt
38
+ } : null, null, 2));
39
+ return;
40
+ }
41
+ case "use": {
42
+ const account = rest[0];
43
+ if (!account) {
44
+ throw new Error("usage: cc98 account use <account>");
45
+ }
46
+ const record = await tokenStore.useAccount(account);
47
+ console.log(JSON.stringify({
48
+ current: record.account,
49
+ userId: record.userId,
50
+ username: record.username,
51
+ displayName: record.displayName
52
+ }, null, 2));
53
+ return;
54
+ }
55
+ case "remove": {
56
+ const account = rest[0];
57
+ if (!account) {
58
+ throw new Error("usage: cc98 account remove <account>");
59
+ }
60
+ await tokenStore.removeAccount(account);
61
+ console.log(JSON.stringify({ removed: account }, null, 2));
62
+ return;
63
+ }
64
+ default:
65
+ throw new Error(`unknown account command: ${subcommand}`);
66
+ }
67
+ }
68
+ function printAccountHelp() {
69
+ console.log(`cc98 account
70
+
71
+ Usage:
72
+ cc98 account list
73
+ cc98 account current
74
+ cc98 account use <account>
75
+ cc98 account remove <account>
76
+
77
+ Options:
78
+ -h, --help Show this help
79
+ `);
80
+ }
81
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/cli/commands/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function boardCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChE"}
@@ -0,0 +1,61 @@
1
+ import { createCliContext } from "../context.js";
2
+ import { extractAccountOption } from "../options.js";
3
+ import { extractPageOptions, parsePositiveInteger, printJson } from "../parse.js";
4
+ export async function boardCommand(args) {
5
+ const accountOption = extractAccountOption(args);
6
+ const [subcommandOrId, ...rest] = accountOption.args;
7
+ const { client } = await createCliContext({ account: accountOption.account });
8
+ if (!subcommandOrId || subcommandOrId === "--help" || subcommandOrId === "-h" || subcommandOrId === "help") {
9
+ printBoardHelp();
10
+ return;
11
+ }
12
+ if (/^\d+$/.test(subcommandOrId)) {
13
+ const boardId = parsePositiveInteger(subcommandOrId, "board-id");
14
+ const page = extractPageOptions(rest, { size: 20 });
15
+ printJson(await client.getBoardTopics(boardId, page.from, page.size));
16
+ return;
17
+ }
18
+ switch (subcommandOrId) {
19
+ case "list":
20
+ printJson(await client.getAllBoards());
21
+ return;
22
+ case "info": {
23
+ const boardId = parsePositiveInteger(rest[0], "board-id");
24
+ printJson(await client.getBoardInfo(boardId));
25
+ return;
26
+ }
27
+ case "topics": {
28
+ const boardId = parsePositiveInteger(rest[0], "board-id");
29
+ const { best, args: pageArgs } = extractBestOption(rest.slice(1));
30
+ const page = extractPageOptions(pageArgs, { size: 20 });
31
+ printJson(await client.getBoardTopics(boardId, page.from, page.size, best));
32
+ return;
33
+ }
34
+ default:
35
+ throw new Error(`unknown board command: ${subcommandOrId}`);
36
+ }
37
+ }
38
+ function extractBestOption(args) {
39
+ const rest = [];
40
+ let best = false;
41
+ for (const arg of args) {
42
+ if (arg === "--best") {
43
+ best = true;
44
+ }
45
+ else {
46
+ rest.push(arg);
47
+ }
48
+ }
49
+ return { best, args: rest };
50
+ }
51
+ function printBoardHelp() {
52
+ console.log(`cc98 board
53
+
54
+ Usage:
55
+ cc98 board <board-id> [--from n] [--size n]
56
+ cc98 board list
57
+ cc98 board info <board-id>
58
+ cc98 board topics <board-id> [--from n] [--size n] [--best]
59
+ `);
60
+ }
61
+ //# sourceMappingURL=board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cacheCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"AAEA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDhE"}
@@ -0,0 +1,68 @@
1
+ import { CacheStore } from "../../storage/cache-store.js";
2
+ export async function cacheCommand(args) {
3
+ const [subcommand, ...rest] = args;
4
+ switch (subcommand) {
5
+ case undefined:
6
+ case "--help":
7
+ case "-h":
8
+ case "help":
9
+ printCacheHelp();
10
+ return;
11
+ case "stats": {
12
+ const cache = new CacheStore();
13
+ const stats = await cache.getStats();
14
+ console.log(JSON.stringify(stats, null, 2));
15
+ return;
16
+ }
17
+ case "cleanup": {
18
+ const cache = new CacheStore();
19
+ const result = await cache.cleanupFileCache();
20
+ console.log(JSON.stringify({
21
+ action: "cleanup",
22
+ removed: result.removed,
23
+ kept: result.kept
24
+ }, null, 2));
25
+ return;
26
+ }
27
+ case "clear": {
28
+ const target = rest[0] ?? "all";
29
+ const cache = new CacheStore();
30
+ switch (target) {
31
+ case "all":
32
+ await cache.clearAll();
33
+ console.log(JSON.stringify({ action: "clear", target: "all" }, null, 2));
34
+ return;
35
+ case "memory":
36
+ cache.clearMemory();
37
+ console.log(JSON.stringify({ action: "clear", target: "memory" }, null, 2));
38
+ return;
39
+ case "file":
40
+ await cache.clearFileCache();
41
+ console.log(JSON.stringify({ action: "clear", target: "file" }, null, 2));
42
+ return;
43
+ default:
44
+ throw new Error(`unknown cache clear target: ${target}. Use "all", "memory", or "file".`);
45
+ }
46
+ }
47
+ default:
48
+ throw new Error(`unknown cache command: ${subcommand}. Run "cc98 cache --help" for usage.`);
49
+ }
50
+ }
51
+ function printCacheHelp() {
52
+ console.log(`cc98 cache
53
+
54
+ Usage:
55
+ cc98 cache stats Show cache statistics
56
+ cc98 cache cleanup Remove expired cache entries
57
+ cc98 cache clear [target] Clear cache (default: all)
58
+
59
+ Clear targets:
60
+ all Clear both memory and file cache
61
+ memory Clear memory cache only
62
+ file Clear file cache only
63
+
64
+ Options:
65
+ -h, --help Show this help
66
+ `);
67
+ }
68
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/cli/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAEnC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,MAAM;YACT,cAAc,EAAE,CAAC;YACjB,OAAO;QAET,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;YAE/B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,KAAK;oBACR,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACzE,OAAO;gBACT,KAAK,QAAQ;oBACX,KAAK,CAAC,WAAW,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,OAAO;gBACT,KAAK,MAAM;oBACT,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC1E,OAAO;gBACT;oBACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,mCAAmC,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,sCAAsC,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;CAcb,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function forumCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=forum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forum.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/forum.ts"],"names":[],"mappings":"AAIA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBhE"}