Skip to content

Commit

Permalink
fix(report generation): updated puppeteer report generation so that i…
Browse files Browse the repository at this point in the history
…t outputs to the `temp` folder

fix #259
  • Loading branch information
alejandrosaenz117 committed Sep 3, 2020
1 parent 1da9e7c commit 38f7bcf
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 42 deletions.
4 changes: 2 additions & 2 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down
Empty file removed src/temp/.gitkeep
Empty file.
1 change: 1 addition & 0 deletions src/temp/empty.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// The purpose of this file is to ensure the temp directory is created during ts compilation
76 changes: 36 additions & 40 deletions src/utilities/puppeteer.utility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
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');
}
});
};

0 comments on commit 38f7bcf

Please sign in to comment.