feat(acls): added backend acls

This commit is contained in:
DecDuck
2025-02-04 13:15:34 +11:00
parent 09fd01d9b5
commit d4dd259b5f
66 changed files with 394 additions and 473 deletions

View File

@ -1,46 +1,39 @@
import session from "~/server/internal/session";
import taskHandler, { TaskMessage } from "~/server/internal/tasks";
import { parse as parseCookies } from "cookie-es";
import { MinimumRequestObject } from "~/server/h3";
// TODO add web socket sessions for horizontal scaling
// ID to admin
const adminSocketSessions: { [key: string]: boolean } = {};
const socketHeaders: { [key: string]: MinimumRequestObject } = {};
export default defineWebSocketHandler({
async open(peer) {
const cookies = peer.request?.headers?.get("Cookie");
if (!cookies) {
const request = peer.request;
if (!request) {
peer.send("unauthenticated");
return;
}
const parsedCookies = parseCookies(cookies);
const token = parsedCookies[session.getDropTokenCookie()];
const userId = await session.getUserIdRaw(token);
if (!userId) {
peer.send("unauthenticated");
return;
}
const admin = session.getAdminUser(token);
adminSocketSessions[peer.id] = admin !== undefined;
socketHeaders[peer.id] = {
headers: request.headers ?? new Headers(),
};
peer.send(`connect`);
},
message(peer, message) {
if (!peer.id) return;
if (adminSocketSessions[peer.id] === undefined) return;
if (socketHeaders[peer.id] === undefined) return;
const text = message.text();
if (text.startsWith("connect/")) {
const id = text.substring("connect/".length);
taskHandler.connect(peer.id, id, peer, adminSocketSessions[peer.id]);
taskHandler.connect(peer.id, id, peer, socketHeaders[peer.id]);
return;
}
},
close(peer, details) {
if (!peer.id) return;
if (adminSocketSessions[peer.id] === undefined) return;
delete adminSocketSessions[peer.id];
if (socketHeaders[peer.id] === undefined) return;
delete socketHeaders[peer.id];
taskHandler.disconnectAll(peer.id);
},