From 1041597f970f03167747b97285b798c60d00cee5 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 11 Dec 2024 11:37:15 +0100 Subject: [PATCH] bugfixing --- src/hooks.server.ts | 10 +- src/lib/components/LoginPopup.svelte | 4 +- src/routes/+layout.server.ts | 1 - src/routes/login/+page.server.ts | 8 +- src/routes/oauth/+server.ts | 10 +- src/routes/pricing/+page.server.ts | 6 +- src/routes/register/+page.server.ts | 10 +- src/routes/stocks/[tickerID]/+page.server.ts | 4 +- .../stocks/[tickerID]/options/+page.server.ts | 157 ++++++++++++++++++ .../[tickerID]/statistics/+page.server.ts | 21 ++- 10 files changed, 195 insertions(+), 36 deletions(-) diff --git a/src/hooks.server.ts b/src/hooks.server.ts index cd9b61c2..7b6a7643 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -4,7 +4,6 @@ import { serializeNonPOJOs } from "$lib/utils"; export const handle = sequence(async ({ event, resolve }) => { - // Use a ternary operator instead of the logical OR for better compatibility const pbURL = import.meta.env.VITE_USEAST_POCKETBASE_URL; //isUS ? import.meta.env.VITE_USEAST_POCKETBASE_URL : import.meta.env.VITE_EU_POCKETBASE_URL; const apiURL = import.meta.env.VITE_USEAST_API_URL; //isUS ? import.meta.env.VITE_USEAST_API_URL : import.meta.env.VITE_EU_API_URL; @@ -20,12 +19,13 @@ export const handle = sequence(async ({ event, resolve }) => { }; const authCookie = event?.request?.headers?.get("cookie") || ""; - event.locals.pb.authStore.loadFromCookie(authCookie); + + event.locals.pb.authStore?.loadFromCookie(authCookie); if (event?.locals?.pb?.authStore?.isValid) { try { - await event.locals.pb.collection("users").authRefresh(); - event.locals.user = serializeNonPOJOs(event.locals.pb.authStore.model); + await event?.locals?.pb?.collection("users")?.authRefresh(); + event.locals.user = serializeNonPOJOs(event?.locals?.pb?.authStore?.model); } catch (e) { event.locals.pb.authStore.clear(); event.locals.user = undefined; @@ -36,7 +36,7 @@ export const handle = sequence(async ({ event, resolve }) => { const response = await resolve(event); // Use a more compatible way to set the cookie - const cookieString = event.locals.pb.authStore.exportToCookie({ + const cookieString = event?.locals?.pb?.authStore?.exportToCookie({ httpOnly: true, path: "/", sameSite: "lax", diff --git a/src/lib/components/LoginPopup.svelte b/src/lib/components/LoginPopup.svelte index 76d61252..df3c566f 100644 --- a/src/lib/components/LoginPopup.svelte +++ b/src/lib/components/LoginPopup.svelte @@ -41,10 +41,10 @@ setTimeout(() => { if ( ["redirect", "success"]?.includes(result.type) && - $page?.url?.pathname === "/pricing" + $page?.url?.pathname ) { const anchor = document.createElement("a"); - anchor.href = "/pricing"; + anchor.href = $page?.url?.pathname; anchor.dataset.sveltekitReload = true; document.body.appendChild(anchor); anchor.dispatchEvent(new MouseEvent("click")); diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts index 549d8a38..6bee57ab 100644 --- a/src/routes/+layout.server.ts +++ b/src/routes/+layout.server.ts @@ -1,6 +1,5 @@ export const load = ({ locals, cookies }) => { const { user, isUSRegion, wsURL } = locals; - return { user: user || undefined, isUSRegion, diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts index 1bbcbc2d..15f6f068 100644 --- a/src/routes/login/+page.server.ts +++ b/src/routes/login/+page.server.ts @@ -57,9 +57,7 @@ export const actions = { const targetItem = authMethods?.providers?.findIndex( (item) => item?.name === providerSelected, ); - //console.log("==================") - //console.log(authMethods.authProviders) - //console.log('target item is: ', targetItem) + const provider = authMethods.providers[targetItem]; const authProviderRedirect = `${provider.authUrl}${redirectURL}`; @@ -92,7 +90,7 @@ export const actions = { maxAge: 60 * 60, }); - cookies.set("path", "/", { + cookies.set("path", "/profile", { httpOnly: true, sameSite: "lax", secure: true, @@ -100,7 +98,7 @@ export const actions = { maxAge: 60, }); - redirect(303, authProviderRedirect); + redirect(301, authProviderRedirect); }, }; diff --git a/src/routes/oauth/+server.ts b/src/routes/oauth/+server.ts index 44c5d3fb..f266a25f 100644 --- a/src/routes/oauth/+server.ts +++ b/src/routes/oauth/+server.ts @@ -1,14 +1,11 @@ import { redirect } from "@sveltejs/kit"; -import { serializeNonPOJOs } from "$lib/utils"; export const GET = async ({ locals, url, cookies }) => { //console.log(url.searchParams); const redirectURL = `${url.origin}/oauth`; - //const expectedState = cookies.get('state'); - //const expectedVerifier = cookies.get('verifier'); - let newUser; + let expectedState = cookies?.get("state"); let expectedVerifier = cookies?.get("verifier"); @@ -17,8 +14,6 @@ export const GET = async ({ locals, url, cookies }) => { const state = await url.searchParams.get("state"); const code = await url.searchParams.get("code"); - //console.log('returned state',state) - //console.log('returned code',code) //as a side effect this will generate a new code verifier, hence why we need to pass the verifier back in through the cookie const authMethods = (await locals.pb?.collection("users")?.listAuthMethods())?.oauth2; @@ -69,10 +64,11 @@ export const GET = async ({ locals, url, cookies }) => { redirect(302, "/register"); } + console.log(cookies?.get("path")) if (cookies?.get("path")) { redirect(301, cookies?.get("path")); } else { - redirect(303, "/"); + redirect(302, "/"); } diff --git a/src/routes/pricing/+page.server.ts b/src/routes/pricing/+page.server.ts index f470eb71..0967b570 100644 --- a/src/routes/pricing/+page.server.ts +++ b/src/routes/pricing/+page.server.ts @@ -104,7 +104,9 @@ await locals.pb?.collection('users').update( redirect(302, "/pricing"); }, - oauth2: async ({ url, locals, request, cookies }) => { + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") const authMethods = (await locals?.pb ?.collection("users") ?.listAuthMethods())?.oauth2; @@ -159,7 +161,7 @@ await locals.pb?.collection('users').update( maxAge: 60 * 60, }); - cookies.set("path", "/", { + cookies.set("path", path, { httpOnly: true, sameSite: "lax", secure: true, diff --git a/src/routes/register/+page.server.ts b/src/routes/register/+page.server.ts index 0df7233f..d9ca0388 100644 --- a/src/routes/register/+page.server.ts +++ b/src/routes/register/+page.server.ts @@ -71,7 +71,7 @@ export const actions = { redirect(301, "/"); }, - oauth2: async ({ url, locals, request, cookies }) => { + oauth2: async ({ url, locals, request, cookies }) => { const authMethods = (await locals?.pb ?.collection("users") ?.listAuthMethods())?.oauth2; @@ -91,9 +91,7 @@ export const actions = { const targetItem = authMethods?.providers?.findIndex( (item) => item?.name === providerSelected, ); - //console.log("==================") - //console.log(authMethods.authProviders) - //console.log('target item is: ', targetItem) + const provider = authMethods.providers[targetItem]; const authProviderRedirect = `${provider.authUrl}${redirectURL}`; @@ -126,7 +124,7 @@ export const actions = { maxAge: 60 * 60, }); - cookies.set("path", "/", { + cookies.set("path", "/profile", { httpOnly: true, sameSite: "lax", secure: true, @@ -134,6 +132,6 @@ export const actions = { maxAge: 60, }); - redirect(303, authProviderRedirect); + redirect(301, authProviderRedirect); }, }; diff --git a/src/routes/stocks/[tickerID]/+page.server.ts b/src/routes/stocks/[tickerID]/+page.server.ts index 4ffe2c60..4c01ee19 100644 --- a/src/routes/stocks/[tickerID]/+page.server.ts +++ b/src/routes/stocks/[tickerID]/+page.server.ts @@ -79,6 +79,8 @@ await locals.pb?.collection('users').update( }, oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") const authMethods = (await locals?.pb ?.collection("users") ?.listAuthMethods())?.oauth2; @@ -133,7 +135,7 @@ await locals.pb?.collection('users').update( maxAge: 60 * 60, }); - cookies.set("path", "/", { + cookies.set("path", path, { httpOnly: true, sameSite: "lax", secure: true, diff --git a/src/routes/stocks/[tickerID]/options/+page.server.ts b/src/routes/stocks/[tickerID]/options/+page.server.ts index 7f9a0bab..f61ca789 100644 --- a/src/routes/stocks/[tickerID]/options/+page.server.ts +++ b/src/routes/stocks/[tickerID]/options/+page.server.ts @@ -1,3 +1,8 @@ +import { error, fail, redirect } from "@sveltejs/kit"; +import { validateData } from "$lib/utils"; +import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + export const load = async ({ locals, params }) => { const { apiKey, apiURL } = locals; @@ -108,3 +113,155 @@ export const load = async ({ locals, params }) => { getOptionsGexData: await getOptionsGexData(), }; }; + + + +export const actions = { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + + const { formData, errors } = await validateData( + await request.formData(), + loginUserSchema, + ); + + if (errors) { + return fail(400, { + data: formData, + errors: errors.fieldErrors, + }); + } + + try { + await locals.pb + .collection("users") + .authWithPassword(formData.email, formData.password); + + /* + if (!locals.pb?.authStore?.model?.verified) { + locals.pb.authStore.clear(); + return { + notVerified: true, + }; + } + */ + } catch (err) { + console.log("Error: ", err); + error(err.status, err.message); + } + + redirect(302, path); + }, + + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + + const { formData, errors } = await validateData( + await request.formData(), + registerUserSchema, + ); + + if (errors) { + return fail(400, { + data: formData, + errors: errors.fieldErrors, + }); + } + + try { + let newUser = await locals.pb.collection("users").create(formData); + /* +await locals.pb?.collection('users').update( + newUser?.id, { + 'freeTrial' : true, + 'tier': 'Pro', //Give new users a free trial for the Pro Subscription + }); +*/ + await locals.pb.collection("users")?.requestVerification(formData.email); + } catch (err) { + console.log("Error: ", err); + error(err.status, err.message); + } + + try { + await locals.pb + .collection("users") + .authWithPassword(formData.email, formData.password); + } catch (err) { + console.log("Error: ", err); + error(err.status, err.message); + } + + redirect(303, path); + }, + + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") + const authMethods = (await locals?.pb + ?.collection("users") + ?.listAuthMethods())?.oauth2; + + + const data = await request?.formData(); + const providerSelected = data?.get("provider"); + + if (!authMethods) { + return { + authProviderRedirect: "", + authProviderState: "", + }; + } + const redirectURL = `${url.origin}/oauth`; + + const targetItem = authMethods?.providers?.findIndex( + (item) => item?.name === providerSelected, + ); + //console.log("==================") + //console.log(authMethods.authProviders) + //console.log('target item is: ', targetItem) + + const provider = authMethods.providers[targetItem]; + const authProviderRedirect = `${provider.authUrl}${redirectURL}`; + const state = provider.state; + const verifier = provider.codeVerifier; + + + + cookies.set("state", state, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60 * 60, + }); + + cookies.set("verifier", verifier, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60 * 60, + }); + + cookies.set("provider", providerSelected, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60 * 60, + }); + + cookies.set("path", path, { + httpOnly: true, + sameSite: "lax", + secure: true, + path: "/", + maxAge: 60, + }); + + redirect(302, authProviderRedirect); + }, + +}; diff --git a/src/routes/stocks/[tickerID]/statistics/+page.server.ts b/src/routes/stocks/[tickerID]/statistics/+page.server.ts index a77cb388..3a7677f6 100644 --- a/src/routes/stocks/[tickerID]/statistics/+page.server.ts +++ b/src/routes/stocks/[tickerID]/statistics/+page.server.ts @@ -32,7 +32,10 @@ export const load = async ({ locals, params }) => { }; export const actions = { - login: async ({ request, locals }) => { + login: async ({ url, request, locals }) => { + + const path = url?.href?.replace("/oauth2","") + const { formData, errors } = await validateData( await request.formData(), loginUserSchema, @@ -63,10 +66,12 @@ export const actions = { error(err.status, err.message); } - redirect(302, "/"); + redirect(301, path); }, - register: async ({ locals, request }) => { + register: async ({ url, locals, request }) => { + const path = url?.href?.replace("/oauth2","") + const { formData, errors } = await validateData( await request.formData(), registerUserSchema, @@ -88,7 +93,7 @@ await locals.pb?.collection('users').update( 'tier': 'Pro', //Give new users a free trial for the Pro Subscription }); */ - await locals.pb.collection("users").requestVerification(formData.email); + await locals.pb.collection("users")?.requestVerification(formData.email); } catch (err) { console.log("Error: ", err); error(err.status, err.message); @@ -103,10 +108,12 @@ await locals.pb?.collection('users').update( error(err.status, err.message); } - redirect(303, "/"); + redirect(301, path); }, - oauth2: async ({ url, locals, request, cookies }) => { + oauth2: async ({ url, locals, request, cookies }) => { + + const path = url?.href?.replace("/oauth2","") const authMethods = (await locals?.pb ?.collection("users") ?.listAuthMethods())?.oauth2; @@ -161,7 +168,7 @@ await locals.pb?.collection('users').update( maxAge: 60 * 60, }); - cookies.set("path", "/", { + cookies.set("path", path, { httpOnly: true, sameSite: "lax", secure: true,