Starting 2FA flow.

This commit is contained in:
Bradley Shellnut 2024-03-24 23:11:25 -07:00
parent 716e2e7d28
commit f729becade
7 changed files with 123 additions and 88 deletions

View file

@ -22,7 +22,7 @@
},
"devDependencies": {
"@melt-ui/pp": "^0.3.0",
"@melt-ui/svelte": "^0.76.0",
"@melt-ui/svelte": "^0.76.2",
"@playwright/test": "^1.42.1",
"@resvg/resvg-js": "^2.6.0",
"@sveltejs/adapter-auto": "^3.1.1",
@ -59,13 +59,13 @@
"svelte-sequential-preprocessor": "^2.0.1",
"sveltekit-flash-message": "^2.4.4",
"sveltekit-rate-limiter": "^0.4.3",
"sveltekit-superforms": "^2.10.6",
"sveltekit-superforms": "^2.11.0",
"tailwindcss": "^3.4.1",
"ts-node": "^10.9.2",
"tslib": "^2.6.1",
"tsx": "^4.7.1",
"typescript": "^5.4.3",
"vite": "^5.2.2",
"vite": "^5.2.6",
"vitest": "^1.4.0",
"zod": "^3.22.4"
},
@ -105,13 +105,13 @@
"open-props": "^1.6.21",
"oslo": "^1.1.3",
"pg": "^8.11.3",
"postgres": "^3.4.3",
"postgres": "^3.4.4",
"radix-svelte": "^0.9.0",
"svelte-french-toast": "^1.2.0",
"svelte-lazy-loader": "^1.0.0",
"tailwind-merge": "^2.2.2",
"tailwind-variants": "^0.2.1",
"tailwindcss-animate": "^1.0.6",
"zod-to-json-schema": "^3.22.4"
"zod-to-json-schema": "^3.22.5"
}
}

View file

@ -58,13 +58,13 @@ dependencies:
version: 0.6.0
drizzle-orm:
specifier: ^0.30.4
version: 0.30.4(@neondatabase/serverless@0.9.0)(@planetscale/database@1.16.0)(@types/pg@8.11.4)(pg@8.11.3)(postgres@3.4.3)
version: 0.30.4(@neondatabase/serverless@0.9.0)(@planetscale/database@1.16.0)(@types/pg@8.11.4)(pg@8.11.3)(postgres@3.4.4)
feather-icons:
specifier: ^4.29.1
version: 4.29.1
formsnap:
specifier: ^0.5.1
version: 0.5.1(svelte@4.2.12)(sveltekit-superforms@2.10.6)
version: 0.5.1(svelte@4.2.12)(sveltekit-superforms@2.11.0)
html-entities:
specifier: ^2.5.2
version: 2.5.2
@ -96,8 +96,8 @@ dependencies:
specifier: ^8.11.3
version: 8.11.3
postgres:
specifier: ^3.4.3
version: 3.4.3
specifier: ^3.4.4
version: 3.4.4
radix-svelte:
specifier: ^0.9.0
version: 0.9.0(svelte@4.2.12)
@ -117,16 +117,16 @@ dependencies:
specifier: ^1.0.6
version: 1.0.7(tailwindcss@3.4.1)
zod-to-json-schema:
specifier: ^3.22.4
version: 3.22.4(zod@3.22.4)
specifier: ^3.22.5
version: 3.22.5(zod@3.22.4)
devDependencies:
'@melt-ui/pp':
specifier: ^0.3.0
version: 0.3.0(@melt-ui/svelte@0.76.0)(svelte@4.2.12)
version: 0.3.0(@melt-ui/svelte@0.76.2)(svelte@4.2.12)
'@melt-ui/svelte':
specifier: ^0.76.0
version: 0.76.0(svelte@4.2.12)
specifier: ^0.76.2
version: 0.76.2(svelte@4.2.12)
'@playwright/test':
specifier: ^1.42.1
version: 1.42.1
@ -141,10 +141,10 @@ devDependencies:
version: 0.1.9(svelte@4.2.12)
'@sveltejs/kit':
specifier: ^2.5.4
version: 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
version: 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
'@sveltejs/vite-plugin-svelte':
specifier: ^3.0.2
version: 3.0.2(svelte@4.2.12)(vite@5.2.2)
version: 3.0.2(svelte@4.2.12)(vite@5.2.6)
'@types/cookie':
specifier: ^0.6.0
version: 0.6.0
@ -236,8 +236,8 @@ devDependencies:
specifier: ^0.4.3
version: 0.4.3(@sveltejs/kit@2.5.4)
sveltekit-superforms:
specifier: ^2.10.6
version: 2.10.6(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12)
specifier: ^2.11.0
version: 2.11.0(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12)
tailwindcss:
specifier: ^3.4.1
version: 3.4.1(ts-node@10.9.2)
@ -254,8 +254,8 @@ devDependencies:
specifier: ^5.4.3
version: 5.4.3
vite:
specifier: ^5.2.2
version: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
specifier: ^5.2.6
version: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vitest:
specifier: ^1.4.0
version: 1.4.0(@types/node@20.11.30)(sass@1.72.0)
@ -2034,14 +2034,14 @@ packages:
- supports-color
dev: false
/@melt-ui/pp@0.3.0(@melt-ui/svelte@0.76.0)(svelte@4.2.12):
/@melt-ui/pp@0.3.0(@melt-ui/svelte@0.76.2)(svelte@4.2.12):
resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==}
engines: {pnpm: '>=8.6.3'}
peerDependencies:
'@melt-ui/svelte': '>= 0.29.0'
svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1
dependencies:
'@melt-ui/svelte': 0.76.0(svelte@4.2.12)
'@melt-ui/svelte': 0.76.2(svelte@4.2.12)
estree-walker: 3.0.3
magic-string: 0.30.5
svelte: 4.2.12
@ -2059,6 +2059,21 @@ packages:
focus-trap: 7.5.4
nanoid: 5.0.6
svelte: 4.2.12
dev: false
/@melt-ui/svelte@0.76.2(svelte@4.2.12):
resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==}
peerDependencies:
svelte: '>=3 <5'
dependencies:
'@floating-ui/core': 1.6.0
'@floating-ui/dom': 1.6.3
'@internationalized/date': 3.5.2
dequal: 2.0.3
focus-trap: 7.5.4
nanoid: 5.0.6
svelte: 4.2.12
dev: true
/@napi-rs/wasm-runtime@0.1.2:
resolution: {integrity: sha512-8JuczewTFIZ/XIjHQ+YlQUydHvlKx2hkcxtuGwh+t/t5zWyZct6YG4+xjHcq8xyc/e7FmFwf42Zj2YgICwmlvA==}
@ -3122,7 +3137,7 @@ packages:
'@sentry/types': 7.100.1
'@sentry/utils': 7.100.1
'@sentry/vite-plugin': 0.6.1
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
magicast: 0.2.8
sorcery: 0.11.0
transitivePeerDependencies:
@ -3201,8 +3216,8 @@ packages:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: true
/@sinclair/typebox@0.32.18:
resolution: {integrity: sha512-ioMK5TA5YOloYf/GcnF+1fT4eTvowJes2j7Pm0Ivlm9xq61keqQw/XtbQQnPG8O4uq2y2DDenU8OqNc93xn11Q==}
/@sinclair/typebox@0.32.19:
resolution: {integrity: sha512-AUphm4Py6t+q5b6TU8OA9YRgeGfogsWy2oZvYLRCxt6d+mPkT0Mc4j+BusQYMGJH47DJe3/fKkLtmWPrKP1nzQ==}
requiresBuild: true
optional: true
@ -3216,7 +3231,7 @@ packages:
peerDependencies:
'@sveltejs/kit': ^2.0.0
dependencies:
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
import-meta-resolve: 4.0.0
dev: true
@ -3225,7 +3240,7 @@ packages:
peerDependencies:
'@sveltejs/kit': ^2.4.0
dependencies:
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
'@vercel/nft': 0.26.4
esbuild: 0.19.12
transitivePeerDependencies:
@ -3244,7 +3259,7 @@ packages:
- svelte
dev: true
/@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2):
/@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6):
resolution: {integrity: sha512-eDxK2d4EGzk99QsZNoPXe7jlzA5EGqfcCpUwZ912bhnalsZ2ZsG5wGRthkydupVjYyqdmzEanVKFhLxU2vkPSQ==}
engines: {node: '>=18.13'}
hasBin: true
@ -3254,7 +3269,7 @@ packages:
svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.3
dependencies:
'@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.6)
'@types/cookie': 0.6.0
cookie: 0.6.0
devalue: 4.3.2
@ -3268,9 +3283,9 @@ packages:
sirv: 2.0.4
svelte: 4.2.12
tiny-glob: 0.2.9
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
/@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2):
/@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6):
resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==}
engines: {node: ^18.0.0 || >=20}
peerDependencies:
@ -3278,29 +3293,29 @@ packages:
svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.0
dependencies:
'@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.6)
debug: 4.3.4
svelte: 4.2.12
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
transitivePeerDependencies:
- supports-color
/@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.2):
/@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.6):
resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==}
engines: {node: ^18.0.0 || >=20}
peerDependencies:
svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.0
dependencies:
'@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
debug: 4.3.4
deepmerge: 4.3.1
kleur: 4.1.5
magic-string: 0.30.5
svelte: 4.2.12
svelte-hmr: 0.15.3(svelte@4.2.12)
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vitefu: 0.2.5(vite@5.2.2)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vitefu: 0.2.5(vite@5.2.6)
transitivePeerDependencies:
- supports-color
@ -4279,7 +4294,7 @@ packages:
- supports-color
dev: true
/drizzle-orm@0.30.4(@neondatabase/serverless@0.9.0)(@planetscale/database@1.16.0)(@types/pg@8.11.4)(pg@8.11.3)(postgres@3.4.3):
/drizzle-orm@0.30.4(@neondatabase/serverless@0.9.0)(@planetscale/database@1.16.0)(@types/pg@8.11.4)(pg@8.11.3)(postgres@3.4.4):
resolution: {integrity: sha512-kWoSMGbrOFkmkAweLTFtHJMpN+nwhx89q0mLELqT2aEU+1szNV8jrnBmJwZ0WGNp7J7yQn/ezEtxBI/qzTSElQ==}
peerDependencies:
'@aws-sdk/client-rds-data': '>=3'
@ -4360,7 +4375,7 @@ packages:
'@planetscale/database': 1.16.0
'@types/pg': 8.11.4
pg: 8.11.3
postgres: 3.4.3
postgres: 3.4.4
dev: false
/electron-to-chromium@1.4.677:
@ -4850,7 +4865,7 @@ packages:
is-callable: 1.2.7
dev: false
/formsnap@0.5.1(svelte@4.2.12)(sveltekit-superforms@2.10.6):
/formsnap@0.5.1(svelte@4.2.12)(sveltekit-superforms@2.11.0):
resolution: {integrity: sha512-8ppOlOu7llBEJbV0PzUz/KWh1J8KfiGqwjiyb8emQ2m+/nYXohLBtMcLVpW3XwlMkUbYaIXM+5lhfGjw8xbGJw==}
peerDependencies:
svelte: ^4.0.0
@ -4858,7 +4873,7 @@ packages:
dependencies:
nanoid: 5.0.6
svelte: 4.2.12
sveltekit-superforms: 2.10.6(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12)
sveltekit-superforms: 2.11.0(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12)
dev: false
/fraction.js@4.3.7:
@ -6542,8 +6557,8 @@ packages:
/postgres-range@1.1.4:
resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==}
/postgres@3.4.3:
resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==}
/postgres@3.4.4:
resolution: {integrity: sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==}
engines: {node: '>=12'}
dev: false
@ -7245,7 +7260,7 @@ packages:
'@sveltejs/kit': 1.x || 2.x
svelte: 3.x || 4.x || >=5.0.0-next.51
dependencies:
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
svelte: 4.2.12
dev: true
@ -7255,16 +7270,16 @@ packages:
'@sveltejs/kit': 1.x || 2.x
dependencies:
'@isaacs/ttlcache': 1.4.1
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
dev: true
/sveltekit-superforms@2.10.6(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12):
resolution: {integrity: sha512-Gu3a13rrjLdJ8EgITqrVB7PnH1XprqZa26Y8H1YSplfgR8+Kuu1v+fSz21N3UCGNNN1BozSjLaUfouerD6WRxQ==}
/sveltekit-superforms@2.11.0(@sveltejs/kit@2.5.4)(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(svelte@4.2.12):
resolution: {integrity: sha512-wRAznfYi9sOp4aQd2kb/SIafqHX4LROn5ojIXEbp2Pss9EPy69tmArQFm3JaiBC0hU72bAlUOTFSmVABTF9TEA==}
peerDependencies:
'@sveltejs/kit': 1.x || 2.x
svelte: 3.x || 4.x || >=5.0.0-next.51
dependencies:
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.2)
'@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.6)
devalue: 4.3.2
just-clone: 6.2.0
memoize-weak: 1.0.2
@ -7272,7 +7287,7 @@ packages:
ts-deepmerge: 7.0.0
optionalDependencies:
'@gcornut/valibot-json-schema': 0.0.26(@types/json-schema@7.0.15)(esbuild-runner@2.2.2)(esbuild@0.20.2)(valibot@0.30.0)
'@sinclair/typebox': 0.32.18
'@sinclair/typebox': 0.32.19
'@sodaru/yup-to-json-schema': 2.0.1
'@vinejs/vine': 1.8.0
arktype: 1.0.29-alpha
@ -7281,7 +7296,7 @@ packages:
valibot: 0.30.0
yup: 1.4.0
zod: 3.22.4
zod-to-json-schema: 3.22.4(zod@3.22.4)
zod-to-json-schema: 3.22.5(zod@3.22.4)
transitivePeerDependencies:
- '@types/json-schema'
- esbuild
@ -7632,7 +7647,7 @@ packages:
debug: 4.3.4
pathe: 1.1.2
picocolors: 1.0.0
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
transitivePeerDependencies:
- '@types/node'
- less
@ -7644,8 +7659,8 @@ packages:
- terser
dev: true
/vite@5.2.2(@types/node@20.11.30)(sass@1.72.0):
resolution: {integrity: sha512-FWZbz0oSdLq5snUI0b6sULbz58iXFXdvkZfZWR/F0ZJuKTSPO7v72QPXt6KqYeMFb0yytNp6kZosxJ96Nr/wDQ==}
/vite@5.2.6(@types/node@20.11.30)(sass@1.72.0):
resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@ -7680,7 +7695,7 @@ packages:
optionalDependencies:
fsevents: 2.3.3
/vitefu@0.2.5(vite@5.2.2):
/vitefu@0.2.5(vite@5.2.6):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
@ -7688,7 +7703,7 @@ packages:
vite:
optional: true
dependencies:
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
/vitest@1.4.0(@types/node@20.11.30)(sass@1.72.0):
resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==}
@ -7733,7 +7748,7 @@ packages:
strip-literal: 2.0.0
tinybench: 2.6.0
tinypool: 0.8.2
vite: 5.2.2(@types/node@20.11.30)(sass@1.72.0)
vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
vite-node: 1.4.0(@types/node@20.11.30)(sass@1.72.0)
why-is-node-running: 2.2.2
transitivePeerDependencies:
@ -7849,8 +7864,8 @@ packages:
type-fest: 2.19.0
optional: true
/zod-to-json-schema@3.22.4(zod@3.22.4):
resolution: {integrity: sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ==}
/zod-to-json-schema@3.22.5(zod@3.22.4):
resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==}
peerDependencies:
zod: ^3.22.4
dependencies:

View file

@ -48,6 +48,7 @@ declare module 'lucia' {
interface Register {
Lucia: typeof lucia;
DatabaseUserAttributes: DatabaseUserAttributes;
DatabaseSessionAttributes: DatabaseSessionAttributes;
}
interface DatabaseSessionAttributes {
ip_country: string;
@ -59,5 +60,6 @@ declare module 'lucia' {
firstName: string;
lastName: string;
theme: string;
two_factor_secret: string | null;
}
}

View file

@ -39,6 +39,7 @@ export const load: PageServerLoad = async (event) => {
return {
profileForm,
emailForm,
hasSetupTwoFactor: !!dbUser?.two_factor_secret
};
};

View file

@ -12,6 +12,8 @@
export let data;
const hasSetupTwoFactor = data.hasSetupTwoFactor;
const { form: profileForm, errors: profileErrors, enhance: profileEnhance } = superForm(data.profileForm, {
taintedMessage: null,
validators: zodClient(profileSchema),
@ -90,12 +92,25 @@
{/if}
</div>
</form>
<div class="mt-6">
<Button variant="link" class="text-secondary-foreground" href="/password/change">
<div class="mt-6">
{#if !hasSetupTwoFactor}
<Button variant="link" class="text-secondary-foreground" href="/two-factor/setup">
<KeyRound class="mr-2 h-4 w-4" />
Change Password
Setup 2FA
</Button>
</div>
{:else}
<Button variant="link" class="text-secondary-foreground" href="/two-factor/disable">
<KeyRound class="mr-2 h-4 w-4" />
Disable 2FA
</Button>
{/if}
</div>
<div class="mt-6">
<Button variant="link" class="text-secondary-foreground" href="/password/change">
<KeyRound class="mr-2 h-4 w-4" />
Change Password
</Button>
</div>
<style lang="postcss">
form {

View file

@ -1,17 +1,17 @@
import { fail, error, type Actions } from '@sveltejs/kit';
import { Argon2id } from 'oslo/password';
import { eq } from 'drizzle-orm';
import { zod } from 'sveltekit-superforms/adapters';
import { setError, superValidate } from 'sveltekit-superforms/server';
import { redirect } from 'sveltekit-flash-message/server';
import { RateLimiter } from 'sveltekit-rate-limiter/server';
import type { PageServerLoad } from './$types';
import { lucia } from '$lib/server/auth';
import { signUpSchema } from '$lib/validations/auth';
import { add_user_to_role } from '$server/roles';
import {fail, error, type Actions} from '@sveltejs/kit';
import {Argon2id} from 'oslo/password';
import {eq} from 'drizzle-orm';
import {zod} from 'sveltekit-superforms/adapters';
import {setError, superValidate} from 'sveltekit-superforms/server';
import {redirect} from 'sveltekit-flash-message/server';
import {RateLimiter} from 'sveltekit-rate-limiter/server';
import type {PageServerLoad} from './$types';
import {lucia} from '$lib/server/auth';
import {signUpSchema} from '$lib/validations/auth';
import {add_user_to_role} from '$server/roles';
import db from '$lib/drizzle';
import { collections, users, wishlists } from '../../../schema';
import { createId as cuid2 } from '@paralleldrive/cuid2';
import {collections, users, wishlists} from '../../../schema';
import {createId as cuid2} from '@paralleldrive/cuid2';
const limiter = new RateLimiter({
// A rate is defined by [number, unit]
@ -37,7 +37,7 @@ export const load: PageServerLoad = async (event) => {
// );
if (event.locals.user) {
const message = { type: 'success', message: 'You are already signed in' } as const;
const message = {type: 'success', message: 'You are already signed in'} as const;
throw redirect('/', message, event);
}
@ -81,18 +81,19 @@ export const actions: Actions = {
const hashedPassword = await new Argon2id().hash(form.data.password);
const user = await db
.insert(users)
.values({
username: form.data.username,
hashed_password: hashedPassword,
email: form.data.email,
first_name: form.data.firstName || '',
last_name: form.data.lastName || '',
verified: false,
receive_email: false,
theme: 'system'
})
.returning();
.insert(users)
.values({
username: form.data.username,
hashed_password: hashedPassword,
email: form.data.email,
first_name: form.data.firstName ?? '',
last_name: form.data.lastName ?? '',
verified: false,
receive_email: false,
theme: 'system',
two_factor_secret: null
})
.returning();
console.log('signup user', user);
if (!user || user.length === 0) {

View file

@ -28,6 +28,7 @@ export const users = pgTable('users', {
verified: boolean('verified').default(false),
receive_email: boolean('receive_email').default(false),
theme: text('theme').default('system'),
two_factor_secret: text('two_factor_secret'),
created_at: timestamp('created_at').notNull().defaultNow(),
updated_at: timestamp('updated_at').notNull().defaultNow()
});