diff --git a/server/package-lock.json b/server/package-lock.json index 43d2c311c..28758c035 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/server", - "version": "0.53.0", + "version": "0.54.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/server", - "version": "0.53.0", + "version": "0.54.0", "license": "ISC", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", diff --git a/server/package.json b/server/package.json index f58d4df2d..28f2da708 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/server", - "version": "0.54.0", + "version": "0.55.0", "description": "", "dependencies": { "@mapbox/node-pre-gyp": "^1.0.11", diff --git a/server/src/scrypted-server-main.ts b/server/src/scrypted-server-main.ts index 5b56abc81..349ee45a9 100644 --- a/server/src/scrypted-server-main.ts +++ b/server/src/scrypted-server-main.ts @@ -474,21 +474,24 @@ async function start(mainFilename: string, options?: { res.send(200); }); - const getAddresses = async () => { + const getAlternateAddresses = async () => { const addresses = ((await scrypted.addressSettings.getLocalAddresses()) || getHostAddresses(true, true)) .map(address => { if (ip.isV6Format(address) && !isV4Format(address)) address = `[${address}]`; return `https://${address}:${SCRYPTED_SECURE_PORT}` }); - return addresses; + return { + externalAddresses: [...new Set(Object.values(scrypted.addressSettings.externalAddresses).flat())], + addresses, + }; } app.post('/login', async (req, res) => { const { username, password, change_password, maxAge: maxAgeRequested } = req.body; const timestamp = Date.now(); const maxAge = parseInt(maxAgeRequested) || ONE_DAY_MILLISECONDS; - const addresses = await getAddresses(); + const alternateAddresses = await getAlternateAddresses(); if (hasLogin) { const user = await db.tryGet(ScryptedUser, username); @@ -530,7 +533,7 @@ async function start(mainFilename: string, options?: { ...createTokens(userToken), username, expiration: maxAge, - addresses, + ...alternateAddresses, }); return; @@ -561,7 +564,7 @@ async function start(mainFilename: string, options?: { username, token: user.token, expiration: maxAge, - addresses, + ...alternateAddresses, }); }); @@ -582,7 +585,7 @@ async function start(mainFilename: string, options?: { await checkResetLogin(); const hostname = os.hostname()?.split('.')?.[0]; - const addresses = await getAddresses(); + const alternateAddresses = await getAlternateAddresses(); // env/header based admin login if (res.locals.username) { @@ -595,7 +598,7 @@ async function start(mainFilename: string, options?: { username: res.locals.username, // TODO: do not return the token from a short term auth mechanism? token: user?.token, - addresses, + ...alternateAddresses, hostname, }); return; @@ -606,7 +609,7 @@ async function start(mainFilename: string, options?: { res.send({ expiration: ONE_DAY_MILLISECONDS, username: 'anonymous', - addresses, + ...alternateAddresses, hostname, }) return; @@ -635,7 +638,7 @@ async function start(mainFilename: string, options?: { ...createTokens(userToken), username, token: user.token, - addresses, + ...alternateAddresses, hostname, }); return; @@ -651,7 +654,7 @@ async function start(mainFilename: string, options?: { ...createTokens(userToken), expiration: (userToken.timestamp + userToken.duration) - Date.now(), username: userToken.username, - addresses, + ...alternateAddresses, hostname, }) } @@ -659,7 +662,7 @@ async function start(mainFilename: string, options?: { res.send({ error: e?.message || 'Unknown Error.', hasLogin, - addresses, + ...alternateAddresses, hostname, }) } diff --git a/server/src/services/addresses.ts b/server/src/services/addresses.ts index f40361a31..05e2c592f 100644 --- a/server/src/services/addresses.ts +++ b/server/src/services/addresses.ts @@ -3,9 +3,21 @@ import { ScryptedRuntime } from "../runtime"; import os from 'os'; export class AddressSettings { + externalAddresses: { + [id: string]: string[], + } = {}; + constructor(public scrypted: ScryptedRuntime) { } + async getExternalAddresses(id: string): Promise { + return this.externalAddresses[id] || []; + } + + async setExternalAddresses(id: string, addresses: string[]) { + this.externalAddresses[id] = addresses; + } + async setLocalAddresses(addresses: string[]) { const localAddresses = new Settings(); localAddresses._id = 'localAddresses';