monitor/core/modules/WebServer/middlewares/ctxVarsMw.ts
2025-04-16 22:30:27 +07:00

63 lines
1.9 KiB
TypeScript

const modulename = 'WebServer:SetupVarsMw';
import consoleFactory from '@lib/console';
import consts from '@shared/consts';
const console = consoleFactory(modulename);
import { Next } from "koa";
import { CtxWithSession } from '../ctxTypes';
import { isIpAddressLocal } from '@lib/host/isIpAddressLocal';
//The custom tx-related vars set to the ctx
export type CtxTxVars = {
isWebInterface: boolean;
realIP: string;
isLocalRequest: boolean;
hostType: 'localhost' | 'ip' | 'other';
};
/**
* Middleware responsible for setting up the ctx.txVars
*/
const ctxVarsMw = (ctx: CtxWithSession, next: Next) => {
//Prepare variables
const txVars: CtxTxVars = {
isWebInterface: typeof ctx.headers['x-txadmin-token'] !== 'string',
realIP: ctx.ip,
isLocalRequest: isIpAddressLocal(ctx.ip),
hostType: 'other',
};
//Setting up the user's host type
const host = ctx.request.host ?? 'none';
if (host.startsWith('localhost') || host.startsWith('127.')) {
txVars.hostType = 'localhost';
} else if (/^\d+\.\d+\.\d+\.\d+(?::\d+)?$/.test(host)) {
txVars.hostType = 'ip';
}
//Setting up the user's real ip from the webpipe
//NOTE: not used anywhere except rate limiter, and login logs.
if (
typeof ctx.headers['x-txadmin-identifiers'] === 'string'
&& typeof ctx.headers['x-txadmin-token'] === 'string'
&& ctx.headers['x-txadmin-token'] === txCore.webServer.luaComToken
&& txVars.isLocalRequest
) {
const ipIdentifier = ctx.headers['x-txadmin-identifiers']
.split(',')
.find((i) => i.substring(0, 3) === 'ip:');
if (ipIdentifier) {
const srcIP = ipIdentifier.substring(3);
if (consts.regexValidIP.test(srcIP)) {
txVars.realIP = srcIP;
}
}
}
//Injecting vars and continuing
ctx.txVars = txVars;
return next();
}
export default ctxVarsMw;