From e545bceefb7d732a138965fc81ae131484384f4b Mon Sep 17 00:00:00 2001 From: undefined Date: Wed, 23 Oct 2024 19:04:05 +0800 Subject: [PATCH] core: move tfa check to a seperate route --- packages/hydrooj/src/handler/user.ts | 13 +++++++++++-- packages/hydrooj/src/service/api.ts | 2 +- packages/ui-default/pages/user_verify.page.ts | 14 +++----------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index 35aee7827..c608ad9b8 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -119,6 +119,16 @@ class UserSudoHandler extends Handler { } } +class UserTFAHandler extends Handler { + @param('q', Types.String) + async get({ }, q: string) { + let udoc = await user.getByUname('system', q); + udoc ||= await user.getByEmail('system', q); + if (!udoc) this.response.body = { tfa: false, authn: false }; + else this.response.body = { tfa: udoc.tfa, authn: udoc.authn }; + } +} + class UserWebauthnHandler extends Handler { noCheckPermView = true; @@ -500,6 +510,7 @@ export async function apply(ctx: Context) { ctx.Route('user_login', '/login', UserLoginHandler); ctx.Route('user_oauth', '/oauth/:type', OauthHandler); ctx.Route('user_sudo', '/user/sudo', UserSudoHandler, PRIV.PRIV_USER_PROFILE); + ctx.Route('user_tfa', '/user/tfa', UserTFAHandler); ctx.Route('user_webauthn', '/user/webauthn', UserWebauthnHandler); ctx.Route('user_oauth_callback', '/oauth/:type/callback', OauthCallbackHandler); ctx.Route('user_register', '/register', UserRegisterHandler, PRIV.PRIV_REGISTER_USER); @@ -523,8 +534,6 @@ export async function apply(ctx: Context) { ['regat', 'Date!'], ['priv', 'Int!', 'User Privilege'], ['avatarUrl', 'String'], - ['tfa', 'Boolean!'], - ['authn', 'Boolean!'], ['displayName', 'String @if(perm: "PERM_VIEW_DISPLAYNAME")'], ['rpInfo', 'JSONObject'], ]); diff --git a/packages/hydrooj/src/service/api.ts b/packages/hydrooj/src/service/api.ts index 7806620d9..22931667c 100644 --- a/packages/hydrooj/src/service/api.ts +++ b/packages/hydrooj/src/service/api.ts @@ -71,7 +71,7 @@ const applyAuthDirective = (s) => mapSchema(s, { class ApiHandler extends Handler { category = '#api'; - noCheckPermView = true; + // FIXME: adding PERM_VIEW check will break omnibar search query(q: string, variables: any) { return graphql({ diff --git a/packages/ui-default/pages/user_verify.page.ts b/packages/ui-default/pages/user_verify.page.ts index 4f032b4ad..04446243b 100644 --- a/packages/ui-default/pages/user_verify.page.ts +++ b/packages/ui-default/pages/user_verify.page.ts @@ -74,19 +74,11 @@ export default new AutoloadPage('user_verify', () => { ev.preventDefault(); const form = ev.currentTarget.form; const uname = $(form).find('[name="uname"]').val() as string; - const info = await api(gql` - uname: user(uname:${uname}){ - tfa authn - } - mail: user(mail:${uname}){ - tfa authn - } - `, ['data']); - if (!info.uname && !info.mail) { - Notification.error(i18n('User not found.')); + if (!uname) { + form.elements.namedItem('uname')?.focus(); return; } - const { authn, tfa } = info.uname || info.mail; + const { authn, tfa } = await request.get('/user/tfa', { q: uname }); if (authn || tfa) { const handleKeyDown = (event) => { if (event.key === 'Enter') {