Fixed typescript checks.

This commit is contained in:
SamTv12345 2024-08-19 16:30:06 +02:00
parent fd9b5d0ff3
commit be49d75fde
7 changed files with 81 additions and 25 deletions

10
pnpm-lock.yaml generated
View file

@ -203,6 +203,9 @@ importers:
languages4translatewiki: languages4translatewiki:
specifier: 0.1.3 specifier: 0.1.3
version: 0.1.3 version: 0.1.3
live-directory:
specifier: ^3.0.3
version: 3.0.3
live-plugin-manager: live-plugin-manager:
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.0.0 version: 1.0.0
@ -3297,6 +3300,9 @@ packages:
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
live-directory@3.0.3:
resolution: {integrity: sha512-d5jchsscPvkDqwv8lypjpxIIUz4w8fu+czfEkNEMGub4+EZ0SBj5Nclb4E2QmJNC5HJ4BwEdc5DHvoHZfIAK+w==}
live-plugin-manager@1.0.0: live-plugin-manager@1.0.0:
resolution: {integrity: sha512-ZzSagtubz5lrlyRZzpJ4L3KCZwdPeYKQJqz3py7hO3R4BDbt6NH2Dn70rWoQTF6ichM8P91xji1cN6ytmZ2VjQ==} resolution: {integrity: sha512-ZzSagtubz5lrlyRZzpJ4L3KCZwdPeYKQJqz3py7hO3R4BDbt6NH2Dn70rWoQTF6ichM8P91xji1cN6ytmZ2VjQ==}
@ -7916,6 +7922,10 @@ snapshots:
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
live-directory@3.0.3:
dependencies:
chokidar: 3.6.0
live-plugin-manager@1.0.0: live-plugin-manager@1.0.0:
dependencies: dependencies:
'@types/debug': 4.1.12 '@types/debug': 4.1.12

View file

@ -18,9 +18,10 @@ const settings = require('../utils/Settings');
const stats = require('../stats') const stats = require('../stats')
import util from 'util'; import util from 'util';
const webaccess = require('./express/webaccess'); const webaccess = require('./express/webaccess');
import HyperExpress from 'hyper-express'; import HyperExpress, {ServerConstructorOptions} from 'hyper-express';
import SecretRotator from '../security/SecretRotator'; import SecretRotator from '../security/SecretRotator';
import {Server} from "hyper-express/types/components/Server";
let secretRotator: SecretRotator|null = null; let secretRotator: SecretRotator|null = null;
const logger = log4js.getLogger('http'); const logger = log4js.getLogger('http');
@ -31,6 +32,7 @@ const socketsEvents = new events.EventEmitter();
const startTime = stats.settableGauge('httpStartTime'); const startTime = stats.settableGauge('httpStartTime');
exports.server = null; exports.server = null;
let appInstance: Server|null = null;
const closeServer = async () => { const closeServer = async () => {
if (exports.server != null) { if (exports.server != null) {
@ -55,8 +57,10 @@ const closeServer = async () => {
await events.once(socketsEvents, 'updated'); await events.once(socketsEvents, 'updated');
} }
await p; await p;
appInstance!.close()
clearTimeout(timeout); clearTimeout(timeout);
exports.server = null; exports.server = null;
appInstance = null
startTime.setValue(0); startTime.setValue(0);
logger.info('HTTP server closed'); logger.info('HTTP server closed');
} }
@ -100,14 +104,21 @@ exports.createServer = async () => {
exports.restartServer = async () => { exports.restartServer = async () => {
await closeServer(); await closeServer();
const opts: ServerConstructorOptions = {
auto_close: true
const app = new HyperExpress.Server(); // New syntax for express v3 }
let app: Server
if (settings.ssl) { if (settings.ssl) {
console.log('SSL -- enabled'); console.log('SSL -- enabled');
console.log(`SSL -- server key file: ${settings.ssl.key}`); console.log(`SSL -- server key file: ${settings.ssl.key}`);
console.log(`SSL -- Certificate Authority's certificate file: ${settings.ssl.cert}`); console.log(`SSL -- Certificate Authority's certificate file: ${settings.ssl.cert}`);
opts.cert_file_name = settings.ssl.cert
opts.key_file_name = settings.ssl.key
const options: MapArrayType<any> = { const options: MapArrayType<any> = {
key: fs.readFileSync(settings.ssl.key), key: fs.readFileSync(settings.ssl.key),
cert: fs.readFileSync(settings.ssl.cert), cert: fs.readFileSync(settings.ssl.cert),
@ -120,13 +131,15 @@ exports.restartServer = async () => {
options.ca.push(fs.readFileSync(caFileName)); options.ca.push(fs.readFileSync(caFileName));
} }
} }
app = new HyperExpress.Server(opts); // New syntax for express v3
const https = require('https'); const https = require('https');
exports.server = https.createServer(options, app); exports.server = https.createServer(options, app);
} else { } else {
app = new HyperExpress.Server(opts); // New syntax for express v3
const http = require('http'); const http = require('http');
exports.server = http.createServer(app); exports.server = http.createServer(app);
} }
exports.appInstance = app
app.use((req, res, next) => { app.use((req, res, next) => {
// res.header("X-Frame-Options", "deny"); // breaks embedded pads // res.header("X-Frame-Options", "deny"); // breaks embedded pads
@ -163,7 +176,7 @@ exports.restartServer = async () => {
* *
* Source: https://expressjs.com/en/guide/behind-proxies.html * Source: https://expressjs.com/en/guide/behind-proxies.html
*/ */
app.enable('trust proxy'); opts.trust_proxy = true
} }
// Measure response time // Measure response time

View file

@ -6,17 +6,16 @@ import {ErrorCaused} from "../../types/ErrorCaused";
const stats = require('../../stats') const stats = require('../../stats')
exports.expressCreateServer = (hook_name:string, args: ArgsExpressType, cb:Function) => { exports.expressCreateServer = (hook_name:string, args: ArgsExpressType, cb:Function) => {
exports.app = args.app;
// Handle errors // Handle errors
/*args.app.use((req:any, res:any, next:Function) => { args.app.set_error_handler((req, res, error)=>{
// if an error occurs Connect will pass it down // if an error occurs Connect will pass it down
// through these "error-handling" middleware // through these "error-handling" middleware
// allowing you to respond however you like // allowing you to respond however you like
res.status(500).send({error: 'Sorry, something bad happened!'}); res.status(500).json({error: 'Sorry, something bad happened!'});
console.error(err.stack ? err.stack : err.toString()); console.error(error.stack ? error.stack : error.toString());
stats.meter('http500').mark(); stats.meter('http500').mark();
});*/ })
return cb(); return cb();
}; };

View file

@ -76,6 +76,8 @@ export const expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Fu
maxHttpBufferSize: settings.socketIo.maxHttpBufferSize, maxHttpBufferSize: settings.socketIo.maxHttpBufferSize,
}) })
io.attachApp(args.app)
const handleConnection = (socket:Socket) => { const handleConnection = (socket:Socket) => {
sockets.add(socket); sockets.add(socket);

View file

@ -10,6 +10,7 @@ import {format} from 'url'
import {ParsedUrlQuery} from "node:querystring"; import {ParsedUrlQuery} from "node:querystring";
import {Http2ServerRequest, Http2ServerResponse} from "node:http2"; import {Http2ServerRequest, Http2ServerResponse} from "node:http2";
import {MapArrayType} from "../types/MapType"; import {MapArrayType} from "../types/MapType";
import LiveDirectory from "live-directory";
const configuration: Configuration = { const configuration: Configuration = {
scopes: ['openid', 'profile', 'email'], scopes: ['openid', 'profile', 'email'],
@ -153,12 +154,13 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp
}); });
args.app.post('/interaction/:uid', async (req: Http2ServerRequest, res: Http2ServerResponse, next:Function) => { args.app.post('/interaction/:uid', async (req, res, next) => {
const formid = new IncomingForm(); const formid = new IncomingForm();
try { try {
// @ts-ignore // @ts-ignore
const {login, password} = (await formid.parse(req))[0] const {login, password} = (await formid.parse(req))[0]
const {prompt, jti, session,cid, params, grantId} = await oidc.interactionDetails(req, res); // @ts-ignore
const {prompt, jti, session,cid, params, grantId} = await oidc.interactionDetails(req, res);
const client = await oidc.Client.find(params.client_id as string); const client = await oidc.Client.find(params.client_id as string);
@ -181,7 +183,8 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp
} }
if (account) { if (account) {
await oidc.interactionFinished(req, res, { // @ts-ignore
await oidc.interactionFinished(req, res, {
login: {accountId: account.username} login: {accountId: account.username}
}, {mergeWithLastSubmission: false}); }, {mergeWithLastSubmission: false});
} }
@ -213,24 +216,26 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp
} }
} }
const result = {consent: {grantId: await grant!.save()}}; const result = {consent: {grantId: await grant!.save()}};
await oidc.interactionFinished(req, res, result, { // @ts-ignore
await oidc.interactionFinished(req, res, result, {
mergeWithLastSubmission: true, mergeWithLastSubmission: true,
}); });
break; break;
} }
} }
await next(); next();
} catch (err:any) { } catch (err:any) {
return res.writeHead(500).end(err.message); return res.status(500).end(err.message);
} }
}) })
args.app.get('/interaction/:uid', async (req: Request, res: Response, next: Function) => { args.app.get('/interaction/:uid', async (req, res, next) => {
try { try {
const { const {
uid, prompt, params, session, uid, prompt, params, session,
} = await oidc.interactionDetails(req, res); // @ts-ignore
} = await oidc.interactionDetails(req, res);
params["state"] = uid params["state"] = uid
@ -253,12 +258,35 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp
return res.sendFile(path.join(settings.root,'src','static', 'oidc','login.html')); return res.sendFile(path.join(settings.root,'src','static', 'oidc','login.html'));
} }
} catch (err) { } catch (err) {
return next(err); throw new Error("Invalid name");
} }
}); });
const LiveAssets = new LiveDirectory(path.join(settings.root,'src','static', 'oidc'), {
})
args.app.use('/views/', express.static(path.join(settings.root,'src','static', 'oidc'), {maxAge: 1000 * 60 * 60 * 24})); args.app.get('/views/*', (request, response)=>{
// Strip away '/assets' from the request path to get asset relative path
// Lookup LiveFile instance from our LiveDirectory instance.
const path = request.path.replace('/views', '');
const file = LiveAssets.get(path);
// Return a 404 if no asset/file exists on the derived path
if (file === undefined) return response.status(404).send();
const fileParts = file.path.split(".");
const extension = fileParts[fileParts.length - 1];
// Retrieve the file content and serve it depending on the type of content available for this file
const content = file.content;
if (content instanceof Buffer) {
// Set appropriate mime-type and serve file content Buffer as response body (This means that the file content was cached in memory)
return response.type(extension).send(content);
} else {
// Set the type and stream the content as the response body (This means that the file content was NOT cached in memory)
return response.type(extension).stream(content);
}
});
oidc.on('authorization.error', (ctx, error) => { oidc.on('authorization.error', (ctx, error) => {
@ -277,6 +305,7 @@ export const expressCreateServer = async (hookName: string, args: ArgsExpressTyp
oidc.on('revocation.error', (ctx, error) => { oidc.on('revocation.error', (ctx, error) => {
console.log('revocation.error', error); console.log('revocation.error', error);
}) })
args.app.use("/oidc", oidc.callback()); // @ts-ignore
args.app.use("/oidc", oidc.callback());
//cb(); //cb();
} }

View file

@ -1,5 +1,7 @@
import {Server} from "hyper-express/types/components/Server";
export type ArgsExpressType = { export type ArgsExpressType = {
app:any, app: Server,
io: any, io: any,
server:any server:any
} }

View file

@ -44,19 +44,20 @@
"find-root": "1.1.0", "find-root": "1.1.0",
"formidable": "^3.5.1", "formidable": "^3.5.1",
"http-errors": "^2.0.0", "http-errors": "^2.0.0",
"hyper-express": "^6.16.4",
"jose": "^5.6.3", "jose": "^5.6.3",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"jsdom": "^24.1.1", "jsdom": "^24.1.1",
"jsonminify": "0.4.2", "jsonminify": "0.4.2",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"languages4translatewiki": "0.1.3", "languages4translatewiki": "0.1.3",
"live-directory": "^3.0.3",
"live-plugin-manager": "^1.0.0", "live-plugin-manager": "^1.0.0",
"lodash.clonedeep": "4.5.0", "lodash.clonedeep": "4.5.0",
"log4js": "^6.9.1", "log4js": "^6.9.1",
"lru-cache": "^11.0.0", "lru-cache": "^11.0.0",
"measured-core": "^2.0.0", "measured-core": "^2.0.0",
"mime-types": "^2.1.35", "mime-types": "^2.1.35",
"hyper-express": "^6.16.4",
"oidc-provider": "^8.5.1", "oidc-provider": "^8.5.1",
"openapi-backend": "^5.10.6", "openapi-backend": "^5.10.6",
"proxy-addr": "^2.0.7", "proxy-addr": "^2.0.7",