pixivflow 2.3.0 → 2.5.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.
- package/README.md +11 -0
- package/README_EN.md +11 -0
- package/dist/package.json +1 -1
- package/dist/webui/package.json +1 -1
- package/dist/webui/server/auth-middleware.d.ts +28 -0
- package/dist/webui/server/auth-middleware.d.ts.map +1 -0
- package/dist/webui/server/auth-middleware.js +68 -0
- package/dist/webui/server/auth-middleware.js.map +1 -0
- package/dist/webui/server/server-utils.d.ts +1 -1
- package/dist/webui/server/server-utils.d.ts.map +1 -1
- package/dist/webui/server/server-utils.js +2 -2
- package/dist/webui/server/server-utils.js.map +1 -1
- package/dist/webui/server/server.d.ts +3 -0
- package/dist/webui/server/server.d.ts.map +1 -1
- package/dist/webui/server/server.js +64 -3
- package/dist/webui/server/server.js.map +1 -1
- package/dist/webui/server/types.d.ts +8 -0
- package/dist/webui/server/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -99,6 +99,7 @@ pixivflow scheduler # 按 cron 配置长期挂机自动收集
|
|
|
99
99
|
| [ARCHITECTURE](docs/ARCHITECTURE.md) | 架构与技术实现 |
|
|
100
100
|
| [RELEASING](docs/RELEASING.md) | npm 发版流程 |
|
|
101
101
|
| [CHANGELOG](docs/project/CHANGELOG.md) | 版本更新日志 |
|
|
102
|
+
| [ACKNOWLEDGMENTS](docs/ACKNOWLEDGMENTS.md) | 参考与致谢:灵感来源、核心依赖与规范声明 |
|
|
102
103
|
|
|
103
104
|
English version: [README_EN.md](README_EN.md).
|
|
104
105
|
|
|
@@ -110,6 +111,16 @@ Bug 与功能建议请提交到
|
|
|
110
111
|
配置文件中包含认证信息,请勿直接分享)。安全漏洞的处理方式见
|
|
111
112
|
[SECURITY.md](SECURITY.md)。
|
|
112
113
|
|
|
114
|
+
## 致谢
|
|
115
|
+
|
|
116
|
+
- [gallery-dl](https://github.com/mikf/gallery-dl) —— ugoira 与小说正文的实现参考
|
|
117
|
+
- [pixiv-app-api](https://github.com/akameco/pixiv-app-api) · [pixiv-api](https://github.com/azuline/pixiv-api) —— App API 端点语义
|
|
118
|
+
- [get-pixivpy-token](https://github.com/eggplants/get-pixivpy-token) —— OAuth 登录流程参考
|
|
119
|
+
- [pixiv-token-getter](https://github.com/redtidev1918/pixiv-token-getter) —— 登录库
|
|
120
|
+
- [pixivflow-webui](https://github.com/redtidev1918/pixivflow-webui) —— WebUI 前端
|
|
121
|
+
|
|
122
|
+
本项目与 Pixiv Inc. 无关联。完整声明见 [docs/ACKNOWLEDGMENTS.md](docs/ACKNOWLEDGMENTS.md)。
|
|
123
|
+
|
|
113
124
|
## 许可证
|
|
114
125
|
|
|
115
126
|
[MIT](LICENSE)
|
package/README_EN.md
CHANGED
|
@@ -103,6 +103,7 @@ Full tutorial site: <https://redtidev1918.github.io/PixivFlow/>
|
|
|
103
103
|
| [ARCHITECTURE](docs/ARCHITECTURE.md) | Architecture notes |
|
|
104
104
|
| [RELEASING](docs/RELEASING.md) | npm release workflow |
|
|
105
105
|
| [CHANGELOG](docs/project/CHANGELOG.md) | Version history |
|
|
106
|
+
| [ACKNOWLEDGMENTS](docs/ACKNOWLEDGMENTS.md) | Credits and references |
|
|
106
107
|
|
|
107
108
|
Chinese version: [README.md](README.md).
|
|
108
109
|
|
|
@@ -114,6 +115,16 @@ Bugs and feature requests go to
|
|
|
114
115
|
secrets before sharing). Security issues are handled privately — see
|
|
115
116
|
[SECURITY.md](SECURITY.md).
|
|
116
117
|
|
|
118
|
+
## Acknowledgments
|
|
119
|
+
|
|
120
|
+
- [gallery-dl](https://github.com/mikf/gallery-dl) — reference for ugoira and novel text handling
|
|
121
|
+
- [pixiv-app-api](https://github.com/akameco/pixiv-app-api) · [pixiv-api](https://github.com/azuline/pixiv-api) — App API endpoint semantics
|
|
122
|
+
- [get-pixivpy-token](https://github.com/eggplants/get-pixivpy-token) — OAuth login flow reference
|
|
123
|
+
- [pixiv-token-getter](https://github.com/redtidev1918/pixiv-token-getter) — login library
|
|
124
|
+
- [pixivflow-webui](https://github.com/redtidev1918/pixivflow-webui) — WebUI frontend
|
|
125
|
+
|
|
126
|
+
Not affiliated with Pixiv Inc. Full statement: [docs/ACKNOWLEDGMENTS.md](docs/ACKNOWLEDGMENTS.md).
|
|
127
|
+
|
|
117
128
|
## License
|
|
118
129
|
|
|
119
130
|
[MIT](LICENSE)
|
package/dist/package.json
CHANGED
package/dist/webui/package.json
CHANGED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
export interface BasicAuthOptions {
|
|
3
|
+
username: string;
|
|
4
|
+
password: string;
|
|
5
|
+
/** WWW-Authenticate realm. Default: PixivFlow */
|
|
6
|
+
realm?: string;
|
|
7
|
+
/** Paths that skip authentication. Default: ['/api/health', '/health'] */
|
|
8
|
+
exemptPaths?: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse an Authorization: Basic header into credentials.
|
|
12
|
+
* Returns null when the header is absent or malformed.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseBasicAuthHeader(header: unknown): {
|
|
15
|
+
username: string;
|
|
16
|
+
password: string;
|
|
17
|
+
} | null;
|
|
18
|
+
/**
|
|
19
|
+
* Validate a Basic auth header against the configured credentials.
|
|
20
|
+
* Shared by the HTTP middleware and the Socket.IO handshake guard.
|
|
21
|
+
*/
|
|
22
|
+
export declare function verifyBasicAuth(authorizationHeader: unknown, username: string, password: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* HTTP Basic Auth middleware. Opt-in via WEBUI_USERNAME / WEBUI_PASSWORD env.
|
|
25
|
+
* OPTIONS preflight requests and exempt paths (health checks) pass through.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createBasicAuthMiddleware(options: BasicAuthOptions): (req: Request, res: Response, next: NextFunction) => void;
|
|
28
|
+
//# sourceMappingURL=auth-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../../src/webui/server/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAanG;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,mBAAmB,EAAE,OAAO,EAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAIT;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gBAAgB,GACxB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAmB3D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseBasicAuthHeader = parseBasicAuthHeader;
|
|
4
|
+
exports.verifyBasicAuth = verifyBasicAuth;
|
|
5
|
+
exports.createBasicAuthMiddleware = createBasicAuthMiddleware;
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
/**
|
|
8
|
+
* Parse an Authorization: Basic header into credentials.
|
|
9
|
+
* Returns null when the header is absent or malformed.
|
|
10
|
+
*/
|
|
11
|
+
function parseBasicAuthHeader(header) {
|
|
12
|
+
if (typeof header !== 'string')
|
|
13
|
+
return null;
|
|
14
|
+
const [scheme, b64] = header.split(' ');
|
|
15
|
+
if (scheme !== 'Basic' || !b64)
|
|
16
|
+
return null;
|
|
17
|
+
let decoded;
|
|
18
|
+
try {
|
|
19
|
+
decoded = Buffer.from(b64, 'base64').toString('utf8');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const idx = decoded.indexOf(':');
|
|
25
|
+
if (idx === -1)
|
|
26
|
+
return null;
|
|
27
|
+
return { username: decoded.slice(0, idx), password: decoded.slice(idx + 1) };
|
|
28
|
+
}
|
|
29
|
+
/** Constant-time comparison (lengths normalized via hash to avoid timing leaks). */
|
|
30
|
+
function safeEqual(a, b) {
|
|
31
|
+
const ha = (0, node_crypto_1.createHash)('sha256').update(a).digest();
|
|
32
|
+
const hb = (0, node_crypto_1.createHash)('sha256').update(b).digest();
|
|
33
|
+
return (0, node_crypto_1.timingSafeEqual)(ha, hb);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate a Basic auth header against the configured credentials.
|
|
37
|
+
* Shared by the HTTP middleware and the Socket.IO handshake guard.
|
|
38
|
+
*/
|
|
39
|
+
function verifyBasicAuth(authorizationHeader, username, password) {
|
|
40
|
+
const creds = parseBasicAuthHeader(authorizationHeader);
|
|
41
|
+
if (!creds)
|
|
42
|
+
return false;
|
|
43
|
+
return safeEqual(creds.username, username) && safeEqual(creds.password, password);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* HTTP Basic Auth middleware. Opt-in via WEBUI_USERNAME / WEBUI_PASSWORD env.
|
|
47
|
+
* OPTIONS preflight requests and exempt paths (health checks) pass through.
|
|
48
|
+
*/
|
|
49
|
+
function createBasicAuthMiddleware(options) {
|
|
50
|
+
const realm = options.realm ?? 'PixivFlow';
|
|
51
|
+
const exempt = new Set(options.exemptPaths ?? ['/api/health', '/health']);
|
|
52
|
+
return (req, res, next) => {
|
|
53
|
+
if (req.method === 'OPTIONS' || exempt.has(req.path)) {
|
|
54
|
+
next();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (verifyBasicAuth(req.headers.authorization, options.username, options.password)) {
|
|
58
|
+
next();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
res.setHeader('WWW-Authenticate', `Basic realm="${realm}", charset="UTF-8"`);
|
|
62
|
+
res.status(401).json({
|
|
63
|
+
errorCode: 'UNAUTHORIZED',
|
|
64
|
+
message: 'Authentication required. Set WEBUI_USERNAME / WEBUI_PASSWORD to configure credentials.',
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../../src/webui/server/auth-middleware.ts"],"names":[],"mappings":";;AAgBA,oDAaC;AAaD,0CAQC;AAMD,8DAqBC;AA5ED,6CAA0D;AAW1D;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,MAAe;IAClD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,oFAAoF;AACpF,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACrC,MAAM,EAAE,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,MAAM,EAAE,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,OAAO,IAAA,6BAAe,EAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC7B,mBAA4B,EAC5B,QAAgB,EAChB,QAAgB;IAEhB,MAAM,KAAK,GAAG,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CACvC,OAAyB;IAEzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnF,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,KAAK,oBAAoB,CAAC,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,wFAAwF;SAClG,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -5,7 +5,7 @@ export declare function findAvailablePort(startPort: number, host: string, maxAt
|
|
|
5
5
|
/**
|
|
6
6
|
* Log server startup message
|
|
7
7
|
*/
|
|
8
|
-
export declare function logServerStart(host: string, port: number): void;
|
|
8
|
+
export declare function logServerStart(host: string, port: number, scheme?: 'http' | 'https'): void;
|
|
9
9
|
/**
|
|
10
10
|
* Log server error message
|
|
11
11
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-utils.d.ts","sourceRoot":"","sources":["../../../src/webui/server/server-utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"server-utils.d.ts","sourceRoot":"","sources":["../../../src/webui/server/server-utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,GAAG,IAAI,CAOlG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGlD"}
|
|
@@ -43,8 +43,8 @@ async function findAvailablePort(startPort, host, maxAttempts = 10) {
|
|
|
43
43
|
/**
|
|
44
44
|
* Log server startup message
|
|
45
45
|
*/
|
|
46
|
-
function logServerStart(host, port) {
|
|
47
|
-
const message = `WebUI server started on
|
|
46
|
+
function logServerStart(host, port, scheme = 'http') {
|
|
47
|
+
const message = `WebUI server started on ${scheme}://${host}:${port}`;
|
|
48
48
|
logger_1.logger.info(message);
|
|
49
49
|
// Also output to stdout for Electron detection
|
|
50
50
|
console.log(`[WebUI] ${message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../../../src/webui/server/server-utils.ts"],"names":[],"mappings":";;AAKA,8CA2CC;AAKD,wCAOC;AAKD,wCAGC;AApED,yCAAsC;AAEtC;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,IAAY,EACZ,cAAsB,EAAE;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACzD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAElC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;gBAChD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,yBAAyB;YACzB,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0CAA0C,WAAW,2BAA2B,SAAS,EAAE,CAC5F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,IAAY;
|
|
1
|
+
{"version":3,"file":"server-utils.js","sourceRoot":"","sources":["../../../src/webui/server/server-utils.ts"],"names":[],"mappings":";;AAKA,8CA2CC;AAKD,wCAOC;AAKD,wCAGC;AApED,yCAAsC;AAEtC;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,IAAY,EACZ,cAAsB,EAAE;IAExB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;QAC3B,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACzD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAElC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;oBACxB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;gBAChD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,yBAAyB;YACzB,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0CAA0C,WAAW,2BAA2B,SAAS,EAAE,CAC5F,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,IAAY,EAAE,SAA2B,MAAM;IAC1F,MAAM,OAAO,GAAG,2BAA2B,MAAM,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;IACtE,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,+CAA+C;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,4CAA4C;AACpF,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,eAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/webui/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/webui/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAI3C,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,WAAW,CAAC;AAiBnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,WAAW;IACtB,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,SAAS,CAAC,CAAyC;IAC3D,OAAO,CAAC,SAAS,CAA4B;IAEtC,OAAO,IAAI,MAAM;gBAIZ,OAAO,GAAE,kBAAuB;IAwG/B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA4C9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,YAAY;CAG7B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA8CjB"}
|
|
@@ -33,6 +33,8 @@ exports.WebUIServer = void 0;
|
|
|
33
33
|
exports.startWebUI = startWebUI;
|
|
34
34
|
const express_1 = __importDefault(require("express"));
|
|
35
35
|
const http_1 = require("http");
|
|
36
|
+
const https_1 = require("https");
|
|
37
|
+
const fs_1 = require("fs");
|
|
36
38
|
const socket_io_1 = require("socket.io");
|
|
37
39
|
const path_1 = __importDefault(require("path"));
|
|
38
40
|
const logger_1 = require("../../logger");
|
|
@@ -41,6 +43,7 @@ const config_1 = require("../../config");
|
|
|
41
43
|
// WebSocket handlers
|
|
42
44
|
const LogStream_1 = require("../websocket/LogStream");
|
|
43
45
|
const DownloadStatus_1 = require("../websocket/DownloadStatus");
|
|
46
|
+
const auth_middleware_1 = require("./auth-middleware");
|
|
44
47
|
// Server setup modules
|
|
45
48
|
const server_middleware_1 = require("./server-middleware");
|
|
46
49
|
const server_routes_1 = require("./server-routes");
|
|
@@ -53,24 +56,70 @@ class WebUIServer {
|
|
|
53
56
|
io;
|
|
54
57
|
port;
|
|
55
58
|
host;
|
|
59
|
+
basicAuthEnabled = false;
|
|
60
|
+
basicAuth;
|
|
61
|
+
tlsScheme = 'http';
|
|
56
62
|
getPort() {
|
|
57
63
|
return this.port;
|
|
58
64
|
}
|
|
59
65
|
constructor(options = {}) {
|
|
60
66
|
this.port = options.port || (process.env.PORT ? parseInt(process.env.PORT, 10) : ports_1.PORTS.PROD_API);
|
|
61
67
|
this.host = options.host || 'localhost';
|
|
68
|
+
// TLS opt-in via WEBUI_TLS_CERT / WEBUI_TLS_KEY (both required)
|
|
69
|
+
const tlsCertPath = process.env.WEBUI_TLS_CERT;
|
|
70
|
+
const tlsKeyPath = process.env.WEBUI_TLS_KEY;
|
|
71
|
+
if (tlsCertPath && tlsKeyPath) {
|
|
72
|
+
options = { ...options, tls: { certPath: tlsCertPath, keyPath: tlsKeyPath } };
|
|
73
|
+
this.tlsScheme = 'https';
|
|
74
|
+
}
|
|
62
75
|
// Initialize Express app
|
|
63
76
|
this.app = (0, express_1.default)();
|
|
64
77
|
// Setup middleware
|
|
65
78
|
(0, server_middleware_1.setupMiddleware)(this.app, options);
|
|
79
|
+
// Optional HTTP Basic Auth (opt-in via WEBUI_USERNAME + WEBUI_PASSWORD).
|
|
80
|
+
// Covers API routes, static files and Socket.IO handshakes; health checks
|
|
81
|
+
// stay open so container healthchecks keep working.
|
|
82
|
+
const authUser = process.env.WEBUI_USERNAME;
|
|
83
|
+
const authPass = process.env.WEBUI_PASSWORD;
|
|
84
|
+
if (authUser && authPass) {
|
|
85
|
+
this.basicAuthEnabled = true;
|
|
86
|
+
this.basicAuth = { username: authUser, password: authPass };
|
|
87
|
+
logger_1.logger.info('WebUI basic auth enabled');
|
|
88
|
+
this.app.use((0, auth_middleware_1.createBasicAuthMiddleware)({
|
|
89
|
+
username: authUser,
|
|
90
|
+
password: authPass,
|
|
91
|
+
exemptPaths: ['/api/health', '/health'],
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
logger_1.logger.warn('WebUI authentication is DISABLED (set WEBUI_USERNAME and WEBUI_PASSWORD to enable basic auth)');
|
|
96
|
+
}
|
|
66
97
|
// Setup API routes
|
|
67
98
|
(0, server_routes_1.setupRoutes)(this.app);
|
|
68
99
|
// Setup static file serving
|
|
69
100
|
(0, server_static_1.setupStaticFiles)(this.app, options.staticPath);
|
|
70
101
|
// Error handler (must be last)
|
|
71
102
|
this.app.use(server_middleware_1.errorHandler);
|
|
72
|
-
// Create HTTP server
|
|
73
|
-
|
|
103
|
+
// Create HTTP or HTTPS server (TLS opt-in via WEBUI_TLS_CERT/KEY)
|
|
104
|
+
if (options.tls) {
|
|
105
|
+
try {
|
|
106
|
+
this.server = (0, https_1.createServer)({
|
|
107
|
+
cert: (0, fs_1.readFileSync)(options.tls.certPath),
|
|
108
|
+
key: (0, fs_1.readFileSync)(options.tls.keyPath),
|
|
109
|
+
}, this.app);
|
|
110
|
+
logger_1.logger.info('WebUI TLS enabled', {
|
|
111
|
+
certPath: options.tls.certPath,
|
|
112
|
+
keyPath: options.tls.keyPath,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
(0, server_utils_1.logServerError)(`Failed to load TLS certificate/key: ${error instanceof Error ? error.message : String(error)}`);
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.server = (0, http_1.createServer)(this.app);
|
|
122
|
+
}
|
|
74
123
|
// Initialize Socket.IO
|
|
75
124
|
this.io = new socket_io_1.Server(this.server, {
|
|
76
125
|
cors: {
|
|
@@ -81,6 +130,18 @@ class WebUIServer {
|
|
|
81
130
|
// Setup WebSocket handlers
|
|
82
131
|
(0, LogStream_1.setupLogStream)(this.io);
|
|
83
132
|
(0, DownloadStatus_1.setupDownloadStatus)(this.io);
|
|
133
|
+
// Socket.IO handshake guard (mirrors the HTTP basic auth above)
|
|
134
|
+
if (this.basicAuth) {
|
|
135
|
+
const ba = this.basicAuth;
|
|
136
|
+
this.io.use((socket, next) => {
|
|
137
|
+
if ((0, auth_middleware_1.verifyBasicAuth)(socket.handshake.headers.authorization, ba.username, ba.password)) {
|
|
138
|
+
next();
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
next(new Error('WebUI authentication required'));
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
84
145
|
}
|
|
85
146
|
async start() {
|
|
86
147
|
return new Promise(async (resolve, reject) => {
|
|
@@ -107,7 +168,7 @@ class WebUIServer {
|
|
|
107
168
|
}
|
|
108
169
|
// Try to start on the resolved port
|
|
109
170
|
this.server.listen(actualPort, this.host, () => {
|
|
110
|
-
(0, server_utils_1.logServerStart)(this.host, actualPort);
|
|
171
|
+
(0, server_utils_1.logServerStart)(this.host, actualPort, this.tlsScheme);
|
|
111
172
|
resolve(actualPort);
|
|
112
173
|
});
|
|
113
174
|
this.server.on('error', (err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/webui/server/server.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;;;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/webui/server/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,5 +7,13 @@ export interface WebUIServerOptions {
|
|
|
7
7
|
enableCors?: boolean;
|
|
8
8
|
corsOrigin?: string | string[];
|
|
9
9
|
staticPath?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Serve HTTPS instead of HTTP. When set, both files must be readable.
|
|
12
|
+
* Opt-in via WEBUI_TLS_CERT / WEBUI_TLS_KEY env.
|
|
13
|
+
*/
|
|
14
|
+
tls?: {
|
|
15
|
+
certPath: string;
|
|
16
|
+
keyPath: string;
|
|
17
|
+
};
|
|
10
18
|
}
|
|
11
19
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/webui/server/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/webui/server/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C"}
|
package/package.json
CHANGED