From 7feb21e72769c65e844cebac30234d4d32c6394e Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Sat, 26 Oct 2024 17:02:11 -0400 Subject: [PATCH 1/3] Updated gerbil key handeling --- server/db/ensureActions.ts | 4 +++- server/db/names.ts | 8 ++++++- server/routers/gerbil/getConfig.ts | 26 +++++++++++------------ server/routers/internal.ts | 2 +- server/routers/resource/createResource.ts | 2 +- 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/server/db/ensureActions.ts b/server/db/ensureActions.ts index 8db1e066..81ea5c68 100644 --- a/server/db/ensureActions.ts +++ b/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(); } diff --git a/server/db/names.ts b/server/db/names.ts index 28fda9b8..440895f8 100644 --- a/server/db/names.ts +++ b/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 { diff --git a/server/routers/gerbil/getConfig.ts b/server/routers/gerbil/getConfig.ts index 6b41c303..41eedbee 100644 --- a/server/routers/gerbil/getConfig.ts +++ b/server/routers/gerbil/getConfig.ts @@ -27,7 +27,7 @@ export type GetConfigResponse = { export async function getConfig(req: Request, res: Response, next: NextFunction): Promise { 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 { }).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'; return subnet; } diff --git a/server/routers/internal.ts b/server/routers/internal.ts index 08bd2a21..d477e696 100644 --- a/server/routers/internal.ts +++ b/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 diff --git a/server/routers/resource/createResource.ts b/server/routers/resource/createResource.ts index 9b447ad1..cb054243 100644 --- a/server/routers/resource/createResource.ts +++ b/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({ From edcae190b27d6b9ca5e1c794a394a194f40dca2f Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Sat, 26 Oct 2024 17:23:48 -0400 Subject: [PATCH 2/3] Test & fix the get defaults for sites --- server/routers/external.ts | 2 +- server/routers/site/pickSiteDefaults.ts | 6 ++++-- src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx | 5 +++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/server/routers/external.ts b/server/routers/external.ts index 4a269f6a..5bb3305b 100644 --- a/server/routers/external.ts +++ b/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", diff --git a/server/routers/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index f12c720e..5901de8c 100644 --- a/server/routers/site/pickSiteDefaults.ts +++ b/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( diff --git a/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx b/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx index ae2f03e3..1691ff00 100644 --- a/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx +++ b/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) => { From a90347183d91d6418d3bbb1fff8a19d906359f51 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Sat, 26 Oct 2024 19:56:50 -0400 Subject: [PATCH 3/3] Working on deployment 2 --- server/routers/gerbil/getConfig.ts | 2 +- src/app/[orgId]/layout.tsx | 23 +++++++++---------- .../sites/[niceId]/components/CreateSite.tsx | 2 +- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/server/routers/gerbil/getConfig.ts b/server/routers/gerbil/getConfig.ts index 41eedbee..808f593e 100644 --- a/server/routers/gerbil/getConfig.ts +++ b/server/routers/gerbil/getConfig.ts @@ -122,7 +122,7 @@ async function getNextAvailableSubnet(): Promise { } // replace the last octet with 1 - subnet = subnet.split('.').slice(0, 3).join('.') + '.1'; + subnet = subnet.split('.').slice(0, 3).join('.') + '.1' + subnet.split('/')[1]; return subnet; } diff --git a/src/app/[orgId]/layout.tsx b/src/app/[orgId]/layout.tsx index 291c37db..0b7a66d7 100644 --- a/src/app/[orgId]/layout.tsx +++ b/src/app/[orgId]/layout.tsx @@ -68,18 +68,17 @@ export default async function ConfigurationLaytout( } let orgs: ListOrgsResponse["orgs"] = []; - try { - const res = await internal.get>( - `/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>( + // `/orgs`, + // cookie + // ); + // if (res && res.data.data.orgs) { + // orgs = res.data.data.orgs; + // } + // } catch (e) { + // console.error("Error fetching orgs", e); + // } return ( <>
diff --git a/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx b/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx index 1691ff00..55b8e088 100644 --- a/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx +++ b/src/app/[orgId]/sites/[niceId]/components/CreateSite.tsx @@ -118,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` : "";