From c05de1019247f2181b2211e4da967fc8450728ea Mon Sep 17 00:00:00 2001 From: Alexandre Tuleu Date: Wed, 20 Sep 2023 11:24:10 +0200 Subject: [PATCH] Check ip range for public/private view. --- package-lock.json | 17 +++++++++++++++++ package.json | 1 + src/lib/server/config.ts | 23 ++++++++++++++++++----- src/routes/+page.server.ts | 8 ++++++-- src/routes/+page.svelte | 9 ++++++++- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1c38dc..54c29e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@fortawesome/fontawesome-free": "^6.4.2", "dotenv": "^16.3.1", + "ip-range-check": "^0.2.0", "js-yaml": "^4.1.0" }, "devDependencies": { @@ -2588,6 +2589,22 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ip-range-check": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ip-range-check/-/ip-range-check-0.2.0.tgz", + "integrity": "sha512-oaM3l/3gHbLlt/tCWLvt0mj1qUaI+STuRFnUvARGCujK9vvU61+2JsDpmkMzR4VsJhuFXWWgeKKVnwwoFfzCqw==", + "dependencies": { + "ipaddr.js": "^1.0.1" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", diff --git a/package.json b/package.json index 8ff4002..5d87425 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "dependencies": { "@fortawesome/fontawesome-free": "^6.4.2", "dotenv": "^16.3.1", + "ip-range-check": "^0.2.0", "js-yaml": "^4.1.0" } } diff --git a/src/lib/server/config.ts b/src/lib/server/config.ts index bc92eb5..23785f1 100644 --- a/src/lib/server/config.ts +++ b/src/lib/server/config.ts @@ -9,6 +9,8 @@ import type { ServiceGroupConfig } from '$lib/config'; +import * as ipRangeCheck from 'ip-range-check'; + const requiredService: Required = { title: '', subtitle: '', @@ -19,7 +21,7 @@ const requiredService: Required = { target: '', type: '', tag: '', - keywords: [], + keywords: [] }; const requiredServiceGroup: Required = { @@ -82,9 +84,8 @@ function merge(a: Type, b: SPOJO): Type { return res; } - export function mergeConfig(a: Config, b: SPOJO): Config { - return merge(a,b); + return merge(a, b); } const defaultLightConfig: ColorConfig = {}; @@ -132,7 +133,7 @@ export const defaultConfig: Config = { function strip(toStrip: Type, reference: Type): Type { const res: Type = { ...toStrip }; - if ( reference == undefined ) { + if (reference == undefined) { return res; } const referenceNames = Object.entries(reference).map(([key, value]) => key); @@ -157,7 +158,6 @@ function strip(toStrip: Type, reference: Type): Type { continue; } - // it is a child object, we strip it further const childReference: SPOJO = reference[key] as SPOJO; (res as SPOJO)[key] = strip(value as SPOJO, childReference); @@ -173,6 +173,7 @@ export function stripPrivateFields(config: Config): Config { if (config?.colors?.light != undefined) { res.colors.light = config.colors.light; } + res.f; return res; } @@ -215,3 +216,15 @@ export function watchDymamicConfig() { } })(); } + +export function clientAddressIsPrivate(clientAddress: string, config: Config): boolean { + const ranges: string[] = (config.privateIPs as string[]) || [ + '192.168.0.0/16', + '100.64.0.0/10', + '::1', + '127.0.0.1', + '10.0.0.0/8' + ]; + + return ipRangeCheck.default(clientAddress, ranges); +} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 5299393..f777a77 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,4 +1,4 @@ -import { clientConfig, serverConfig } from '$lib/server/config'; +import { clientAddressIsPrivate, clientConfig, serverConfig } from '$lib/server/config'; import type { PageServerLoad } from './$types'; import { getServiceHandler } from '$lib/services/services'; @@ -22,5 +22,9 @@ export const load: PageServerLoad = ({ fetch, getClientAddress }) => { } } - return { config, serviceData, location: getClientAddress() }; + return { + config, + serviceData, + privateAccess: clientAddressIsPrivate(getClientAddress(), privateConfig) + }; }; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 11ef5fc..ebb0d8e 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -19,7 +19,14 @@
-
Made with ♥ by atuleu. Your IP is {data.location}
+
+ Made with ♥ by atuleu. + {#if data.privateAccess === true} + Private view + {:else} + Public view + {/if} +