2018-03-30 15:30:30 -04:00
|
|
|
import {NextFunction, Request, Response} from 'express';
|
|
|
|
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
|
|
|
|
import {Message} from '../../common/entities/Message';
|
2020-01-28 18:36:52 +01:00
|
|
|
import {Config, PrivateConfigClass} from '../../common/config/private/Config';
|
2020-01-07 22:17:54 +01:00
|
|
|
import {UserDTO, UserRoles} from '../../common/entities/UserDTO';
|
2018-03-30 15:30:30 -04:00
|
|
|
import {NotificationManager} from '../model/NotifocationManager';
|
|
|
|
import {Logger} from '../Logger';
|
2016-03-26 11:19:10 +01:00
|
|
|
|
|
|
|
export class RenderingMWs {
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
public static renderResult(req: Request, res: Response, next: NextFunction) {
|
2018-05-12 12:19:51 -04:00
|
|
|
if (typeof req.resultPipe === 'undefined') {
|
2017-06-10 22:32:56 +02:00
|
|
|
return next();
|
2018-05-12 12:19:51 -04:00
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
return RenderingMWs.renderMessage(res, req.resultPipe);
|
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
public static renderSessionUser(req: Request, res: Response, next: NextFunction) {
|
|
|
|
if (!(req.session.user)) {
|
2018-03-30 15:30:30 -04:00
|
|
|
return next(new ErrorDTO(ErrorCodes.GENERAL_ERROR, 'User not exists'));
|
2016-03-26 11:19:10 +01:00
|
|
|
}
|
|
|
|
|
2020-01-07 22:17:54 +01:00
|
|
|
const user = <UserDTO>{
|
|
|
|
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
|
|
|
|
};
|
|
|
|
|
|
|
|
if (!user.csrfToken && req.csrfToken) {
|
|
|
|
user.csrfToken = req.csrfToken();
|
|
|
|
}
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
RenderingMWs.renderMessage(res, user);
|
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
public static renderSharing(req: Request, res: Response, next: NextFunction) {
|
2018-05-12 12:19:51 -04:00
|
|
|
if (!req.resultPipe) {
|
2017-07-03 19:17:49 +02:00
|
|
|
return next();
|
2018-05-12 12:19:51 -04:00
|
|
|
}
|
2017-07-03 19:17:49 +02:00
|
|
|
|
2020-01-07 22:17:54 +01:00
|
|
|
const {password, creator, ...sharing} = req.resultPipe;
|
2017-07-03 19:17:49 +02:00
|
|
|
RenderingMWs.renderMessage(res, sharing);
|
|
|
|
}
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
public static renderFile(req: Request, res: Response, next: NextFunction) {
|
2018-05-12 12:19:51 -04:00
|
|
|
if (!req.resultPipe) {
|
2017-06-10 22:32:56 +02:00
|
|
|
return next();
|
2018-05-12 12:19:51 -04:00
|
|
|
}
|
2019-12-29 23:25:22 +01:00
|
|
|
return res.sendFile(req.resultPipe, {maxAge: 31536000, dotfiles: 'allow'});
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static renderOK(req: Request, res: Response, next: NextFunction) {
|
2018-05-12 12:19:51 -04:00
|
|
|
const message = new Message<string>(null, 'ok');
|
2017-06-10 22:32:56 +02:00
|
|
|
res.json(message);
|
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
2017-07-08 12:43:42 +02:00
|
|
|
|
2020-01-28 18:36:52 +01:00
|
|
|
public static async renderConfig(req: Request, res: Response, next: NextFunction) {
|
|
|
|
const originalConf = await Config.original();
|
2020-01-03 20:28:03 +01:00
|
|
|
originalConf.Server.sessionSecret = null;
|
2020-01-28 18:36:52 +01:00
|
|
|
const message = new Message<PrivateConfigClass>(null, <any>originalConf.toJSON({attachDefaults: true}));
|
2017-07-08 12:43:42 +02:00
|
|
|
res.json(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
public static renderError(err: any, req: Request, res: Response, next: NextFunction): any {
|
2017-07-09 14:23:50 +02:00
|
|
|
|
2017-07-15 12:47:11 +02:00
|
|
|
if (err instanceof ErrorDTO) {
|
2017-07-13 23:39:09 +02:00
|
|
|
if (err.details) {
|
2019-01-02 21:21:20 +01:00
|
|
|
Logger.warn('Handled error:');
|
|
|
|
console.log(err);
|
2019-12-10 14:50:20 +01:00
|
|
|
delete (err.details); // do not send back error object to the client side
|
|
|
|
|
|
|
|
// hide error details for non developers
|
2017-07-13 23:39:09 +02:00
|
|
|
if (!(req.session.user && req.session.user.role >= UserRoles.Developer)) {
|
2019-12-10 14:50:20 +01:00
|
|
|
delete (err.detailsStr);
|
2017-07-13 23:39:09 +02:00
|
|
|
}
|
2017-07-09 14:23:50 +02:00
|
|
|
}
|
2018-05-12 12:19:51 -04:00
|
|
|
const message = new Message<any>(err, null);
|
2017-06-10 22:32:56 +02:00
|
|
|
return res.json(message);
|
2016-03-26 11:19:10 +01:00
|
|
|
}
|
2018-03-30 15:30:30 -04:00
|
|
|
NotificationManager.error('unknown server error', err);
|
2017-06-10 22:32:56 +02:00
|
|
|
return next(err);
|
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
protected static renderMessage<T>(res: Response, content: T) {
|
2018-05-12 12:19:51 -04:00
|
|
|
const message = new Message<T>(null, content);
|
2017-06-10 22:32:56 +02:00
|
|
|
res.json(message);
|
|
|
|
}
|
2016-03-26 11:19:10 +01:00
|
|
|
|
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|