Quellcode durchsuchen

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

Milo Schwartz vor 9 Monaten
Ursprung
Commit
6942eeb7b4

+ 3 - 1
server/db/ensureActions.ts

@@ -20,9 +20,10 @@ export async function ensureActions() {
 
     // Add new actions
     for (const actionId of actionsToAdd) {
+        logger.debug(`Adding action: ${actionId}`);
         await db.insert(actions).values({ actionId }).execute();
         // Add new actions to the Default role
-        if (defaultRoles.length === 0) {
+        if (defaultRoles.length != 0) {
             await db.insert(roleActions)
                 .values(defaultRoles.map(role => ({ roleId: role.roleId!, actionId, orgId: role.orgId! })))
                 .execute();
@@ -31,6 +32,7 @@ export async function ensureActions() {
 
     // Remove deprecated actions
     if (actionsToRemove.length > 0) {
+        logger.debug(`Removing actions: ${actionsToRemove.join(', ')}`);
         await db.delete(actions).where(inArray(actions.actionId, actionsToRemove)).execute();
         await db.delete(roleActions).where(inArray(roleActions.actionId, actionsToRemove)).execute();
     }

+ 7 - 1
server/db/names.ts

@@ -6,7 +6,13 @@ import { eq, and } from "drizzle-orm";
 import { __DIRNAME } from "@server/config";
 
 // Load the names from the names.json file
-const file = join(__DIRNAME, "names.json");
+const dev = process.env.ENVIRONMENT !== "prod";
+let file;
+if (!dev) {
+    file = join(__DIRNAME, "names.json");
+} else {
+    file = join(__DIRNAME, "/db/names.json");
+}
 export const names = JSON.parse(readFileSync(file, "utf-8"));
 
 export async function getUniqueSiteName(orgId: string): Promise<string> {

+ 1 - 1
server/routers/external.ts

@@ -46,11 +46,11 @@ authenticated.put("/org/:orgId/site", verifyOrgAccess, site.createSite);
 authenticated.get("/org/:orgId/sites", verifyOrgAccess, site.listSites);
 authenticated.get("/org/:orgId/site/:niceId", verifyOrgAccess, site.getSite);
 
+authenticated.get("/org/:orgId/pickSiteDefaults", verifyOrgAccess, site.pickSiteDefaults);
 authenticated.get("/site/:siteId", verifySiteAccess, site.getSite);
 authenticated.get("/site/:siteId/roles", verifySiteAccess, site.listSiteRoles);
 authenticated.post("/site/:siteId", verifySiteAccess, site.updateSite);
 authenticated.delete("/site/:siteId", verifySiteAccess, site.deleteSite);
-authenticated.delete("/site/pickSiteDefaults", site.pickSiteDefaults);
 
 authenticated.put(
     "/org/:orgId/site/:siteId/resource",

+ 13 - 13
server/routers/gerbil/getConfig.ts

@@ -27,7 +27,7 @@ export type GetConfigResponse = {
 export async function getConfig(req: Request, res: Response, next: NextFunction): Promise<any> {
     try {
         // Validate request parameters
-        const parsedParams = getConfigSchema.safeParse(req.query);
+        const parsedParams = getConfigSchema.safeParse(req.body);
         if (!parsedParams.success) {
             return next(
                 createHttpError(
@@ -44,9 +44,9 @@ export async function getConfig(req: Request, res: Response, next: NextFunction)
         }
 
         // Fetch exit node
-        let exitNode = await db.select().from(exitNodes).where(eq(exitNodes.publicKey, publicKey));
-
-        if (!exitNode) {
+        let exitNodeQuery = await db.select().from(exitNodes).where(eq(exitNodes.publicKey, publicKey));
+        let exitNode;
+        if (exitNodeQuery.length === 0) {
             const address = await getNextAvailableSubnet();
             const listenPort = await getNextAvailablePort();
             const subEndpoint = await getUniqueExitNodeEndpointName();
@@ -61,6 +61,8 @@ export async function getConfig(req: Request, res: Response, next: NextFunction)
             }).returning().execute();
 
             logger.info(`Created new exit node ${exitNode[0].name} with address ${exitNode[0].address} and port ${exitNode[0].listenPort}`);
+        } else {
+            exitNode = exitNodeQuery;
         }
 
         if (!exitNode) {
@@ -98,16 +100,11 @@ export async function getConfig(req: Request, res: Response, next: NextFunction)
             peers,
         };
 
-        return response(res, {
-            data: configResponse,
-            success: true,
-            error: false,
-            message: "Configuration retrieved successfully",
-            status: HttpCode.OK,
-        });
+        logger.debug("Sending config: ", configResponse);
 
+        return res.status(HttpCode.OK).send(configResponse);
     } catch (error) {
-        logger.error('Error from getConfig:', error);
+        logger.error(error);
         return next(createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred..."));
     }
 }
@@ -119,10 +116,13 @@ async function getNextAvailableSubnet(): Promise<string> {
     }).from(exitNodes);
 
     const addresses = existingAddresses.map(a => a.address);
-    const subnet = findNextAvailableCidr(addresses, config.gerbil.block_size, config.gerbil.subnet_group);
+    let subnet = findNextAvailableCidr(addresses, config.gerbil.block_size, config.gerbil.subnet_group);
     if (!subnet) {
         throw new Error('No available subnets remaining in space');
     }
+
+    // replace the last octet with 1
+    subnet = subnet.split('.').slice(0, 3).join('.') + '.1' + subnet.split('/')[1];
     return subnet;
 }
 

+ 1 - 1
server/routers/internal.ts

@@ -17,7 +17,7 @@ internalRouter.get("/traefik-config", traefik.traefikConfigProvider);
 const gerbilRouter = Router();
 internalRouter.use("/gerbil", gerbilRouter);
 
-gerbilRouter.get("/get-config", gerbil.getConfig);
+gerbilRouter.post("/get-config", gerbil.getConfig);
 gerbilRouter.post("/receive-bandwidth", gerbil.receiveBandwidth);
 
 // Badger routes

+ 1 - 1
server/routers/resource/createResource.ts

@@ -75,7 +75,7 @@ export async function createResource(req: Request, res: Response, next: NextFunc
         }
 
         // Generate a unique resourceId
-        const fullDomain = `${subdomain}.${org[0].orgId}.${org[0].domain}`;
+        const fullDomain = `${subdomain}.${org[0].domain}`;
 
         // Create new resource in the database
         const newResource = await db.insert(resources).values({

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

@@ -66,8 +66,10 @@ export async function pickSiteDefaults(
             .where(eq(sites.exitNodeId, exitNode.exitNodeId));
 
         // TODO: we need to lock this subnet for some time so someone else does not take it
-        const subnets = sitesQuery.map((site) => site.subnet);
-        const newSubnet = findNextAvailableCidr(subnets, 28, exitNode.address);
+        let subnets = sitesQuery.map((site) => site.subnet);
+        // exclude the exit node address by replacing after the / with a /28
+        subnets.push(exitNode.address.replace(/\/\d+$/, "/29"));
+        const newSubnet = findNextAvailableCidr(subnets, 29, exitNode.address);
         if (!newSubnet) {
             return next(
                 createHttpError(

+ 11 - 12
src/app/[orgId]/layout.tsx

@@ -68,18 +68,17 @@ export default async function ConfigurationLaytout(
     }
 
     let orgs: ListOrgsResponse["orgs"] = [];
-    try {
-        const res = await internal.get<AxiosResponse<ListOrgsResponse>>(
-            `/orgs`,
-            cookie
-        );
-        if (res && res.data.data.orgs) {
-            orgs = res.data.data.orgs;
-        }
-    } catch (e) {
-        console.error("Error fetching orgs", e);
-    }
-
+    // try {
+    //     const res = await internal.get<AxiosResponse<ListOrgsResponse>>(
+    //         `/orgs`,
+    //         cookie
+    //     );
+    //     if (res && res.data.data.orgs) {
+    //         orgs = res.data.data.orgs;
+    //     }
+    // } catch (e) {
+    //     console.error("Error fetching orgs", e);
+    // }
     return (
         <>
             <div className="w-full bg-muted mb-6 select-none sm:px-0 px-3 pt-3">

+ 4 - 3
src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx

@@ -76,7 +76,7 @@ export function CreateSiteForm() {
             setIsLoading(false);
 
             api
-            .get(`/site/pickSiteDefaults`)
+            .get(`/org/${orgId}/pickSiteDefaults`)
             .catch((e) => {
                 toast({
                     title: "Error creating site..."
@@ -93,7 +93,8 @@ export function CreateSiteForm() {
         const res = await api
             .put(`/org/${orgId}/site/`, {
                 name: data.name,
-                // subdomain: data.subdomain,
+                subnet: siteDefaults?.subnet,
+                exitNodeId: siteDefaults?.exitNodeId,
                 pubKey: keypair?.publicKey,
             })
             .catch((e) => {
@@ -117,7 +118,7 @@ PrivateKey = ${keypair.privateKey}
 
 [Peer]
 PublicKey = ${siteDefaults.publicKey}
-AllowedIPs = ${siteDefaults.address}
+AllowedIPs = ${siteDefaults.address.split("/")[0]}/32
 Endpoint = ${siteDefaults.endpoint}:${siteDefaults.listenPort}
 PersistentKeepalive = 5`
         : "";