Fix bugs and change makefile

This commit is contained in:
Owen Schwartz 2024-10-20 12:55:28 -04:00
parent 16e2a262e9
commit 002614499b
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
13 changed files with 150 additions and 159 deletions

View file

@ -22,5 +22,6 @@ RUN npm install --omit=dev
COPY --from=builder /app/.next ./.next COPY --from=builder /app/.next ./.next
COPY --from=builder /app/dist ./dist COPY --from=builder /app/dist ./dist
COPY server/db/names.json /app/dist/names.json
CMD ["npm", "start"] CMD ["npm", "start"]

View file

@ -1,6 +1,11 @@
all: all: build push
docker build -t pangolin .
build:
docker build -t fossorial/pangolin:latest .
push:
docker push fossorial/pangolin:latest
test: test:
docker run -it -p 3000:3000 -p 3001:3001 --env-file=.env -v ./config:/app/config pangolin docker run -it -p 3000:3000 -p 3001:3001 --env-file=.env -v ./config:/app/config pangolin

View file

@ -10,150 +10,150 @@ import db from "@server/db";
import { createSuperuserRole } from "@server/db/ensureActions"; import { createSuperuserRole } from "@server/db/ensureActions";
async function insertDummyData() { async function insertDummyData() {
// Insert dummy orgs // // Insert dummy orgs
const org1 = db // const org1 = db
.insert(orgs) // .insert(orgs)
.values({ // .values({
orgId: "default", // orgId: "default",
name: "Default", // name: "Default",
domain: "fosrl.io", // domain: "fosrl.io",
}) // })
.returning() // .returning()
.get(); // .get();
await createSuperuserRole(org1.orgId!); // await createSuperuserRole(org1.orgId!);
const org2 = db // const org2 = db
.insert(orgs) // .insert(orgs)
.values({ // .values({
orgId: "fossorial", // orgId: "fossorial",
name: "Fossorial", // name: "Fossorial",
domain: "fossorial.io", // domain: "fossorial.io",
}) // })
.returning() // .returning()
.get(); // .get();
await createSuperuserRole(org2.orgId!); // await createSuperuserRole(org2.orgId!);
// Insert dummy exit nodes // // Insert dummy exit nodes
const exitNode1 = db // const exitNode1 = db
.insert(exitNodes) // .insert(exitNodes)
.values({ // .values({
name: "Exit Node 1", // name: "Exit Node 1",
address: "10.0.0.1/24", // address: "10.0.0.1/24",
privateKey: "sKQlCNErB2n+dV8eLp5Yw/avsjK/zkrxJE0n48hjb10=", // privateKey: "sKQlCNErB2n+dV8eLp5Yw/avsjK/zkrxJE0n48hjb10=",
listenPort: 51820, // listenPort: 51820,
}) // })
.returning() // .returning()
.get(); // .get();
const exitNode2 = db // const exitNode2 = db
.insert(exitNodes) // .insert(exitNodes)
.values({ // .values({
name: "Exit Node 2", // name: "Exit Node 2",
address: "172.16.1.1/24", // address: "172.16.1.1/24",
privateKey: "ACaw+q5vHVm8Xb0jIgIkMzlkJiriC7cURuOiNbGsGHg=", // privateKey: "ACaw+q5vHVm8Xb0jIgIkMzlkJiriC7cURuOiNbGsGHg=",
listenPort: 51820, // listenPort: 51820,
}) // })
.returning() // .returning()
.get(); // .get();
// Insert dummy sites // // Insert dummy sites
const site1 = db // const site1 = db
.insert(sites) // .insert(sites)
.values({ // .values({
orgId: org1.orgId, // orgId: org1.orgId,
exitNode: exitNode1.exitNodeId, // exitNode: exitNode1.exitNodeId,
name: "Main Site", // name: "Main Site",
subdomain: "main", // subdomain: "main",
pubKey: "Kn4eD0kvcTwjO//zqH/CtNVkMNdMiUkbqFxysEym2D8=", // pubKey: "Kn4eD0kvcTwjO//zqH/CtNVkMNdMiUkbqFxysEym2D8=",
subnet: "10.0.0.16/28", // subnet: "10.0.0.16/28",
}) // })
.returning() // .returning()
.get(); // .get();
const site2 = db // const site2 = db
.insert(sites) // .insert(sites)
.values({ // .values({
orgId: org2.orgId, // orgId: org2.orgId,
exitNode: exitNode2.exitNodeId, // exitNode: exitNode2.exitNodeId,
name: "Dev Site", // name: "Dev Site",
subdomain: "dev", // subdomain: "dev",
pubKey: "V329Uf/vhnBwYxAuT/ZlMZuLokHy5tug/sGsLfIMK1w=", // pubKey: "V329Uf/vhnBwYxAuT/ZlMZuLokHy5tug/sGsLfIMK1w=",
subnet: "172.16.1.16/28", // subnet: "172.16.1.16/28",
}) // })
.returning() // .returning()
.get(); // .get();
// Insert dummy resources // // Insert dummy resources
const resource1 = db // const resource1 = db
.insert(resources) // .insert(resources)
.values({ // .values({
resourceId: `web.${site1.subdomain}.${org1.domain}`, // resourceId: `web.${site1.subdomain}.${org1.domain}`,
siteId: site1.siteId, // siteId: site1.siteId,
orgId: site1.orgId, // orgId: site1.orgId,
name: "Web Server", // name: "Web Server",
subdomain: "web", // subdomain: "web",
}) // })
.returning() // .returning()
.get(); // .get();
const resource2 = db // const resource2 = db
.insert(resources) // .insert(resources)
.values({ // .values({
resourceId: `web2.${site1.subdomain}.${org1.domain}`, // resourceId: `web2.${site1.subdomain}.${org1.domain}`,
siteId: site1.siteId, // siteId: site1.siteId,
orgId: site1.orgId, // orgId: site1.orgId,
name: "Web Server 2", // name: "Web Server 2",
subdomain: "web2", // subdomain: "web2",
}) // })
.returning() // .returning()
.get(); // .get();
const resource3 = db // const resource3 = db
.insert(resources) // .insert(resources)
.values({ // .values({
resourceId: `db.${site2.subdomain}.${org2.domain}`, // resourceId: `db.${site2.subdomain}.${org2.domain}`,
siteId: site2.siteId, // siteId: site2.siteId,
orgId: site2.orgId, // orgId: site2.orgId,
name: "Database", // name: "Database",
subdomain: "db", // subdomain: "db",
}) // })
.returning() // .returning()
.get(); // .get();
// Insert dummy routes // // Insert dummy routes
await db.insert(routes).values([ // await db.insert(routes).values([
{ exitNodeId: exitNode1.exitNodeId, subnet: "10.0.0.0/24" }, // { exitNodeId: exitNode1.exitNodeId, subnet: "10.0.0.0/24" },
{ exitNodeId: exitNode2.exitNodeId, subnet: "172.16.1.1/24" }, // { exitNodeId: exitNode2.exitNodeId, subnet: "172.16.1.1/24" },
]); // ]);
// Insert dummy targets // // Insert dummy targets
await db.insert(targets).values([ // await db.insert(targets).values([
{ // {
resourceId: resource1.resourceId, // resourceId: resource1.resourceId,
ip: "10.0.0.16", // ip: "10.0.0.16",
method: "http", // method: "http",
port: 4200, // port: 4200,
protocol: "TCP", // protocol: "TCP",
}, // },
{ // {
resourceId: resource2.resourceId, // resourceId: resource2.resourceId,
ip: "10.0.0.17", // ip: "10.0.0.17",
method: "https", // method: "https",
port: 443, // port: 443,
protocol: "TCP", // protocol: "TCP",
}, // },
{ // {
resourceId: resource3.resourceId, // resourceId: resource3.resourceId,
ip: "172.16.1.16", // ip: "172.16.1.16",
method: "http", // method: "http",
port: 80, // port: 80,
protocol: "TCP", // protocol: "TCP",
}, // },
]); // ]);
console.log("Dummy data inserted successfully"); // console.log("Dummy data inserted successfully");
} }
insertDummyData().catch(console.error); insertDummyData().catch(console.error);

View file

@ -37,7 +37,6 @@ export async function listRoleSites(req: Request, res: Response, next: NextFunct
.select({ .select({
siteId: sites.siteId, siteId: sites.siteId,
name: sites.name, name: sites.name,
subdomain: sites.subdomain,
}) })
.from(roleSites) .from(roleSites)
.innerJoin(sites, eq(roleSites.siteId, sites.siteId)) .innerJoin(sites, eq(roleSites.siteId, sites.siteId))

View file

@ -10,7 +10,7 @@ import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions';
import logger from '@server/logger'; import logger from '@server/logger';
const listRolesParamsSchema = z.object({ const listRolesParamsSchema = z.object({
orgId: z.string().optional().transform(Number).pipe(z.number().int().positive()), orgId: z.string()
}); });
const listRolesSchema = z.object({ const listRolesSchema = z.object({
@ -61,14 +61,11 @@ export async function listRoles(req: Request, res: Response, next: NextFunction)
orgName: orgs.name, orgName: orgs.name,
}) })
.from(roles) .from(roles)
.leftJoin(orgs, eq(roles.orgId, orgs.orgId)); .leftJoin(orgs, eq(roles.orgId, orgs.orgId))
.where(eq(roles.orgId, orgId));
let countQuery: any = db.select({ count: sql<number>`cast(count(*) as integer)` }).from(roles); let countQuery: any = db.select({ count: sql<number>`cast(count(*) as integer)` }).from(roles)
.where(eq(roles.orgId, orgId));
if (orgId) {
baseQuery = baseQuery.where(eq(roles.orgId, orgId));
countQuery = countQuery.where(eq(roles.orgId, orgId));
}
const rolesList = await baseQuery.limit(limit).offset(offset); const rolesList = await baseQuery.limit(limit).offset(offset);
const totalCountResult = await countQuery; const totalCountResult = await countQuery;

View file

@ -25,7 +25,7 @@ const createSiteSchema = z.object({
subnet: z.string().optional(), subnet: z.string().optional(),
}); });
export type GetSiteResponse = { export type CreateSiteResponse = {
name: string; name: string;
siteId: number; siteId: number;
orgId: string; orgId: string;

View file

@ -11,7 +11,7 @@ import { eq } from 'drizzle-orm';
const addUserSiteSchema = z.object({ const addUserSiteSchema = z.object({
userId: z.string(), userId: z.string(),
siteId: z.string().optional().transform(stoi).pipe(z.number().int().positive().optional()), siteId: z.string().transform(Number).pipe(z.number().int().positive()),
}); });
export async function addUserSite(req: Request, res: Response, next: NextFunction): Promise<any> { export async function addUserSite(req: Request, res: Response, next: NextFunction): Promise<any> {

View file

@ -28,7 +28,6 @@ import {
} from "@/components/ui/select" } from "@/components/ui/select"
import { Textarea } from "@/components/ui/textarea" import { Textarea } from "@/components/ui/textarea"
import { useSiteContext } from "@app/hooks/useSiteContext" import { useSiteContext } from "@app/hooks/useSiteContext"
import api from "@app/api"
const GeneralFormSchema = z.object({ const GeneralFormSchema = z.object({
name: z.string() name: z.string()

View file

@ -1,5 +1,5 @@
import { Separator } from "@/components/ui/separator" import { Separator } from "@/components/ui/separator"
import { AccountForm } from "@/app/configuration/account/account-form" import { AccountForm } from "./account-form"
export default function SettingsAccountPage() { export default function SettingsAccountPage() {
return ( return (

View file

@ -1,5 +1,5 @@
import { Separator } from "@/components/ui/separator" import { Separator } from "@/components/ui/separator"
import { AppearanceForm } from "@/app/configuration/appearance/appearance-form" import { AppearanceForm } from "./appearance-form"
export default function SettingsAppearancePage() { export default function SettingsAppearancePage() {
return ( return (

View file

@ -1,5 +1,5 @@
import { Separator } from "@/components/ui/separator" import { Separator } from "@/components/ui/separator"
import { DisplayForm } from "@/app/configuration/display/display-form" import { DisplayForm } from "./display-form"
export default function SettingsDisplayPage() { export default function SettingsDisplayPage() {
return ( return (

View file

@ -40,16 +40,6 @@ interface SettingsLayoutProps {
export default function SettingsLayout({ children }: SettingsLayoutProps) { export default function SettingsLayout({ children }: SettingsLayoutProps) {
return ( return (
<> <>
<div className="w-full bg-stone-200 border-b border-stone-300 mb-6 select-none sm:px-0 px-3">
<div className="container mx-auto flex flex-col content-between gap-4 pt-2">
<Header
email={"user.email"}
orgName={"Profile"}
/>
</div>
</div>
<div className="md:hidden"> <div className="md:hidden">
<Image <Image
src="/configuration/forms-light.png" src="/configuration/forms-light.png"

View file

@ -1,5 +1,5 @@
import { Separator } from "@/components/ui/separator" import { Separator } from "@/components/ui/separator"
import { NotificationsForm } from "@/app/configuration/notifications/notifications-form" import { NotificationsForm } from "./notifications-form"
export default function SettingsNotificationsPage() { export default function SettingsNotificationsPage() {
return ( return (