diff --git a/dashboard/src/models/TasksModel.js b/dashboard/src/models/TasksModel.js index 28f7bea86..fd2da8791 100644 --- a/dashboard/src/models/TasksModel.js +++ b/dashboard/src/models/TasksModel.js @@ -16,7 +16,6 @@ function create() { return [e]; } - console.log(result.body) if (!result.body.active) return [result.body.error, result.body.result]; progressHandler(result.body); diff --git a/dashboard/src/views/EmailsView.vue b/dashboard/src/views/EmailsView.vue index 0781fd198..26cc7ce1a 100644 --- a/dashboard/src/views/EmailsView.vue +++ b/dashboard/src/views/EmailsView.vue @@ -5,7 +5,7 @@ const i18n = useI18n(); const t = i18n.t; import { ref, onMounted, useTemplateRef } from 'vue'; -import { Button, TableView, ProgressBar, InputDialog, FormGroup, TextInput, InputGroup, Switch, ButtonGroup, SingleSelect } from 'pankow'; +import { Button, TableView, ProgressBar, InputDialog, Dialog, FormGroup, TextInput, InputGroup, Switch, ButtonGroup, SingleSelect } from 'pankow'; import { prettyDecimalSize } from 'pankow/utils'; import Section from '../components/Section.vue'; import SettingsItem from '../components/SettingsItem.vue'; @@ -29,14 +29,6 @@ const columns = { const domains = ref([]); const profile = ref({}); const busy = ref(true); -const mailboxSharingEnabled = ref(false); -const virtualAllMailEnabled = ref(false); -const ftsEnabled = ref(false); -const blocklist = ref([]); -const allowlist = ref([]); -const dnsblZones = ref([]); -const dnsblZonesString = ref(''); -const spamCustomConfig = ref(''); async function refresh() { busy.value = true; @@ -147,6 +139,8 @@ async function onChangeMailDomain() { locationChangeProgress.value = result.percent; }); + currentLocationDomain.value = locationDomain.value; + currentLocationSubdomain.value = locationSubdomain.value; locationChangeBusy.value = false; locationChangeMessage.value = ''; locationChangeProgress.value = 0; @@ -167,6 +161,41 @@ async function onChangeMaxEmailSize() { maxEmailSizeBusy.value = false; } + +const aclDialog = useTemplateRef('aclDialog'); +const dnsblZonesError = ref(''); +const dnsblZonesBusy = ref(false); +const dnsblZones = ref([]); +const dnsblZonesString = ref(''); + +function onShowAclDialog() { + dnsblZonesError.value = ''; + dnsblZonesBusy.value = false; + aclDialog.value.open(); +} + +async function onSubmitAcl() { + dnsblZonesError.value = ''; + dnsblZonesBusy.value = true; + + const zones = dnsblZonesString.value.split('\n').filter((l) => { return l !== ''; }); + + const [error] = await mailModel.setDnsblConfig(zones); + if (error) { + dnsblZonesError.value = error.body ? error.body.message : 'Internal error'; + dnsblZonesBusy.value = false; + return console.error(error); + } + + aclDialog.value.close(); + + dnsblZones.value = zones; + dnsblZonesBusy.value = false; +} + + +const mailboxSharingEnabled = ref(false); + async function onChangeMailboxSharing(value) { const [error] = await mailModel.setMailboxSharing(value); if (error) { @@ -175,6 +204,9 @@ async function onChangeMailboxSharing(value) { } } + +const virtualAllMailEnabled = ref(false); + async function onChangeVirtualAllMail(value) { const [error] = await mailModel.setVirtualAllMail(value); if (error) { @@ -183,6 +215,9 @@ async function onChangeVirtualAllMail(value) { } } + +const ftsEnabled = ref(false); + async function onChangeFts(value) { const [error] = await mailModel.setFtsConfig(value); if (error) { @@ -191,6 +226,49 @@ async function onChangeFts(value) { } } + +const spamFilterDialog = useTemplateRef('spamFilterDialog'); +const spamFilterBusy = ref(false); +const spamFilterError = ref(''); +const blocklist = ref([]); +const allowlist = ref([]); +const spamCustomConfig = ref(''); + +function onShowSpamFilterDialog() { + spamFilterError.value = ''; + spamFilterBusy.value = false; + + spamFilterDialog.value.open(); +} + +async function onSubmitSpamFilter() { + spamFilterError.value = ''; + spamFilterBusy.value = true; + + const block = blocklist.value.split('\n').filter((l) => { return l !== ''; }); + const allow = allowlist.value.split('\n').filter((l) => { return l !== ''; }); + + let [error] = await mailModel.setSpamAcl(allow, block); + if (error) { + spamFilterError.value = error.body ? error.body.message : 'Internal error'; + spamFilterBusy.value = false; + return console.error(error); + } + + [error] = await mailModel.setSpamCustomConfig(spamCustomConfig.value); + if (error) { + spamFilterError.value = error.body ? error.body.message : 'Internal error'; + spamFilterBusy.value = false; + return console.error(error); + } + + spamFilterDialog.value.close(); + + blocklist.value = block.join('\n'); + allowlist.value = allow.join('\n'); + spamFilterBusy.value = false; +} + onMounted(async () => { let [error, result] = await profileModel.get(); if (error) return console.error(error); @@ -220,8 +298,8 @@ onMounted(async () => { [error, result] = await mailModel.dnsblConfig(); if (error) return console.error(error); - dnsblZones.value = result.join('\n'); - dnsblZonesString.value = result; + dnsblZones.value = result; + dnsblZonesString.value = result.join('\n'); [error, result] = await mailModel.spamCustomConfig(); if (error) return console.error(error); @@ -229,8 +307,8 @@ onMounted(async () => { [error, result] = await mailModel.spamAcl(); if (error) return console.error(error); - allowlist.value = result.allowlist; - blocklist.value = result.blocklist; + allowlist.value = result.allowlist.join('\n'); + blocklist.value = result.blocklist.join('\n'); [error, result] = await mailModel.ftsConfig(); if (error) return console.error(error); @@ -245,6 +323,57 @@ onMounted(async () => {
+ +
+
+ + + + +

{{ $t('emails.aclDialog.dnsblZonesInfo') }}

+ +
+ +
{{ dnsblZonesError }}
+
+
+
+ + +
+
+ + + + +

{{ $t('emails.spamFilterDialog.blacklisteAddressesInfo') }}

+ +
+ + + + + + +
{{ spamFilterError }}
+
+
+
+

{{ $t('emails.title') }}
@@ -301,7 +430,7 @@ onMounted(async () => {
@@ -347,7 +476,7 @@ onMounted(async () => {
{{ $t('emails.settings.aclOverview', { dnsblZonesCount: dnsblZones.length }) }}
- +
@@ -357,7 +486,7 @@ onMounted(async () => {
{{ $t('emails.settings.spamFilterOverview', { blacklistCount: blocklist.length }) }}
- +