1
1
"use strict" ;
2
2
var express = require ( 'express' ) ;
3
3
var router = express . Router ( ) ;
4
- var bodyParser = require ( 'body-parser' ) ;
5
4
var expressValidator = require ( 'express-validator' ) ;
6
- var cors = require ( 'cors' ) ;
7
5
var response = require ( '../services/response' ) ;
8
6
var encryption = require ( '../services/encryption' ) ;
9
7
var log = require ( '../services/logger' ) ;
10
8
var me = require ( '../package.json' ) ;
11
9
var initialize = require ( './initialize' ) ;
10
+ var config = require ( '../config' ) ;
11
+ var helmet = require ( 'helmet' ) ;
12
+ var client = require ( 'redis' ) . createClient ( config . redisURL ) ;
13
+ var limiter = require ( 'express-limiter' ) ( router , client ) ;
12
14
var _ = require ( 'lodash' ) ;
15
+ var bodyParser = require ( 'body-parser' ) ;
16
+ var cors = require ( 'cors' ) ;
17
+ var hpp = require ( 'hpp' ) ;
18
+ var contentLength = require ( 'express-content-length-validator' ) ;
19
+ var MAX_CONTENT_LENGTH_ACCEPTED = config . maxContentLength * 1 ;
13
20
14
21
var allRequestData = function ( req , res , next ) {
15
22
var requestData = { } ;
16
- var newRequestData = _ . assignIn ( requestData , req . params , req . body , req . query ) ;
17
23
req . param = function ( key , defaultValue ) {
24
+ var newRequestData = _ . assignIn ( requestData , req . params , req . body , req . query ) ;
18
25
if ( newRequestData [ key ] ) {
19
26
return newRequestData [ key ] ;
20
27
} else if ( defaultValue ) {
@@ -26,49 +33,81 @@ var allRequestData = function(req,res,next){
26
33
next ( ) ;
27
34
} ;
28
35
29
- var enforceUserId = function ( req , res , next ) {
36
+ var enforceUserIdAndAppId = function ( req , res , next ) {
30
37
var userId = req . param ( 'userId' ) ;
38
+ var appId = req . param ( 'appId' ) ;
31
39
if ( ! userId ) {
32
40
res . badRequest ( false , 'No userId parameter was passed in the payload of this request. Please pass a userId.' ) ;
41
+ } else if ( ! appId ) {
42
+ res . badRequest ( false , 'No appId parameter was passed in the payload of this request. Please pass an appId.' ) ;
33
43
} else {
34
- // Do a middleware that validates userId here. put the user service endpoint in the env var. ideally, this should be the gateway endpoint
44
+ // Do a middleware that validates userId and appID here. put the user service endpoint in the env var. ideally, this should be the gateway endpoint
45
+ // Check if this user and app is allowed on this service
46
+ req . userId = userId ;
47
+ req . appId = appId ;
35
48
next ( ) ;
36
49
}
37
50
} ;
38
51
39
-
52
+ router . use ( helmet ( ) ) ;
53
+ // no client side caching
54
+ if ( config . noFrontendCaching === 'yes' ) {
55
+ router . use ( helmet . noCache ( ) ) ;
56
+ }
40
57
router . use ( cors ( ) ) ;
41
- router . use ( response ) ;
58
+ router . options ( '*' , cors ( ) ) ;
42
59
router . use ( bodyParser . urlencoded ( { extended : false } ) ) ;
43
60
router . use ( bodyParser . json ( ) ) ;
44
61
router . use ( bodyParser . raw ( ) ) ;
45
62
router . use ( bodyParser . text ( ) ) ;
63
+ router . use ( encryption . interpreter ) ;
64
+ router . use ( hpp ( ) ) ;
65
+ router . use ( contentLength . validateMax ( { max : MAX_CONTENT_LENGTH_ACCEPTED , status : 400 , message : "Stop! Maximum content length exceeded." } ) ) ; // max size accepted for the content-length
46
66
// add the param function to request object
47
67
router . use ( allRequestData ) ;
48
- // Make userId compolsory in every request
49
- router . use ( enforceUserId ) ;
50
- router . use ( encryption . interpreter ) ;
51
- router . use ( expressValidator ( ) ) ;
52
68
69
+ // API Rate limiter
70
+ limiter ( {
71
+ path : '*' ,
72
+ method : 'all' ,
73
+ lookup : [ 'userId' , 'appId' ] ,
74
+ total : config . rateLimit * 1 ,
75
+ expire : config . rateLimitExpiry * 1 ,
76
+ onRateLimited : function ( req , res , next ) {
77
+ next ( { message : 'Rate limit exceeded' , statusCode : 429 } ) ;
78
+ }
79
+ } ) ;
80
+
81
+ router . use ( response ) ;
82
+ router . use ( expressValidator ( ) ) ;
53
83
router . use ( function ( req , res , next ) {
54
84
log . info ( '[TIME: ' + new Date ( ) . toISOString ( ) + '] [IP Address: ' + req . ip + '] [METHOD: ' + req . method + '] [URL: ' + req . originalUrl + ']' ) ;
55
85
next ( ) ;
56
86
} ) ;
57
87
58
- router . options ( '*' , cors ( ) ) ;
59
-
60
88
router . get ( '/' , function ( req , res ) {
61
89
res . ok ( { name : me . name , version : me . version } ) ;
62
90
} ) ;
63
91
64
- router . get ( '/.well-known/acme-challenge/xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8' , function ( req , res ) {
65
- res . send ( 'xvArhQBSilF4V30dGUagNAZ96ASipB0b0ex0kXn0za8._v6aFbaRYWeOmSebtlD-X4Ixf5tPsyULMsXM8HjsK-Q' ) ;
92
+ // Let's Encrypt Setup
93
+ router . get ( config . letsencryptSSLVerificationURL , function ( req , res ) {
94
+ res . send ( config . letsencryptSSLVerificationBody ) ;
66
95
} ) ;
67
96
68
- // Other routes here
69
-
70
97
router . use ( '/' , initialize ) ;
71
98
99
+ // Publicly available routes here
100
+ //
101
+ //
102
+
103
+
104
+ // Make userId compolsory in every request
105
+ router . use ( enforceUserIdAndAppId ) ;
106
+
107
+ // Other routes here
108
+ //
109
+ //
110
+
72
111
router . use ( function ( req , res , next ) { // jshint ignore:line
73
112
res . notFound ( ) ;
74
113
} ) ;
0 commit comments