From c2f36e97234a77741daa24e8a5a6472315b63cee Mon Sep 17 00:00:00 2001 From: C4illin Date: Sat, 18 May 2024 00:16:08 +0200 Subject: [PATCH] login working --- README.md | 15 --- bun.lockb | Bin 15742 -> 18952 bytes package.json | 13 ++- src/index.ts | 155 ++++++++++++++++++++++++++++- src/pages/index.html | 49 +++++---- src/pages/login.html | 40 ++++++++ src/pages/register.html | 36 +++++++ src/public/{index.js => script.js} | 21 +++- 8 files changed, 278 insertions(+), 51 deletions(-) delete mode 100644 README.md create mode 100644 src/pages/login.html create mode 100644 src/pages/register.html rename src/public/{index.js => script.js} (68%) diff --git a/README.md b/README.md deleted file mode 100644 index 688c87e..0000000 --- a/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Elysia with Bun runtime - -## Getting Started -To get started with this template, simply paste this command into your terminal: -```bash -bun create elysia ./elysia-example -``` - -## Development -To start the development server run: -```bash -bun run dev -``` - -Open http://localhost:3000/ with your browser to see the result. \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 501b456b8636c0ea43bac9badc697ad1db853932..268fe520b511a23411899a3f0c9f6178c3430199 100644 GIT binary patch delta 5113 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 UPh1`xfxqY&xrV_*NMPl^0A=mVvj6}9 delta 3204 zcmdT`eNa@_6@TyTF1rs{7Gz;}Sz!4RSao;Vg=Lqo1sk=PRWY3=Yqo$cAB81+x~qIN z1DKK2*3uD`l>x;%Gzs?Fd3`ik|ZWi=o4j$B;%X?@L} zqt1BMDc{V;rHnwv5szU&W(Fd=TPcU z9uK$IcXT}AZ)BKP5YzbFu-=Cp!$cykZ|!KuZYBvi2JxhXVG>btEcRF9&lomDlVTtc z?Cor1dVO1)0;p`4h1z?q&US>1F^ts_p^3d=xq$5&9RGKeQ7E-2$q*iVtVU;6Fbt2V z3nld)MM>`PFv4morm>5RYW4+8-);3Z;W$D2DYTqMb)%$F_fV3Jo3DTLkEe(Fj%}_o zWM#a0aW}+r6|uQ>af%!FIv;2zgKdqa=NF)dJCpXkTTSomT5>bvxwrTAKHKuHf5hS) z&VH?|i0>#pedCew8Q3GKj9ZP%72vdJu|RSdk>tR6iGu58U{>a0qd_MvXRF|G{QeBa zq~-iw+_rDf5I7)pu=${qm9tIoIDQYqm<;=I+cCh{?~^)s6Yi}I5l2Y28BsCpmz8ku zNx&<2u`6IqUd}g58ODi95@E;$qCx?sOC8)rDR>nwb|s7{%DJaxFspEJugV~ack!vX z|FlvBS;9Ajkzf}$5dpKP@+mgDP(=aryn`>0Gt9$?I5?niaQ$)^k96^;u<^^qzd%Ix zDug*57^`ALavIJ(seth)7yo-~qz%AXa0B8&7cFd1bUD8RBSwRzhuLTsFT=>u z{8E}jR)(k;YNRFH?nv;eTye*#0lU?>{}^Z{buj|6C>W0^gb9gsErmx65lJ+XPJ=)s zF(h=R1o|q;L0g<=0E589BhyS;VN6J3;Dk#;O>|jkm2?6~|0!vF7Ba266q)F2$Rvg) z$VDc(9GNCsK@!?xH3MXZCES{al87X=zxFP{ zl_i}O6USE9H>X_s;fuqkZAG15RBw6q^^vKDg~8VCe;B>=(C9z6p6K_Uxm@M3Y})(& zT*_I^JFosx(bv#%Waa0}j~HvZCt)~V3(7<{D}k|i4^*m^un_NNWw2K5fzJ?4soks` z?jbsqpoE$PH_OA}1P^RVd;@-`akEN@(|X|78YOJgx>*&RMAWQR!cv`^je{e@TkGfX2JmjdSp<7EX}=MJkNBP zqz8|@E&seO;;)m?U4Fs)%*@C(&A*z=-@4hE(N%8x_|$h4LlJlS{`{BGOY3qDy&<1J zbNBh}`)h+ojWLI>E}cx?ZiL$gEu>_+*XPi5VUh*|#ZAde$FF-@je>MWzu5{!KWXcbebT%!+4^r-O(cT1#6=gxP zf$S#x6)v)_6Vn3Z6}96_EO<%%WF1*a)?&FKctc(-K_(B$ zEAkFYiA7IEZ^E8i7TqEjGm*&y@=ElMBCv^4Aksu0{4_t?E>-~I`>o(weZj^+Fk}hU z3RT(X{Q9+NH#oM|YR)rbPRxaxf@N8YisC^Kiv*5*73dWhDahB0mD7tqxZRlT%l#%! zWXFjx#^>N_fsVZf3wB+ySa+$eKJ&iy$6LB-Ih)yP&Sy9l%yumsQvMKp_I!A_FezEA zqwZ+my?1NP?SnWVKV;ve1b$gK_+JXKq+q3WamI}f8;5#39qTY$aB3S4#Gzu*b*sVq=#|nFtFXt3i{gW^AcJQonNv&526Ea*_dZnhPg3z$3fTq1Q^M@uRw8z9Z#ZKlKXtHjAE(@=}` zEMmM4gYokbA9;sAdjSgsSzHfTcOu*7_w11bsn&eVxDE5;~OTmH_N1( Bun.file("src/pages/index.html")) + .get("/register", async () => { + return Bun.file("src/pages/register.html"); + }) + .post( + "/register", + async function handler({ body, set, jwt, cookie: { auth } }) { + const existingUser = await db + .query("SELECT * FROM users WHERE email = ?") + .get(body.email); + if (existingUser) { + set.status = 400; + return { + message: "Email already in use.", + }; + } + const savedPassword = await Bun.password.hash(body.password); + + db.run( + "INSERT INTO users (email, password) VALUES (?, ?)", + body.email, + savedPassword, + ); + + const user = await db + .query("SELECT * FROM users WHERE email = ?") + .get(body.email); + + const accessToken = await jwt.sign({ + id: String(user.id), + }); + + // set cookie + auth.set({ + value: accessToken, + httpOnly: true, + secure: true, + maxAge: 60 * 60 * 24 * 7, + sameSite: "strict", + }); + + // redirect to home + set.status = 302; + set.headers = { + Location: "/", + }; + }, + ) + .get("/login", async () => { + return Bun.file("src/pages/login.html"); + }) + .post("/login", async function handler({ body, set, jwt, cookie: { auth } }) { + const existingUser = await db + .query("SELECT * FROM users WHERE email = ?") + .get(body.email); + + if (!existingUser) { + set.status = 403; + return { + message: "Invalid credentials.", + }; + } + + const validPassword = await Bun.password.verify( + body.password, + existingUser.password, + ); + + if (!validPassword) { + set.status = 403; + return { + message: "Invalid credentials.", + }; + } + + const accessToken = await jwt.sign({ + id: String(existingUser.id), + }); + + // set cookie + // set cookie + auth.set({ + value: accessToken, + httpOnly: true, + secure: true, + maxAge: 60 * 60 * 24 * 7, + sameSite: "strict", + }); + + // redirect to home + set.status = 302; + set.headers = { + Location: "/", + }; + }) + .post("/logout", async ({ set, cookie: { auth } }) => { + auth.remove(); + set.status = 302; + set.headers = { + Location: "/login", + }; + }) + .get("/", async ({ jwt, set, cookie: { auth } }) => { + // validate jwt + const user = await jwt.verify(auth.value); + if (!user) { + // redirect to login + set.status = 302; + set.headers = { + Location: "/login", + }; + return; + } + return Bun.file("src/pages/index.html"); + }) .post("/upload", async (ctx) => { console.log(ctx.body); if (ctx.body?.file) { await Bun.write(`${uploadsDir}${ctx.body.file.name}`, ctx.body.file); } else if (ctx.body?.files) { if (Array.isArray(ctx.body.files)) { - console.log("Found array of files"); for (const file of ctx.body.files) { console.log(file); await Bun.write(`${uploadsDir}${file.name}`, file); @@ -32,6 +176,9 @@ const app = new Elysia() } } }) + .post("/delete/:file", async (ctx) => { + await unlink(`${uploadsDir}${ctx.params.file}`); + }) .listen(3000); console.log( diff --git a/src/pages/index.html b/src/pages/index.html index de49eb3..d00bac6 100644 --- a/src/pages/index.html +++ b/src/pages/index.html @@ -7,14 +7,14 @@ ConvertX - +