From 37d449d42fe4ae68cf108b0135190484a7cfd1bb Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 7 Aug 2020 13:15:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=AF=BC=E5=85=A5=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/hydrooj/TODO | 4 +-- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/manage.ts | 38 +++++++++++++++++++++++++- packages/hydrooj/src/model/user.ts | 2 +- packages/hydrooj/src/script/rating.ts | 1 - 5 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/hydrooj/TODO b/packages/hydrooj/TODO index dc5ac8aab..a670000cd 100644 --- a/packages/hydrooj/TODO +++ b/packages/hydrooj/TODO @@ -6,6 +6,4 @@ pdoc.secretConfig? message.markAsRead 批量导入用户 domain_join_application -user.displayName -problem.difficulty_setting -用户等级计算 \ No newline at end of file +problem.difficulty_setting \ No newline at end of file diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 03342fd89..212f05320 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "2.12.4", + "version": "2.12.5", "bin": "bin/hydrooj.js", "main": "dist/loader.js", "typings": "dist/loader.d.ts", diff --git a/packages/hydrooj/src/handler/manage.ts b/packages/hydrooj/src/handler/manage.ts index 159baf1cf..ac4980278 100644 --- a/packages/hydrooj/src/handler/manage.ts +++ b/packages/hydrooj/src/handler/manage.ts @@ -3,12 +3,15 @@ import { ValidationError } from '../error'; import * as check from '../check'; import * as setting from '../model/setting'; import * as system from '../model/system'; +import * as user from '../model/user'; import { STATUS, PRIV } from '../model/builtin'; import * as record from '../model/record'; import { Route, Connection, Handler, ConnectionHandler, param, Types, } from '../service/server'; -import { validate } from '../lib/validator'; +import { + validate, isEmail, isUname, isPassword, +} from '../lib/validator'; function set(key, value) { if (setting.SYSTEM_SETTINGS_BY_KEY[key]) { @@ -159,11 +162,44 @@ class SystemSettingHandler extends SystemHandler { } } +class SystemUserImportHandler extends SystemHandler { + async get() { + this.response.body.users = []; + this.response.template = 'manage_user_import.html'; + } + + @param('users', Types.String) + @param('confirm', Types.Boolean) + async post(domainId: string, _users: string, confirm: boolean) { + const users = _users.split('\n'); + const udocs = []; + const tasks = []; + const messages = []; + for (const i in users) { + const u = users[i]; + const [email, username, password] = u.split(',').map((t) => t.trim()); + if (email && username && password) { + if (!isEmail(email)) messages.push(`Line ${i + 1}: Invalid email.`); + else if (!isUname(username)) messages.push(`Line ${i + 1}: Invalid username`); + else if (!isPassword(password)) messages.push(`Line ${i + 1}: Invalid password`); + else { + udocs.push({ email, username, password }); + if (!confirm) tasks.push(user.create(email, username, password)); + } + } else messages.push(`Line ${i + 1}: Input invalid.`); + } + await Promise.all(tasks); + this.response.body.users = udocs; + this.response.body.messages = messages; + } +} + async function apply() { Route('manage', '/manage', SystemMainHandler); Route('manage_dashboard', '/manage/dashboard', SystemDashboardHandler); Route('manage_script', '/manage/script', SystemScriptHandler); Route('manage_setting', '/manage/setting', SystemSettingHandler); + Route('manage_user_import', '/manage/userimport', SystemUserImportHandler); Connection('manage_check', '/manage/check-conn', SystemCheckConnHandler); } diff --git a/packages/hydrooj/src/model/user.ts b/packages/hydrooj/src/model/user.ts index 0c12ff6aa..32a15ccea 100644 --- a/packages/hydrooj/src/model/user.ts +++ b/packages/hydrooj/src/model/user.ts @@ -173,7 +173,7 @@ export async function inc(_id: number, field: string, n = 1) { export async function create( mail: string, uname: string, password: string, - uid: number, regip = '127.0.0.1', priv = PRIV.PRIV_DEFAULT, + uid?: number, regip = '127.0.0.1', priv = PRIV.PRIV_DEFAULT, ) { const salt = String.random(); if (!uid) uid = await system.inc('user'); diff --git a/packages/hydrooj/src/script/rating.ts b/packages/hydrooj/src/script/rating.ts index 0573d2a56..613b19e44 100644 --- a/packages/hydrooj/src/script/rating.ts +++ b/packages/hydrooj/src/script/rating.ts @@ -9,7 +9,6 @@ import * as record from '../model/record'; import { STATUS } from '../model/builtin'; import rating from '../lib/rating'; import paginate from '../lib/paginate'; -import ranked from '../lib/rank'; export const description = 'Calculate rp of a domain, or all domains';