From 5b241d25475e35ebfaea6001ad924f80c339c8a5 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 5 Jan 2025 23:01:32 +0800 Subject: [PATCH] migrate 2fa auth store to composition API and typescript --- src/stores/twoFactorAuth.js | 142 ---------------- src/stores/twoFactorAuth.ts | 156 ++++++++++++++++++ .../tabs/UserTwoFactorAuthSettingTab.vue | 2 +- src/views/mobile/users/TwoFactorAuthPage.vue | 2 +- 4 files changed, 158 insertions(+), 144 deletions(-) delete mode 100644 src/stores/twoFactorAuth.js create mode 100644 src/stores/twoFactorAuth.ts diff --git a/src/stores/twoFactorAuth.js b/src/stores/twoFactorAuth.js deleted file mode 100644 index b96d656a..00000000 --- a/src/stores/twoFactorAuth.js +++ /dev/null @@ -1,142 +0,0 @@ -import { defineStore } from 'pinia'; - -import { updateCurrentToken } from '@/lib/userstate.ts'; -import services from '@/lib/services.ts'; -import logger from '@/lib/logger.ts'; -import { isBoolean } from '@/lib/common.ts'; - -export const useTwoFactorAuthStore = defineStore('twoFactorAuth', { - actions: { - get2FAStatus() { - return new Promise((resolve, reject) => { - services.get2FAStatus().then(response => { - const data = response.data; - - if (!data || !data.success || !data.result || !isBoolean(data.result.enable)) { - reject({ message: 'Unable to retrieve current two-factor authentication status' }); - return; - } - - resolve(data.result); - }).catch(error => { - logger.error('failed to retrieve 2fa status', error); - - if (error.response && error.response.data && error.response.data.errorMessage) { - reject({ error: error.response.data }); - } else if (!error.processed) { - reject({ message: 'Unable to retrieve current two-factor authentication status' }); - } else { - reject(error); - } - }); - }); - }, - enable2FA() { - return new Promise((resolve, reject) => { - services.enable2FA().then(response => { - const data = response.data; - - if (!data || !data.success || !data.result || !data.result.qrcode || !data.result.secret) { - reject({ message: 'Unable to enable two-factor authentication' }); - return; - } - - resolve(data.result); - }).catch(error => { - logger.error('failed to request to enable 2fa', error); - - if (error.response && error.response.data && error.response.data.errorMessage) { - reject({ error: error.response.data }); - } else if (!error.processed) { - reject({ message: 'Unable to enable two-factor authentication' }); - } else { - reject(error); - } - }); - }); - }, - confirmEnable2FA({ secret, passcode }) { - return new Promise((resolve, reject) => { - services.confirmEnable2FA({ - secret: secret, - passcode: passcode - }).then(response => { - const data = response.data; - - if (!data || !data.success || !data.result || !data.result.token) { - reject({ message: 'Unable to enable two-factor authentication' }); - return; - } - - if (data.result.token) { - updateCurrentToken(data.result.token); - } - - resolve(data.result); - }).catch(error => { - logger.error('failed to confirm to enable 2fa', error); - - if (error.response && error.response.data && error.response.data.errorMessage) { - reject({ error: error.response.data }); - } else if (!error.processed) { - reject({ message: 'Unable to enable two-factor authentication' }); - } else { - reject(error); - } - }); - }); - }, - disable2FA({ password }) { - return new Promise((resolve, reject) => { - services.disable2FA({ - password: password - }).then(response => { - const data = response.data; - - if (!data || !data.success || !data.result) { - reject({ message: 'Unable to disable two-factor authentication' }); - return; - } - - resolve(data.result); - }).catch(error => { - logger.error('failed to disable 2fa', error); - - if (error.response && error.response.data && error.response.data.errorMessage) { - reject({ error: error.response.data }); - } else if (!error.processed) { - reject({ message: 'Unable to disable two-factor authentication' }); - } else { - reject(error); - } - }); - }); - }, - regenerate2FARecoveryCode({ password }) { - return new Promise((resolve, reject) => { - services.regenerate2FARecoveryCode({ - password: password - }).then(response => { - const data = response.data; - - if (!data || !data.success || !data.result || !data.result.recoveryCodes || !data.result.recoveryCodes.length) { - reject({ message: 'Unable to regenerate two-factor authentication backup codes' }); - return; - } - - resolve(data.result); - }).catch(error => { - logger.error('failed to regenerate 2fa recovery code', error); - - if (error.response && error.response.data && error.response.data.errorMessage) { - reject({ error: error.response.data }); - } else if (!error.processed) { - reject({ message: 'Unable to regenerate two-factor authentication backup codes' }); - } else { - reject(error); - } - }); - }); - } - } -}); diff --git a/src/stores/twoFactorAuth.ts b/src/stores/twoFactorAuth.ts new file mode 100644 index 00000000..4f5e5709 --- /dev/null +++ b/src/stores/twoFactorAuth.ts @@ -0,0 +1,156 @@ +import { defineStore } from 'pinia'; + +import type { + TwoFactorEnableConfirmRequest, + TwoFactorEnableResponse, + TwoFactorEnableConfirmResponse, + TwoFactorDisableRequest, + TwoFactorRegenerateRecoveryCodeRequest, + TwoFactorStatusResponse +} from '@/models/two_factor.ts'; + +import { isBoolean } from '@/lib/common.ts'; +import { updateCurrentToken } from '@/lib/userstate.ts'; + +import logger from '@/lib/logger.ts'; +import services from '@/lib/services.ts'; + +export const useTwoFactorAuthStore = defineStore('twoFactorAuth', () => { + function get2FAStatus(): Promise { + return new Promise((resolve, reject) => { + services.get2FAStatus().then(response => { + const data = response.data; + + if (!data || !data.success || !data.result || !isBoolean(data.result.enable)) { + reject({ message: 'Unable to retrieve current two-factor authentication status' }); + return; + } + + resolve(data.result); + }).catch(error => { + logger.error('failed to retrieve 2fa status', error); + + if (error.response && error.response.data && error.response.data.errorMessage) { + reject({ error: error.response.data }); + } else if (!error.processed) { + reject({ message: 'Unable to retrieve current two-factor authentication status' }); + } else { + reject(error); + } + }); + }); + } + + function enable2FA(): Promise { + return new Promise((resolve, reject) => { + services.enable2FA().then(response => { + const data = response.data; + + if (!data || !data.success || !data.result || !data.result.qrcode || !data.result.secret) { + reject({ message: 'Unable to enable two-factor authentication' }); + return; + } + + resolve(data.result); + }).catch(error => { + logger.error('failed to request to enable 2fa', error); + + if (error.response && error.response.data && error.response.data.errorMessage) { + reject({ error: error.response.data }); + } else if (!error.processed) { + reject({ message: 'Unable to enable two-factor authentication' }); + } else { + reject(error); + } + }); + }); + } + + function confirmEnable2FA(req: TwoFactorEnableConfirmRequest): Promise { + return new Promise((resolve, reject) => { + services.confirmEnable2FA(req).then(response => { + const data = response.data; + + if (!data || !data.success || !data.result || !data.result.token) { + reject({ message: 'Unable to enable two-factor authentication' }); + return; + } + + if (data.result.token) { + updateCurrentToken(data.result.token); + } + + resolve(data.result); + }).catch(error => { + logger.error('failed to confirm to enable 2fa', error); + + if (error.response && error.response.data && error.response.data.errorMessage) { + reject({ error: error.response.data }); + } else if (!error.processed) { + reject({ message: 'Unable to enable two-factor authentication' }); + } else { + reject(error); + } + }); + }); + } + + function disable2FA(req: TwoFactorDisableRequest): Promise { + return new Promise((resolve, reject) => { + services.disable2FA(req).then(response => { + const data = response.data; + + if (!data || !data.success || !data.result) { + reject({ message: 'Unable to disable two-factor authentication' }); + return; + } + + resolve(data.result); + }).catch(error => { + logger.error('failed to disable 2fa', error); + + if (error.response && error.response.data && error.response.data.errorMessage) { + reject({ error: error.response.data }); + } else if (!error.processed) { + reject({ message: 'Unable to disable two-factor authentication' }); + } else { + reject(error); + } + }); + }); + } + + function regenerate2FARecoveryCode(req: TwoFactorRegenerateRecoveryCodeRequest): Promise { + return new Promise((resolve, reject) => { + services.regenerate2FARecoveryCode(req).then(response => { + const data = response.data; + + if (!data || !data.success || !data.result || !data.result.recoveryCodes || !data.result.recoveryCodes.length) { + reject({ message: 'Unable to regenerate two-factor authentication backup codes' }); + return; + } + + resolve(data.result); + }).catch(error => { + logger.error('failed to regenerate 2fa recovery code', error); + + if (error.response && error.response.data && error.response.data.errorMessage) { + reject({ error: error.response.data }); + } else if (!error.processed) { + reject({ message: 'Unable to regenerate two-factor authentication backup codes' }); + } else { + reject(error); + } + }); + }); + } + + return { + // functions + get2FAStatus, + enable2FA, + confirmEnable2FA, + disable2FA, + regenerate2FARecoveryCode + }; +}); diff --git a/src/views/desktop/user/settings/tabs/UserTwoFactorAuthSettingTab.vue b/src/views/desktop/user/settings/tabs/UserTwoFactorAuthSettingTab.vue index 618c41c6..25196a88 100644 --- a/src/views/desktop/user/settings/tabs/UserTwoFactorAuthSettingTab.vue +++ b/src/views/desktop/user/settings/tabs/UserTwoFactorAuthSettingTab.vue @@ -104,7 +104,7 @@