Rewrite frontend as single self-contained HTML file — all CSS/JS inline, no external files to fail loading
This commit is contained in:
2
dist/server/middleware/auth.d.ts
vendored
Normal file
2
dist/server/middleware/auth.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
export declare function basicAuth(req: Request, res: Response, next: NextFunction): void;
|
||||
32
dist/server/middleware/auth.js
vendored
Normal file
32
dist/server/middleware/auth.js
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.basicAuth = basicAuth;
|
||||
const AUTH_USERNAME = process.env.SERVER_USERNAME || 'admin';
|
||||
const AUTH_PASSWORD = process.env.SERVER_PASSWORD || 'aidio2024';
|
||||
function basicAuth(req, res, next) {
|
||||
// Allow login/check endpoints and all non-API routes (static files, HTML)
|
||||
if (req.path === '/api/auth/login' || req.path === '/api/auth/check' || !req.path.startsWith('/api/')) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
// Support token via query param for SSE (EventSource doesn't support custom headers)
|
||||
let authHeader = req.headers.authorization;
|
||||
if (!authHeader && req.query.token) {
|
||||
const token = Array.isArray(req.query.token) ? req.query.token[0] : req.query.token;
|
||||
authHeader = `Basic ${token}`;
|
||||
}
|
||||
if (!authHeader || !authHeader.startsWith('Basic ')) {
|
||||
res.setHeader('WWW-Authenticate', 'Basic realm="Audio Description Server"');
|
||||
res.status(401).json({ error: 'Authentication required' });
|
||||
return;
|
||||
}
|
||||
const credentials = Buffer.from(authHeader.slice(6), 'base64').toString('utf-8');
|
||||
const [username, password] = credentials.split(':');
|
||||
if (username === AUTH_USERNAME && password === AUTH_PASSWORD) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
res.setHeader('WWW-Authenticate', 'Basic realm="Audio Description Server"');
|
||||
res.status(401).json({ error: 'Invalid credentials' });
|
||||
}
|
||||
//# sourceMappingURL=auth.js.map
|
||||
1
dist/server/middleware/auth.js.map
vendored
Normal file
1
dist/server/middleware/auth.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":";;AAKA,8BA8BC;AAjCD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC;AAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW,CAAC;AAEjE,SAAgB,SAAS,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACvE,0EAA0E;IAC1E,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,GAAG,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACtG,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,qFAAqF;IACrF,IAAI,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAC3C,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;QACpF,UAAU,GAAG,SAAS,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,wCAAwC,CAAC,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpD,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC7D,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,wCAAwC,CAAC,CAAC;IAC5E,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;AACzD,CAAC"}
|
||||
Reference in New Issue
Block a user