diff --git a/src/app/lib/actions/actions.ts b/src/app/lib/actions/actions.ts index 649b66e..e788bac 100644 --- a/src/app/lib/actions/actions.ts +++ b/src/app/lib/actions/actions.ts @@ -1,129 +1,150 @@ -'use server' - +"use server"; + import { constructAPIUrl } from "@/util/url"; -import { cookies } from "next/headers" -import { parseSetCookie } from "@/util/parseSetCookie"; -import makeFetchCookie from 'fetch-cookie'; -import fetchCookie from "fetch-cookie"; -import { Attribute, Attributes } from "@sequelize/core"; -import { User, Auth } from "@/models"; +import { cookies } from "next/headers"; +import { parseSetCookie } from "@/util/cookies"; +import makeFetchCookie from "fetch-cookie"; +import fetchCookie from "fetch-cookie"; +import { User, Auth } from "@/models"; import { AuthProps } from "@/providers/providers"; -import { ActionResult } from "./ActionResult"; type LoginReturn = { - cookie?:unknown, - errorMessage?:string; + cookie?: unknown; + errorMessage?: string; +}; + +async function attemptAPILogin( + method: string, + formData: FormData +): Promise { + // Check if form data is present with required fields, return null if not + if ( + !formData || + !formData.get("input_username") || + !formData.get("input_password") + ) + return null; + + // Instantiate header object + let headers: Headers = new Headers(); + + // Prepare fetchCookie + const { CookieJar, Cookie } = fetchCookie.toughCookie; + const jar = new CookieJar(); + const fetchWithCookie = makeFetchCookie(fetch, jar); + + // Set Basic Auth + headers.set( + "Authorization", + `Basic ${Buffer.from( + `${formData.get("input_username")}:${formData.get( + "input_password" + )}` + ).toString("base64")}` + ); + let res = await fetchWithCookie(constructAPIUrl("auth"), { + method: "POST", + credentials: "include", + headers: headers, + }); + + console.log(jar.store.idx["localhost"]["/"]); + + let koek = res.headers.getSetCookie(); + + let cookieDict = parseSetCookie(koek); + + await cookies().set("auth", cookieDict.auth); + return { + cookie: cookieDict.auth, + errorMessage: "", + }; + // console.log(koek); } -async function attemptAPILogin(method:string,formData:FormData):Promise -{ - // Check if form data is present with required fields, return null if not - if(!formData || !formData.get('input_username') || !formData.get('input_password')) return null; - - // Instantiate header object - let headers:Headers = new Headers(); - - // Prepare fetchCookie - const { CookieJar, Cookie } = fetchCookie.toughCookie; - const jar = new CookieJar() - const fetchWithCookie = makeFetchCookie(fetch, jar); - - // Set Basic Auth - headers.set('Authorization', `Basic ${Buffer.from(`${formData.get('input_username')}:${formData.get('input_password')}`).toString('base64')}`); - let res = await fetchWithCookie(constructAPIUrl("auth"), { - method:'POST', - credentials: 'include', - headers:headers, - }); - - console.log(jar.store.idx['localhost']['/']); - - let koek = res.headers.getSetCookie(); - - let cookieDict = parseSetCookie(koek); - - await cookies().set('auth', cookieDict.auth); - return { - cookie:cookieDict.auth, - errorMessage:"" - }; - // console.log(koek); +export async function serverAttemptAuthenticateUser( + _currentState: unknown, + formData: FormData +): Promise { + try { + const signInStatus = await attemptAPILogin("credentials", formData); + return signInStatus; + } catch (error: any) { + if (error) { + switch (error.type) { + case "CredentialsSignin": + return { errorMessage: "invalidCredentials" }; + default: + return { errorMessage: "Something went wrong." }; + } + } + throw Error; + } } -export async function serverAttemptAuthenticateUser(_currentState: unknown, formData: FormData):Promise -{ - try { - const signInStatus = await attemptAPILogin('credentials', formData) - return signInStatus; - } catch (error:any) { - if (error) { - switch (error.type) { - case 'CredentialsSignin': return { errorMessage: 'invalidCredentials' }; - default: return { errorMessage: 'Something went wrong.' }; - } - } - throw Error - } +export async function serverValidateSessionCookie( + koek: string +): Promise { + const validateSession = await fetch(constructAPIUrl("auth/validate"), { + method: "POST", + headers: { + Cookie: `auth=${koek};`, + }, + }); + if (validateSession.status == 200) return true; + else return false; } -export async function serverValidateSessionCookie(koek:string):Promise -{ - const validateSession = await fetch(constructAPIUrl("auth/validate"),{ - method:"POST", - headers:{ - Cookie: `auth=${koek};` - } - }); - if(validateSession.status == 200) - return true - else - return false +export async function userIsAdmin(): Promise { + const cookieAuthValue = await cookies().get("auth")?.value; + const cookieAuthSanitized = cookieAuthValue + ? JSON.parse(JSON.stringify(cookieAuthValue)) + : ""; + + if (!cookieAuthSanitized) return false; + const parsedAuth = JSON.parse(cookieAuthSanitized); + + if (!parsedAuth.id || !parsedAuth.token || !parsedAuth.user_id) + return false; + + const p: AuthProps = { + auth: { + id: parsedAuth.id, + token: parsedAuth.token, + user_id: parsedAuth.user_id, + }, + }; + + const foundAuth = await Auth.findOne({ where: { id: p.auth?.id } }); + if (!foundAuth || foundAuth.token != p.auth?.token) return false; + + return true; } -export async function userIsAdmin():Promise -{ - const cookieAuthValue = await cookies().get('auth')?.value; - const cookieAuthSanitized = cookieAuthValue? JSON.parse(JSON.stringify(cookieAuthValue)) : ""; +export async function getCookieAuth(): Promise { + const cookieAuthValue = await cookies().get("auth")?.value; + const cookieAuthSanitized = cookieAuthValue + ? JSON.parse(JSON.stringify(cookieAuthValue)) + : ""; + console.log("kanker koek"); - if(!cookieAuthSanitized) return false; - const parsedAuth = JSON.parse(cookieAuthSanitized); - - if(!parsedAuth.id || !parsedAuth.token || !parsedAuth.user_id) return false - - const p:AuthProps = { - auth: { - id:parsedAuth.id, - token:parsedAuth.token, - user_id:parsedAuth.user_id - } - }; - - const foundAuth = await Auth.findOne({where: { id: p.auth?.id}}); - if(!foundAuth || foundAuth.token != p.auth?.token ) return false; + if (!cookieAuthSanitized) return {}; - return true; -} - -export async function getCookieAuth():Promise -{ - const cookieAuthValue = await cookies().get('auth')?.value; - const cookieAuthSanitized = cookieAuthValue? JSON.parse(JSON.stringify(cookieAuthValue)) : ""; - console.log("kanker koek") - - if(!cookieAuthSanitized) return {} - - const kd = JSON.parse(cookieAuthSanitized); - if(!kd.id || !kd.token || !kd.user_id) return {}; - - const foundAuth = await Auth.findOne({where: { id: kd.id},include:{model:User}}); - if(!foundAuth) return {}; - const authObject:AuthProps = { - auth: { - id:kd.id, - token:kd.token, - user_id:kd.user_id - }, - user: await foundAuth.user - } - return authObject; + const kd = JSON.parse(cookieAuthSanitized); + if (!kd.id || !kd.token || !kd.user_id) return {}; + + const foundAuth = await Auth.findOne({ + where: { id: kd.id }, + include: { model: User }, + }); + if (!foundAuth) return {}; + const authObject: AuthProps = { + auth: { + id: kd.id, + token: kd.token, + user_id: kd.user_id, + }, + user: await foundAuth.user, + }; + return authObject; } diff --git a/src/components/shared/news/article-preview.tsx b/src/components/shared/news/article-preview.tsx index 5e59082..a99e97a 100644 --- a/src/components/shared/news/article-preview.tsx +++ b/src/components/shared/news/article-preview.tsx @@ -8,7 +8,7 @@ import Link from "next/link"; import { redirect } from 'next/navigation'; import { Router } from "next/router"; import { useRouter } from 'next/navigation' -import { truncateString } from "@/util/utils"; +import { truncateString } from "@/util/strings"; // @ts-ignore import { MDXRemote } from "next-mdx-remote/rsc"; import { ExampleComponent } from "./article"; diff --git a/src/util/aifa.ts b/src/util/aifa.ts new file mode 100644 index 0000000..0104e5c --- /dev/null +++ b/src/util/aifa.ts @@ -0,0 +1,3 @@ +import { ReactNode } from "react"; + +export const aifa = (a: ReactNode, b: ReactNode) => (a ? a : b); \ No newline at end of file diff --git a/src/util/getAPIEnv.ts b/src/util/api/getAPIEnv.ts similarity index 100% rename from src/util/getAPIEnv.ts rename to src/util/api/getAPIEnv.ts diff --git a/src/util/api/index.ts b/src/util/api/index.ts index d1f5898..26fde1e 100644 --- a/src/util/api/index.ts +++ b/src/util/api/index.ts @@ -1,2 +1,3 @@ export * from './error'; +export * from './getAPIEnv'; export * from './user'; diff --git a/src/util/cookies/index.ts b/src/util/cookies/index.ts new file mode 100644 index 0000000..13d986b --- /dev/null +++ b/src/util/cookies/index.ts @@ -0,0 +1,2 @@ +export * from './Cookies'; +export * from './parseSetCookie'; diff --git a/src/util/parseSetCookie.ts b/src/util/cookies/parseSetCookie.ts similarity index 100% rename from src/util/parseSetCookie.ts rename to src/util/cookies/parseSetCookie.ts diff --git a/src/util/gens.ts b/src/util/gens.ts deleted file mode 100644 index b1a03f7..0000000 --- a/src/util/gens.ts +++ /dev/null @@ -1,10 +0,0 @@ - -class Gens{ - - public static loremipsum():String - { - return 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer egestas eros a imperdiet ultrices. Maecenas tincidunt tristique dolor, vitae dignissim ligula faucibus sit amet. Ut hendrerit elit eu elit molestie, vel consectetur leo accumsan. Phasellus ex mi, dignissim at aliquam at, rutrum eget mi. Curabitur pellentesque auctor nulla sed pulvinar. Maecenas scelerisque orci at sem finibus tincidunt. Mauris viverra pulvinar nibh. Etiam ornare purus leo, at cursus elit ornare nec. Suspendisse potenti. Sed nisl libero, sollicitudin vitae dignissim sit amet, laoreet sit amet odio. Duis rhoncus felis ut erat facilisis, vitae rutrum odio sollicitudin. Praesent et scelerisque eros. Praesent laoreet eu orci ut blandit. Morbi dapibus nibh urna, eget blandit quam aliquet vitae. Nulla quam metus, volutpat et vulputate vel, viverra sed diam.' - } - -} -export default Gens; \ No newline at end of file diff --git a/src/util/index.ts b/src/util/index.ts index 9f0f006..3eaa49b 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -1,10 +1,6 @@ -export * from './api'; -export * from './auth'; -export * from './Cookies'; export * from './DeepPartial'; -export * from './gens'; -export * from './getAPIEnv'; -export * from './parseSetCookie'; +export * from './aifa'; +export * from './auth'; +export * from './cookies'; export * from './state'; -export * from './url'; -export * from './utils'; +export * from './strings'; diff --git a/src/util/strings/index.ts b/src/util/strings/index.ts new file mode 100644 index 0000000..528ff61 --- /dev/null +++ b/src/util/strings/index.ts @@ -0,0 +1 @@ +export * from './loremipsum'; diff --git a/src/util/strings/loremipsum.ts b/src/util/strings/loremipsum.ts new file mode 100644 index 0000000..8f31208 --- /dev/null +++ b/src/util/strings/loremipsum.ts @@ -0,0 +1,6 @@ + +export function loremipsum():String +{ + return 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer egestas eros a imperdiet ultrices. Maecenas tincidunt tristique dolor, vitae dignissim ligula faucibus sit amet. Ut hendrerit elit eu elit molestie, vel consectetur leo accumsan. Phasellus ex mi, dignissim at aliquam at, rutrum eget mi. Curabitur pellentesque auctor nulla sed pulvinar. Maecenas scelerisque orci at sem finibus tincidunt. Mauris viverra pulvinar nibh. Etiam ornare purus leo, at cursus elit ornare nec. Suspendisse potenti. Sed nisl libero, sollicitudin vitae dignissim sit amet, laoreet sit amet odio. Duis rhoncus felis ut erat facilisis, vitae rutrum odio sollicitudin. Praesent et scelerisque eros. Praesent laoreet eu orci ut blandit. Morbi dapibus nibh urna, eget blandit quam aliquet vitae. Nulla quam metus, volutpat et vulputate vel, viverra sed diam.' +} + diff --git a/src/util/strings/truncateString.ts b/src/util/strings/truncateString.ts new file mode 100644 index 0000000..c741544 --- /dev/null +++ b/src/util/strings/truncateString.ts @@ -0,0 +1,7 @@ +export function truncateString(str:string = '', num:number = 255) { + if (str.length > num) { + return str.slice(0, num) + "..."; + } else { + return str; + } +} \ No newline at end of file diff --git a/src/util/url/urlConstructor.ts b/src/util/url/urlConstructor.ts index ce1ddb4..8527298 100644 --- a/src/util/url/urlConstructor.ts +++ b/src/util/url/urlConstructor.ts @@ -1,6 +1,6 @@ 'use server' -import { getAPIEnv } from "../getAPIEnv"; +import { getAPIEnv } from "../api/getAPIEnv"; export function constructAPIUrl(endpoint:string){ const { schema, host, port, basepath } = getAPIEnv(); diff --git a/src/util/utils.ts b/src/util/utils.ts deleted file mode 100644 index c60ebce..0000000 --- a/src/util/utils.ts +++ /dev/null @@ -1,14 +0,0 @@ -'server only' -import { ReactNode } from "react"; -import Gens from "./gens"; -function truncateString(str:string = '', num:number = 255) { - if (str.length > num) { - return str.slice(0, num) + "..."; - } else { - return str; - } -} - - -export { Gens, truncateString } -export const aifa = (a: ReactNode, b: ReactNode) => (a ? a : b);