Procházet zdrojové kódy

Merge branch 'main' of https://github.com/fosrl/pangolin

Milo Schwartz před 8 měsíci
rodič
revize
3c7b2c03f8

+ 1 - 1
bruno/Auth/login.bru

@@ -12,7 +12,7 @@ post {
 
 
 body:json {
 body:json {
   {
   {
-    "email": "milo@fossorial.io",
+    "email": "owen@fossorial.io",
     "password": "Password123!"
     "password": "Password123!"
   }
   }
 }
 }

+ 1 - 1
bruno/Auth/signup.bru

@@ -12,7 +12,7 @@ put {
 
 
 body:json {
 body:json {
   {
   {
-    "email": "milo@fossorial.io",
+    "email": "numbat@fossorial.io",
     "password": "Password123!"
     "password": "Password123!"
   }
   }
 }
 }

+ 1 - 1
bruno/Sites/Get Site.bru

@@ -5,7 +5,7 @@ meta {
 }
 }
 
 
 get {
 get {
-  url: http://localhost:3000/api/v1/org/theorg/sites/mexican-mole-lizard-windy
+  url: http://localhost:3000/api/v1/org/test/sites/mexican-mole-lizard-windy
   body: none
   body: none
   auth: none
   auth: none
 }
 }

+ 4 - 1
server/db/schema.ts

@@ -17,7 +17,7 @@ export const sites = sqliteTable("sites", {
         onDelete: "set null",
         onDelete: "set null",
     }),
     }),
     name: text("name").notNull(),
     name: text("name").notNull(),
-    pubKey: text("pubKey").notNull(),
+    pubKey: text("pubKey"),
     subnet: text("subnet").notNull(),
     subnet: text("subnet").notNull(),
     megabytesIn: integer("bytesIn"),
     megabytesIn: integer("bytesIn"),
     megabytesOut: integer("bytesOut"),
     megabytesOut: integer("bytesOut"),
@@ -76,6 +76,9 @@ export const newts = sqliteTable("newt", {
     newtId: text("id").primaryKey(),
     newtId: text("id").primaryKey(),
     secretHash: text("secretHash").notNull(),
     secretHash: text("secretHash").notNull(),
     dateCreated: text("dateCreated").notNull(),
     dateCreated: text("dateCreated").notNull(),
+    siteId: integer("siteId").references(() => sites.siteId, {
+        onDelete: "cascade",
+    }),
 });
 });
 
 
 export const twoFactorBackupCodes = sqliteTable("twoFactorBackupCodes", {
 export const twoFactorBackupCodes = sqliteTable("twoFactorBackupCodes", {

+ 2 - 2
server/routers/messageHandlers.ts

@@ -1,6 +1,6 @@
-import { handleNewtMessage } from "./newt";
+import { handleRegisterMessage } from "./newt";
 import { MessageHandler } from "./ws";
 import { MessageHandler } from "./ws";
 
 
 export const messageHandlers: Record<string, MessageHandler> = {
 export const messageHandlers: Record<string, MessageHandler> = {
-    "newt": handleNewtMessage,
+    "newt/wg/register": handleRegisterMessage,
 };
 };

+ 0 - 22
server/routers/newt/handleNewtMessage.ts

@@ -1,22 +0,0 @@
-// messageHandlers/chat.ts
-import { MessageHandler } from "../ws";
-
-export const handleNewtMessage: MessageHandler = async (context) => {
-    const { message, senderNewtId, sendToClient } = context;
-    
-    // Process chat message
-    // ... your chat logic here ...
-
-    // Example response
-    return {
-        message: {
-            type: 'newt_response',
-            data: {
-                originalMessage: message.data,
-                timestamp: new Date().toISOString()
-            }
-        },
-        broadcast: false,  // Send to all clients
-        excludeSender: false  // Include sender in broadcast
-    };
-};

+ 42 - 0
server/routers/newt/handleRegisterMessage.ts

@@ -0,0 +1,42 @@
+import db from "@server/db";
+import { MessageHandler } from "../ws";
+import { sites } from "@server/db/schema";
+import { eq } from "drizzle-orm";
+
+export const handleRegisterMessage: MessageHandler = async (context) => {
+    const { message, newt, sendToClient } = context;
+    
+    if (!newt) {
+        console.log("Newt not found");
+        return;
+    }
+
+    if (!newt.siteId) {
+        console.log("Newt has no site!"); // TODO: Maybe we create the site here?
+        return;
+    }
+    
+    const siteId = newt.siteId;
+        
+    // get the site
+    const site = await db
+    .select()
+    .from(sites)
+    .where(eq(sites.siteId, siteId))
+    .limit(1);
+
+
+        const { publicKey } = message.data;
+
+    return {
+        message: {
+            type: 'newt/wg/connect',
+            data: {
+                publicKey: 'publicKey',
+
+            }
+        },
+        broadcast: false,  // Send to all clients
+        excludeSender: false  // Include sender in broadcast
+    };
+};

+ 1 - 1
server/routers/newt/index.ts

@@ -1,3 +1,3 @@
 export * from "./createNewt";
 export * from "./createNewt";
 export * from "./getToken";
 export * from "./getToken";
-export * from "./handleNewtMessage";
+export * from "./handleRegisterMessage";

+ 23 - 16
server/routers/site/createSite.ts

@@ -20,7 +20,7 @@ const createSiteSchema = z
         name: z.string().min(1).max(255),
         name: z.string().min(1).max(255),
         exitNodeId: z.number().int().positive(),
         exitNodeId: z.number().int().positive(),
         subdomain: z.string().min(1).max(255).optional(),
         subdomain: z.string().min(1).max(255).optional(),
-        pubKey: z.string(),
+        pubKey: z.string().optional(),
         subnet: z.string(),
         subnet: z.string(),
     })
     })
     .strict();
     .strict();
@@ -70,17 +70,22 @@ export async function createSite(
 
 
         const niceId = await getUniqueSiteName(orgId);
         const niceId = await getUniqueSiteName(orgId);
 
 
-        const [newSite] = await db
-            .insert(sites)
-            .values({
-                orgId,
-                exitNodeId,
-                name,
-                niceId,
+        let payload: any = {
+            orgId,
+            exitNodeId,
+            name,
+            niceId,
+            subnet,
+        };
+
+        if (pubKey) {
+            payload = {
+                ...payload,
                 pubKey,
                 pubKey,
-                subnet,
-            })
-            .returning();
+            };
+        }
+
+        const [newSite] = await db.insert(sites).values(payload).returning();
 
 
         const adminRole = await db
         const adminRole = await db
             .select()
             .select()
@@ -107,11 +112,13 @@ export async function createSite(
             });
             });
         }
         }
 
 
-        // add the peer to the exit node
-        await addPeer(exitNodeId, {
-            publicKey: pubKey,
-            allowedIps: [],
-        });
+        if (pubKey) {
+            // add the peer to the exit node
+            await addPeer(exitNodeId, {
+                publicKey: pubKey,
+                allowedIps: [],
+            });
+        }
 
 
         return response(res, {
         return response(res, {
             data: {
             data: {

+ 4 - 2
server/routers/site/deleteSite.ts

@@ -48,7 +48,9 @@ export async function deleteSite(
             );
             );
         }
         }
 
 
-        await deletePeer(deletedSite.exitNodeId!, deletedSite.pubKey);
+        if (deletedSite.pubKey) {
+            await deletePeer(deletedSite.exitNodeId!, deletedSite.pubKey);
+        }
 
 
         return response(res, {
         return response(res, {
             data: null,
             data: null,
@@ -79,7 +81,7 @@ async function removePeer(publicKey: string) {
         }
         }
 
 
         const data = await response.json();
         const data = await response.json();
-        console.log("Peer removed successfully:", data.status);
+        logger.info("Peer removed successfully:", data.status);
         return data;
         return data;
     } catch (error: any) {
     } catch (error: any) {
         console.error("Error removing peer:", error.message);
         console.error("Error removing peer:", error.message);

+ 9 - 8
server/routers/ws.ts

@@ -8,6 +8,7 @@ import { eq } from "drizzle-orm";
 import db from "@server/db";
 import db from "@server/db";
 import { validateNewtSessionToken } from "@server/auth/newt";
 import { validateNewtSessionToken } from "@server/auth/newt";
 import { messageHandlers } from "./messageHandlers";
 import { messageHandlers } from "./messageHandlers";
+import logger from "@server/logger";
 
 
 // Custom interfaces
 // Custom interfaces
 interface WebSocketRequest extends IncomingMessage {
 interface WebSocketRequest extends IncomingMessage {
@@ -39,7 +40,7 @@ interface HandlerResponse {
 interface HandlerContext {
 interface HandlerContext {
     message: WSMessage;
     message: WSMessage;
     senderWs: WebSocket;
     senderWs: WebSocket;
-    senderNewtId: string;
+    newt: Newt | undefined;
     sendToClient: (newtId: string, message: WSMessage) => boolean;
     sendToClient: (newtId: string, message: WSMessage) => boolean;
     broadcastToAllExcept: (message: WSMessage, excludeNewtId?: string) => void;
     broadcastToAllExcept: (message: WSMessage, excludeNewtId?: string) => void;
     connectedClients: Map<string, WebSocket[]>;
     connectedClients: Map<string, WebSocket[]>;
@@ -58,7 +59,7 @@ const addClient = (newtId: string, ws: AuthenticatedWebSocket): void => {
     const existingClients = connectedClients.get(newtId) || [];
     const existingClients = connectedClients.get(newtId) || [];
     existingClients.push(ws);
     existingClients.push(ws);
     connectedClients.set(newtId, existingClients);
     connectedClients.set(newtId, existingClients);
-    console.log(`Client added to tracking - Newt ID: ${newtId}, Total connections: ${existingClients.length}`);
+    logger.info(`Client added to tracking - Newt ID: ${newtId}, Total connections: ${existingClients.length}`);
 };
 };
 
 
 const removeClient = (newtId: string, ws: AuthenticatedWebSocket): void => {
 const removeClient = (newtId: string, ws: AuthenticatedWebSocket): void => {
@@ -67,10 +68,10 @@ const removeClient = (newtId: string, ws: AuthenticatedWebSocket): void => {
     
     
     if (updatedClients.length === 0) {
     if (updatedClients.length === 0) {
         connectedClients.delete(newtId);
         connectedClients.delete(newtId);
-        console.log(`All connections removed for Newt ID: ${newtId}`);
+        logger.info(`All connections removed for Newt ID: ${newtId}`);
     } else {
     } else {
         connectedClients.set(newtId, updatedClients);
         connectedClients.set(newtId, updatedClients);
-        console.log(`Connection removed - Newt ID: ${newtId}, Remaining connections: ${updatedClients.length}`);
+        logger.info(`Connection removed - Newt ID: ${newtId}, Remaining connections: ${updatedClients.length}`);
     }
     }
 };
 };
 
 
@@ -78,7 +79,7 @@ const removeClient = (newtId: string, ws: AuthenticatedWebSocket): void => {
 const sendToClient = (newtId: string, message: WSMessage): boolean => {
 const sendToClient = (newtId: string, message: WSMessage): boolean => {
     const clients = connectedClients.get(newtId);
     const clients = connectedClients.get(newtId);
     if (!clients || clients.length === 0) {
     if (!clients || clients.length === 0) {
-        console.log(`No active connections found for Newt ID: ${newtId}`);
+        logger.info(`No active connections found for Newt ID: ${newtId}`);
         return false;
         return false;
     }
     }
 
 
@@ -198,7 +199,7 @@ wss.on("connection", (ws: AuthenticatedWebSocket, request: WebSocketRequest) =>
     ws.on("message", async (data) => {
     ws.on("message", async (data) => {
         try {
         try {
             const message: WSMessage = JSON.parse(data.toString());
             const message: WSMessage = JSON.parse(data.toString());
-            // console.log(`Message received from Newt ID ${newtId}:`, message);
+            // logger.info(`Message received from Newt ID ${newtId}:`, message);
     
     
             // Validate message format
             // Validate message format
             if (!message.type || typeof message.type !== "string") {
             if (!message.type || typeof message.type !== "string") {
@@ -215,7 +216,7 @@ wss.on("connection", (ws: AuthenticatedWebSocket, request: WebSocketRequest) =>
             const response = await handler({
             const response = await handler({
                 message,
                 message,
                 senderWs: ws,
                 senderWs: ws,
-                senderNewtId: newtId,
+                newt: ws.newt,
                 sendToClient,
                 sendToClient,
                 broadcastToAllExcept,
                 broadcastToAllExcept,
                 connectedClients
                 connectedClients
@@ -250,7 +251,7 @@ wss.on("connection", (ws: AuthenticatedWebSocket, request: WebSocketRequest) =>
     ws.on("close", () => {
     ws.on("close", () => {
         clearInterval(pingInterval);
         clearInterval(pingInterval);
         removeClient(newtId, ws);
         removeClient(newtId, ws);
-        console.log(`Client disconnected - Newt ID: ${newtId}`);
+        logger.info(`Client disconnected - Newt ID: ${newtId}`);
     });
     });
 
 
     ws.on("error", (error: Error) => {
     ws.on("error", (error: Error) => {