Skip to content

Commit 7bf83c1

Browse files
authored
Merge pull request #3310 from bluewave-labs/fix/be/status-page-access
Fix: Authentication Middleware in StatusPage
2 parents 921a1c5 + e25669a commit 7bf83c1

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

server/src/config/routes.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { createVerifyJWT } from "../middleware/verifyJWT.js";
2+
import { createVerifyStatusPageAccess } from "../middleware/verifyStatusPageAccess.js";
23
import { authApiLimiter } from "../middleware/rateLimiter.js";
34

45
import AuthRoutes from "../routes/authRoute.js";
@@ -25,7 +26,8 @@ export const setupRoutes = (app: any, controllers: Record<string, any>, services
2526
const maintenanceWindowRoutes = new MaintenanceWindowRoutes(controllers.maintenanceWindowController);
2627
const queueRoutes = new QueueRoutes(controllers.queueController);
2728
const logRoutes = new LogRoutes(controllers.logController);
28-
const statusPageRoutes = new StatusPageRoutes(controllers.statusPageController, verifyJWT);
29+
const verifyStatusPageAccess = createVerifyStatusPageAccess(services.statusPagesRepository, verifyJWT);
30+
const statusPageRoutes = new StatusPageRoutes(controllers.statusPageController, verifyJWT, verifyStatusPageAccess);
2931
const notificationRoutes = new NotificationRoutes(controllers.notificationController);
3032
const diagnosticRoutes = new DiagnosticRoutes(controllers.diagnosticController, verifyJWT);
3133
const incidentRoutes = new IncidentRoutes(controllers.incidentController);

server/src/controllers/statusPageController.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ class StatusPageController {
7878
}
7979

8080
const statusPage = await this.statusPageService.getStatusPageByUrl(req.params.url as string);
81+
82+
if (!statusPage.isPublished) {
83+
const teamId = requireTeamId(req?.user?.teamId);
84+
if (statusPage.teamId !== teamId) {
85+
throw new AppError({ message: "Forbidden", status: 403 });
86+
}
87+
}
88+
8189
const settings = await this.settingsService.getDBSettings();
8290
const showURL = settings.showURL;
8391

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { NextFunction, Request, RequestHandler, Response } from "express";
2+
import { IStatusPagesRepository } from "@/repositories/index.js";
3+
import { AppError } from "@/utils/AppError.js";
4+
5+
export const createVerifyStatusPageAccess = (statusPagesRepository: IStatusPagesRepository, verifyJWT: RequestHandler) => {
6+
return async (req: Request, res: Response, next: NextFunction) => {
7+
try {
8+
const url = req.params.url;
9+
if (!url) {
10+
throw new AppError({ message: "Status page URL is required", status: 400 });
11+
}
12+
const statusPage = await statusPagesRepository.findByUrl(url);
13+
if (statusPage.isPublished) {
14+
next(); // Published — no auth needed
15+
} else {
16+
verifyJWT(req, res, next); // Unpublished — require JWT
17+
}
18+
} catch (error) {
19+
next(error);
20+
}
21+
};
22+
};

server/src/routes/statusPageRoute.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ class StatusPageRoutes {
66
private router: Router;
77
private statusPageController: any;
88

9-
constructor(statusPageController: any, verifyJWT: RequestHandler) {
9+
constructor(statusPageController: any, verifyJWT: RequestHandler, verifyStatusPageAccess: RequestHandler) {
1010
this.router = Router();
1111
this.statusPageController = statusPageController;
12-
this.initRoutes(verifyJWT);
12+
this.initRoutes(verifyJWT, verifyStatusPageAccess);
1313
}
1414

15-
initRoutes(verifyJWT: RequestHandler) {
15+
initRoutes(verifyJWT: RequestHandler, verifyStatusPageAccess: RequestHandler) {
1616
this.router.get("/team", verifyJWT, this.statusPageController.getStatusPagesByTeamId);
1717

1818
this.router.post("/", upload.single("logo"), verifyJWT, this.statusPageController.createStatusPage);
1919
this.router.put("/:id", upload.single("logo"), verifyJWT, this.statusPageController.updateStatusPage);
2020

21-
this.router.get("/:url", this.statusPageController.getStatusPageByUrl);
21+
this.router.get("/:url", verifyStatusPageAccess, this.statusPageController.getStatusPageByUrl);
2222
this.router.delete("/:id", verifyJWT, this.statusPageController.deleteStatusPage);
2323
}
2424

0 commit comments

Comments
 (0)