fixed broken ipv6 on linux, and weird implementation in general

19eae8cb49177fedf4ce245d9334ef6c4d64f5f8

BPplays <andymalbp@gmail.com>

1 files changed, +25 -9Showing whitespace changes
server.js+25 -9
@@ -28,7 +28,6 @@ import multer from 'multer';
2828import responseTime from 'response-time';
2929import helmet from 'helmet';
3030import bodyParser from 'body-parser';
31-import { getMatch, IPMatch, IPSubnetwork, IPRange, matches } from 'ip-matching';
3231
3332// net related library imports
3433import fetch from 'node-fetch';
@@ -70,6 +69,7 @@ import {
7069 removeColorFormatting,
7170 getSeparator,
7271 stringToBool,
72+ urlHostnameToIPv6,
7373} from './src/util.js';
7474import { UPLOADS_DIRECTORY } from './src/constants.js';
7575import { ensureThumbnailCache } from './src/endpoints/thumbnails.js';
@@ -388,14 +388,14 @@ async function getHasIP() {
388388 let hasIPv4 = false;
389389 let hasIPv4Local = false;
390390 const interfaces = os.networkInterfaces();
391- const linkLocalV6 = getMatch('fe80::/10');
392391
393392 for (const iface of Object.values(interfaces)) {
394393 if (iface === undefined) {
395394 continue;
396395 }
397396 for (const info of iface) {
398- if (info.family === 'IPv6' && !linkLocalV6.matches(info.address)) {
397+ //! change this if you ever add configurable addresses to bind to
398+ if (info.family === 'IPv6') {
399399 hasIPv6 = true;
400400 if (info.internal === true) {
401401 hasIPv6Local = true;
@@ -878,7 +878,7 @@ function handleServerListenFail(v6Failed, v4Failed, useIPv6, useIPv4) {
878878 * @returns {Promise<void>} A promise that resolves when the server is listening
879879 * @throws {Error} If the server fails to start
880880 */
881881function createHttpsServer(url, ipVersion) {
882882 return new Promise((resolve, reject) => {
883883 const server = https.createServer(
884884 {
@@ -887,7 +887,15 @@ function createHttpsServer(url) {
887887 }, app);
888888 server.on('error', reject);
889889 server.on('listening', resolve);
890- server.listen(Number(url.port || 443), url.hostname);
890+
891+ let host = url.hostname
892+ if (ipVersion === 6) host = urlHostnameToIPv6(url.hostname);
893+ server.listen({
894+ host: host,
895+ port: Number(url.port || 443),
896+ // see https://nodejs.org/api/net.html#serverlisten for why ipv6Only is used
897+ ipv6Only: true,
898+ });
891899 });
892900}
893901
@@ -897,12 +905,20 @@ function createHttpsServer(url) {
897905 * @returns {Promise<void>} A promise that resolves when the server is listening
898906 * @throws {Error} If the server fails to start
899907 */
900908function createHttpServer(url, ipVersion) {
901909 return new Promise((resolve, reject) => {
902910 const server = http.createServer(app);
903911 server.on('error', reject);
904912 server.on('listening', resolve);
905- server.listen(Number(url.port || 80), url.hostname);
913+
914+ let host = url.hostname
915+ if (ipVersion === 6) host = urlHostnameToIPv6(url.hostname);
916+ server.listen({
917+ host: host,
918+ port: Number(url.port || 80),
919+ // see https://nodejs.org/api/net.html#serverlisten for why ipv6Only is used
920+ ipv6Only: true,
921+ });
906922 });
907923}
908924
@@ -914,7 +930,7 @@ async function startHTTPorHTTPS(useIPv6, useIPv4) {
914930
915931 if (useIPv6) {
916932 try {
917933 await createFunc(tavernUrlV6, 6);
918934 } catch (error) {
919935 console.error('non-fatal error: failed to start server on IPv6');
920936 console.error(error);
@@ -925,7 +941,7 @@ async function startHTTPorHTTPS(useIPv6, useIPv4) {
925941
926942 if (useIPv4) {
927943 try {
928944 await createFunc(tavernUrl, 4);
929945 } catch (error) {
930946 console.error('non-fatal error: failed to start server on IPv4');
931947 console.error(error);