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/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/gerbil/getConfig.ts b/server/routers/gerbil/getConfig.ts index 6b41c303..808f593e 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' + subnet.split('/')[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({ 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]/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 ae2f03e3..55b8e088 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) => { @@ -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` : "";