diff --git a/dashboard/src/components/DomainDialog.vue b/dashboard/src/components/DomainDialog.vue index 2f01ef903..0a2df1f76 100644 --- a/dashboard/src/components/DomainDialog.vue +++ b/dashboard/src/components/DomainDialog.vue @@ -3,12 +3,84 @@ const API_ORIGIN = import.meta.env.VITE_API_ORIGIN ? import.meta.env.VITE_API_ORIGIN : window.location.origin; import { ref, useTemplateRef } from 'vue'; -import { Dialog } from 'pankow'; +import { Dialog, TextInput, FormGroup, Dropdown, Checkbox } from 'pankow'; +import { ENDPOINTS_OVH } from '../constants.js'; + + // currently, validation of wildcard with various provider is done server side + const tlsProviders = [ + { name: 'Let\'s Encrypt Prod', value: 'letsencrypt-prod' }, + { name: 'Let\'s Encrypt Prod - Wildcard', value: 'letsencrypt-prod-wildcard' }, + { name: 'Let\'s Encrypt Staging', value: 'letsencrypt-staging' }, + { name: 'Let\'s Encrypt Staging - Wildcard', value: 'letsencrypt-staging-wildcard' }, + { name: 'Custom Wildcard Certificate', value: 'fallback' }, +]; + +// keep in sync with setup.js +const domainProviders = [ + { name: 'AWS Route53', value: 'route53' }, + { name: 'Bunny', value: 'bunny' }, + { name: 'Cloudflare', value: 'cloudflare' }, + { name: 'deSEC', value: 'desec' }, + { name: 'DigitalOcean', value: 'digitalocean' }, + { name: 'DNSimple', value: 'dnsimple' }, + { name: 'Gandi LiveDNS', value: 'gandi' }, + { name: 'GoDaddy', value: 'godaddy' }, + { name: 'Google Cloud DNS', value: 'gcdns' }, + { name: 'Hetzner', value: 'hetzner' }, + { name: 'INWX', value: 'inwx' }, + { name: 'Linode', value: 'linode' }, + { name: 'Name.com', value: 'namecom' }, + { name: 'Namecheap', value: 'namecheap' }, + { name: 'Netcup', value: 'netcup' }, + { name: 'OVH', value: 'ovh' }, + { name: 'Porkbun', value: 'porkbun' }, + { name: 'Vultr', value: 'vultr' }, + { name: 'Wildcard', value: 'wildcard' }, + { name: 'Manual (not recommended)', value: 'manual' }, + { name: 'No-op (only for development)', value: 'noop' } +]; const dialog = useTemplateRef('dialog'); +const busy = ref(false); +const error = ref(''); const domain = ref(''); +const zoneName = ref(''); const provider = ref(''); +const tlsProvider = ref(''); + +const accessKeyId = ref(''); +const secretAccessKey = ref(''); +const digitalOceanToken = ref(''); +const gandiTokenType = ref(''); +const gandiApiKey = ref(''); +const godaddyApiKey = ref(''); +const godaddyApiSecret = ref(''); +const netcupCustomerNumber = ref(''); +const netcupApiKey = ref(''); +const netcupApiPassword = ref(''); +const ovhEndpoint = ref(''); +const ovhConsumerKey = ref(''); +const ovhAppKey = ref(''); +const ovhAppSecret = ref(''); +const porkbunSecretapikey = ref(''); +const porkbunApikey = ref(''); +const cloudflareTokenType = ref(''); +const cloudflareToken = ref(''); +const cloudflareEmail = ref(''); +const cloudflareDefaultProxyStatus = ref(false); +const linodeToken = ref(''); +const bunnyAccessKey = ref(''); +const dnsimpleAccessToken = ref(''); +const hetznerToken = ref(''); +const vultrToken = ref(''); +const deSecToken = ref(''); +const nameComUsername = ref(''); +const nameComToken = ref(''); +const namecheapUsername = ref(''); +const namecheapApiKey = ref(''); +const inwxUsername = ref(''); +const inwxPassword = ref(''); defineExpose({ open(d) { @@ -16,8 +88,45 @@ defineExpose({ d = d || {}; - domain.value = d.domain; - provider.value = d.provider; + busy.value = false; + error.value = ''; + domain.value = d.domain || ''; + zoneName.value = d.zoneName || ''; + provider.value = d.provider || ''; + tlsProvider.value = d.tlsProvider || ''; + + accessKeyId.value = d.accessKeyId || ''; + secretAccessKey.value = d.secretAccessKey || ''; + digitalOceanToken.value = d.digitalOceanToken || ''; + gandiTokenType.value = d.gandiTokenType || ''; + gandiApiKey.value = d.gandiApiKey || ''; + godaddyApiKey.value = d.godaddyApiKey || ''; + godaddyApiSecret.value = d.godaddyApiSecret || ''; + netcupCustomerNumber.value = d.netcupCustomerNumber || ''; + netcupApiKey.value = d.netcupApiKey || ''; + netcupApiPassword.value = d.netcupApiPassword || ''; + ovhEndpoint.value = d.ovhEndpoint || ''; + ovhConsumerKey.value = d.ovhConsumerKey || ''; + ovhAppKey.value = d.ovhAppKey || ''; + ovhAppSecret.value = d.ovhAppSecret || ''; + porkbunSecretapikey.value = d.porkbunSecretapikey || ''; + porkbunApikey.value = d.porkbunApikey || ''; + cloudflareTokenType.value = d.cloudflareTokenType || 'ApiToken'; + cloudflareToken.value = d.cloudflareToken || ''; + cloudflareEmail.value = d.cloudflareEmail || ''; + cloudflareDefaultProxyStatus.value = d.cloudflareDefaultProxyStatus || false; + linodeToken.value = d.linodeToken || ''; + bunnyAccessKey.value = d.bunnyAccessKey || ''; + dnsimpleAccessToken.value = d.dnsimpleAccessToken || ''; + hetznerToken.value = d.hetznerToken || ''; + vultrToken.value = d.vultrToken || ''; + deSecToken.value = d.deSecToken || ''; + nameComUsername.value = d.nameComUsername || ''; + nameComToken.value = d.nameComToken || ''; + namecheapUsername.value = d.namecheapUsername || ''; + namecheapApiKey.value = d.namecheapApiKey || ''; + inwxUsername.value = d.inwxUsername || ''; + inwxPassword.value = d.inwxPassword || ''; dialog.value.open(); } @@ -27,6 +136,251 @@ defineExpose({ \ No newline at end of file diff --git a/dashboard/src/constants.js b/dashboard/src/constants.js index 83df3f548..638ee57e1 100644 --- a/dashboard/src/constants.js +++ b/dashboard/src/constants.js @@ -91,6 +91,16 @@ const TOKEN_TYPES = { ID_SDK: 'cid-sdk', // created by user via dashboard }; +const ENDPOINTS_OVH = [ + { name: 'OVH Europe', value: 'ovh-eu' }, + { name: 'OVH US', value: 'ovh-us' }, + { name: 'OVH North-America', value: 'ovh-ca' }, + { name: 'SoYouStart Europe', value: 'soyoustart-eu' }, + { name: 'SoYouStart North-America', value: 'soyoustart-ca' }, + { name: 'Kimsufi Europe', value: 'kimsufi-eu' }, + { name: 'Kimsufi North-America', value: 'kimsufi-ca' }, +]; + // named exports export { APP_TYPES, @@ -102,6 +112,7 @@ export { TASK_TYPES, PROXY_APP_ID, TOKEN_TYPES, + ENDPOINTS_OVH, }; // default export @@ -115,4 +126,5 @@ export default { TASK_TYPES, PROXY_APP_ID, TOKEN_TYPES, + ENDPOINTS_OVH, }; diff --git a/dashboard/src/views/AppstoreView.vue b/dashboard/src/views/AppstoreView.vue index 8ff7bafe5..94bd4cfcd 100644 --- a/dashboard/src/views/AppstoreView.vue +++ b/dashboard/src/views/AppstoreView.vue @@ -92,6 +92,8 @@ onMounted(async () => { + +