Files
freeplanet_serverside/src/server/serverUtils.js
Surya Paolo 70698fab44 - primo aggiornamento myreccard
- aggiunta sito germogliamo.app
- aggiornato login con il parametro "browser_random" che serve per fare un login anche su 2 pagine contemporaneamente.
2025-11-25 17:45:24 +01:00

114 lines
3.5 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const express = require('express');
var app = express();
function parseDomains() {
try {
const ris = {
domains: JSON.parse(process.env.DOMAINS || '[]'),
domainsAllowed: JSON.parse(process.env.DOMAINS_ALLOWED || '[]'),
};
return ris;
} catch {
return { domains: [], domainsAllowed: [] };
}
}
function buildAllowedOrigins(domains, domainsAllowed, isProduction) {
if (!isProduction) {
return [
'https://localhost:3000',
'https://localhost:8089',
'https://localhost:8082',
'https://localhost:8083',
'https://localhost:8084',
'https://localhost:8085',
'https://localhost:8088',
'https://localhost:8099',
'https://localhost:8094',
'https://192.168.8.182',
'https://192.168.8.182:8084/',
'http://192.168.8.182:8084/',
];
}
const baseOrigins = domains.flatMap((domain) => [
`https://${domain.hostname}`,
`https://api.${domain.hostname}`,
`https://test.${domain.hostname}`,
`https://testapi.${domain.hostname}`,
`http://${domain.hostname}`,
`http://api.${domain.hostname}`,
`http://test.${domain.hostname}`,
`http://testapi.${domain.hostname}`,
]);
console.log('baseOrigins:', baseOrigins.map((origin) => `'${origin}'`).join(', '));
const allowedExtra = domainsAllowed.flatMap((domain) => [`https://${domain}`, `http://${domain}`]);
return [...baseOrigins, ...allowedExtra];
}
function createCorsOptions(domains, domainsAllowed, isProduction, noCors = false) {
if (noCors) {
console.log('NOCORS mode enabled');
return {
exposedHeaders: ['x-auth', 'x-refrtok', 'x-browser-random'],
};
}
const allowedOrigins = buildAllowedOrigins(domains, domainsAllowed, isProduction);
console.log('allowedOrigins:', allowedOrigins.map((origin) => `'${origin}'`).join(', '));
let originValidator = (origin, callback) => {
if (!origin) {
// console.log('✅ Origin undefined or empty — allowing');
return callback(null, true);
}
if (typeof origin !== 'string' || !/^https?:\/\/[^\s/$.?#].[^\s]*$/.test(origin)) {
console.error('❌ Invalid origin:', origin);
return callback(new Error('Origine non valida'), false);
}
if (allowedOrigins.includes(origin)) {
return callback(null, true);
}
console.warn('❌ Origin blocked:', origin);
return callback(new Error('CORS non permesso per questa origine'), false);
};
if (app.get('env') === 'development') {
originValidator = (_origin, callback) => callback(null, true);
}
return {
origin: originValidator,
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'],
allowedHeaders: ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization', 'x-auth', 'x-refrtok', 'x-browser-random'],
exposedHeaders: ['x-auth', 'x-refrtok', 'x-browser-random'],
maxAge: 86400,
preflightContinue: false,
optionsSuccessStatus: 204,
};
}
async function getCredentials(hostname) {
const key = fs.readFileSync(`/etc/letsencrypt/live/${hostname}/${process.env.PATH_CERT_KEY}`, 'utf8');
const cert = fs.readFileSync(`/etc/letsencrypt/live/${hostname}/${process.env.PATH_SERVER_CRT}`, 'utf8');
return {
key,
cert,
secureProtocol: 'TLSv1_2_method',
secureOptions: require('constants').SSL_OP_NO_SSLv3 | require('constants').SSL_OP_NO_TLSv1,
};
}
module.exports = { parseDomains, createCorsOptions, getCredentials };