summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-03-25 17:25:30 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-03-25 17:25:30 -0400
commitd41d77fcd7c7c40b8409a22baecd0c0101db6e1e (patch)
treecec01a636388c2873dc46f8078a11e35faee0c7a /packages/backend/src
parentremerge: remove FetchAllowSoftFailMask in favor of our same-authority checks (diff)
downloadsharkey-d41d77fcd7c7c40b8409a22baecd0c0101db6e1e.tar.gz
sharkey-d41d77fcd7c7c40b8409a22baecd0c0101db6e1e.tar.bz2
sharkey-d41d77fcd7c7c40b8409a22baecd0c0101db6e1e.zip
revert 7bfada9792bc4d29d47d3895643543cbe15191cd: enhance: remove bull-board support
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/server/api/ApiServerService.ts3
-rw-r--r--packages/backend/src/server/web/ClientServerService.ts62
2 files changed, 65 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/ApiServerService.ts b/packages/backend/src/server/api/ApiServerService.ts
index 12459d5698..0d77309537 100644
--- a/packages/backend/src/server/api/ApiServerService.ts
+++ b/packages/backend/src/server/api/ApiServerService.ts
@@ -6,6 +6,7 @@
import { Inject, Injectable } from '@nestjs/common';
import cors from '@fastify/cors';
import multipart from '@fastify/multipart';
+import fastifyCookie from '@fastify/cookie';
import { ModuleRef } from '@nestjs/core';
import { AuthenticationResponseJSON } from '@simplewebauthn/types';
import type { Config } from '@/config.js';
@@ -56,6 +57,8 @@ export class ApiServerService {
},
});
+ fastify.register(fastifyCookie, {});
+
// Prevent cache
fastify.addHook('onRequest', (request, reply, done) => {
reply.header('Cache-Control', 'private, max-age=0, must-revalidate');
diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts
index 165e4f3f73..79deb107b0 100644
--- a/packages/backend/src/server/web/ClientServerService.ts
+++ b/packages/backend/src/server/web/ClientServerService.ts
@@ -7,12 +7,16 @@ import { randomUUID } from 'node:crypto';
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { Inject, Injectable } from '@nestjs/common';
+import { createBullBoard } from '@bull-board/api';
+import { BullMQAdapter } from '@bull-board/api/bullMQAdapter.js';
+import { FastifyAdapter as BullBoardFastifyAdapter } from '@bull-board/fastify';
import ms from 'ms';
import sharp from 'sharp';
import pug from 'pug';
import { In, IsNull } from 'typeorm';
import fastifyStatic from '@fastify/static';
import fastifyView from '@fastify/view';
+import fastifyCookie from '@fastify/cookie';
import fastifyProxy from '@fastify/http-proxy';
import vary from 'vary';
import htmlSafeJsonStringify from 'htmlescape';
@@ -222,6 +226,64 @@ export class ClientServerService {
@bindThis
public createServer(fastify: FastifyInstance, options: FastifyPluginOptions, done: (err?: Error) => void) {
+ fastify.register(fastifyCookie, {});
+
+ //#region Bull Dashboard
+ const bullBoardPath = '/queue';
+
+ // Authenticate
+ fastify.addHook('onRequest', async (request, reply) => {
+ if (request.routeOptions.url == null) {
+ reply.code(404).send('Not found');
+ return;
+ }
+
+ // %71ueueとかでリクエストされたら困るため
+ const url = decodeURI(request.routeOptions.url);
+ if (url === bullBoardPath || url.startsWith(bullBoardPath + '/')) {
+ if (!url.startsWith(bullBoardPath + '/static/')) {
+ reply.header('Cache-Control', 'private, max-age=0, must-revalidate');
+ }
+
+ const token = request.cookies.token;
+ if (token == null) {
+ reply.code(401).send('Login required');
+ return;
+ }
+ const user = await this.usersRepository.findOneBy({ token });
+ if (user == null) {
+ reply.code(403).send('No such user');
+ return;
+ }
+ const isAdministrator = await this.roleService.isAdministrator(user);
+ if (!isAdministrator) {
+ reply.code(403).send('Access denied');
+ return;
+ }
+ }
+ });
+
+ const bullBoardServerAdapter = new BullBoardFastifyAdapter();
+
+ createBullBoard({
+ queues: [
+ this.systemQueue,
+ this.endedPollNotificationQueue,
+ this.deliverQueue,
+ this.inboxQueue,
+ this.dbQueue,
+ this.relationshipQueue,
+ this.objectStorageQueue,
+ this.userWebhookDeliverQueue,
+ this.systemWebhookDeliverQueue,
+ ].map(q => new BullMQAdapter(q)),
+ serverAdapter: bullBoardServerAdapter,
+ });
+
+ bullBoardServerAdapter.setBasePath(bullBoardPath);
+ (fastify.register as any)(bullBoardServerAdapter.registerPlugin(), { prefix: bullBoardPath });
+ //#endregion
+
fastify.register(fastifyView, {
root: _dirname + '/views',
engine: {