From 5f8785362c6b8119017ba2cc539549ef2f9515e0 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 8 Oct 2024 18:56:08 +0800 Subject: [PATCH 01/12] core: db: add collectionMap support --- packages/hydrooj/src/service/db.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/hydrooj/src/service/db.ts b/packages/hydrooj/src/service/db.ts index 9430b9ea6..6dee3f3fd 100644 --- a/packages/hydrooj/src/service/db.ts +++ b/packages/hydrooj/src/service/db.ts @@ -22,6 +22,7 @@ interface MongoConfig { url?: string, uri?: string, prefix?: string, + collectionMap?: Record, } class MongoService { @@ -54,8 +55,9 @@ class MongoService { } public collection(c: K) { - if (this.opts.prefix) return this.db.collection(`${this.opts.prefix}.${c}`); - return this.db.collection(c); + let coll = this.opts.prefix ? `${this.opts.prefix}.${c}` : c; + if (this.opts.collectionMap?.[coll]) coll = this.opts.collectionMap[coll]; + return this.db.collection(coll); } public async fixExpireAfter() { From 35e481213dd18a2931d0867a458fe8ace1d394c1 Mon Sep 17 00:00:00 2001 From: undefined Date: Tue, 8 Oct 2024 20:17:55 +0800 Subject: [PATCH 02/12] install: rewrite caddyfile if not exist --- install/install.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/install/install.ts b/install/install.ts index df84d6ff1..ea696a83f 100644 --- a/install/install.ts +++ b/install/install.ts @@ -305,7 +305,7 @@ const Steps = () => [ { init: 'install.preparing', operations: [ - () => { + async () => { if (process.env.IGNORE_BT) return; const res = exec('bt default'); if (!res.code) { @@ -314,6 +314,7 @@ const Steps = () => [ process.exit(1); } else { log.warn('warn.bt'); + await sleep(5000); } } }, @@ -407,7 +408,7 @@ ${nixConfBase}`); }, { init: 'install.caddy', - skip: () => !exec('caddy version').code || installAsJudge || noCaddy, + skip: () => !exec('caddy version').code || installAsJudge || noCaddy || !existsSync(`${process.env.HOME}/.hydro/Caddyfile`), hidden: installAsJudge, operations: [ 'nix-env -iA nixpkgs.caddy', From 8d75bb1b68b5ba527d251c491eb6476d2d988389 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 10 Oct 2024 10:04:28 +0800 Subject: [PATCH 03/12] core: replace detect-browser with ua-parser-js --- packages/hydrooj/package.json | 4 ++-- packages/hydrooj/src/handler/home.ts | 9 ++++++--- packages/hydrooj/src/lib/useragent.ts | 5 ----- packages/ui-default/backendlib/template.ts | 7 +++++++ packages/ui-default/templates/home_security.html | 6 +++--- 5 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 packages/hydrooj/src/lib/useragent.ts diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 94c38e893..7b024a057 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -25,7 +25,6 @@ "adm-zip": "0.5.14", "cac": "^6.7.14", "cordis": "3.18.1", - "detect-browser": "^5.3.0", "emoji-regex": "^10.4.0", "emojis-list": "2.1.0", "fs-extra": "^11.2.0", @@ -51,7 +50,8 @@ "shorty.js": "^1.0.1", "superagent": "^10.1.0", "tar": "6.2.1", - "thirty-two": "^1.0.2" + "thirty-two": "^1.0.2", + "ua-parser-js": "^1.0.39" }, "devDependencies": { "@types/adm-zip": "^0.4.34", diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index fa42f38ff..d2eefa4e1 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -3,6 +3,7 @@ import { generateRegistrationOptions, verifyRegistrationResponse } from '@simple import yaml from 'js-yaml'; import { pick } from 'lodash'; import { Binary, ObjectId } from 'mongodb'; +import Parser from 'ua-parser-js'; import { Context } from '../context'; import { AuthOperationError, BlacklistedError, DomainAlreadyExistsError, InvalidTokenError, @@ -12,7 +13,6 @@ import { import { DomainDoc, MessageDoc, Setting } from '../interface'; import avatar, { validate } from '../lib/avatar'; import * as mail from '../lib/mail'; -import * as useragent from '../lib/useragent'; import { verifyTFA } from '../lib/verifyTFA'; import BlackListModel from '../model/blacklist'; import { PERM, PRIV } from '../model/builtin'; @@ -187,7 +187,11 @@ class HomeSecurityHandler extends Handler { for (const session of sessions) { session.isCurrent = session._id === this.session._id; session._id = md5(session._id); - session.updateUa = useragent.parse(session.updateUa || session.createUa || ''); + const ua = session.updateUa || session.createUa; + if (ua) { + const parser = new Parser(ua); + session.updateUaInfo = parser.getResult(); + } session.updateGeoip = this.ctx.geoip?.lookup?.( session.updateIp || session.createIp, this.translate('geoip_locale'), @@ -202,7 +206,6 @@ class HomeSecurityHandler extends Handler { 'authenticatorAttachment', 'regat', 'fmt', ])), geoipProvider: this.ctx?.geoip?.provider, - icon: (str = '') => str.split(' ')[0].toLowerCase(), }; } diff --git a/packages/hydrooj/src/lib/useragent.ts b/packages/hydrooj/src/lib/useragent.ts deleted file mode 100644 index 0dfb414d2..000000000 --- a/packages/hydrooj/src/lib/useragent.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as browser from 'detect-browser'; - -export function parse(str: string) { - return browser.parseUserAgent(str); -} diff --git a/packages/ui-default/backendlib/template.ts b/packages/ui-default/backendlib/template.ts index 7758a60dd..d2f679006 100644 --- a/packages/ui-default/backendlib/template.ts +++ b/packages/ui-default/backendlib/template.ts @@ -157,6 +157,13 @@ env.addGlobal('set', (obj, key, val) => { env.addGlobal('findSubModule', (prefix) => Object.keys(global.Hydro.ui.template).filter((n) => n.startsWith(prefix))); env.addGlobal('templateExists', (name) => !!global.Hydro.ui.template[name]); +const supportedPlatformIcons = ['android', 'chromeos', 'ios', 'linux', 'mac', 'mobile', 'windows']; +env.addGlobal('platformIcon', (platform) => { + const key = platform?.toLowerCase(); + if (supportedPlatformIcons.includes(key)) return key; + return 'unknown'; +}); + const render = (name: string, state: any) => new Promise((resolve, reject) => { env.render(name, { page_name: name.split('.')[0], diff --git a/packages/ui-default/templates/home_security.html b/packages/ui-default/templates/home_security.html index 406f933f5..ae47ea3d1 100644 --- a/packages/ui-default/templates/home_security.html +++ b/packages/ui-default/templates/home_security.html @@ -153,7 +153,7 @@
  • - +

    {{ _('Last Update At') }}: {{ datetimeSpan(session.updateAt)|safe }}

    @@ -161,8 +161,8 @@

    {{ _('Hostname') }}: {{ session.createHost }}

    {% endif %}

    {{ _('Location') }}: {{ _(session.updateGeoip.display) }} ({{ session.updateIp }})

    -

    {{ _('Operating System') }}: {{ session.updateUa.os }}

    -

    {{ _('Browser') }}: {{ session.updateUa.name }} {{ session.updateUa.version }}

    +

    {{ _('Operating System') }}: {{ session.updateUaInfo.os.name }} {{ session.updateUaInfo.os.version }}

    +

    {{ _('Browser') }}: {{ session.updateUaInfo.browser.name }} {{ session.updateUaInfo.browser.version }}

    {% if session.isCurrent %}

    {{ _('This is the current session') }}

    {% endif %} From 0862e4f35916e4c45b341e5a6144f58e9b4020a4 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 10 Oct 2024 19:40:04 +0800 Subject: [PATCH 04/12] ui: fix macos icon --- packages/ui-default/backendlib/template.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui-default/backendlib/template.ts b/packages/ui-default/backendlib/template.ts index d2f679006..51222dc63 100644 --- a/packages/ui-default/backendlib/template.ts +++ b/packages/ui-default/backendlib/template.ts @@ -157,9 +157,10 @@ env.addGlobal('set', (obj, key, val) => { env.addGlobal('findSubModule', (prefix) => Object.keys(global.Hydro.ui.template).filter((n) => n.startsWith(prefix))); env.addGlobal('templateExists', (name) => !!global.Hydro.ui.template[name]); +const platformIconMap = { 'mac os': 'mac' }; const supportedPlatformIcons = ['android', 'chromeos', 'ios', 'linux', 'mac', 'mobile', 'windows']; env.addGlobal('platformIcon', (platform) => { - const key = platform?.toLowerCase(); + const key = platformIconMap[platform?.toLowerCase()] || platform?.toLowerCase(); if (supportedPlatformIcons.includes(key)) return key; return 'unknown'; }); From d9a903de86ca0d9ce34c8b9a9958f27b0d743ae3 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 11 Oct 2024 21:42:14 +0800 Subject: [PATCH 05/12] ui: fix language-* class --- packages/ui-default/backendlib/markdown-it-xss.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui-default/backendlib/markdown-it-xss.ts b/packages/ui-default/backendlib/markdown-it-xss.ts index d9fbe90a8..c3033a8e4 100644 --- a/packages/ui-default/backendlib/markdown-it-xss.ts +++ b/packages/ui-default/backendlib/markdown-it-xss.ts @@ -151,7 +151,7 @@ export const xss = new FilterXSS({ css: cssFilterOptions, safeAttrValue(tag, name, value) { if (name === 'id') return escapeAttrValue(`xss-id-${value}`); - if (name === 'class') return value.split(' ').filter((i) => whitelistClasses.includes(i)).join(' '); + if (name === 'class') return value.split(' ').filter((i) => whitelistClasses.includes(i) || i.startsWith('language-')).join(' '); return safeAttrValue(tag, name, value, CssFilter); }, }); From ce2e7da7ca9cbb7261b0fe80f28d37e7f62d0726 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 11 Oct 2024 21:42:26 +0800 Subject: [PATCH 06/12] core: pagination: add default value --- packages/hydrooj/src/service/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 131e18227..e1d11976e 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -238,7 +238,7 @@ export async function apply(ctx: Context) { return res; }, paginate(cursor: FindCursor, page: number, key: string) { - return db.paginate(cursor, page, this.ctx.setting.get(`pagination.${key}`)); + return db.paginate(cursor, page, this.ctx.setting.get(`pagination.${key}`) || 20); }, checkPerm(...args: bigint[]) { if (!this.user.hasPerm(...args)) { From aada95cf12d7799299f4a2f271e1e8aad7e4b317 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 11 Oct 2024 21:44:57 +0800 Subject: [PATCH 07/12] ui: hide register floatbox if not allowed to register --- packages/ui-default/templates/partials/login_dialog.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/ui-default/templates/partials/login_dialog.html b/packages/ui-default/templates/partials/login_dialog.html index 2ecb04545..400315d37 100644 --- a/packages/ui-default/templates/partials/login_dialog.html +++ b/packages/ui-default/templates/partials/login_dialog.html @@ -1,13 +1,11 @@