diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 285e2ecb9..a066e44f0 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 d4979283b..22d598de0 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 a79bd8185..05e6ee4db 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(() => { }); } }