diff --git a/doc/upgrade.rst b/doc/upgrade.rst
index bec3a4c56..06e648e06 100644
--- a/doc/upgrade.rst
+++ b/doc/upgrade.rst
@@ -269,7 +269,7 @@ by default.
'OIDC_ENABLED': True,
'OIDC_RP_INITIATED_LOGOUT_ENABLED': True,
'OIDC_RP_INITIATED_LOGOUT_ALWAYS_PROMPT': True,
- 'OIDC_RSA_PRIVATE_KEY': env('OIDC_RSA_PRIVATE_KEY'),
+ 'OIDC_RSA_PRIVATE_KEY': env.str('OIDC_RSA_PRIVATE_KEY', multiline=True),
'SCOPES': {
'openid': 'OpenID Connect scope',
'read': 'Read scope',
diff --git a/frontend/src/components/admin/alarms/AlarmList.vue b/frontend/src/components/admin/alarms/AlarmList.vue
index ae90785c4..6c022dec0 100644
--- a/frontend/src/components/admin/alarms/AlarmList.vue
+++ b/frontend/src/components/admin/alarms/AlarmList.vue
@@ -151,9 +151,9 @@ function fetchAlarms({ page, itemsPerPage, sortBy }) {
page: page || 1,
page_size: itemsPerPage || 10,
}
- if (sortBy) {
+ if (sortBy && sortBy.length) {
params.ordering = sortBy
- .map((item) => (this.options.sortDesc[0] ? `-${item}` : item))
+ .map((item) => (item.order !== 'asc' ? `-${item.key}` : item.key))
.join(',')
}
if (search.value !== '') {
@@ -177,7 +177,7 @@ async function deleteAlarm(alarm, single = true) {
}
async function deleteAlarms() {
await alarmsApi.bulkDelete(selected.value.map((alarm) => alarm.id))
- busStore.displayNotification({ msg: this.$gettext('Alarms deleted') })
+ busStore.displayNotification({ msg: $gettext('Alarms deleted') })
selected.value = []
fetchAlarms({})
}
diff --git a/frontend/src/components/admin/dmarc/DmarcAligmentChart.vue b/frontend/src/components/admin/dmarc/DmarcAligmentChart.vue
index 83d418ab8..7a470d98a 100644
--- a/frontend/src/components/admin/dmarc/DmarcAligmentChart.vue
+++ b/frontend/src/components/admin/dmarc/DmarcAligmentChart.vue
@@ -2,7 +2,7 @@
- $gettext('Alignment')
+ {{ $gettext('Alignment') }}
@@ -153,8 +153,8 @@ const boxes = ref([
])
const now = DateTime.now()
-const currentWeek = ref(now.year)
-const currentYear = ref(now.weekNumber)
+const currentYear = ref(now.year)
+const currentWeek = ref(now.weekNumber)
const dmarcDisabled = ref(false)
const loading = ref(false)
const panel = ref(null)
diff --git a/frontend/src/components/login/PasswordRecoveryChangeForm.vue b/frontend/src/components/login/PasswordRecoveryChangeForm.vue
deleted file mode 100644
index 9d071c342..000000000
--- a/frontend/src/components/login/PasswordRecoveryChangeForm.vue
+++ /dev/null
@@ -1,141 +0,0 @@
-
-
-
-
-
- {{ $gettext('Forgot password?') }}
-
-
-
- {{ password_validation_error }}
-
- {{ $gettext('Change password') }}
-
-
-
-
-
- {{ $gettext('Submit') }}
-
-
-
-
- {{ $gettext('Return to login') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/login/PasswordRecoveryForm.vue b/frontend/src/components/login/PasswordRecoveryForm.vue
deleted file mode 100644
index 8cdbdcddc..000000000
--- a/frontend/src/components/login/PasswordRecoveryForm.vue
+++ /dev/null
@@ -1,130 +0,0 @@
-
-
-
-
-
- {{ $gettext('Forgot password?') }}
-
-
- {{
- $gettext('Please fill-in your primary email address')
- }}
-
-
-
-
- {{ $gettext('Submit') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/login/PasswordRecoverySmsTotpForm.vue b/frontend/src/components/login/PasswordRecoverySmsTotpForm.vue
deleted file mode 100644
index e771816ea..000000000
--- a/frontend/src/components/login/PasswordRecoverySmsTotpForm.vue
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
- {{ $gettext('Password recovery') }}
-
-
- {{ $gettext("Enter the code you've just received by SMS") }}
-
-
-
-
-
- {{ $gettext('Submit') }}
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/login/TwofaForm.vue b/frontend/src/components/login/TwofaForm.vue
deleted file mode 100644
index 020f658fb..000000000
--- a/frontend/src/components/login/TwofaForm.vue
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
- {{ $gettext('Two-factor authentication') }}
-
-
-
- {{
- $gettext(
- 'Enter the code from the two-factor app on your mobile device. If you have lost your device, you may enter one of your recovery codes.'
- )
- }}
-
-
-
- {{ $gettext('Verify code') }}
-
-
-
-
-
-
-
-
diff --git a/frontend/src/layouts/dashboard/DashboardLayout.vue b/frontend/src/layouts/dashboard/DashboardLayout.vue
index 00b805f6c..97b80fb29 100644
--- a/frontend/src/layouts/dashboard/DashboardLayout.vue
+++ b/frontend/src/layouts/dashboard/DashboardLayout.vue
@@ -42,3 +42,9 @@ busStore.$onAction(({ name, after }) => {
}
}, true)
+
+
diff --git a/frontend/src/layouts/dashboard/NavBar.vue b/frontend/src/layouts/dashboard/NavBar.vue
index b8a951b26..a88c1603c 100644
--- a/frontend/src/layouts/dashboard/NavBar.vue
+++ b/frontend/src/layouts/dashboard/NavBar.vue
@@ -46,14 +46,15 @@
>
-
+
+
+
@@ -176,7 +177,7 @@ const mainMenuItems = [
text: $gettext('Dashboard'),
to: { name: 'Dashboard' },
exact: true,
- icon: 'mdi-view-dashboard-outline'
+ icon: 'mdi-view-dashboard-outline',
},
{
text: $gettext('Domains'),
@@ -245,7 +246,7 @@ const mainMenuItems = [
text: $gettext('Information'),
roles: ['SuperAdmins'],
to: { name: 'Information' },
- }
+ },
]
const userMenuItems = [
@@ -262,11 +263,11 @@ const userMenuItems = [
},
]
-if (isAuthenticated && authUser.value.role !== 'SimpleUsers') {
+if (isAuthenticated.value && authUser.value.role !== 'SimpleUsers') {
userMenuItems.unshift({
text: $gettext('Admin'),
to: { name: 'Dashboard' },
- icon: 'mdi-view-dashboard-outline'
+ icon: 'mdi-view-dashboard-outline',
})
}
@@ -277,13 +278,13 @@ function getUserSettingsMenuItems() {
result.push({
text: $gettext('Filters'),
to: { name: 'AccountFilters' },
- icon: 'mdi-filter'
+ icon: 'mdi-filter',
})
}
result.push({
text: $gettext('Settings'),
to: { name: 'AccountSettings' },
- icon: 'mdi-cog'
+ icon: 'mdi-cog',
})
return result
}
@@ -318,7 +319,10 @@ onMounted(() => {
})
})
}
- if (authUser.value.role === 'SuperAdmins' && parametersStore.imapMigrationEnabled === null) {
+ if (
+ authUser.value.role === 'SuperAdmins' &&
+ parametersStore.imapMigrationEnabled === null
+ ) {
parametersApi.getApplication('imap_migration').then((response) => {
parametersStore.imapMigrationEnabled =
response.data.params.enabled_imapmigration
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
index 5420cd0d6..c5bb5076d 100644
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -12,33 +12,11 @@ const routes = [
name: 'Login',
component: () => import('@/views/login/LoginView.vue'),
},
- {
- path: 'twofa',
- name: 'TwoFA',
- component: () => import('@/views/login/TwoFA.vue'),
- },
{
path: 'logged',
name: 'LoginCallback',
component: () => import('@/views/login/LoginCallbackView.vue'),
},
- {
- path: 'password_recovery',
- name: 'PasswordRecovery',
- component: () => import('../views/login/PasswordRecoveryView.vue'),
- },
- {
- path: 'password_recovery/confirm/:id?/:token?/',
- name: 'PasswordRecoveryChangeForm',
- component: () =>
- import('../views/login/PasswordRecoveryChangeView.vue'),
- },
- {
- path: 'password_recovery/sms_confirm',
- name: 'PasswordRecoverySms',
- component: () =>
- import('../views/login/PasswordRecoverySmsTotpView.vue'),
- },
],
},
{
diff --git a/frontend/src/views/account/SettingsView.vue b/frontend/src/views/account/SettingsView.vue
index 4669c0e35..1c2047581 100644
--- a/frontend/src/views/account/SettingsView.vue
+++ b/frontend/src/views/account/SettingsView.vue
@@ -65,3 +65,9 @@ const tab = ref()
background-color: #f7f8fa !important;
}
+
+
diff --git a/frontend/src/views/admin/ParametersView.vue b/frontend/src/views/admin/ParametersView.vue
index 6998a9cb4..c47e49f2f 100644
--- a/frontend/src/views/admin/ParametersView.vue
+++ b/frontend/src/views/admin/ParametersView.vue
@@ -19,59 +19,61 @@
v-for="element in displayableElements"
:key="element.label"
>
-
-
-
-
-
- {{ param.label }}
-
-
-
-
-
- {{ param.label }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {{ param.label }}
+
+
+
+
+
+ {{ param.label }}
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/admin/domains/DomainEditView.vue b/frontend/src/views/admin/domains/DomainEditView.vue
index 41068a340..4244158fe 100644
--- a/frontend/src/views/admin/domains/DomainEditView.vue
+++ b/frontend/src/views/admin/domains/DomainEditView.vue
@@ -1,9 +1,8 @@
-
-
{{ $gettext('Edit domain') }}
-
-
-
+
+ {{ $gettext('Edit domain') }}
+
+
+
+
diff --git a/frontend/src/views/admin/domains/DomainView.vue b/frontend/src/views/admin/domains/DomainView.vue
index 4f22feb10..4568f254e 100644
--- a/frontend/src/views/admin/domains/DomainView.vue
+++ b/frontend/src/views/admin/domains/DomainView.vue
@@ -27,6 +27,7 @@
{{ $gettext('DMARC') }}
+
@@ -117,3 +118,9 @@ function refreshDomain() {
background-color: #f7f8fa !important;
}
+
+
diff --git a/frontend/src/views/admin/identities/AccountEditView.vue b/frontend/src/views/admin/identities/AccountEditView.vue
index 3b9869e7a..d60489ff2 100644
--- a/frontend/src/views/admin/identities/AccountEditView.vue
+++ b/frontend/src/views/admin/identities/AccountEditView.vue
@@ -1,6 +1,7 @@
- {{ $gettext('Edit account') }}
-
+
+ {{ $gettext('Edit account') }}
+
@@ -10,3 +11,9 @@ import { useGettext } from 'vue3-gettext'
const { $gettext } = useGettext()
+
+
diff --git a/frontend/src/views/admin/identities/AliasEditView.vue b/frontend/src/views/admin/identities/AliasEditView.vue
index 31ba106b6..2eb69ed3c 100644
--- a/frontend/src/views/admin/identities/AliasEditView.vue
+++ b/frontend/src/views/admin/identities/AliasEditView.vue
@@ -1,9 +1,8 @@
-
-
{{ $gettext('Edit alias') }}
-
-
-
+
+ {{ $gettext('Edit alias') }}
+
+
+
+
diff --git a/frontend/src/views/login/PasswordRecoveryChangeView.vue b/frontend/src/views/login/PasswordRecoveryChangeView.vue
deleted file mode 100644
index 1aa56e03f..000000000
--- a/frontend/src/views/login/PasswordRecoveryChangeView.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/views/login/PasswordRecoveryForm.vue b/frontend/src/views/login/PasswordRecoveryForm.vue
deleted file mode 100644
index b405d81f3..000000000
--- a/frontend/src/views/login/PasswordRecoveryForm.vue
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
-
-
- {{
- $gettext('Forgot password?')
- }}
-
- {{
- $gettext('Please fill-in your primary email address')
- }}
-
-
-
-
- {{ $gettext('Submit') }}
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/views/login/PasswordRecoverySmsTotpView.vue b/frontend/src/views/login/PasswordRecoverySmsTotpView.vue
deleted file mode 100644
index 88cef341a..000000000
--- a/frontend/src/views/login/PasswordRecoverySmsTotpView.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/views/login/PasswordRecoveryView.vue b/frontend/src/views/login/PasswordRecoveryView.vue
deleted file mode 100644
index ccf11a50b..000000000
--- a/frontend/src/views/login/PasswordRecoveryView.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/views/login/TwoFA.vue b/frontend/src/views/login/TwoFA.vue
deleted file mode 100644
index 462146614..000000000
--- a/frontend/src/views/login/TwoFA.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl
index 9513eceb5..bb1d941b5 100644
--- a/modoboa/core/commands/templates/settings.py.tpl
+++ b/modoboa/core/commands/templates/settings.py.tpl
@@ -206,7 +206,7 @@ OAUTH2_PROVIDER = {
'OIDC_ENABLED': True,
'OIDC_RP_INITIATED_LOGOUT_ENABLED': True,
'OIDC_RP_INITIATED_LOGOUT_ALWAYS_PROMPT': True,
- 'OIDC_RSA_PRIVATE_KEY': env('OIDC_RSA_PRIVATE_KEY'),
+ 'OIDC_RSA_PRIVATE_KEY': env.str('OIDC_RSA_PRIVATE_KEY', multiline=True),
'SCOPES': {
'openid': 'OpenID Connect scope',
'read': 'Read scope',
diff --git a/requirements.txt b/requirements.txt
index 28451ce11..e6d86cba9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -53,4 +53,4 @@ rq>=1.13.0
django-rq
# Sieve
-sievelib>=1.4
+sievelib>=1.4.1