fix: Check domain for coolify before saving

This commit is contained in:
Andras Bacsai
2022-05-05 15:18:13 +02:00
parent eccd7c96d7
commit f56d4dbbb3
5 changed files with 167 additions and 73 deletions

View File

@@ -1,25 +1,124 @@
import { asyncExecShell, getEngine, getUserDetails } from '$lib/common';
import { dev } from '$app/env';
import { asyncExecShell, getDomain, getEngine, getUserDetails } from '$lib/common';
import * as db from '$lib/database';
import { ErrorHandler } from '$lib/database';
import { t } from '$lib/translations';
import { promises as dns } from 'dns';
import type { RequestHandler } from '@sveltejs/kit';
import { isIP } from 'is-ip';
export const post: RequestHandler = async (event) => {
const { status, body } = await getUserDetails(event);
if (status === 401) return { status, body };
const { id } = event.params;
let { fqdn } = await event.request.json();
let { fqdn, forceSave, dualCerts, isDNSCheckEnabled } = await event.request.json();
if (fqdn) fqdn = fqdn.toLowerCase();
try {
const domain = getDomain(fqdn);
const domainDualCert = domain.includes('www.') ? domain.replace('www.', '') : `www.${domain}`;
const found = await db.isDomainConfigured({ id, fqdn });
return {
status: found ? 500 : 200,
body: {
error:
found && t.get('application.domain_already_in_use', { domain: fqdn.replace('www.', '') })
if (found) {
throw {
message: t.get('application.domain_already_in_use', {
domain: getDomain(fqdn).replace('www.', '')
})
};
}
if (isDNSCheckEnabled) {
if (!forceSave) {
dns.setServers(['1.1.1.1', '8.8.8.8']);
if (dualCerts) {
try {
const ipDomain = await dns.resolve4(domain);
const ipDomainDualCert = await dns.resolve4(domainDualCert);
console.log({ ipDomain, ipDomainDualCert });
if (
ipDomain.length === ipDomainDualCert.length &&
ipDomain.every((v) => ipDomainDualCert.indexOf(v) >= 0)
) {
let resolves = [];
if (isIP(event.url.hostname)) {
resolves = [event.url.hostname];
} else {
resolves = await dns.resolve4(event.url.hostname);
}
console.log({ resolves });
if (resolves.includes(ipDomain) || resolves.includes(ipDomainDualCert)) {
console.log('OK');
} else {
throw false;
}
} else {
throw false;
}
} catch (error) {
console.log(error);
throw {
message: t.get('application.dns_not_set_error', { domain })
};
}
} else {
let resolves = [];
try {
const ipDomain = await dns.resolve4(domain);
console.log({ ipDomain });
if (isIP(event.url.hostname)) {
resolves = [event.url.hostname];
} else {
resolves = await dns.resolve4(event.url.hostname);
}
console.log({ resolves });
if (resolves.includes(ipDomain)) {
console.log('OK');
} else {
throw false;
}
} catch (error) {
console.log(error);
throw {
message: t.get('application.dns_not_set_error', { domain })
};
}
}
// let localReverseDomains = [];
// let newIps = [];
// let newIpsWWW = [];
// let localIps = [];
// try {
// localReverseDomains = await dns.reverse(event.url.hostname)
// } catch (error) { }
// try {
// localIps = await dns.resolve4(event.url.hostname);
// } catch (error) { }
// try {
// newIps = await dns.resolve4(domain);
// if (dualCerts) {
// newIpsWWW = await dns.resolve4(`${isWWW ? nonWWW : domain}`)
// }
// console.log(newIps)
// } catch (error) { }
// console.log({ localIps, newIps, localReverseDomains, dualCerts, isWWW, nonWWW })
// if (localReverseDomains?.length > 0) {
// if ((newIps?.length === 0 || !newIps.includes(event.url.hostname)) || (dualCerts && newIpsWWW?.length === 0 && !newIpsWWW.includes(`${isWWW ? nonWWW : domain}`))) {
// throw {
// message: t.get('application.dns_not_set_error', { domain })
// };
// }
// }
// if (localIps?.length > 0) {
// if (newIps?.length === 0 || !localIps.includes(newIps[0])) {
// throw {
// message: t.get('application.dns_not_set_error', { domain })
// };
// }
// }
}
}
return {
status: 200
};
} catch (error) {
return ErrorHandler(error);

View File

@@ -1,3 +1,4 @@
import { dev } from '$app/env';
import { getUserDetails } from '$lib/common';
import * as db from '$lib/database';
import { listSettings, ErrorHandler } from '$lib/database';
@@ -71,7 +72,8 @@ export const post: RequestHandler = async (event) => {
minPort,
maxPort,
isAutoUpdateEnabled,
isDNSCheckEnabled
isDNSCheckEnabled,
forceSave
} = await event.request.json();
try {
const { id } = await db.listSettings();

View File

@@ -47,6 +47,7 @@
let minPort = settings.minPort;
let maxPort = settings.maxPort;
let forceSave = false;
let fqdn = settings.fqdn;
let isFqdnSet = !!settings.fqdn;
let loading = {
@@ -96,7 +97,7 @@
try {
loading.save = true;
if (fqdn !== settings.fqdn) {
await post(`/settings/check.json`, { fqdn });
await post(`/settings/check.json`, { fqdn, forceSave, dualCerts, isDNSCheckEnabled });
await post(`/settings.json`, { fqdn });
return window.location.reload();
}
@@ -106,6 +107,9 @@
settings.maxPort = maxPort;
}
} catch ({ error }) {
if (error?.startsWith($t('application.dns_not_set_partial_error'))) {
forceSave = true;
}
return errorNotification(error);
} finally {
loading.save = false;
@@ -131,11 +135,18 @@
<div class="title font-bold">{$t('index.global_settings')}</div>
<button
type="submit"
class:bg-green-600={!loading.save}
class:bg-orange-600={forceSave}
class:hover:bg-green-500={!loading.save}
class:hover:bg-orange-400={forceSave}
disabled={loading.save}
class:bg-yellow-500={!loading.save}
class:hover:bg-yellow-400={!loading.save}
class="mx-2 ">{loading.save ? $t('forms.saving') : $t('forms.save')}</button
>{loading.save
? $t('forms.saving')
: forceSave
? $t('forms.confirm_continue')
: $t('forms.save')}</button
>
{#if isFqdnSet}
<button
on:click|preventDefault={removeFqdn}