From 52e1fc78b9a354114843338eb1b94743af033598 Mon Sep 17 00:00:00 2001 From: Sam Machin Date: Sun, 5 Oct 2025 01:08:42 +0100 Subject: [PATCH] Store the private IP in redis when a client registers (#113) * add srf.locals.privateSipAddress * add private SBC address in client redis data * lint --- app.js | 20 ++++++++++++++++++-- lib/register.js | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app.js b/app.js index a46013f..0552ff7 100644 --- a/app.js +++ b/app.js @@ -32,6 +32,7 @@ assert.ok(DRACHTIO_PORT, 'missing DRACHTIO_PORT env var'); assert.ok(DRACHTIO_SECRET, 'missing DRACHTIO_SECRET env var'); assert.ok(JAMBONES_TIME_SERIES_HOST, 'missing JAMBONES_TIME_SERIES_HOST env var'); +const CIDRMatcher = require('cidr-matcher'); const logger = require('pino')({ level: JAMBONES_LOGLEVEL || 'info' }); const Srf = require('drachtio-srf'); const srf = new Srf(); @@ -120,11 +121,26 @@ srf.locals = { writeAlerts, AlertType }; +const cidrs = process.env.JAMBONES_NETWORK_CIDR + .split(',') + .map((s) => s.trim()); +const matcher = new CIDRMatcher(cidrs); srf.connect({ host: DRACHTIO_HOST, port: DRACHTIO_PORT, secret: DRACHTIO_SECRET }); -srf.on('connect', (err, hp) => { +srf.on('connect', (err, hp, version, localHostports) => { if (err) return logger.error({ err }, 'Error connecting to drachtio server'); - logger.info(`connected to drachtio listening on ${hp}`); + logger.info(`connected to drachtio listening on ${hp}, local hostports: ${localHostports}`); + + if (localHostports) { + const locals = localHostports.split(','); + for (const hp of locals) { + const arr = /^(.*)\/(.*):(\d+)$/.exec(hp); + if (arr && 'tcp' === arr[1] && matcher.contains(arr[2])) { + const hostport = `${arr[2]}:${arr[3]}`; + srf.locals.privateSipAddress = hostport; + } + } + } // Add SBC Public IP to Database srf.locals.sbcPublicIpAddress = {}; diff --git a/lib/register.js b/lib/register.js index 53bbe88..48b5b72 100644 --- a/lib/register.js +++ b/lib/register.js @@ -32,6 +32,7 @@ async function register(logger, req, res) { const opts = { contact: req.getParsedHeader('Contact')[0].uri, sbcAddress: req.server.hostport, + privateSbcAddress: req.srf.locals.privateSipAddress, protocol: getSipProtocol(req), proxy: `sip:${req.source_address}:${req.source_port}`, callHook: req.authorization.grant.call_hook,