From 10cc5e82d630eb6bd9b2e257834e6aa20b5c0613 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sun, 26 Dec 2021 11:03:05 +0100 Subject: [PATCH] New user profile section WIP --- frontend/src/api/account.js | 16 +++ frontend/src/api/languages.js | 9 ++ .../components/domains/DomainDNSConfig.vue | 30 +++- .../src/components/identities/AccountForm.vue | 2 +- .../identities/AccountGeneralForm.vue | 83 ++--------- .../identities/AccountPasswordForm.vue | 127 ++++++++++++++++ frontend/src/components/layout/Navbar.vue | 54 ++++++- frontend/src/components/user/ProfileForm.vue | 133 +++++++++++++++++ .../src/components/user/TwoFactorAuthForm.vue | 135 ++++++++++++++++++ frontend/src/plugins/vee-validate.js | 18 ++- frontend/src/router/index.js | 18 +++ frontend/src/store/modules/auth.js | 18 +-- frontend/src/views/user/Profile.vue | 32 +++++ frontend/src/views/user/Security.vue | 32 +++++ modoboa/admin/api/v1/serializers.py | 4 +- modoboa/admin/api/v2/serializers.py | 22 +++ modoboa/admin/models/mailbox.py | 4 +- modoboa/core/api/v2/serializers.py | 12 ++ modoboa/core/api/v2/urls.py | 1 + modoboa/core/api/v2/viewsets.py | 81 +++++++++++ modoboa/core/middleware.py | 3 +- 21 files changed, 740 insertions(+), 94 deletions(-) create mode 100644 frontend/src/api/languages.js create mode 100644 frontend/src/components/identities/AccountPasswordForm.vue create mode 100644 frontend/src/components/user/ProfileForm.vue create mode 100644 frontend/src/components/user/TwoFactorAuthForm.vue create mode 100644 frontend/src/views/user/Profile.vue create mode 100644 frontend/src/views/user/Security.vue diff --git a/frontend/src/api/account.js b/frontend/src/api/account.js index a3c2f17a5..fd56250e5 100644 --- a/frontend/src/api/account.js +++ b/frontend/src/api/account.js @@ -6,8 +6,24 @@ export default { getMe () { return repository.get(`/${resource}/me/`) }, + checkPassword (value) { + return repository.post(`/${resource}/me/password/`, { password: value }) + }, verifyTFACode (code) { const payload = { code } return repository.post(`${resource}/tfa/verify/`, payload) + }, + startTFASetup () { + return repository.post(`${resource}/tfa/setup/`) + }, + getQRCodeForTFASetup () { + return repository.get(`${resource}/tfa/setup/qr_code/`) + }, + finalizeTFASetup (pinCode) { + const payload = { pin_code: pinCode } + return repository.post(`${resource}/tfa/setup/check/`, payload) + }, + disableTFA () { + return repository.post(`${resource}/tfa/disable/`) } } diff --git a/frontend/src/api/languages.js b/frontend/src/api/languages.js new file mode 100644 index 000000000..0c45bf824 --- /dev/null +++ b/frontend/src/api/languages.js @@ -0,0 +1,9 @@ +import repository from './repository' + +const resource = 'languages' + +export default { + getAll () { + return repository.get(`/${resource}/`) + } +} diff --git a/frontend/src/components/domains/DomainDNSConfig.vue b/frontend/src/components/domains/DomainDNSConfig.vue index 30ef13b89..363f932ee 100644 --- a/frontend/src/components/domains/DomainDNSConfig.vue +++ b/frontend/src/components/domains/DomainDNSConfig.vue @@ -31,6 +31,19 @@ mail.{{ domain.name }}. IN A [IP address of your Modoboa serv @ IN TXT "v=spf1 mx ~all" + +
DKIM
+
+{{ domain.dkim_key_selector }}._domain_key.{{ domain.name }}. IN TXT (
+  {{ splitKey(`v=DKIM1;k=rsa;p=${domain.dkim_public_key}`) }}
+
dense >
Auto configuration
-
-    autoconfig.{{ domain.name }}. IN CNAME [hostname of your automx server]
+      
+autoconfig.{{ domain.name }}. IN CNAME [hostname of your automx server]
 autodiscover.{{ domain.name }}. IN CNAME [hostname of your automx server]
@@ -70,6 +83,19 @@ export default { methods: { close () { this.$emit('close') + }, + splitKey (value) { + let key = value + const result = [] + while (key.length > 0) { + if (key.length > 74) { + result.push(` "${key.substring(0, 74)}"`) + key = key.substring(74) + } else { + result.push(` "${key}"`) + } + } + return result.join('\n') } } } diff --git a/frontend/src/components/identities/AccountForm.vue b/frontend/src/components/identities/AccountForm.vue index f54ced640..fda9b4dea 100644 --- a/frontend/src/components/identities/AccountForm.vue +++ b/frontend/src/components/identities/AccountForm.vue @@ -139,7 +139,7 @@ export default { methods: { async save () { if (this.$refs.generalForm !== undefined) { - const valid = await this.$refs.generalForm.$refs.observer.validate() + const valid = await this.$refs.generalForm.validateForm() if (!valid) { return } diff --git a/frontend/src/components/identities/AccountGeneralForm.vue b/frontend/src/components/identities/AccountGeneralForm.vue index d3344ef2d..61c44007a 100644 --- a/frontend/src/components/identities/AccountGeneralForm.vue +++ b/frontend/src/components/identities/AccountGeneralForm.vue @@ -28,51 +28,13 @@ outlined dense /> -
- - -
- - - - - - - - + + + diff --git a/frontend/src/components/layout/Navbar.vue b/frontend/src/components/layout/Navbar.vue index 6923b709b..f32a6295a 100644 --- a/frontend/src/components/layout/Navbar.vue +++ b/frontend/src/components/layout/Navbar.vue @@ -3,7 +3,7 @@ v-model="drawer" :mini-variant.sync="mini" permanent - color="primary" + :color="mainColor" app dark > @@ -11,6 +11,8 @@