1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2025-07-03 00:47:20 +02:00
Files
pigallery2/src/backend/middlewares/RenderingMWs.ts

168 lines
4.5 KiB
TypeScript
Raw Normal View History

import {NextFunction, Request, Response} from 'express';
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
import {Message} from '../../common/entities/Message';
import {PrivateConfigClass} from '../../common/config/private/PrivateConfigClass';
import {UserDTO, UserRoles} from '../../common/entities/UserDTO';
import {NotificationManager} from '../model/NotifocationManager';
import {Logger} from '../Logger';
import {SharingDTO} from '../../common/entities/SharingDTO';
import {Utils} from '../../common/Utils';
import {LoggerRouter} from '../routes/LoggerRouter';
import {TAGS} from '../../common/config/public/ClientConfig';
2023-11-13 16:51:25 +01:00
import {ExtensionConfigWrapper} from '../model/extension/ExtensionConfigWrapper';
const forcedDebug = process.env['NODE_ENV'] === 'debug';
export class RenderingMWs {
2022-04-04 19:37:31 +02:00
public static renderResult(
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
if (typeof req.resultPipe === 'undefined') {
return next();
}
return RenderingMWs.renderMessage(res, req.resultPipe);
}
2022-04-04 19:37:31 +02:00
public static renderSessionUser(
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
2022-04-04 19:37:31 +02:00
if (!req.session['user']) {
2018-03-30 15:30:30 -04:00
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'User not exists'));
}
const user = {
2022-04-04 19:37:31 +02:00
id: req.session['user'].id,
name: req.session['user'].name,
csrfToken: req.session['user'].csrfToken || req.csrfToken(),
role: req.session['user'].role,
usedSharingKey: req.session['user'].usedSharingKey,
permissions: req.session['user'].permissions,
} as UserDTO;
2020-01-07 22:17:54 +01:00
if (!user.csrfToken && req.csrfToken) {
user.csrfToken = req.csrfToken();
}
RenderingMWs.renderMessage(res, user);
}
2022-04-04 19:37:31 +02:00
public static renderSharing(
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
if (!req.resultPipe) {
2017-07-03 19:17:49 +02:00
return next();
}
2017-07-03 19:17:49 +02:00
2022-12-10 00:32:31 +01:00
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const {password, creator, ...sharing} = req.resultPipe as SharingDTO;
2017-07-03 19:17:49 +02:00
RenderingMWs.renderMessage(res, sharing);
}
2022-04-04 19:37:31 +02:00
public static renderSharingList(
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
if (!req.resultPipe) {
return next();
}
2022-04-25 18:09:06 +02:00
const shares = Utils.clone(req.resultPipe as SharingDTO[]);
shares.forEach((s): void => {
delete s.password;
delete s.creator.password;
});
return RenderingMWs.renderMessage(res, shares);
}
2022-04-04 19:37:31 +02:00
public static renderFile(
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
if (!req.resultPipe) {
return next();
}
2022-04-25 18:09:06 +02:00
return res.sendFile(req.resultPipe as string, {
2022-04-04 19:37:31 +02:00
maxAge: 31536000,
dotfiles: 'allow',
});
}
2022-04-04 19:37:31 +02:00
public static renderOK(
req: Request,
res: Response
2022-04-04 19:37:31 +02:00
): void {
const message = new Message<string>(null, 'ok');
res.json(message);
}
2022-04-04 19:37:31 +02:00
public static async renderConfig(
req: Request,
res: Response
2022-04-04 19:37:31 +02:00
): Promise<void> {
2023-11-13 16:51:25 +01:00
const originalConf = await ExtensionConfigWrapper.original();
// These are sensitive information, do not send to the client side
originalConf.Server.sessionSecret = null;
2024-03-25 23:10:10 +01:00
const originalConfJSON = JSON.parse(JSON.stringify(originalConf.toJSON({
attachState: true,
attachVolatile: true,
skipTags: {secret: true} as TAGS
}) as PrivateConfigClass));
2022-04-04 19:37:31 +02:00
const message = new Message<PrivateConfigClass>(
null,
2024-03-25 23:10:10 +01:00
originalConfJSON
2022-04-04 19:37:31 +02:00
);
2017-07-08 12:43:42 +02:00
res.json(message);
}
2022-04-04 19:37:31 +02:00
public static renderError(
err: Error,
req: Request,
res: Response,
next: NextFunction
2022-04-25 18:09:06 +02:00
): void {
2017-07-15 12:47:11 +02:00
if (err instanceof ErrorDTO) {
2017-07-13 23:39:09 +02:00
if (err.details) {
LoggerRouter.log(logFn, req, res);
// use separate rendering for detailsStr
const d = err.detailsStr;
delete err.detailsStr;
console.log(err);
err.detailsStr = d;
2022-04-04 19:37:31 +02:00
delete err.details; // do not send back error object to the client side
2019-12-10 14:50:20 +01:00
// hide error details for non developers
2022-04-04 19:37:31 +02:00
if (
!(
forcedDebug ||
(req.session &&
req.session['user'] &&
req.session['user'].role >= UserRoles.Developer)
)
2022-04-04 19:37:31 +02:00
) {
delete err.detailsStr;
2017-07-13 23:39:09 +02:00
}
2017-07-09 14:23:50 +02:00
}
2022-04-25 18:09:06 +02:00
const message = new Message<null>(err, null);
res.json(message);
return;
}
NotificationManager.error('Unknown server error', err, req);
return next(err);
}
protected static renderMessage<T>(res: Response, content: T): void {
const message = new Message<T>(null, content);
res.json(message);
}
}