From 4862181d61771ff0f91c1d29134ce1718684f820 Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Wed, 10 Dec 2025 20:57:55 +0100 Subject: [PATCH 1/2] Fix registration email and markdown parser singleton --- app/composables/useMarkdown.ts | 12 ++++++------ server/api/auth/register.post.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/composables/useMarkdown.ts b/app/composables/useMarkdown.ts index a9ad8ce..fd1a70c 100644 --- a/app/composables/useMarkdown.ts +++ b/app/composables/useMarkdown.ts @@ -18,7 +18,7 @@ interface Parser } export default function useMarkdown(): Parser { - let processor: Processor, processorSync: Processor; + let processor: Processor, processorText: Processor; const parse = (markdown: string) => { if (!processor) @@ -43,14 +43,14 @@ export default function useMarkdown(): Parser } const text = (markdown: string) => { - if (!processor) + if (!processorText) { - processor = unified().use([RemarkParse, RemarkGfm, RemarkOfm, RemarkBreaks, RemarkFrontmatter ]); - processor.use(StripMarkdown, { remove: [ 'comment', 'tag', 'callout' ] }); - processor.use(RemarkStringify); + processorText = unified().use([RemarkParse, RemarkGfm, RemarkOfm, RemarkBreaks, RemarkFrontmatter ]); + processorText.use(StripMarkdown, { remove: [ 'comment', 'tag', 'callout' ] }); + processorText.use(RemarkStringify); } - const processed = processor.processSync(markdown); + const processed = processorText.processSync(markdown); return String(processed); } diff --git a/server/api/auth/register.post.ts b/server/api/auth/register.post.ts index dce0d35..4b95569 100644 --- a/server/api/auth/register.post.ts +++ b/server/api/auth/register.post.ts @@ -90,7 +90,7 @@ export default defineEventHandler(async (e): Promise => { template: 'registration', data: { id: emailId, timestamp, - userId: id, + userId: id.id, username: body.data.username, }, } From 94645f9dbfac06889acd7e6cdbaaf821b892baf0 Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Mon, 15 Dec 2025 18:39:33 +0100 Subject: [PATCH 2/2] Fix mail validation --- app/composables/useDatabase.ts | 1 - db.sqlite | Bin 724992 -> 720896 bytes server/api/auth/register.post.ts | 2 +- server/api/auth/request-reset.post.ts | 2 +- server/api/users/[id]/revalidate.post.ts | 2 +- server/components/mail/reset-password.ts | 1 + server/routes/user/mailvalidation.get.ts | 8 ++-- server/tasks/validation.ts | 8 ++-- shared/character.util.ts | 52 +++++++++++------------ 9 files changed, 39 insertions(+), 37 deletions(-) diff --git a/app/composables/useDatabase.ts b/app/composables/useDatabase.ts index d4fb931..622aa6a 100644 --- a/app/composables/useDatabase.ts +++ b/app/composables/useDatabase.ts @@ -1,7 +1,6 @@ import { Database } from "bun:sqlite"; import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite"; import * as schema from '../db/schema'; -import { eq, or, sql } from "drizzle-orm"; let instance: BunSQLiteDatabase & { $client: Database; diff --git a/db.sqlite b/db.sqlite index 6f3c060756fb70c51324273126be75083d837cd4..64617a404f59e3d6d0a9fb7b41a61fff63a306a9 100644 GIT binary patch delta 37438 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 V{-Li6es>u%$4URe-wCqZ{|&4CGBf}H delta 39517 zcmeHw34B{umABrLWb4V6l{8H)*Ky<6Y11rHv^;HY)mE}(N!D)dN{jOJ^t4#3wOLZB z6}M@+LrZ91H(Ck|(3zn_TR==an56kA8l$ ziZm#7v{A<>8KX+6R;!GvOiGo~s?-!srd39@(U7KUCOuT0`p?l4Ml0+CX9V zKYLNj>zWYq)+Iukp)`6D;G|AV8}%8ZR>P=t6h&%NdWOuTl{#%kXHe5xgPu03v?`6J zr>7YMt)){&HKR^xvHRKA?b+s%ak*vEj9RBR>QqWlA4;t<=u>J+lUC^r8Wo+U(t35u zpiUdK>QtIkG8tnkttTmxN|BT@Z8WNN*!}n1{_}@i<6LHpQJKydDZMhIrgfAqqc>>u z%9No8nonmKHKV6Ax(s7v^ahnuuhD2TsSHUgDGifS8H@~Q3wHnN^FMgRb-^GvC8^S= z$#jO%kZC2z)u2)tbPQ-)MyVy!lp&MRrYTaVF{;xUN}Dlgl`2YOP^#&SUa8V*KxSXt z{VUf_p%tnPR5_DU>OfOcw1H-fWJ;~osr5>2ipgknDlN!Cn^BRZkzur;U%)4|R&8LE zKw-KxfKL8=BGDuDOorA_M!i9oCTWd^)N4`(V@jh`>s4x6rJ+-Xlu?&5kPJ=JDxfMO zL+jE;O~yzX)1W2T{aW(blIuLKeR`llwO(x`Nkd9&U|^X-s{@NWd=r;lGYiuDKG{N zV06$x@u19}QEebKv@xYqgVCYPs5B%)rgdsvMy=K|V8p7msg#k_Q!0?#jmvL!Ne8*5 z49c|HU{urTGy{rO8`2tWO3Q#QOo2|-WKtR(2?mIsVRUJADx+qUT0IH6L9NmmRR$$? zud48!r(9!$j#Pq9*Bcm;qM;g88l{$j!Wj)1zMx})oDp=5mQ)+{DkcRw(nxE7wkWkx zr&Fdfh9|f0`pFIvF8zC+^jYcOKe=7`eyR0BoUajpwgKhoK~wa44d@mFY0N9W|APxL zh^ciX7#v!o&Y;tfTCLKc0odon;5o;opW#WrC;be_>0{Ev<9rQvmW=QV_!{CYnLOeD zqV!Ulq%;~@pO#ZftyWHgkt7GzVC0NiX#mf(Hf>N+dE9FE! zAK`?KJu1!WnMypgH&j{_C- zrSkKJ_y>t(vdpX|=^Ry~=mt|03Hjqhv(D7&BLe;uK~tqFmCu$(ho1cD!|y)adj;z! z9s31O`a@8^PfGtr`gZAk(p#k0N;A@s)GSp=cS{KX^Pb$Hd}gdCl?sX7m?+KAOtq1( zl!wnB6B7F|5mnBYsA7⪻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 TR4Fr^nK|Wke)gLc{G$I0!d_={ diff --git a/server/api/auth/register.post.ts b/server/api/auth/register.post.ts index 4b95569..e800780 100644 --- a/server/api/auth/register.post.ts +++ b/server/api/auth/register.post.ts @@ -74,7 +74,7 @@ export default defineEventHandler(async (e): Promise => { logSession(e, await setUserSession(e, { user: { id: id.id, username: body.data.username, email: body.data.email, state: 0, signin: new Date(), permissions: [], lastTimestamp: new Date() } }) as UserSessionRequired); - const emailId = Bun.hash('register' + id.id + hash, Date.now()); + const emailId = Bun.hash('register' + id.id + hash, Date.now()).toString(10); const timestamp = Date.now() + 1000 * 60 * 60; await runTask('validation', { diff --git a/server/api/auth/request-reset.post.ts b/server/api/auth/request-reset.post.ts index 63a0a1b..08f5721 100644 --- a/server/api/auth/request-reset.post.ts +++ b/server/api/auth/request-reset.post.ts @@ -24,7 +24,7 @@ export default defineEventHandler(async (e) => { if(result && result.id) { - const id = hash('reset' + result.id + result.hash, Date.now()); + const id = hash('reset' + result.id + result.hash, Date.now()).toString(10); const timestamp = Date.now() + 1000 * 60 * 60; await runTask('validation', { payload: { diff --git a/server/api/users/[id]/revalidate.post.ts b/server/api/users/[id]/revalidate.post.ts index 51586fb..21a0fa3 100644 --- a/server/api/users/[id]/revalidate.post.ts +++ b/server/api/users/[id]/revalidate.post.ts @@ -47,7 +47,7 @@ export default defineEventHandler(async (e) => { return; } - const emailId = hash('register' + data.id + data.hash, Date.now()); + const emailId = hash('register' + data.id + data.hash, Date.now()).toString(10); const timestamp = Date.now() + 1000 * 60 * 60; await runTask('validation', { diff --git a/server/components/mail/reset-password.ts b/server/components/mail/reset-password.ts index d1fe15a..d194101 100644 --- a/server/components/mail/reset-password.ts +++ b/server/components/mail/reset-password.ts @@ -1,4 +1,5 @@ import { dom, text } from "#shared/dom.virtual.util"; +import { format } from "#shared/general.util"; export default function(data: any) { diff --git a/server/routes/user/mailvalidation.get.ts b/server/routes/user/mailvalidation.get.ts index ed31af8..4c4a353 100644 --- a/server/routes/user/mailvalidation.get.ts +++ b/server/routes/user/mailvalidation.get.ts @@ -16,6 +16,8 @@ export default defineEventHandler(async (e) => { if(!query.success) throw query.error; + const date = new Date(); + if(Bun.hash('1' + query.data.u.toString(), query.data.t).toString() !== query.data.h) { return createError({ @@ -23,7 +25,7 @@ export default defineEventHandler(async (e) => { message: 'Lien incorrect', }); } - if(Date.now() > query.data.t + (60 * 60 * 1000)) + if(date.getTime() > query.data.t + (60 * 60 * 1000)) { return createError({ statusCode: 400, @@ -34,7 +36,7 @@ export default defineEventHandler(async (e) => { const db = useDatabase(); const validate = db.select(getTableColumns(emailValidationTable)).from(emailValidationTable).where(eq(emailValidationTable.id, query.data.i)).get(); - if(!validate || validate.timestamp <= new Date()) + if(!validate || validate.timestamp <= date) { return createError({ statusCode: 400, @@ -42,7 +44,7 @@ export default defineEventHandler(async (e) => { }); } - db.delete(emailValidationTable).where(lte(emailValidationTable.timestamp, new Date())).run(); + db.delete(emailValidationTable).where(lte(emailValidationTable.timestamp, date)).run(); const result = db.select({ state: usersTable.state }).from(usersTable).where(eq(usersTable.id, query.data.u)).get(); if(result === undefined) diff --git a/server/tasks/validation.ts b/server/tasks/validation.ts index 8945182..27e0998 100644 --- a/server/tasks/validation.ts +++ b/server/tasks/validation.ts @@ -14,18 +14,18 @@ export default defineTask({ name: 'validation', description: 'Add email ID to DB', }, - run(e) { + run({ payload, context }) { try { - if(e.payload.type !== 'validation') + if(payload.type !== 'validation') { throw new Error(`Données inconnues`); } - const payload = e.payload as ValidationPayload; + const _payload = payload as ValidationPayload; const db = useDatabase(); db.delete(emailValidationTable).where(lt(emailValidationTable.timestamp, new Date())).run(); - db.insert(emailValidationTable).values({ id: payload.id, timestamp: new Date(payload.timestamp) }).run(); + db.insert(emailValidationTable).values({ id: _payload.id, timestamp: new Date(_payload.timestamp) }).run(); return { result: true }; } diff --git a/shared/character.util.ts b/shared/character.util.ts index ed5599f..e250745 100644 --- a/shared/character.util.ts +++ b/shared/character.util.ts @@ -1,9 +1,9 @@ -import type { Ability, Alignment, ArmorConfig, Character, CharacterConfig, CharacterVariables, CompiledCharacter, DamageType, FeatureItem, ItemConfig, ItemState, Level, MainStat, Resistance, SpellConfig, SpellElement, SpellType, TrainingLevel, WeaponConfig, WeaponType } from "~/types/character"; -import { keyof, z } from "zod/v4"; +import type { Ability, Alignment, ArmorConfig, Character, CharacterConfig, CharacterVariables, CompiledCharacter, DamageType, FeatureItem, ItemConfig, ItemState, Level, MainStat, Resistance, SpellElement, SpellType, TrainingLevel, WeaponConfig, WeaponType } from "~/types/character"; +import { z } from "zod/v4"; import characterConfig from '#shared/character-config.json'; import proses, { preview } from "#shared/proses"; import { button, buttongroup, checkbox, floater, foldable, input, loading, multiselect, numberpicker, select, tabgroup, Toaster, toggle } from "#shared/components.util"; -import { div, dom, icon, span, text, type DOMList, type RedrawableHTML } from "#shared/dom.util"; +import { div, dom, icon, span, text, reactive, type DOMList, type RedrawableHTML } from "#shared/dom.util"; import { followermenu, fullblocker, tooltip } from "#shared/floating.util"; import { clamp, deepEquals } from "#shared/general.util"; import markdown from "#shared/markdown.util"; @@ -1006,11 +1006,11 @@ class TrainingPicker extends BuilderTab ]), div("flex justify-center items-center gap-2 my-2 md:text-base text-sm", [ dom("span", { text: "Vie" }), - text(this._builder, '{{compiled.health}}'), + text(() => this._builder.compiled.health), ]), div("flex justify-center items-center gap-2 my-2 md:text-base text-sm", [ dom("span", { text: "Mana" }), - text(this._builder, '{{compiled.mana}}'), + text(() => this._builder.compiled.mana), ]), button(text('Suivant'), () => this._builder.display(3), 'h-[35px] px-[15px]'), ]), dom('span') @@ -1311,7 +1311,7 @@ export class CharacterSheet useRequestFetch()(`/api/character/${id}`).then(character => { if(character) { - this.character = new CharacterCompiler(character); + this.character = new CharacterCompiler(reactive(character)); if(character.campaign) { @@ -1321,7 +1321,7 @@ export class CharacterSheet useRequestFetch()(`/api/character/${id}`).then(character => { if(character) { - this.character!.character = character; + this.character!.character = reactive(character); this.character!.values; 'update' in this.container! && this.container!.update!(true); } @@ -1458,12 +1458,12 @@ export class CharacterSheet dom("span", { class: "flex flex-row items-center gap-2 text-3xl font-light" }, [ text("PV: "), health.readonly, - text(character, `/ {{health}}`), + text(() => character.health), ]), dom("span", { class: "flex flex-row items-center gap-2 text-3xl font-light" }, [ text("Mana: "), mana.readonly, - text(character, `/ {{mana}}`), + text(() => character.mana), ]), ]), ]), @@ -1478,31 +1478,31 @@ export class CharacterSheet div("flex flex-row justify-center 2xl:gap-4 gap-2 p-4 border-b border-light-35 dark:border-dark-35", [ div("flex 2xl:gap-4 gap-2 flex-row items-center justify-between", [ div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.strength}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.strength}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Force" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.dexterity}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.dexterity}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Dextérité" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.constitution}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.constitution}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Constitution" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.intelligence}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.intelligence}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Intelligence" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.curiosity}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.curiosity}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Curiosité" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.charisma}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.charisma}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Charisme" }) ]), div("flex flex-col items-center px-2", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{modifier.psyche}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.modifier.psyche}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Psyché" }) ]) ]), @@ -1511,11 +1511,11 @@ export class CharacterSheet div("flex 2xl:gap-4 gap-2 flex-row items-center justify-between", [ div("flex flex-col px-2 items-center", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `+{{initiative}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => `+${character.initiative}`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Initiative" }) ]), div("flex flex-col px-2 items-center", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, () => character.speed === false ? "Aucun déplacement" : `{{speed}} cases`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => character.speed === false ? "Aucun déplacement" : `${character.speed} cases`) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Course" }) ]) ]), @@ -1525,15 +1525,15 @@ export class CharacterSheet div("flex 2xl:gap-4 gap-2 flex-row items-center justify-between", [ icon("game-icons:checked-shield", { width: 32, height: 32 }), div("flex flex-col px-2 items-center", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `{{defense.passive}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => clamp(character.defense.static + character.defense.passiveparry + character.defense.passivedodge, 0, character.defense.hardcap)) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Passive" }) ]), div("flex flex-col px-2 items-center", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `{{defense.parry}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => clamp(character.defense.static + character.defense.activeparry + character.defense.passivedodge, 0, character.defense.hardcap)) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Blocage" }) ]), div("flex flex-col px-2 items-center", [ - dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(character, `{{defense.dodge}}`) ]), + dom("span", { class: "2xl:text-2xl text-xl font-bold" }, [ text(() => clamp(character.defense.static + character.defense.passiveparry + character.defense.activedodge, 0, character.defense.hardcap)) ]), dom("span", { class: "text-sm 2xl:text-base", text: "Esquive" }) ]) ]), @@ -1551,7 +1551,7 @@ export class CharacterSheet Object.keys(character.abilities).map((ability) => div("flex flex-row px-1 justify-between items-center", [ span("text-sm text-light-70 dark:text-dark-70 max-w-20 truncate", abilityTexts[ability as Ability] || ability), - span("font-bold text-base text-light-100 dark:text-dark-100", text(character.abilities, `+{{${ability}}}`)), + span("font-bold text-base text-light-100 dark:text-dark-100", text(() => `+${character.abilities[ability as Ability] ?? 0}`)), ]) ) ), @@ -1583,10 +1583,10 @@ export class CharacterSheet ]) : undefined, div("grid grid-cols-2 gap-x-3 gap-y-1 text-sm", [ - div('flex flex-row items-center gap-2', [ text('Précision'), span('font-bold', text(character.spellranks, "{{precision}}")) ]), - div('flex flex-row items-center gap-2', [ text('Savoir'), span('font-bold', text(character.spellranks, "{{knowledge}}")) ]), - div('flex flex-row items-center gap-2', [ text('Instinct'), span('font-bold', text(character.spellranks, "{{instinct}}")) ]), - div('flex flex-row items-center gap-2', [ text('Oeuvres'), span('font-bold', text(character.spellranks, "{{arts}}")) ]), + div('flex flex-row items-center gap-2', [ text('Précision'), span('font-bold', text(() => character.spellranks.precision)) ]), + div('flex flex-row items-center gap-2', [ text('Savoir'), span('font-bold', text(() => character.spellranks.knowledge)) ]), + div('flex flex-row items-center gap-2', [ text('Instinct'), span('font-bold', text(() => character.spellranks.instinct)) ]), + div('flex flex-row items-center gap-2', [ text('Oeuvres'), span('font-bold', text(() => character.spellranks.arts)) ]), ]) ]) ]),