73 lines
2.1 KiB
TypeScript
73 lines
2.1 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import {
|
|
StatusCodes,
|
|
} from 'http-status-codes';
|
|
import { narrow } from "@/types/typeUtils";
|
|
import { CLIENT_AUTH_TOKENS, SERVER_AUTH_TOKENS } from "./auth";
|
|
import { initDb } from "../db";
|
|
|
|
type Intents = 'server' | 'client';
|
|
|
|
const narrowIntents = (intents?: string | null) => narrow(intents, 'client', 'server') as Intents;
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const url = new URL(req.url);
|
|
const token = url.searchParams.get('token');
|
|
const intents = narrowIntents(url.searchParams.get('intents'));
|
|
|
|
if (!token)
|
|
return NextResponse.json({ message: "token parameter required" });
|
|
|
|
switch (intents) {
|
|
case "server":
|
|
{
|
|
const auth = SERVER_AUTH_TOKENS[token];
|
|
|
|
if (!auth)
|
|
return NextResponse.json({ message: "Invalid token" });
|
|
|
|
const ip = (req.headers.get("x-real-ip") || req.headers.get("x-forwarded-for")?.split(",")[0] || '127.0.0.1').replace('::1', '127.0.0.1');
|
|
|
|
if (auth.server_ip !== ip) {
|
|
return NextResponse.json({ message: "Invalid address" });
|
|
}
|
|
|
|
delete SERVER_AUTH_TOKENS[token];
|
|
|
|
return NextResponse.json({ message: "ok", ...auth });
|
|
}
|
|
case "client":
|
|
{
|
|
const auth = CLIENT_AUTH_TOKENS[token];
|
|
if (!auth)
|
|
return NextResponse.json({ message: "Invalid token" }, { status: StatusCodes.NOT_FOUND });
|
|
return NextResponse.json({ message: "ok", auth });
|
|
}
|
|
}
|
|
}
|
|
|
|
export async function POST(req: NextRequest) {
|
|
let { intents, server_ip } = await req.json();
|
|
|
|
intents = String(intents).split('/');
|
|
|
|
const token = crypto.randomUUID();
|
|
|
|
const user_id = 12;
|
|
|
|
switch (narrowIntents(intents[0])) {
|
|
case 'server':
|
|
SERVER_AUTH_TOKENS[token] = {
|
|
user_id,
|
|
server_ip: String(server_ip),
|
|
};
|
|
return NextResponse.json({ message: "ok", token });
|
|
case 'client':
|
|
CLIENT_AUTH_TOKENS[token] = user_id;
|
|
return NextResponse.json({ message: "ok", token });
|
|
default:
|
|
return NextResponse.json({ message: 'Invalid intentions' }, { status: StatusCodes.BAD_REQUEST });
|
|
}
|
|
}
|
|
|
|
initDb(); |