Skip to content
Open
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e60fbfc
CCD-6861: data validation
jenedgar Jun 9, 2026
054490b
CCD-6861: removed unused parameter
jenedgar Jun 9, 2026
720344b
CCD-6861: resolving eslint issues
jenedgar Jun 9, 2026
76ad164
CCD-6861: refactored to remove eslint error and formatted
jenedgar Jun 9, 2026
7418dd8
CCD-6861: fixing issues with proxy
jenedgar Jun 9, 2026
608bc0a
Merge branch 'master' into CCD-6861-validation
jenedgar Jun 11, 2026
ff4ff8e
CCD-6861: Updating with 7337
jenedgar Jun 11, 2026
3256a94
CCD-6861: Udating files
jenedgar Jun 11, 2026
6b5454d
CCD-6861: updated the modules
jenedgar Jun 17, 2026
096f576
CCD-6861: updated tests to esm
jenedgar Jun 18, 2026
c894f24
CCD-6861: updating exports
jenedgar Jun 19, 2026
1b821a0
CCD-6861: updating esm and esmock
jenedgar Jun 22, 2026
3b5bfcc
CCD-6861: Fixing test
jenedgar Jun 23, 2026
9fd7b1d
CCD-6861: fixing tests
jenedgar Jun 23, 2026
b00772a
CCD-6861: fixing test
jenedgar Jun 24, 2026
09b9f7a
CCD-6861: Fixing test
jenedgar Jun 24, 2026
2f9d264
CCD-6861: updating with ccd-7337
jenedgar Jun 24, 2026
0f37175
CCD-6861: fixing lint errors
jenedgar Jun 24, 2026
4f4aac3
CCD-6861: Changing from nyc to c8 due to esm being used
jenedgar Jun 25, 2026
3041c9d
CCD-6861: Updated package.json with resolutions
jenedgar Jun 25, 2026
aa89ead
Merge branch 'master' into CCD-6861-esm-updates
jenedgar Jun 25, 2026
469d6b6
Merge branch 'CCD-7337' of github.com:hmcts/ccd-api-gateway into CCD-…
lang-ben Jun 26, 2026
d07748b
CCD-6861: removed secrects
jenedgar Jun 26, 2026
12106aa
CCD-6861: moved propertiesVolume.addTo(config)
jenedgar Jun 26, 2026
12b84d5
Change how propertiesVolume is imported
lang-ben Jun 26, 2026
7c63496
CCD-6861: fixing properties in the pipeline
jenedgar Jun 30, 2026
77df411
CCD-6861: fixing properties in the pipeline
jenedgar Jun 30, 2026
994acfe
CCD-6861: updating known issues
jenedgar Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"extends": "eslint:recommended",
"parserOptions": {
"sourceType": "module",
"ecmaVersion": 2017
"ecmaVersion": 2022
},
"plugins": ["mocha"],
"rules": {
Expand Down
652 changes: 326 additions & 326 deletions .yarn/releases/yarn-4.16.0.cjs → .yarn/releases/yarn-4.17.0.cjs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .yarnrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ enableScripts: true

nodeLinker: node-modules

yarnPath: .yarn/releases/yarn-4.16.0.cjs
yarnPath: .yarn/releases/yarn-4.17.0.cjs
59 changes: 36 additions & 23 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
const enableAppInsights = require('./app/app-insights/app-insights');
import enableAppInsights from './app/app-insights/app-insights.js';
import payloadGuard from './app/service/service-payloadGuard.js';

import express from 'express';
import cookieParser from 'cookie-parser';
import { legacyCreateProxyMiddleware as proxy } from 'http-proxy-middleware';
import config from 'config';
import loggingPkg from '@hmcts/nodejs-logging';
const { Express: ExpressLogger, Logger } = loggingPkg;
import {authCheckerUserOnlyFilter, mapFetchErrors} from './app/user/auth-checker-user-only-filter.js';
import addressLookup from './app/address/address-lookup.js';
import serviceFilter from './app/service/service-filter.js';
import corsHandler from './app/security/cors.js';
import handleTiming from './app/security/timing.js';
import hstsHandler from './app/security/hsts.js';
import healthcheck from '@hmcts/nodejs-healthcheck';
import routes from '@hmcts/nodejs-healthcheck/healthcheck/routes.js';
import {oauth2Route} from './app/oauth2/oauth2-route.js';
import {logoutRoute} from './app/oauth2/logout-route.js';
import noCache from 'nocache';
import noSniff from 'dont-sniff-mimetype';

enableAppInsights();

let express = require('express');
let cookieParser = require('cookie-parser');
const { legacyCreateProxyMiddleware: proxy } = require('http-proxy-middleware');
const config = require('config');
const { Express: ExpressLogger, Logger } = require('@hmcts/nodejs-logging');
const {authCheckerUserOnlyFilter} = require('./app/user/auth-checker-user-only-filter');
const {mapFetchErrors} = require('./app/user/auth-checker-user-only-filter');
const addressLookup = require('./app/address/address-lookup');
const serviceFilter = require('./app/service/service-filter');
const corsHandler = require('./app/security/cors');
const handleTiming = require('./app/security/timing');
const hstsHandler = require('./app/security/hsts');
const healthcheck = require('@hmcts/nodejs-healthcheck');
const routes = require('@hmcts/nodejs-healthcheck/healthcheck/routes');
const oauth2Route = require('./app/oauth2/oauth2-route').oauth2Route;
const logoutRoute = require('./app/oauth2/logout-route').logoutRoute;
const noCache = require('nocache');
const noSniff = require('dont-sniff-mimetype');

let app = express();
const app = express();
const appHealth = express();
const logger = Logger.getLogger('app');

Expand Down Expand Up @@ -77,6 +78,18 @@ app.get('/logout', logoutRoute);

app.use(serviceFilter);

// parsing + basic size limits (protects DoS)
app.use('/data', express.json({ limit: '1mb', strict: true }));
app.use('/data', express.urlencoded({ limit: '1mb', extended: false }));

// lightweight safety/validation middleware
app.use('/data', payloadGuard({
allowContentTypes: ['application/json'],
maxArrayLength: 10000, // sanity cap
rejectPathTraversal: true,
rejectObviousScriptTags: true
}));

app.get('/addresses',(req, res, next) => {
addressLookup(req.query.postcode)
.then(result => res.send(result))
Expand Down Expand Up @@ -163,7 +176,7 @@ app.use(function (err, req, res, next) { // eslint-disable-line no-unused-vars
res.locals.error = req.app.get('env') === 'development' ? err : {};

// render the error page
let status = isNaN(err.status) ? 500 : err.status;
let status = Number.isNaN(err.status) ? 500 : err.status;
res.status(status);
res.json({
error: err.error || 'Unauthorized',
Expand All @@ -172,4 +185,4 @@ app.use(function (err, req, res, next) { // eslint-disable-line no-unused-vars
});
});

module.exports = app;
export default app;
13 changes: 7 additions & 6 deletions app/address/address-lookup.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
const config = require('config');
const fetch = require('node-fetch').default;
const { HttpsProxyAgent } = require('https-proxy-agent');
const { Logger } = require('@hmcts/nodejs-logging');
import config from 'config';
import fetch from 'node-fetch';
import {HttpsProxyAgent} from 'https-proxy-agent';
import {Logger} from '@hmcts/nodejs-logging';

const logger = Logger.getLogger('addressLookup');
const crypto = require('crypto');
import crypto from 'crypto';

function addressLookup(postcode) {

Expand Down Expand Up @@ -50,4 +51,4 @@ function badResponse(res, body) {
throw errorObj(`An error response was received from the Postcode Service. Status=${res.status}, Body=${body}`, res.status);
}

module.exports = addressLookup;
export default addressLookup;
6 changes: 3 additions & 3 deletions app/app-insights/app-insights.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const config = require('config');
const appInsights = require('applicationinsights');
import config from 'config';
import appInsights from 'applicationinsights';

const enabled = config.get('appInsights.enabled');

Expand All @@ -26,4 +26,4 @@ const enableAppInsights = () => {
}
};

module.exports = enableAppInsights;
export default enableAppInsights;
8 changes: 4 additions & 4 deletions app/cache/cache-config.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
const CacheService = require('./cache-service');
const config = require('config');
import CacheService from './cache-service.js';
import config from 'config';

// TTL for userInfoCache should always be set to lower value than the actual token's TTL
// to limit risk/time of an expired token still returning details - config default is 10 mins
const userInfoCache = new CacheService('UserInfoCache', config.get('cache.user_info_ttl'), config.get('cache.user_info_check_period'));

module.exports = {
userInfoCache
export {
userInfoCache
};
9 changes: 5 additions & 4 deletions app/cache/cache-service.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
const NodeCache = require('node-cache');
const { Logger } = require('@hmcts/nodejs-logging');
import NodeCache from 'node-cache';
import {Logger} from '@hmcts/nodejs-logging';

const logger = Logger.getLogger('CacheService');

class Cache {

constructor(name, ttlSeconds, checkPeriodSeconds) {
this.cache = new NodeCache({ stdTTL: ttlSeconds, checkperiod: checkPeriodSeconds });
this.cache = new NodeCache({stdTTL: ttlSeconds, checkperiod: checkPeriodSeconds});
this.name = name;
}

Expand Down Expand Up @@ -41,4 +42,4 @@ class Cache {
}
}

module.exports = Cache;
export default Cache;
10 changes: 5 additions & 5 deletions app/oauth2/access-token-request.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const config = require('config');
const fetch = require('node-fetch').default;
const { URL } = require('url');
const { Logger } = require('@hmcts/nodejs-logging');
import config from 'config';
import fetch from 'node-fetch';
import {URL} from 'url';
import {Logger} from '@hmcts/nodejs-logging';

const logger = Logger.getLogger('accessTokenRequest');

Expand Down Expand Up @@ -50,4 +50,4 @@ function accessTokenRequest(request) {
throw error;
});
}
module.exports = accessTokenRequest;
export default accessTokenRequest;
11 changes: 6 additions & 5 deletions app/oauth2/logout-route.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
const config = require('config');
const fetch = require('node-fetch').default;
const COOKIE_ACCESS_TOKEN = require('./oauth2-route').COOKIE_ACCESS_TOKEN;
import config from 'config';
import fetch from 'node-fetch';
import {COOKIE_ACCESS_TOKEN} from './oauth2-route.js';

const TOKEN_PLACEHOLDER = ':token';
const { userInfoCache } = require('../cache/cache-config');
import {userInfoCache} from '../cache/cache-config.js';

const logoutRoute = (req, res, next) => {
const accessToken = req.cookies && req.cookies[COOKIE_ACCESS_TOKEN];
Expand Down Expand Up @@ -33,6 +34,6 @@ const logoutRoute = (req, res, next) => {
}
};

module.exports = {
export {
logoutRoute
};
27 changes: 14 additions & 13 deletions app/oauth2/oauth2-route.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
const accessTokenRequest = require('./access-token-request');
const config = require('config');
import accessTokenRequest from './access-token-request.js';
import config from 'config';

const COOKIE_ACCESS_TOKEN = 'accessToken';

const oauth2Route = (req, res, next) => {
accessTokenRequest(req)
.then(result => {
if( result.status === 200 ) {
if (result.status === 200) {

result.json().then ( jsonResult => {
result.json().then(jsonResult => {

res.cookie(COOKIE_ACCESS_TOKEN, jsonResult.access_token,
{
maxAge: jsonResult.expires_in * 1000,
httpOnly: true,
secure: config.get('security.secure_auth_cookie_enabled')
});
res.status(204).send();
res.cookie(COOKIE_ACCESS_TOKEN, jsonResult.access_token,
{
maxAge: jsonResult.expires_in * 1000,
httpOnly: true,
secure: config.get('security.secure_auth_cookie_enabled')
});
res.status(204).send();
}
);
} else {
next({
status: 502,
status: 502,
message: 'Internal Server Error'
});
}
Expand All @@ -29,7 +30,7 @@ const oauth2Route = (req, res, next) => {
.catch(err => next(err));
};

module.exports = {
export {
COOKIE_ACCESS_TOKEN,
oauth2Route
};
10 changes: 5 additions & 5 deletions app/security/cors.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const config = require('config');
const sanitize = require('../util/sanitize');
import config from 'config';
import {sanitizeData} from '../util/sanitize.js';

const WILDCARD = '*';

Expand All @@ -23,7 +23,7 @@ const handleCors = (req, res, next) => {
if (corsOptions.allowOrigin) {
const origin = req.get('origin');
if (corsOptions.allowOrigin(origin)) {
res.set('Access-Control-Allow-Origin', sanitize.sanitizeData(origin));
res.set('Access-Control-Allow-Origin', sanitizeData(origin));
}
} else {
res.set('Access-Control-Allow-Origin', '*');
Expand All @@ -34,7 +34,7 @@ const handleCors = (req, res, next) => {
if (corsOptions.allowMethods) {
res.set('Access-Control-Allow-Methods', corsOptions.allowMethods);
}
res.set('Access-Control-Allow-Headers', sanitize.sanitizeData(req.get('Access-Control-Request-Headers')));
res.set('Access-Control-Allow-Headers', sanitizeData(req.get('Access-Control-Request-Headers')));
if('OPTIONS' === req.method) {
res
.status(200)
Expand All @@ -44,4 +44,4 @@ const handleCors = (req, res, next) => {
}
};

module.exports = handleCors;
export default handleCors;
2 changes: 1 addition & 1 deletion app/security/hsts.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ const handleHSTS = (req, res, next) => {
next();
};

module.exports = handleHSTS;
export default handleHSTS;
4 changes: 2 additions & 2 deletions app/security/timing.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const config = require('config');
import config from 'config';

const handleTiming = (req, res, next) => {
res.set('Timing-Allow-Origin', config.get('security.timing-allow-origin'));
next();
};

module.exports = handleTiming;
export default handleTiming;
6 changes: 3 additions & 3 deletions app/service/service-filter.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const serviceTokenGenerator = require('./service-token-generator');
const { Logger } = require('@hmcts/nodejs-logging');
import serviceTokenGenerator from './service-token-generator.js';
import {Logger} from '@hmcts/nodejs-logging';

const logger = Logger.getLogger('serviceFilter');

Expand All @@ -26,4 +26,4 @@ const serviceFilter = (req, res, next) => {
});
};

module.exports = serviceFilter;
export default serviceFilter;
Loading