From b1eab219f82f9e34af8d002ebbd9aa48719babef Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 20 Aug 2021 20:13:21 +0800 Subject: [PATCH] core: auto-redirect --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/user.ts | 7 ++++--- packages/hydrooj/src/service/server.ts | 14 +++++++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 285e2ecb..a066e44f 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.32.33", + "version": "2.32.34", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index d4979283..22d598de 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -33,17 +33,18 @@ class UserLoginHandler extends Handler { @param('uname', Types.String) @param('password', Types.String) @param('rememberme', Types.Boolean) - async post(domainId: string, uname: string, password: string, rememberme = false) { + @param('redirect', Types.String, true) + async post(domainId: string, uname: string, password: string, rememberme = false, redirect = '') { if (!system.get('server.login')) throw new LoginError('Builtin login disabled.'); const udoc = await user.getByUname(domainId, uname); if (!udoc) throw new UserNotFoundError(uname); udoc.checkPassword(password); await user.setById(udoc._id, { loginat: new Date(), loginip: this.request.ip }); - if (udoc.priv === PRIV.PRIV_NONE) throw new BlacklistedError(uname); + if (!udoc.hasPriv(PRIV.PRIV_USER_PROFILE)) throw new BlacklistedError(uname); this.session.uid = udoc._id; this.session.scope = PERM.PERM_ALL.toString(); this.session.save = rememberme; - this.response.redirect = (this.request.referer || '/login').endsWith('/login') + this.response.redirect = redirect || (this.request.referer || '/login').endsWith('/login') ? this.url('homepage') : this.request.referer; } diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index a79bd818..05e6ee4d 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -650,11 +650,15 @@ export class Handler extends HandlerCommon { logger.error(`User: ${this.user._id}(${this.user.uname}) Path: ${this.request.path}`, error.msg(), error.params); if (error.stack) logger.error(error.stack); } - this.response.status = error instanceof UserFacingError ? error.code : 500; - this.response.template = error instanceof UserFacingError ? 'error.html' : 'bsod.html'; - this.response.body = { - error: { message: error.msg(), params: error.params, stack: errorMessage(error.stack) }, - }; + if (this.user?._id === 0) { + this.response.redirect = this.url('user_login', { query: { redirect: this.request.path + this.ctx.search } }); + } else { + this.response.status = error instanceof UserFacingError ? error.code : 500; + this.response.template = error instanceof UserFacingError ? 'error.html' : 'bsod.html'; + this.response.body = { + error: { message: error.msg(), params: error.params, stack: errorMessage(error.stack) }, + }; + } await this.finish().catch(() => { }); } }