From 38f7bcf4e2bb4d390a5df65de119af92d577de7a Mon Sep 17 00:00:00 2001 From: Alejandro Saenz Date: Thu, 3 Sep 2020 08:57:43 -0400 Subject: [PATCH] fix(report generation): updated puppeteer report generation so that it outputs to the `temp` folder fix #259 --- src/app.ts | 4 +- src/temp/.gitkeep | 0 src/temp/empty.ts | 1 + src/utilities/puppeteer.utility.ts | 76 ++++++++++++++---------------- 4 files changed, 39 insertions(+), 42 deletions(-) delete mode 100644 src/temp/.gitkeep create mode 100644 src/temp/empty.ts diff --git a/src/app.ts b/src/app.ts index 3bc48980..da3ed4ee 100644 --- a/src/app.ts +++ b/src/app.ts @@ -21,7 +21,7 @@ import * as assetController from './routes/asset.controller'; import * as assessmentController from './routes/assessment.controller'; import * as vulnController from './routes/vulnerability.controller'; import * as jwtMiddleware from './middleware/jwt.middleware'; -const puppeteerUtility = require('./utilities/puppeteer.utility'); +import { generateReport } from './utilities/puppeteer.utility'; const helmet = require('helmet'); const cors = require('cors'); const app = express(); @@ -99,7 +99,7 @@ createConnection().then((_) => { jwtMiddleware.checkToken, assessmentController.queryReportDataByAssessment ); - app.post('/api/report/generate', jwtMiddleware.checkToken, puppeteerUtility.generateReport); + app.post('/api/report/generate', jwtMiddleware.checkToken, generateReport); app.get('/api/vulnerability/:vulnId', jwtMiddleware.checkToken, vulnController.getVulnById); app.delete('/api/vulnerability/:vulnId', jwtMiddleware.checkToken, vulnController.deleteVulnById); app.patch('/api/vulnerability/:vulnId', jwtMiddleware.checkToken, vulnController.patchVulnById); diff --git a/src/temp/.gitkeep b/src/temp/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/temp/empty.ts b/src/temp/empty.ts new file mode 100644 index 00000000..274373b6 --- /dev/null +++ b/src/temp/empty.ts @@ -0,0 +1 @@ +// The purpose of this file is to ensure the temp directory is created during ts compilation diff --git a/src/utilities/puppeteer.utility.ts b/src/utilities/puppeteer.utility.ts index dabe67e6..bc10e404 100644 --- a/src/utilities/puppeteer.utility.ts +++ b/src/utilities/puppeteer.utility.ts @@ -10,45 +10,41 @@ const fs = require('fs'); * new html page with PDF Report * @returns a new page generated by Puppeteer with a Report in PDF format */ -const generateReport = async (req: UserRequest, res: Response) => { - if (!req.body.orgId || !req.body.assetId || !req.body.assessmentId) { - return res.status(400).send('Invalid report parameters'); - } - const url = - process.env.NODE_ENV === 'production' - ? `${process.env.PROD_URL}/#/organization/${req.body.orgId} +export const generateReport = async (req: UserRequest, res: Response) => { + if (!req.body.orgId || !req.body.assetId || !req.body.assessmentId) { + return res.status(400).send('Invalid report parameters'); + } + const url = + process.env.NODE_ENV === 'production' + ? `${process.env.PROD_URL}/#/organization/${req.body.orgId} /asset/${req.body.assetId}/assessment/${req.body.assessmentId}/report/puppeteer` - : `${process.env.DEV_URL}/#/organization/${req.body.orgId} + : `${process.env.DEV_URL}/#/organization/${req.body.orgId} /asset/${req.body.assetId}/assessment/${req.body.assessmentId}/report/puppeteer`; - const browser = await puppeteer.launch({ - args: ['--no-sandbox', '--disable-setuid-sandbox'] - }); - const page = await browser.newPage(); - const filePath = path.join(__dirname, '../temp_report.pdf'); - const jwtToken = req.headers.authorization; - await page.evaluateOnNewDocument(token => { - localStorage.clear(); - localStorage.setItem('AUTH_TOKEN', token); - }, jwtToken); - await page.goto(url, { waitUntil: 'networkidle0' }); - await page.pdf({ path: filePath, format: 'A4' }); - await browser.close(); - const file = fs.createReadStream(filePath); - const stat = fs.statSync(filePath); - res.setHeader('Content-Length', stat.size); - res.setHeader('Content-Type', 'application/pdf'); - res.setHeader('Content-Disposition', 'attachment; filename=report.pdf'); - file.pipe(res); - fs.unlink(filePath, (err, response) => { - if (err) { - // handle error here - } else { - // tslint:disable-next-line: no-console - console.info('File removed'); - } - }); -} - -module.exports = { - generateReport -} \ No newline at end of file + const browser = await puppeteer.launch({ + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + const page = await browser.newPage(); + const filePath = path.join(__dirname, '../temp/temp_report.pdf'); + const jwtToken = req.headers.authorization; + await page.evaluateOnNewDocument((token) => { + localStorage.clear(); + localStorage.setItem('AUTH_TOKEN', token); + }, jwtToken); + await page.goto(url, { waitUntil: 'networkidle0' }); + await page.pdf({ path: filePath, format: 'A4' }); + await browser.close(); + const file = fs.createReadStream(filePath); + const stat = fs.statSync(filePath); + res.setHeader('Content-Length', stat.size); + res.setHeader('Content-Type', 'application/pdf'); + res.setHeader('Content-Disposition', 'attachment; filename=report.pdf'); + file.pipe(res); + fs.unlink(filePath, (err, response) => { + if (err) { + // handle error here + } else { + // tslint:disable-next-line: no-console + console.info('File removed'); + } + }); +};