From d8671355a6f5b6f377af7ce74ff6f7aa0324ec8e Mon Sep 17 00:00:00 2001 From: dswbx Date: Sat, 11 Jan 2025 15:45:32 +0100 Subject: [PATCH] exposed bknd middlewares to be used for custom routes --- app/__test__/auth/middleware.spec.ts | 8 -------- app/__test__/modules/AppAuth.spec.ts | 4 ++-- app/package.json | 2 +- app/src/App.ts | 1 - app/src/auth/middlewares.ts | 16 ++++++++-------- app/src/index.ts | 1 + app/src/modules/Controller.ts | 7 +------ app/src/modules/Module.ts | 8 ++++---- app/src/modules/index.ts | 2 +- app/src/modules/middlewares.ts | 1 + app/src/modules/server/SystemController.ts | 2 +- 11 files changed, 20 insertions(+), 32 deletions(-) create mode 100644 app/src/modules/middlewares.ts diff --git a/app/__test__/auth/middleware.spec.ts b/app/__test__/auth/middleware.spec.ts index d7e3f30..5fef79c 100644 --- a/app/__test__/auth/middleware.spec.ts +++ b/app/__test__/auth/middleware.spec.ts @@ -1,9 +1 @@ import { describe, expect, it } from "bun:test"; -import { shouldSkipAuth } from "../../src/auth/middlewares"; - -describe("auth middleware", () => { - it("should skip auth on asset paths", () => { - expect(shouldSkipAuth(new Request("http://localhost/assets/test.js"))).toBe(true); - expect(shouldSkipAuth(new Request("http://localhost/"))).toBe(false); - }); -}); diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index 11b1d03..225c9d6 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -79,7 +79,7 @@ describe("AppAuth", () => { } }); - test("registers auth middleware automatically", async () => { + test("registers auth middleware for bknd routes only", async () => { const app = createApp({ initialConfig: { auth: { @@ -101,7 +101,7 @@ describe("AppAuth", () => { await app.server.request("/api/system/ping"); await app.server.request("/test"); - expect(spy.mock.calls.length).toBe(2); + expect(spy.mock.calls.length).toBe(1); }); test("should allow additional user fields", async () => { diff --git a/app/package.json b/app/package.json index ab050af..e0e3338 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,7 @@ "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.5.0-rc13", + "version": "0.5.0-rc14", "scripts": { "build:all": "NODE_ENV=production bun run build.ts --minify --types --clean && bun run build:cli", "dev": "vite", diff --git a/app/src/App.ts b/app/src/App.ts index 5382562..bead262 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -111,7 +111,6 @@ export class App { await Promise.all(this.plugins.map((plugin) => plugin(this))); } - //console.log("emitting built", options); await this.emgr.emit(new AppBuiltEvent({ app: this })); server.all("/api/*", async (c) => c.notFound()); diff --git a/app/src/auth/middlewares.ts b/app/src/auth/middlewares.ts index ce579aa..50fd2d4 100644 --- a/app/src/auth/middlewares.ts +++ b/app/src/auth/middlewares.ts @@ -33,17 +33,17 @@ export const auth = (options?: { c.set("auth_registered", true); const app = c.get("app"); - const skipped = shouldSkip(c, options?.skip) || !app.module.auth.enabled; - const guard = app.modules.ctx().guard; - const authenticator = app.module.auth.authenticator; + const skipped = shouldSkip(c, options?.skip) || !app?.module.auth.enabled; + const guard = app?.modules.ctx().guard; + const authenticator = app?.module.auth.authenticator; if (!skipped) { const resolved = c.get("auth_resolved"); if (!resolved) { if (!app.module.auth.enabled) { - guard.setUserContext(undefined); + guard?.setUserContext(undefined); } else { - guard.setUserContext(await authenticator.resolveAuthFromRequest(c)); + guard?.setUserContext(await authenticator?.resolveAuthFromRequest(c)); c.set("auth_resolved", true); } } @@ -53,11 +53,11 @@ export const auth = (options?: { if (!skipped) { // renew cookie if applicable - authenticator.requestCookieRefresh(c); + authenticator?.requestCookieRefresh(c); } // release - guard.setUserContext(undefined); + guard?.setUserContext(undefined); authenticator?.resetUser(); c.set("auth_resolved", false); }); @@ -75,7 +75,7 @@ export const permission = ( //console.log("skip?", c.get("auth_skip")); // in tests, app is not defined - if (!c.get("auth_registered")) { + if (!c.get("auth_registered") || !app) { const msg = `auth middleware not registered, cannot check permissions for ${getPath(c)}`; if (app?.module.auth.enabled) { throw new Error(msg); diff --git a/app/src/index.ts b/app/src/index.ts index 1e5b71d..84a5d97 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -9,6 +9,7 @@ export { type ModuleBuildContext } from "./modules/ModuleManager"; +export * as middlewares from "modules/middlewares"; export { registries } from "modules/registries"; export type * from "./adapter"; diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts index 4d50a80..674c2a0 100644 --- a/app/src/modules/Controller.ts +++ b/app/src/modules/Controller.ts @@ -1,11 +1,6 @@ -import { auth, permission } from "auth/middlewares"; import { Hono } from "hono"; import type { ServerEnv } from "modules/Module"; - -const middlewares = { - auth, - permission -} as const; +import * as middlewares from "modules/middlewares"; export class Controller { protected middlewares = middlewares; diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index c217686..838e964 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -9,13 +9,13 @@ import type { Hono } from "hono"; export type ServerEnv = { Variables: { - app: App; + app?: App; // to prevent resolving auth multiple times - auth_resolved: boolean; + auth_resolved?: boolean; // to only register once - auth_registered: boolean; + auth_registered?: boolean; // whether or not to bypass auth - auth_skip: boolean; + auth_skip?: boolean; html?: string; }; }; diff --git a/app/src/modules/index.ts b/app/src/modules/index.ts index 186a689..5411636 100644 --- a/app/src/modules/index.ts +++ b/app/src/modules/index.ts @@ -11,7 +11,7 @@ export { MODULE_NAMES, type ModuleKey } from "./ModuleManager"; -export { /*Module,*/ type ModuleBuildContext } from "./Module"; +export type { ModuleBuildContext } from "./Module"; export { type PrimaryFieldType, diff --git a/app/src/modules/middlewares.ts b/app/src/modules/middlewares.ts new file mode 100644 index 0000000..be1ad59 --- /dev/null +++ b/app/src/modules/middlewares.ts @@ -0,0 +1 @@ +export { auth, permission } from "auth/middlewares"; diff --git a/app/src/modules/server/SystemController.ts b/app/src/modules/server/SystemController.ts index 5f980b5..47ba55f 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -292,7 +292,7 @@ export class SystemController extends Controller { return c.json({ version: this.app.version(), test: 2, - app: c.get("app").version() + app: c.get("app")?.version() }); });