Skip to content

Commit 5e3c669

Browse files
authored
Api/deny query strings (#193)
* Deny http requests with unknown query strings * Add /didcomm as didcomm proxy endpoint * Bump version to 2.5.0 Signed-off-by: Patrik Stas <[email protected]>
1 parent d7bb3de commit 5e3c669

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

vcxagency-client/test/e2e/shared/agency-flows.spec.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const { vcxFlowCreateAgentConnection } = require('vcxagency-client/src')
3030
const { vcxFlowFullOnboarding } = require('vcxagency-client/src')
3131
const { indyGenerateWalletKey } = require('easy-indysdk')
3232
const { indyOpenWallet } = require('easy-indysdk')
33+
const axios = require('axios')
3334

3435
let aliceWalletName
3536
let aliceWalletKey
@@ -160,3 +161,22 @@ describe('healthchecks', () => {
160161
expect(success).toBe('true')
161162
})
162163
})
164+
165+
describe('query params', () => {
166+
it('should return bad request if unknown query parameter is specified', async () => {
167+
let err
168+
try {
169+
await axios.get(`${agencyUrl}/agency?foobar=123`)
170+
} catch (error) {
171+
err = error
172+
}
173+
expect(err).toBeDefined()
174+
expect(err.response.status === 400)
175+
})
176+
})
177+
178+
describe('query params', () => {
179+
it('should return bad request if known query parameter is specified', async () => {
180+
await axios.get(`${agencyUrl}/agency?timeout=10`)
181+
})
182+
})

vcxagency-node/src/api/middleware.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,22 @@ module.exports.asyncHandler = function asyncHandler (fn) {
5757
}
5858
}
5959

60+
module.exports.buildDenyQueryStringsMiddleware = function buildDenyQueryStringsMiddleware (allowedQueryKeys) {
61+
const allowedQueryKeysSet = new Set(allowedQueryKeys)
62+
return function denyQueryStrings (req, res, next) {
63+
const queryKeys = Object.keys(req.query)
64+
if (queryKeys.length > 0) {
65+
if (queryKeys.length === 1 && allowedQueryKeysSet.has(queryKeys[0])) {
66+
next()
67+
} else {
68+
return res.status(400).send()
69+
}
70+
} else {
71+
next()
72+
}
73+
}
74+
}
75+
6076
module.exports.logRequestsWithBody = function logRequestsWithBody (req, res, next) {
6177
logger.info(`${req.method} ${req.originalUrl} Request body: ${JSON.stringify(req.body)}`)
6278
next()

vcxagency-node/src/execution/server.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const apiProxy = require('../api/api-proxy')
3131
const {
3232
logRequestsWithBody,
3333
setReqId,
34-
finalExpressHandlers
34+
finalExpressHandlers, buildDenyQueryStringsMiddleware
3535
} = require('../api/middleware')
3636

3737
function createWebServer (expressApp, enableTls, tlsCertPath, tlsKeyPath, logger) {
@@ -51,6 +51,7 @@ function createWebServer (expressApp, enableTls, tlsCertPath, tlsKeyPath, logger
5151
async function setupExpressApp (expressApp, application, appConfig) {
5252
const { entityForwardAgent, serviceNewMessagesV1, serviceNewMessagesV2 } = application
5353
logger.info('Setting up express endpoints and middleware.')
54+
expressApp.use(buildDenyQueryStringsMiddleware(['timeout']))
5455

5556
if (appConfig.DANGEROUS_HTTP_DETAILS === true) {
5657
logger.warn('** DANGEROUS, FULL HTTP REQUESTS WILL BE LOGGED **')
@@ -71,15 +72,15 @@ async function setupExpressApp (expressApp, application, appConfig) {
7172

7273
const maxRequestSizeKb = appConfig.SERVER_MAX_REQUEST_SIZE_KB
7374
if (appConfig.PROXY_TARGET_URL) {
74-
const proxyPrefix = '/api/proxy'
75-
logger.info(`Requests to ${proxyPrefix} will be forwarded to ${appConfig.PROXY_TARGET_URL}`)
75+
const proxyPrefixes = ['/api/proxy', '/didcomm']
76+
logger.info(`Requests to ${proxyPrefixes} will be forwarded to ${appConfig.PROXY_TARGET_URL}`)
7677
const routerProxy = express.Router()
7778
routerProxy.use(bodyParser.raw({
7879
inflate: false,
7980
limit: `${maxRequestSizeKb}kb`
8081
}))
81-
expressApp.use(proxyPrefix, routerProxy)
82-
apiProxy(routerProxy, proxyPrefix, appConfig.PROXY_TARGET_URL)
82+
expressApp.use(proxyPrefixes, routerProxy)
83+
apiProxy(routerProxy, proxyPrefixes, appConfig.PROXY_TARGET_URL)
8384
}
8485

8586
logger.info('Setting up express Aries API.')

version.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"major": 2,
3-
"minor": 4,
3+
"minor": 5,
44
"patch": 0
55
}

0 commit comments

Comments
 (0)