63 lines
1.9 KiB
TypeScript
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;
|