Added totp/mail otp, split up dto and api into multiple files
This commit is contained in:
@@ -3,10 +3,8 @@ import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';
|
||||
import { inject, onBeforeMount, ref } from 'vue';
|
||||
import {
|
||||
check_token,
|
||||
get_node,
|
||||
get_path,
|
||||
get_root,
|
||||
GetNodeResponse,
|
||||
FS,
|
||||
Responses,
|
||||
isErrorResponse,
|
||||
TokenInjectType
|
||||
} from '@/api';
|
||||
@@ -18,14 +16,14 @@ const route = useRoute();
|
||||
const jwt = inject<TokenInjectType>('jwt') as TokenInjectType;
|
||||
|
||||
const path = ref('');
|
||||
const node = ref<GetNodeResponse | null>(null);
|
||||
const node = ref<Responses.FS.GetNodeResponse | null>(null);
|
||||
|
||||
async function fetch_node(node_id: number) {
|
||||
const token = await check_token(jwt);
|
||||
if (!token) return;
|
||||
let [p, n] = [
|
||||
await get_path(token, node_id),
|
||||
await get_node(token, node_id)
|
||||
await FS.get_path(token, node_id),
|
||||
await FS.get_node(token, node_id)
|
||||
];
|
||||
if (isErrorResponse(p)) return gotoRoot();
|
||||
if (isErrorResponse(n)) return gotoRoot();
|
||||
@@ -46,7 +44,7 @@ onBeforeMount(async () => {
|
||||
async function gotoRoot() {
|
||||
const token = await check_token(jwt);
|
||||
if (!token) return;
|
||||
const rootRes = await get_root(token);
|
||||
const rootRes = await FS.get_root(token);
|
||||
if (isErrorResponse(rootRes)) return jwt.logout();
|
||||
const root = rootRes.rootId;
|
||||
await router.replace({
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<script setup lang="ts">
|
||||
import { onBeforeRouteUpdate, useRouter } from 'vue-router';
|
||||
import { inject, onBeforeMount } from 'vue';
|
||||
import { check_token, get_root, isErrorResponse, TokenInjectType } from '@/api';
|
||||
import { FS, check_token, isErrorResponse, TokenInjectType } from '@/api';
|
||||
|
||||
const router = useRouter();
|
||||
const jwt = inject<TokenInjectType>('jwt') as TokenInjectType;
|
||||
@@ -11,7 +11,7 @@ const jwt = inject<TokenInjectType>('jwt') as TokenInjectType;
|
||||
async function start_redirect() {
|
||||
const token = await check_token(jwt);
|
||||
if (!token) return;
|
||||
const root = await get_root(token);
|
||||
const root = await FS.get_root(token);
|
||||
if (isErrorResponse(root)) return jwt.logout();
|
||||
await router.push({
|
||||
name: 'fs',
|
||||
|
||||
@@ -1,25 +1,32 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, inject } from 'vue';
|
||||
import { auth_login, get_root, isErrorResponse, TokenInjectType } from '@/api';
|
||||
import { Auth, FS, isErrorResponse, TokenInjectType } from '@/api';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
let username = ref('');
|
||||
let password = ref('');
|
||||
const username = ref('');
|
||||
const password = ref('');
|
||||
const otp = ref('');
|
||||
|
||||
const error = ref('');
|
||||
|
||||
const requestOtp = ref(false);
|
||||
|
||||
const jwt = inject<TokenInjectType>('jwt') as TokenInjectType;
|
||||
|
||||
async function login() {
|
||||
error.value = '';
|
||||
if (username.value === '' || password.value === '') {
|
||||
error.value = 'Email and/or Password missing';
|
||||
return;
|
||||
}
|
||||
const res = await auth_login(username.value, password.value);
|
||||
const res = await (requestOtp.value
|
||||
? Auth.auth_login(username.value, password.value, otp.value)
|
||||
: Auth.auth_login(username.value, password.value));
|
||||
if (isErrorResponse(res)) error.value = 'Login failed: ' + res.message;
|
||||
else {
|
||||
const root = await get_root(res.jwt);
|
||||
else if ('jwt' in res) {
|
||||
const root = await FS.get_root(res.jwt);
|
||||
if (isErrorResponse(root)) {
|
||||
error.value = 'Get root failed: ' + root.message;
|
||||
return;
|
||||
@@ -29,14 +36,23 @@ async function login() {
|
||||
name: 'fs',
|
||||
params: { node_id: root.rootId }
|
||||
});
|
||||
} else {
|
||||
error.value = '';
|
||||
requestOtp.value = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="error !== ''" v-text="error"></div>
|
||||
<input type="email" placeholder="Email" v-model="username" />
|
||||
<input type="password" placeholder="Password" v-model="password" />
|
||||
<template v-if="!requestOtp">
|
||||
<input type="email" placeholder="Email" v-model="username" />
|
||||
<input type="password" placeholder="Password" v-model="password" />
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>Please input your 2 factor authentication code</div>
|
||||
<input type="text" placeholder="Code" v-model="otp" />
|
||||
</template>
|
||||
<button @click="login()">Login</button>
|
||||
<router-link to="signup">Signup instead?</router-link>
|
||||
</template>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import { auth_signup, isErrorResponse } from '@/api';
|
||||
import { Auth, isErrorResponse } from '@/api';
|
||||
|
||||
let username = ref('');
|
||||
let password = ref('');
|
||||
@@ -16,7 +16,7 @@ async function signup() {
|
||||
error.value = "Passwords don't match";
|
||||
return;
|
||||
}
|
||||
const res = await auth_signup(username.value, password.value);
|
||||
const res = await Auth.auth_signup(username.value, password.value);
|
||||
error.value = isErrorResponse(res)
|
||||
? 'Signup failed: ' + res.message
|
||||
: 'Signup successful, please wait till an admin unlocks your account.';
|
||||
|
||||
Reference in New Issue
Block a user