From d564f064d69c780e855133c0436c619f3bde3bc2 Mon Sep 17 00:00:00 2001 From: Aetherinox Date: Fri, 11 Apr 2025 12:58:41 -0700 Subject: [PATCH] feat: add env variable `WEB_PROXY_HEADER` to override proxy header --- Dockerfile | 1 + tvapp2/index.js | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index a4be35a4..40452c98 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,6 +74,7 @@ ENV URL_REPO="https://git.binaryninja.net/binaryninja/" ENV WEB_IP="0.0.0.0" ENV WEB_PORT=4124 ENV WEB_ENCODING="deflate, br" +ENV WEB_PROXY_HEADER="x-forwarded-for" ENV STREAM_QUALITY="hd" ENV FILE_URL="urls.txt" ENV FILE_M3U="playlist.m3u8" diff --git a/tvapp2/index.js b/tvapp2/index.js index 79cdf4e8..ca807a0c 100755 --- a/tvapp2/index.js +++ b/tvapp2/index.js @@ -78,6 +78,7 @@ const envApiKey = process.env.API_KEY || null; const envWebIP = process.env.WEB_IP || '0.0.0.0'; const envWebPort = process.env.WEB_PORT || `4124`; const envWebEncoding = process.env.WEB_ENCODING || 'deflate, br'; +const envProxyHeader = process.env.WEB_PROXY_HEADER || 'x-forwarded-for'; const envHealthTimer = process.env.HEALTH_TIMER || 600000; const LOG_LEVEL = process.env.LOG_LEVEL || 10; @@ -235,6 +236,23 @@ else FILE_GZP = path.resolve( __dirname, FOLDER_WWW, `${ envFileGZP }` ); } +/* + Get Client IP + + prioritize header. +*/ + +const clientIp = ( req ) => + ( req.headers && ( + req.headers[envProxyHeader]?.split( ',' )?.shift() || + req.headers['X-Forwarded-For']?.split( ',' )?.shift() || + req.headers['x-forwarded-for']?.split( ',' )?.shift() || + req.headers['cf-connecting-ip']?.split( ',' )?.shift() || + req.headers['x-real-ip']?.split( ',' )?.shift() || + req.headers['X-Real-IP']?.split( ',' )?.shift() || + req.socket?.remoteAddress ) || + envIpContainer ); + /* Semaphore > Declare @@ -574,7 +592,7 @@ async function serveKey( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: 'Error: Missing "uri" parameter for key download.', status: 'unhealthy', ref: req.url, @@ -605,7 +623,7 @@ async function serveKey( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `Failed to serve key`, error: `${ err.message }`, status: 'unhealthy', @@ -768,7 +786,7 @@ async function serveM3UPlaylist( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `Missing ?url= parameter`, status: `unhealthy`, ref: req.url, @@ -822,7 +840,7 @@ async function serveM3UPlaylist( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `Failed to retrieve tokenized URL.`, status: `unhealthy`, ref: req.url, @@ -861,7 +879,7 @@ async function serveM3UPlaylist( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `Cannot process request when fetching channel playlist`, error: `${ err.message }`, status: 'unhealthy', @@ -901,7 +919,7 @@ async function serveHealthCheck( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `healthy`, status: `healthy`, ref: req.url, @@ -927,7 +945,7 @@ async function serveHealthCheck( req, res ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `health check failed`, error: `${ err.message }`, status: `unhealthy`, @@ -1016,7 +1034,7 @@ async function serveM3U( res, req ) { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( req ), message: `Fatal error serving playlist`, error: `${ err.message }`, status: 'unhealthy', @@ -1232,7 +1250,7 @@ const server = http.createServer( ( request, response ) => { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( response ), message: 'Restart command received', status: 'ok', ref: request.url, @@ -1378,7 +1396,7 @@ const server = http.createServer( ( request, response ) => { ip: envIpContainer, gateway: envIpGateway, - uptime: process.uptime(), + client: clientIp( response ), message: 'Page not found', status: 'healthy', ref: request.url,