Skip to content

Commit 19789b4

Browse files
authored
Xendit #8 - Security (#8)
* Add helmet as dependency for setting headers * Add test cases for checking http headers from helmet
1 parent 05aa2f7 commit 19789b4

File tree

6 files changed

+70
-4
lines changed

6 files changed

+70
-4
lines changed

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ const sqlite3 = require('sqlite3').verbose();
44

55
const db = new sqlite3.Database(':memory:');
66
const buildSchemas = require('./src/schemas');
7+
const logger = require('./src/lib/logger');
78

89
db.serialize(() => {
910
buildSchemas(db);
1011

1112
const app = require('./src/app')(db);
12-
app.listen(port, () => console.log(`App started and listening on port ${port}`));
13+
app.listen(port, () => logger.info(`App started and listening on port ${port}`));
1314
});

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"body-parser": "^1.19.0",
2121
"express": "^4.16.4",
2222
"faker": "^5.1.0",
23+
"helmet": "^4.1.1",
2324
"http-status-codes": "^2.1.4",
2425
"sqlite3": "^4.0.6",
2526
"swagger-ui-express": "^4.1.4",

src/app.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ const express = require('express');
33
const app = express();
44

55
const bodyParser = require('body-parser');
6+
const helmet = require('helmet');
67

7-
const jsonParser = bodyParser.json();
8+
const jsonParser = bodyParser.json({ limit: '2kb' });
89

910
const swaggerUI = require('swagger-ui-express');
1011
const swaggerFile = require('./resources/api-v1-swagger.json');
@@ -20,6 +21,8 @@ module.exports = (db) => {
2021
const repository = new RideRepository(db, RideEntity, selectQuery, insertQuery);
2122
const controller = new RideController(repository);
2223

24+
app.use(helmet());
25+
2326
app.get('/health', (req, res) => res.send('Healthy'));
2427

2528
app.use('/api-documentation/v1', swaggerUI.serve, swaggerUI.setup(swaggerFile));

src/lib/logger.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const {
55
} = require('winston');
66
const path = require('path');
77

8-
const LOGGING_LEVEL = 'error';
8+
const LOGGING_LEVEL = 'info';
99
const logger = createLogger({
1010
level: LOGGING_LEVEL,
1111
format: format.combine(
@@ -18,12 +18,13 @@ const logger = createLogger({
1818
),
1919
transports: [
2020
new transports.File({
21+
level: LOGGING_LEVEL,
2122
filename: 'rider-api.log',
2223
handleExceptions: true,
2324
format: format.combine(
2425
format.colorize(),
2526
format.printf(
26-
(info) => `${info.timestamp} ${LOGGING_LEVEL} [${info.label}]: ${info.message}`,
27+
(info) => `${info.timestamp} ${info.level} [${info.label}]: ${info.message}`,
2728
),
2829
),
2930
}),

tests/api.test.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,24 @@ describe('API tests', () => {
111111
});
112112

113113
describe('GET /rides', () => {
114+
it('should return a response with pre-set headers from helmet',
115+
(done) => {
116+
request(app).
117+
get('/rides').
118+
expect('Content-Type', /json/).
119+
expect(200).
120+
expect('X-DNS-Prefetch-Control', 'off').
121+
expect('Expect-CT', 'max-age=0').
122+
expect('X-Download-Options', 'noopen').
123+
expect('X-Content-Type-Options', 'nosniff').
124+
expect('X-XSS-Protection', '0').
125+
expect('Content-Security-Policy', 'default-src' +
126+
' \'self\';base-uri' +
127+
' \'self\';block-all-mixed-content;font-src \'self\'' +
128+
' https: data:;frame-ancestors \'self\';img-src \'self\' data:;object-src \'none\';script-src \'self\';script-src-attr \'none\';style-src \'self\' https: \'unsafe-inline\';upgrade-insecure-requests',
129+
done);
130+
});
131+
114132
it('should return exactly 10 rides given no limit query parameter',
115133
(done) => {
116134
const limit = 10;
@@ -223,6 +241,23 @@ describe('API tests', () => {
223241
});
224242

225243
describe('GET /rides/${id}', () => {
244+
it('should return a response with pre-set headers from helmet',
245+
(done) => {
246+
request(app).
247+
get('/rides/2').
248+
expect('Content-Type', /json/).
249+
expect(200).
250+
expect('X-DNS-Prefetch-Control', 'off').
251+
expect('Expect-CT', 'max-age=0').
252+
expect('X-Download-Options', 'noopen').
253+
expect('X-Content-Type-Options', 'nosniff').
254+
expect('X-XSS-Protection', '0').
255+
expect('Content-Security-Policy', 'default-src' +
256+
' \'self\';base-uri' +
257+
' \'self\';block-all-mixed-content;font-src \'self\'' +
258+
' https: data:;frame-ancestors \'self\';img-src \'self\' data:;object-src \'none\';script-src \'self\';script-src-attr \'none\';style-src \'self\' https: \'unsafe-inline\';upgrade-insecure-requests',
259+
done);
260+
});
226261
it('should return ride id of 2', (done) => {
227262
request(app).
228263
get('/rides/2').
@@ -236,6 +271,26 @@ describe('API tests', () => {
236271
});
237272

238273
describe('POST /rides', () => {
274+
it('should return a response with pre-set headers from helmet',
275+
(done) => {
276+
const body = rideEntities[2];
277+
request(app).
278+
post('/rides').
279+
send(body).
280+
expect('Content-Type', /json/).
281+
expect(200).
282+
expect('X-DNS-Prefetch-Control', 'off').
283+
expect('Expect-CT', 'max-age=0').
284+
expect('X-Download-Options', 'noopen').
285+
expect('X-Content-Type-Options', 'nosniff').
286+
expect('X-XSS-Protection', '0').
287+
expect('Content-Security-Policy', 'default-src' +
288+
' \'self\';base-uri' +
289+
' \'self\';block-all-mixed-content;font-src \'self\'' +
290+
' https: data:;frame-ancestors \'self\';img-src \'self\' data:;object-src \'none\';script-src \'self\';script-src-attr \'none\';style-src \'self\' https: \'unsafe-inline\';upgrade-insecure-requests',
291+
done);
292+
});
293+
239294
it('should create a new ride', (done) => {
240295
const body = rideEntities[2];
241296
request(app).

0 commit comments

Comments
 (0)