@govuk-pay/pay-js-commons 6.0.21 → 6.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
5
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
9
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
10
+ function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
11
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
12
+ function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
13
+ function _wrapNativeSuper(t) { var r = "function" == typeof Map ? new Map() : void 0; return _wrapNativeSuper = function _wrapNativeSuper(t) { if (null === t || !_isNativeFunction(t)) return t; if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); if (void 0 !== r) { if (r.has(t)) return r.get(t); r.set(t, Wrapper); } function Wrapper() { return _construct(t, arguments, _getPrototypeOf(this).constructor); } return Wrapper.prototype = Object.create(t.prototype, { constructor: { value: Wrapper, enumerable: !1, writable: !0, configurable: !0 } }), _setPrototypeOf(Wrapper, t); }, _wrapNativeSuper(t); }
14
+ function _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }
15
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
16
+ function _isNativeFunction(t) { try { return -1 !== Function.toString.call(t).indexOf("[native code]"); } catch (n) { return "function" == typeof t; } }
17
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
18
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
19
+ var csrf = require('csrf');
20
+ var CsrfError = /*#__PURE__*/function (_Error) {
21
+ function CsrfError(message) {
22
+ var _this;
23
+ _classCallCheck(this, CsrfError);
24
+ _this = _callSuper(this, CsrfError, [message]);
25
+ _this.name = 'CsrfError';
26
+ return _this;
27
+ }
28
+ _inherits(CsrfError, _Error);
29
+ return _createClass(CsrfError);
30
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
31
+ /**
32
+ * @param logger {Logger}
33
+ * @param sessionName {string} the name of the object on the request where the secret key will be stored
34
+ * @param secretName {string} the name of the key in session object that will hold the secret value
35
+ * @param tokenName {string} the name of the key on the request body/query that will hold the token value
36
+ */
37
+ var configureCsrfMiddleware = function configureCsrfMiddleware(logger, sessionName) {
38
+ var secretName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'csrfSecret';
39
+ var tokenName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'csrfToken';
40
+ logger.debug('--- CSRF middleware configuration ---');
41
+ logger.debug("Secret is set at req['".concat(sessionName, "']['").concat(secretName, "']"));
42
+ logger.debug("Token is checked at req.body|query['".concat(tokenName, "']"));
43
+ logger.debug('-------------------------------------');
44
+
45
+ /**
46
+ * @param req {e.Request}
47
+ * @param res {e.Response}
48
+ * @param next {e.NextFunction}
49
+ */
50
+ var setSecret = function setSecret(req, res, next) {
51
+ var _req$sessionName;
52
+ var csrfSecret = (_req$sessionName = req[sessionName]) === null || _req$sessionName === void 0 ? void 0 : _req$sessionName[secretName];
53
+ if (!csrfSecret) {
54
+ logger.debug('Synchronising CSRF secret');
55
+ req[sessionName][secretName] = csrf().secretSync();
56
+ }
57
+ next();
58
+ };
59
+
60
+ /**
61
+ * @param req {e.Request}
62
+ * @param res {e.Response}
63
+ * @param next {e.NextFunction}
64
+ */
65
+ var checkToken = function checkToken(req, res, next) {
66
+ var _req$sessionName2, _req$body, _req$query;
67
+ // short circuit the check if method is not PUT/POST
68
+ if (!['PUT', 'POST'].includes(req.method.toUpperCase())) {
69
+ return next();
70
+ }
71
+ var csrfSecret = (_req$sessionName2 = req[sessionName]) === null || _req$sessionName2 === void 0 ? void 0 : _req$sessionName2[secretName];
72
+ var csrfToken = ((_req$body = req.body) === null || _req$body === void 0 ? void 0 : _req$body[tokenName]) || ((_req$query = req.query) === null || _req$query === void 0 ? void 0 : _req$query[tokenName]);
73
+ if (!csrfSecret) {
74
+ return next(new CsrfError("CSRF secret was not found on ".concat(sessionName, " when validating token")));
75
+ }
76
+ if (!csrfToken) {
77
+ return next(new CsrfError('CSRF token was not found in body or query for PUT/POST request'));
78
+ }
79
+ if (!csrf().verify(csrfSecret, csrfToken)) {
80
+ return next(new CsrfError('Invalid CSRF token'));
81
+ }
82
+ next();
83
+ };
84
+
85
+ /**
86
+ * @param req {e.Request}
87
+ * @param res {e.Response}
88
+ * @param next {e.NextFunction}
89
+ */
90
+ var generateToken = function generateToken(req, res, next) {
91
+ var csrfSecret = req[sessionName][secretName];
92
+ res.locals.csrf = csrf().create(csrfSecret);
93
+ next();
94
+ };
95
+ return {
96
+ setSecret: setSecret,
97
+ checkToken: checkToken,
98
+ generateToken: generateToken
99
+ };
100
+ };
101
+ module.exports = {
102
+ configureCsrfMiddleware: configureCsrfMiddleware,
103
+ CsrfError: CsrfError
104
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@govuk-pay/pay-js-commons",
3
- "version": "6.0.21",
3
+ "version": "6.0.23",
4
4
  "description": "Reusable js scripts for GOV.UK Pay Node.js projects",
5
5
  "engines": {
6
6
  "node": "^18.17.1"
@@ -20,7 +20,7 @@
20
20
  "prepare": "npm run transpile && npm run browserify-analytics",
21
21
  "test": "npm run jest-tests npm && npm run karma-tests",
22
22
  "karma-tests": "karma start",
23
- "jest-tests": "jest src/analytics src/utils/axios-base-client/axios-base-client.test.js",
23
+ "jest-tests": "jest src/analytics src/utils/axios-base-client/axios-base-client.test.js src/utils/middleware/*.test.js",
24
24
  "lint": "standard --fix"
25
25
  },
26
26
  "repository": {
@@ -112,6 +112,7 @@
112
112
  "@babel/cli": "^7.4.4",
113
113
  "@babel/core": "^7.4.5",
114
114
  "@babel/preset-env": "^7.4.5",
115
+ "@types/express": "^5.0.0",
115
116
  "babelify": "^10.0.0",
116
117
  "brfs": "^2.0.2",
117
118
  "browser-env": "^3.2.6",
@@ -144,6 +145,7 @@
144
145
  },
145
146
  "dependencies": {
146
147
  "axios": "^1.6.5",
148
+ "csrf": "^3.1.0",
147
149
  "lodash": "4.17.21",
148
150
  "moment-timezone": "0.5.43",
149
151
  "rfc822-validate": "1.0.0",
@@ -0,0 +1,63 @@
1
+ $govuk-font-family: -apple-system,BlinkMacSystemFont,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif; // Override font as so not to use New Transport
2
+ @import "application";
3
+
4
+ // CUSTOM BRANDING
5
+ // Use the variables below to control the style
6
+ // Make sure banner colours meet minimum colour contrast levels
7
+
8
+ $custom-banner-colour: #ffffff;
9
+ $custom-banner-border-colour: #ffffff;
10
+ $custom-text-colour: #ffffff;
11
+ $logo-image-height: 2em;
12
+
13
+ .custom-branding {
14
+ @if $logo-image-height != null {
15
+ .custom-branding-image {
16
+ max-height: $logo-image-height;
17
+
18
+ @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
19
+ width: 100%;
20
+ }
21
+ }
22
+ }
23
+
24
+ .govuk-header {
25
+ background-color: $custom-banner-colour;
26
+ }
27
+
28
+ .govuk-header__link{
29
+ &:link,
30
+ &:visited {
31
+ color: $custom-text-colour;
32
+ }
33
+ }
34
+
35
+ .govuk-header__link--homepage {
36
+ &:hover,
37
+ &:active {
38
+ border-bottom: none;
39
+ margin-bottom: 0;
40
+ }
41
+ }
42
+
43
+ .govuk-header__service-name {
44
+ color: $custom-text-colour;
45
+ }
46
+
47
+ .govuk-header__container {
48
+ border-bottom-color: $custom-banner-border-colour;
49
+ }
50
+
51
+ @include govuk-media-query($from: tablet) {
52
+ .govuk-header__content {
53
+ width: 66%;
54
+ vertical-align: bottom;
55
+ margin-bottom: 7px;
56
+ }
57
+ }
58
+
59
+ .govuk-button {
60
+ padding: 7px 15px 6px;
61
+ padding: .368421053em .842105263em .315789474em;
62
+ }
63
+ }