From 346bf7d085e6aeaabf4778e631b7de4c819cf607 Mon Sep 17 00:00:00 2001 From: undefined Date: Mon, 20 Nov 2023 23:17:35 +0800 Subject: [PATCH] onsite-toolkit: add iplogin support --- packages/onsite-toolkit/index.ts | 36 ++++++++++++++++++++++++++++ packages/onsite-toolkit/package.json | 4 ++++ 2 files changed, 40 insertions(+) create mode 100644 packages/onsite-toolkit/index.ts create mode 100644 packages/onsite-toolkit/package.json diff --git a/packages/onsite-toolkit/index.ts b/packages/onsite-toolkit/index.ts new file mode 100644 index 00000000..0e0fc30c --- /dev/null +++ b/packages/onsite-toolkit/index.ts @@ -0,0 +1,36 @@ +import { + Context, db, ForbiddenError, UserModel, +} from 'hydrooj'; + +interface IpLoginInfo { + _id: string; + uid: number; +} + +declare module 'hydrooj' { + interface Collections { + iplogin: IpLoginInfo; + } +} +const coll = db.collection('iplogin'); + +function normalizeIp(ip: string) { + if (ip.startsWith('::ffff:')) return ip.slice(7); + return ip; +} + +export function apply(ctx: Context) { + ctx.on('handler/init', async (that) => { + const iplogin = await coll.findOne({ _id: normalizeIp(that.request.ip) }); + if (iplogin) { + that.user = await UserModel.getById(that.domain._id, iplogin.uid); + if (!that.user) { + that.user = await UserModel.getById(that.domain._id, 0); + throw new ForbiddenError(`User ${iplogin.uid}not found`); + } + that.session.ipLoggedIn = true; + that.session.uid = iplogin.uid; + that.session.user = that.user; + } + }); +} diff --git a/packages/onsite-toolkit/package.json b/packages/onsite-toolkit/package.json new file mode 100644 index 00000000..d1ccd0de --- /dev/null +++ b/packages/onsite-toolkit/package.json @@ -0,0 +1,4 @@ +{ + "name": "@hydrooj/onsite-toolkit", + "version": "0.0.1" +}