Support overwrite DNS in app install dialog

This commit is contained in:
Johannes Zellner
2025-10-07 14:35:47 +02:00
parent b38371400c
commit f6e14a5420

View File

@@ -8,6 +8,7 @@ import AccessControl from './AccessControl.vue';
import PortBindings from './PortBindings.vue';
import AppsModel from '../models/AppsModel.js';
import DashboardModel from '../models/DashboardModel.js';
import DomainsModel from '../models/DomainsModel.js';
import { PROXY_APP_ID, ACL_OPTIONS } from '../constants.js';
const STEP = Object.freeze({
@@ -16,6 +17,7 @@ const STEP = Object.freeze({
});
const appsModel = AppsModel.create();
const domainsModel = DomainsModel.create();
const dashboardModel = DashboardModel.create();
const subscriptionRequiredDialog = inject('subscriptionRequiredDialog');
@@ -74,22 +76,48 @@ const tcpPorts = ref({});
const udpPorts = ref({});
const secondaryDomains = ref({});
const upstreamUri = ref('');
const needsOverwriteDns = ref(false);
function onDomainChange() {
const tmp = domains.value.find(d => d.domain === domain.value);
domainProvider.value = tmp ? tmp.provider : '';
}
async function submit() {
async function onSubmit(overwriteDns) {
formError.value = {};
busy.value = true;
const checkForDomains = [{
domain: domain.value,
subdomain: location.value,
}];
for (const d in secondaryDomains.value) checkForDomains.push({ domain: secondaryDomains.value[d].domain, subdomain: secondaryDomains.value[d].value });
for (const d of checkForDomains) {
const [error, result] = await domainsModel.checkRecords(d.domain, d.subdomain);
if (error) {
formError.value.location = error.body ? error.body.message : 'Internal error';
busy.value = false;
return console.error(error);
}
if (result.needsOverwrite && !overwriteDns) {
busy.value = false;
needsOverwriteDns.value = true;
formError.value.dnsExists = `DNS record for ${d.subdomain}.${d.domain} already exists`;
return;
}
}
const config = {
subdomain: location.value,
domain: domain.value,
accessRestriction: accessRestrictionOption.value === ACL_OPTIONS.ANY ? null : (accessRestrictionOption.value === ACL_OPTIONS.NOSSO ? null : accessRestrictionAcl.value)
};
if (overwriteDns) config.overwriteDns = true;
if (manifest.value.optionalSso) config.sso = accessRestrictionOption.value !== ACL_OPTIONS.NOSSO;
const finalPorts = {};
@@ -103,8 +131,7 @@ async function submit() {
}
config.ports = finalPorts;
const finalSecondaryDomains = {};
for (var p in secondaryDomains.value) {
const finalSecondaryDomains = {}; for (const p in secondaryDomains.value) {
finalSecondaryDomains[p] = {
subdomain: secondaryDomains.value[p].value,
domain: secondaryDomains.value[p].domain
@@ -176,6 +203,7 @@ defineExpose({
accessRestrictionAcl.value = { users: [], groups: [] };
domainProvider.value = '';
upstreamUri.value = '';
needsOverwriteDns.value = '';
domainList.forEach(d => {
d.label = '.' + d.domain;
@@ -244,9 +272,10 @@ defineExpose({
<div class="description" v-html="description"></div>
</div>
<div v-else-if="step === STEP.INSTALL">
<div class="text-danger" v-if="formError.generic">{{ formError.generic }}</div>
<div class="error-label" v-if="formError.generic">{{ formError.generic }}</div>
<div class="error-label" v-if="formError.dnsExists">{{ formError.dnsExists }}</div>
<form @submit.prevent="submit()" autocomplete="off">
<form @submit.prevent="onSubmit(false)" autocomplete="off">
<fieldset :disabled="busy">
<input style="display: none;" type="submit" :disabled="!formValid" />
@@ -257,7 +286,7 @@ defineExpose({
<SingleSelect v-model="domain" :options="domains" option-label="label" option-key="domain" @select="onDomainChange()" :search-threshold="10"/>
</InputGroup>
<div class="warning-label" v-show="domainProvider === 'noop' || domainProvider === 'manual'" v-html="$t('appstore.installDialog.manualWarning', { location: ((location ? location + '.' : '') + domain) })"></div>
<div class="text-danger" v-if="formError.location">{{ formError.location }}</div>
<div class="error-label" v-if="formError.location">{{ formError.location }}</div>
</FormGroup>
<FormGroup v-for="(port, key) in secondaryDomains" :key="key">
@@ -278,7 +307,8 @@ defineExpose({
<AccessControl v-model:option="accessRestrictionOption" v-model:acl="accessRestrictionAcl" :manifest="manifest"/>
<div class="bottom-button-bar">
<Button @click="submit" icon="fa-solid fa-circle-down" :disabled="!formValid" :loading="busy">Install {{ manifest.title }}</Button>
<Button v-if="needsOverwriteDns" danger @click="onSubmit(true)" icon="fa-solid fa-circle-down" :disabled="!formValid" :loading="busy">Install {{ manifest.title }} and overwrite DNS</Button>
<Button v-else @click="onSubmit(false)" icon="fa-solid fa-circle-down" :disabled="!formValid" :loading="busy">Install {{ manifest.title }}</Button>
</div>
</fieldset>
</form>