From bacc5e421397e4b1112012c78cf55442dd0d152f Mon Sep 17 00:00:00 2001 From: Owen Date: Sun, 23 Feb 2025 20:18:03 -0500 Subject: [PATCH] Add relay message --- server/routers/messageHandlers.ts | 5 +- server/routers/olm/handleOlmRelayMessage.ts | 81 +++++++++++++++++++++ server/routers/olm/index.ts | 3 +- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 server/routers/olm/handleOlmRelayMessage.ts diff --git a/server/routers/messageHandlers.ts b/server/routers/messageHandlers.ts index f23ea0a8..759a88ea 100644 --- a/server/routers/messageHandlers.ts +++ b/server/routers/messageHandlers.ts @@ -1,5 +1,5 @@ import { handleNewtRegisterMessage, handleReceiveBandwidthMessage } from "./newt"; -import { handleOlmRegisterMessage } from "./olm"; +import { handleOlmRegisterMessage, handleOlmRelayMessage } from "./olm"; import { handleGetConfigMessage } from "./newt/handleGetConfigMessage"; import { MessageHandler } from "./ws"; @@ -7,5 +7,6 @@ export const messageHandlers: Record = { "newt/wg/register": handleNewtRegisterMessage, "olm/wg/register": handleOlmRegisterMessage, "newt/wg/get-config": handleGetConfigMessage, - "newt/receive-bandwidth": handleReceiveBandwidthMessage + "newt/receive-bandwidth": handleReceiveBandwidthMessage, + "olm/wg/relay": handleOlmRelayMessage }; diff --git a/server/routers/olm/handleOlmRelayMessage.ts b/server/routers/olm/handleOlmRelayMessage.ts new file mode 100644 index 00000000..9cf0ceb2 --- /dev/null +++ b/server/routers/olm/handleOlmRelayMessage.ts @@ -0,0 +1,81 @@ +import db from "@server/db"; +import { MessageHandler } from "../ws"; +import { clients, Olm, olms, sites } from "@server/db/schema"; +import { eq } from "drizzle-orm"; +import { addPeer, deletePeer } from "../newt/peers"; +import logger from "@server/logger"; + +export const handleOlmRelayMessage: MessageHandler = async (context) => { + const { message, client: c, sendToClient } = context; + const olm = c as Olm; + + logger.info("Handling relay olm message!"); + + if (!olm) { + logger.warn("Olm not found"); + return; + } + + if (!olm.clientId) { + logger.warn("Olm has no site!"); // TODO: Maybe we create the site here? + return; + } + + const clientId = olm.clientId; + + const [client] = await db + .select() + .from(clients) + .where(eq(clients.clientId, clientId)) + .limit(1); + + if (!client || !client.siteId) { + logger.warn("Site not found or does not have exit node"); + return; + } + + const [site] = await db + .select() + .from(sites) + .where(eq(sites.siteId, client.siteId)) + .limit(1); + + if (!client) { + logger.warn("Site not found or does not have exit node"); + return; + } + + // make sure we hand endpoints for both the site and the client and the lastHolePunch is not too old + if (!client.pubKey) { + logger.warn("Site or client has no endpoint or listen port"); + return; + } + + if (!site.subnet) { + logger.warn("Site has no subnet"); + return; + } + + await deletePeer(site.siteId, client.pubKey); + + // add the peer to the exit node + await addPeer(site.siteId, { + publicKey: client.pubKey, + allowedIps: [client.subnet], + endpoint: "" + }); + + return { + message: { + type: "olm/wg/connect", + data: { + endpoint: site.endpoint, + publicKey: site.publicKey, + serverIP: site.address!.split("/")[0], + tunnelIP: client.subnet + } + }, + broadcast: false, // Send to all olms + excludeSender: false // Include sender in broadcast + }; +}; diff --git a/server/routers/olm/index.ts b/server/routers/olm/index.ts index 616480cc..b7373961 100644 --- a/server/routers/olm/index.ts +++ b/server/routers/olm/index.ts @@ -1,3 +1,4 @@ export * from "./handleOlmRegisterMessage"; export * from "./getOlmToken"; -export * from "./createOlm"; \ No newline at end of file +export * from "./createOlm"; +export * from "./handleOlmRelayMessage"; \ No newline at end of file