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