From 0777a722167e54db8aabb5ecc5059314842e0138 Mon Sep 17 00:00:00 2001 From: not-nullptr Date: Wed, 13 Mar 2024 00:17:26 +0000 Subject: [PATCH] temp: delete all server routes --- src/routes/account/+page.server.ts | 13 --- src/routes/account/+page.svelte | 80 -------------- src/routes/api/user/+server.ts | 122 --------------------- src/routes/jwt/external/key.pem/+server.ts | 47 -------- src/routes/jwt/internal/+server.ts | 16 --- src/routes/lobby/+server.ts | 65 ----------- src/routes/lobby/[id]/+server.ts | 30 ----- src/routes/profile/+server.ts | 11 -- src/routes/signup/+page.server.ts | 13 --- src/routes/signup/+page.svelte | 84 -------------- 10 files changed, 481 deletions(-) delete mode 100644 src/routes/account/+page.server.ts delete mode 100644 src/routes/account/+page.svelte delete mode 100644 src/routes/api/user/+server.ts delete mode 100644 src/routes/jwt/external/key.pem/+server.ts delete mode 100644 src/routes/jwt/internal/+server.ts delete mode 100644 src/routes/lobby/+server.ts delete mode 100644 src/routes/lobby/[id]/+server.ts delete mode 100644 src/routes/profile/+server.ts delete mode 100644 src/routes/signup/+page.server.ts delete mode 100644 src/routes/signup/+page.svelte diff --git a/src/routes/account/+page.server.ts b/src/routes/account/+page.server.ts deleted file mode 100644 index 2dc64e8..0000000 --- a/src/routes/account/+page.server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RoomManager } from "$lib/server/class/Room.js"; -import { useAuth } from "$lib/util/api"; - -export async function load(opts) { - const apiKey = opts.cookies.get("token"); - const user = await useAuth(apiKey || "unused"); - const rooms = RoomManager.getRooms().map((r) => r.toJSON()); - return { - user: { ...user }, - rooms, - token: apiKey, - }; -} diff --git a/src/routes/account/+page.svelte b/src/routes/account/+page.svelte deleted file mode 100644 index c3109c9..0000000 --- a/src/routes/account/+page.svelte +++ /dev/null @@ -1,80 +0,0 @@ - diff --git a/src/routes/api/user/+server.ts b/src/routes/api/user/+server.ts deleted file mode 100644 index cb39114..0000000 --- a/src/routes/api/user/+server.ts +++ /dev/null @@ -1,122 +0,0 @@ -// TODO: refactor into external utils (ie Suyu.createAccount() or something???) - -import { userRepo } from "$lib/server/repo"; -import type { SuyuUser } from "$lib/server/schema"; -import { json, serializeRoles } from "$lib/server/util"; -import { useAuth } from "$lib/util/api"; -import type { - CreateAccountRequest, - CreateAccountResponse, - DeleteAccountResponse, - GetUserResponse, -} from "$types/api"; -import crypto from "crypto"; -import { promisify } from "util"; -import { verify } from "hcaptcha"; -import { PUBLIC_SITE_KEY } from "$env/static/public"; -import { HCAPTCHA_KEY } from "$env/static/private"; -import validator from "validator"; - -const randomBytes = promisify(crypto.randomBytes); - -async function genKey(username: string) { - const random = (await randomBytes(80)).toString("hex"); - let apiKey = `${username}:${random}`; - let b64ApiKey = Buffer.from(apiKey).toString("base64"); - if (b64ApiKey.length > 80) { - b64ApiKey = b64ApiKey.slice(0, 80); - } - // decode b64ApiKey - apiKey = Buffer.from(b64ApiKey, "base64").toString("utf-8"); - return apiKey; -} - -export async function POST({ request, getClientAddress }) { - const body: CreateAccountRequest = await request.json(); - if (!body.username || !body.email || !body.captchaToken) { - return json({ - success: false, - error: "missing fields", - }); - } - if (body.username.length < 3 || body.username.length > 24) { - return json({ - success: false, - error: "invalid username", - }); - } - if (!validator.isEmail(body.email)) { - return json({ - success: false, - error: "invalid email", - }); - } - const res = await verify(HCAPTCHA_KEY, body.captchaToken, getClientAddress(), PUBLIC_SITE_KEY); - if (!res.success) { - return json({ - success: false, - error: "missing fields!", - }); - } - // check if user exists - const user = await userRepo.findOne({ - where: [ - { - username: body.username, - }, - { - email: body.email, - }, - ], - }); - if (user) { - return json({ - success: false, - error: "user already exists", - }); - } - // the api key can only be 80 characters total, including the username and colon - const key = await genKey(body.username); - const createdUser: SuyuUser = userRepo.create({ - username: body.username, - avatarUrl: `https://avatars.githubusercontent.com/u/${Math.floor(Math.random() * 100000000)}?v=4`, - displayName: body.username, - roles: serializeRoles(["user"]), - apiKey: key, - email: body.email, - }); - await userRepo.save(createdUser); - return json({ - success: true, - token: createdUser.apiKey, - user: createdUser, - }); -} - -export async function GET({ request }) { - const user = await useAuth(request); - if (!user) { - return json({ - success: false, - error: "unauthorized", - }); - } - return json({ - success: true, - user, - }); -} - -export async function DELETE({ request }) { - const user = await useAuth(request); - if (!user) { - return json({ - success: false, - error: "unauthorized", - }); - } - await userRepo.remove(user); - return json({ - success: true, - }); -} diff --git a/src/routes/jwt/external/key.pem/+server.ts b/src/routes/jwt/external/key.pem/+server.ts deleted file mode 100644 index ef8c292..0000000 --- a/src/routes/jwt/external/key.pem/+server.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { json } from "$lib/server/util/index.js"; - -export function GET({ request }) { - return new Response( - `-----BEGIN CERTIFICATE----- -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== ------END CERTIFICATE-----`, - { - headers: { - "content-type": "text/plain", - }, - }, - ); -} - -export function POST({ request }) { - return new Response(); -} diff --git a/src/routes/jwt/internal/+server.ts b/src/routes/jwt/internal/+server.ts deleted file mode 100644 index ba144e7..0000000 --- a/src/routes/jwt/internal/+server.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { PRIVATE_KEY } from "$lib/server/secrets/secrets.json"; -import { useAuth } from "$lib/util/api/index.js"; -import jwt from "jsonwebtoken"; - -export async function POST({ request }) { - const userKey = `${request.headers.get("x-username")}:${request.headers.get("x-token")}`; - const user = await useAuth(userKey); - const token = jwt.sign({ ...user, apiKey: userKey }, Buffer.from(PRIVATE_KEY), { - algorithm: "RS256", - }); - return new Response(token, { - headers: { - "content-type": "text/html", - }, - }); -} diff --git a/src/routes/lobby/+server.ts b/src/routes/lobby/+server.ts deleted file mode 100644 index dd223c5..0000000 --- a/src/routes/lobby/+server.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Room, RoomManager } from "$lib/server/class/Room"; -import { userRepo } from "$lib/server/repo/index.js"; -import { SuyuUser } from "$lib/server/schema"; -import { PUBLIC_KEY } from "$lib/server/secrets/secrets.json"; -import { json } from "$lib/server/util"; -import { useAuth } from "$lib/util/api/index.js"; -import type { IJwtData } from "$types/auth.js"; -import type { IRoom, LobbyResponse } from "$types/rooms"; -import jwt from "jsonwebtoken"; - -export async function GET({ request }) { - return json({ - rooms: RoomManager.getRooms().map((r) => r.toJSON()), - }); -} - -/* credit to janeberru for showing the shape of this data */ -export async function POST({ request, getClientAddress }) { - // TODO: per-ip room limit - const body: IRoom = await request.json(); - /* description may contain "### END DESCRIPTION ###" on its own line. if it does, get all lines after that */ - const parsedDescription = body.description.split("### END DESCRIPTION ###"); - console.log(parsedDescription); - const description = parsedDescription?.slice(1)?.join("### END DESCRIPTION ###") || ""; - const opts: { [key: string]: string } = {}; - description.split("\n").forEach((line) => { - const [key, ...values] = line.split("="); - const value = values.join("=").trim(); - if (!key || !value) return; - opts[key] = value; - }); - if (opts.ip) { - if ( - !opts.ip.match( - /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/, - ) - ) { - return new Response(null, { status: 400 }); - } - } - const token = request.headers.get("authorization"); - if (!token) return new Response(null, { status: 401 }); - // TODO: jwt utils which type and validate automatically - const user = await useAuth(token); - console.log(user); - if (!user) return new Response(null, { status: 401 }); - const room = RoomManager.createRoom({ - name: body.name, - description: parsedDescription[0] || "", - gameName: body.preferredGameName, - gameId: body.preferredGameId, - players: [ - { - gameId: 0, - gameName: "", - nickname: user.username, - }, - ], - maxPlayers: body.maxPlayers, - ip: `${opts.ip || getClientAddress().split(":").at(-1)}:${body.port}`, - host: user, - hasPassword: body.hasPassword || false, - }); - return json(room.toJSON()); -} diff --git a/src/routes/lobby/[id]/+server.ts b/src/routes/lobby/[id]/+server.ts deleted file mode 100644 index b85cea8..0000000 --- a/src/routes/lobby/[id]/+server.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { RoomManager } from "$lib/server/class/Room"; -import { json } from "$lib/server/util/index.js"; -import { useAuth } from "$lib/util/api/index.js"; - -/* thanks again janeberru for the shape of this data */ -export async function POST({ request, params }) { - const body = await request.json(); - const { id } = params; - const room = RoomManager.getRoom(id); - if (!room) return new Response(null, { status: 500 }); - const user = await useAuth(request.headers.get("authorization") || ""); - if (!user) return new Response(null, { status: 401 }); - if (user.id !== room.host.id) return new Response(null, { status: 401 }); - if (body.players.length === 0 && room.roomInfo.owner) { - console.log(room.roomInfo.players); - room.setPlayerList([{ gameId: 0, gameName: "", nickname: room.roomInfo.owner }]); - } - return json({ message: "Lobby updated successfully" }); -} - -export async function DELETE({ request, params }) { - const { id } = params; - const room = RoomManager.getRoom(id); - if (!room) return new Response(null, { status: 500 }); - const user = await useAuth(request.headers.get("authorization") || ""); - if (!user) return new Response(null, { status: 401 }); - if (user.id !== room.host.id) return new Response(null, { status: 401 }); - room.delete(); - return json(room.toJSON()); -} diff --git a/src/routes/profile/+server.ts b/src/routes/profile/+server.ts deleted file mode 100644 index a5c82c2..0000000 --- a/src/routes/profile/+server.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { json } from "$lib/server/util/index"; -import { useAuth } from "$lib/util/api/index.js"; - -export async function GET({ request }) { - const user = await useAuth(request.headers.get("authorization") || ""); - console.log(user); - if (!user) return new Response(null, { status: 401 }); - return json({ - username: user.username, - }); -} diff --git a/src/routes/signup/+page.server.ts b/src/routes/signup/+page.server.ts deleted file mode 100644 index 2dc64e8..0000000 --- a/src/routes/signup/+page.server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { RoomManager } from "$lib/server/class/Room.js"; -import { useAuth } from "$lib/util/api"; - -export async function load(opts) { - const apiKey = opts.cookies.get("token"); - const user = await useAuth(apiKey || "unused"); - const rooms = RoomManager.getRooms().map((r) => r.toJSON()); - return { - user: { ...user }, - rooms, - token: apiKey, - }; -} diff --git a/src/routes/signup/+page.svelte b/src/routes/signup/+page.svelte deleted file mode 100644 index 6bab9e7..0000000 --- a/src/routes/signup/+page.svelte +++ /dev/null @@ -1,84 +0,0 @@ -