diff --git a/resources/js_vue3/components/formElements/ButtonBackCloseCancel.vue b/resources/js_vue3/components/formElements/ButtonBackCloseCancel.vue index a2c1184a..9a410a1b 100644 --- a/resources/js_vue3/components/formElements/ButtonBackCloseCancel.vue +++ b/resources/js_vue3/components/formElements/ButtonBackCloseCancel.vue @@ -7,8 +7,8 @@ const props = defineProps({ returnTo: { - type: String, - default: 'accounts' + type: Object, + default: { name: 'accounts' } }, action: { type: String, @@ -40,7 +40,7 @@ @@ -60,7 +60,7 @@ {{ $t('commons.cancel') }} diff --git a/resources/js_vue3/router/index.js b/resources/js_vue3/router/index.js index b89c05b0..2b5211ea 100644 --- a/resources/js_vue3/router/index.js +++ b/resources/js_vue3/router/index.js @@ -6,22 +6,23 @@ import { useTwofaccounts } from '@/stores/twofaccounts' import authGuard from './middlewares/authGuard' import starter from './middlewares/starter' import noEmptyError from './middlewares/noEmptyError' +import startingPoint from './middlewares/startingPoint' const router = createRouter({ history: createWebHistory('/'), routes: [ - { path: '/start', name: 'start', component: () => import('../views/Start.vue'), meta: { middlewares: [authGuard] } }, - { path: '/capture', name: 'capture', component: () => import('../views/twofaccounts/Capture.vue'), meta: { middlewares: [authGuard] } }, + { path: '/start', name: 'start', component: () => import('../views/Start.vue'), meta: { middlewares: [authGuard, startingPoint] } }, + { path: '/capture', name: 'capture', component: () => import('../views/twofaccounts/Capture.vue'), meta: { middlewares: [authGuard, startingPoint] } }, - { path: '/accounts', name: 'accounts', component: () => import('../views/twofaccounts/Accounts.vue'), meta: { middlewares: [authGuard, starter] }, alias: '/' }, - { path: '/account/create', name: 'createAccount', component: () => import('../views/twofaccounts/CreateUpdate.vue'), meta: { middlewares: [authGuard] } }, - { path: '/account/import', name: 'importAccounts', component: () => import('../views/twofaccounts/Import.vue'), meta: { middlewares: [authGuard] } }, - { path: '/account/:twofaccountId/edit', name: 'editAccount', component: () => import('../views/twofaccounts/CreateUpdate.vue'), meta: { middlewares: [authGuard] }, props: true }, - { path: '/account/:twofaccountId/qrcode', name: 'showQRcode', component: () => import('../views/twofaccounts/QRcode.vue'), meta: { middlewares: [authGuard] } }, + { path: '/accounts', name: 'accounts', component: () => import('../views/twofaccounts/Accounts.vue'), meta: { middlewares: [authGuard, starter, startingPoint] }, alias: '/' }, + { path: '/account/create', name: 'createAccount', component: () => import('../views/twofaccounts/CreateUpdate.vue'), meta: { middlewares: [authGuard, startingPoint] } }, + { path: '/account/import', name: 'importAccounts', component: () => import('../views/twofaccounts/Import.vue'), meta: { middlewares: [authGuard, startingPoint] } }, + { path: '/account/:twofaccountId/edit', name: 'editAccount', component: () => import('../views/twofaccounts/CreateUpdate.vue'), meta: { middlewares: [authGuard, startingPoint] }, props: true }, + { path: '/account/:twofaccountId/qrcode', name: 'showQRcode', component: () => import('../views/twofaccounts/QRcode.vue'), meta: { middlewares: [authGuard, startingPoint] } }, - { path: '/groups', name: 'groups', component: () => import('../views/groups/Groups.vue'), meta: { middlewares: [authGuard] }, props: true }, - { path: '/group/create', name: 'createGroup', component: () => import('../views/groups/CreateUpdate.vue'), meta: { middlewares: [authGuard] } }, - { path: '/group/:groupId/edit', name: 'editGroup', component: () => import('../views/groups/CreateUpdate.vue'), meta: { middlewares: [authGuard] }, props: true }, + { path: '/groups', name: 'groups', component: () => import('../views/groups/Groups.vue'), meta: { middlewares: [authGuard, startingPoint] }, props: true }, + { path: '/group/create', name: 'createGroup', component: () => import('../views/groups/CreateUpdate.vue'), meta: { middlewares: [authGuard, startingPoint] } }, + { path: '/group/:groupId/edit', name: 'editGroup', component: () => import('../views/groups/CreateUpdate.vue'), meta: { middlewares: [authGuard, startingPoint] }, props: true }, { path: '/settings/options', name: 'settings.options', component: () => import('../views/settings/Options.vue'), meta: { middlewares: [authGuard], showAbout: true } }, { path: '/settings/account', name: 'settings.account', component: () => import('../views/settings/Account.vue'), meta: { middlewares: [authGuard], showAbout: true } }, @@ -29,12 +30,12 @@ const router = createRouter({ { path: '/settings/webauthn/:credentialId/edit', name: 'settings.webauthn.editCredential', component: () => import('../views/settings/Credentials/Edit.vue'), meta: { middlewares: [authGuard], showAbout: true }, props: true }, { path: '/settings/webauthn', name: 'settings.webauthn.devices', component: () => import('../views/settings/WebAuthn.vue'), meta: { middlewares: [authGuard], showAbout: true } }, - { path: '/login', name: 'login', component: () => import('../views/auth/Login.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, - { path: '/register', name: 'register', component: () => import('../views/auth/Register.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, - { path: '/password/request', name: 'password.request', component: () => import('../views/auth/RequestReset.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, - { path: '/user/password/reset', name: 'password.reset', component: () => import('../views/auth/password/Reset.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, - { path: '/webauthn/lost', name: 'webauthn.lost', component: () => import('../views/auth/RequestReset.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, - { path: '/webauthn/recover', name: 'webauthn.recover', component: () => import('../views/auth/webauthn/Recover.vue'), meta: { disabledWithAuthProxy: true, showAbout: true } }, + { path: '/login', name: 'login', component: () => import('../views/auth/Login.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, + { path: '/register', name: 'register', component: () => import('../views/auth/Register.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, + { path: '/password/request', name: 'password.request', component: () => import('../views/auth/RequestReset.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, + { path: '/user/password/reset', name: 'password.reset', component: () => import('../views/auth/password/Reset.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, + { path: '/webauthn/lost', name: 'webauthn.lost', component: () => import('../views/auth/RequestReset.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, + { path: '/webauthn/recover', name: 'webauthn.recover', component: () => import('../views/auth/webauthn/Recover.vue'), meta: { middlewares: [startingPoint], disabledWithAuthProxy: true, showAbout: true } }, { path: '/about', name: 'about', component: () => import('../views/About.vue'), meta: { showAbout: true } }, { path: '/error', name: 'genericError', component: () => import('../views/Error.vue'), meta: { middlewares: [noEmptyError], err: null } }, diff --git a/resources/js_vue3/router/middlewares/startingPoint.js b/resources/js_vue3/router/middlewares/startingPoint.js new file mode 100644 index 00000000..557befd2 --- /dev/null +++ b/resources/js_vue3/router/middlewares/startingPoint.js @@ -0,0 +1,11 @@ +/** + * Allows an authenticated user to access the main view only if he owns at least one twofaccount. + * Push to the starter view otherwise. + */ +export default function starter({ to, next, stores }) { + const { user } = stores + const startPoint = useStorage(user.$2fauth.prefix + 'returnTo', 'accounts') + startPoint.value = to.name + + next() +} \ No newline at end of file diff --git a/resources/js_vue3/views/About.vue b/resources/js_vue3/views/About.vue index 6378eca4..7d4008c5 100644 --- a/resources/js_vue3/views/About.vue +++ b/resources/js_vue3/views/About.vue @@ -4,20 +4,18 @@ import { UseColorMode } from '@vueuse/components' const $2fauth = inject('2fauth') + const router = useRouter() const notify = useNotifyStore() - const returnTo = useStorage($2fauth.prefix + 'returnTo', 'accounts') + const { copy } = useClipboard({ legacy: true }) + const returnTo = router.options.history.state.back const infos = ref() const listInfos = ref(null) - const userPreferences = ref(false) const listUserPreferences = ref(null) - const adminSettings = ref(false) const listAdminSettings = ref(null) - const { copy } = useClipboard({ legacy: true }) - onMounted(() => { systemService.getSystemInfos().then(response => { infos.value = response.data.common @@ -128,7 +126,7 @@ - + \ No newline at end of file diff --git a/resources/js_vue3/views/Start.vue b/resources/js_vue3/views/Start.vue index 3b7bce45..3af055bc 100644 --- a/resources/js_vue3/views/Start.vue +++ b/resources/js_vue3/views/Start.vue @@ -109,7 +109,7 @@ - + diff --git a/resources/js_vue3/views/groups/Groups.vue b/resources/js_vue3/views/groups/Groups.vue index 3669e089..a6b4d058 100644 --- a/resources/js_vue3/views/groups/Groups.vue +++ b/resources/js_vue3/views/groups/Groups.vue @@ -3,8 +3,10 @@ import { useGroups } from '@/stores/groups' import { useBusStore } from '@/stores/bus' + const router = useRouter() const groups = useGroups() const bus = useBusStore() + const isFetching = ref(false) onMounted(async () => { @@ -68,7 +70,7 @@ - + \ No newline at end of file diff --git a/resources/js_vue3/views/settings/Account.vue b/resources/js_vue3/views/settings/Account.vue index ec5575c0..026fcaa9 100644 --- a/resources/js_vue3/views/settings/Account.vue +++ b/resources/js_vue3/views/settings/Account.vue @@ -139,7 +139,7 @@ - + diff --git a/resources/js_vue3/views/settings/OAuth.vue b/resources/js_vue3/views/settings/OAuth.vue index d06968f8..f9ec7676 100644 --- a/resources/js_vue3/views/settings/OAuth.vue +++ b/resources/js_vue3/views/settings/OAuth.vue @@ -156,7 +156,7 @@ - + diff --git a/resources/js_vue3/views/settings/Options.vue b/resources/js_vue3/views/settings/Options.vue index e7011107..8846c414 100644 --- a/resources/js_vue3/views/settings/Options.vue +++ b/resources/js_vue3/views/settings/Options.vue @@ -185,7 +185,7 @@ - + \ No newline at end of file diff --git a/resources/js_vue3/views/settings/WebAuthn.vue b/resources/js_vue3/views/settings/WebAuthn.vue index 12cfbeed..118fea1c 100644 --- a/resources/js_vue3/views/settings/WebAuthn.vue +++ b/resources/js_vue3/views/settings/WebAuthn.vue @@ -166,7 +166,7 @@ - + diff --git a/resources/js_vue3/views/twofaccounts/Import.vue b/resources/js_vue3/views/twofaccounts/Import.vue index dca2d93f..5f51537d 100644 --- a/resources/js_vue3/views/twofaccounts/Import.vue +++ b/resources/js_vue3/views/twofaccounts/Import.vue @@ -376,7 +376,7 @@ -->

- + diff --git a/resources/js_vue3/views/twofaccounts/QRcode.vue b/resources/js_vue3/views/twofaccounts/QRcode.vue index dee53cd9..e5c61e1a 100644 --- a/resources/js_vue3/views/twofaccounts/QRcode.vue +++ b/resources/js_vue3/views/twofaccounts/QRcode.vue @@ -29,7 +29,7 @@

\ No newline at end of file