@hmcts/opal-frontend-common-node 0.0.2 → 0.0.4

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.
Files changed (212) hide show
  1. package/app-insights/app-insights-configuration.d.ts +5 -0
  2. package/app-insights/app-insights-configuration.d.ts.map +1 -0
  3. package/app-insights/app-insights-configuration.js +15 -0
  4. package/app-insights/app-insights-configuration.js.map +1 -0
  5. package/app-insights/index.d.ts +5 -0
  6. package/app-insights/index.d.ts.map +1 -0
  7. package/app-insights/index.js +34 -0
  8. package/app-insights/index.js.map +1 -0
  9. package/csrf-token/index.d.ts +5 -0
  10. package/csrf-token/index.d.ts.map +1 -0
  11. package/csrf-token/index.js +33 -0
  12. package/csrf-token/index.js.map +1 -0
  13. package/health/index.d.ts +8 -0
  14. package/health/index.d.ts.map +1 -0
  15. package/health/index.js +30 -0
  16. package/health/index.js.map +1 -0
  17. package/helmet/index.d.ts +10 -0
  18. package/helmet/index.d.ts.map +1 -0
  19. package/helmet/index.js +54 -0
  20. package/helmet/index.js.map +1 -0
  21. package/index.d.ts +9 -0
  22. package/index.d.ts.map +1 -0
  23. package/{src/index.ts → index.js} +1 -1
  24. package/index.js.map +1 -0
  25. package/interfaces/app-insights-config.d.ts +7 -0
  26. package/interfaces/app-insights-config.d.ts.map +1 -0
  27. package/interfaces/app-insights-config.js +7 -0
  28. package/interfaces/app-insights-config.js.map +1 -0
  29. package/interfaces/index.d.ts +12 -0
  30. package/interfaces/index.d.ts.map +1 -0
  31. package/{src/interfaces/index.ts → interfaces/index.js} +2 -13
  32. package/interfaces/index.js.map +1 -0
  33. package/interfaces/launch-darkly-config.d.ts +7 -0
  34. package/interfaces/launch-darkly-config.d.ts.map +1 -0
  35. package/interfaces/launch-darkly-config.js +7 -0
  36. package/interfaces/launch-darkly-config.js.map +1 -0
  37. package/interfaces/routes-config.d.ts +8 -0
  38. package/interfaces/routes-config.d.ts.map +1 -0
  39. package/interfaces/routes-config.js +8 -0
  40. package/interfaces/routes-config.js.map +1 -0
  41. package/interfaces/securityToken.d.ts +7 -0
  42. package/interfaces/securityToken.d.ts.map +1 -0
  43. package/interfaces/securityToken.js +6 -0
  44. package/interfaces/securityToken.js.map +1 -0
  45. package/interfaces/session-config.d.ts +6 -0
  46. package/interfaces/session-config.d.ts.map +1 -0
  47. package/interfaces/session-config.js +6 -0
  48. package/interfaces/session-config.js.map +1 -0
  49. package/interfaces/session-expiry-config.d.ts +7 -0
  50. package/interfaces/session-expiry-config.d.ts.map +1 -0
  51. package/interfaces/session-expiry-config.js +7 -0
  52. package/interfaces/session-expiry-config.js.map +1 -0
  53. package/interfaces/session-storage-config.d.ts +12 -0
  54. package/interfaces/session-storage-config.d.ts.map +1 -0
  55. package/interfaces/session-storage-config.js +12 -0
  56. package/interfaces/session-storage-config.js.map +1 -0
  57. package/interfaces/sso-config.d.ts +9 -0
  58. package/interfaces/sso-config.d.ts.map +1 -0
  59. package/interfaces/sso-config.js +9 -0
  60. package/interfaces/sso-config.js.map +1 -0
  61. package/interfaces/transfer-server-state.d.ts +9 -0
  62. package/interfaces/transfer-server-state.d.ts.map +1 -0
  63. package/interfaces/transfer-server-state.js +7 -0
  64. package/interfaces/transfer-server-state.js.map +1 -0
  65. package/interfaces/userState.d.ts +16 -0
  66. package/interfaces/userState.d.ts.map +1 -0
  67. package/interfaces/userState.js +16 -0
  68. package/interfaces/userState.js.map +1 -0
  69. package/launch-darkly/index.d.ts +5 -0
  70. package/launch-darkly/index.d.ts.map +1 -0
  71. package/launch-darkly/index.js +14 -0
  72. package/launch-darkly/index.js.map +1 -0
  73. package/package.json +2 -2
  74. package/properties-volume/index.d.ts +6 -0
  75. package/properties-volume/index.d.ts.map +1 -0
  76. package/properties-volume/index.js +10 -0
  77. package/properties-volume/index.js.map +1 -0
  78. package/proxy/index.d.ts +2 -0
  79. package/proxy/index.d.ts.map +1 -0
  80. package/{src/proxy/index.ts → proxy/index.js} +1 -0
  81. package/proxy/index.js.map +1 -0
  82. package/proxy/opal-api-proxy/index.d.ts +3 -0
  83. package/proxy/opal-api-proxy/index.d.ts.map +1 -0
  84. package/proxy/opal-api-proxy/index.js +18 -0
  85. package/proxy/opal-api-proxy/index.js.map +1 -0
  86. package/routes/index.d.ts +10 -0
  87. package/routes/index.d.ts.map +1 -0
  88. package/routes/index.js +36 -0
  89. package/routes/index.js.map +1 -0
  90. package/session/index.d.ts +5 -0
  91. package/session/index.d.ts.map +1 -0
  92. package/{src/session/index.ts → session/index.js} +1 -1
  93. package/session/index.js.map +1 -0
  94. package/session/session-expiry/index.d.ts +4 -0
  95. package/session/session-expiry/index.d.ts.map +1 -0
  96. package/session/session-expiry/index.js +23 -0
  97. package/session/session-expiry/index.js.map +1 -0
  98. package/session/session-storage/index.d.ts +7 -0
  99. package/session/session-storage/index.d.ts.map +1 -0
  100. package/session/session-storage/index.js +58 -0
  101. package/session/session-storage/index.js.map +1 -0
  102. package/session/session-user-state/index.d.ts +4 -0
  103. package/session/session-user-state/index.d.ts.map +1 -0
  104. package/session/session-user-state/index.js +20 -0
  105. package/session/session-user-state/index.js.map +1 -0
  106. package/sso/index.d.ts +7 -0
  107. package/sso/index.d.ts.map +1 -0
  108. package/{src/sso/index.ts → sso/index.js} +1 -1
  109. package/sso/index.js.map +1 -0
  110. package/sso/sso-authenticated.d.ts +4 -0
  111. package/sso/sso-authenticated.d.ts.map +1 -0
  112. package/sso/sso-authenticated.js +14 -0
  113. package/sso/sso-authenticated.js.map +1 -0
  114. package/sso/sso-login-callback.d.ts +4 -0
  115. package/sso/sso-login-callback.d.ts.map +1 -0
  116. package/sso/sso-login-callback.js +26 -0
  117. package/sso/sso-login-callback.js.map +1 -0
  118. package/sso/sso-login.d.ts +4 -0
  119. package/sso/sso-login.d.ts.map +1 -0
  120. package/sso/sso-login.js +24 -0
  121. package/sso/sso-login.js.map +1 -0
  122. package/sso/sso-logout-callback.d.ts +4 -0
  123. package/sso/sso-logout-callback.d.ts.map +1 -0
  124. package/sso/sso-logout-callback.js +13 -0
  125. package/sso/sso-logout-callback.js.map +1 -0
  126. package/sso/sso-logout.d.ts +4 -0
  127. package/sso/sso-logout.d.ts.map +1 -0
  128. package/sso/sso-logout.js +31 -0
  129. package/sso/sso-logout.js.map +1 -0
  130. package/stubs/sso/index.d.ts +7 -0
  131. package/stubs/sso/index.d.ts.map +1 -0
  132. package/{src/stubs/sso/index.ts → stubs/sso/index.js} +1 -1
  133. package/stubs/sso/index.js.map +1 -0
  134. package/stubs/sso/sso-authenticated.stub.d.ts +4 -0
  135. package/stubs/sso/sso-authenticated.stub.d.ts.map +1 -0
  136. package/stubs/sso/sso-authenticated.stub.js +14 -0
  137. package/stubs/sso/sso-authenticated.stub.js.map +1 -0
  138. package/stubs/sso/sso-login-callback.stub.d.ts +4 -0
  139. package/stubs/sso/sso-login-callback.stub.d.ts.map +1 -0
  140. package/stubs/sso/sso-login-callback.stub.js +26 -0
  141. package/stubs/sso/sso-login-callback.stub.js.map +1 -0
  142. package/stubs/sso/sso-login.stub.d.ts +4 -0
  143. package/stubs/sso/sso-login.stub.d.ts.map +1 -0
  144. package/stubs/sso/sso-login.stub.js +14 -0
  145. package/stubs/sso/sso-login.stub.js.map +1 -0
  146. package/stubs/sso/sso-logout-callback.stub.d.ts +4 -0
  147. package/stubs/sso/sso-logout-callback.stub.d.ts.map +1 -0
  148. package/stubs/sso/sso-logout-callback.stub.js +13 -0
  149. package/stubs/sso/sso-logout-callback.stub.js.map +1 -0
  150. package/stubs/sso/sso-logout.stub.d.ts +4 -0
  151. package/stubs/sso/sso-logout.stub.d.ts.map +1 -0
  152. package/stubs/sso/sso-logout.stub.js +5 -0
  153. package/stubs/sso/sso-logout.stub.js.map +1 -0
  154. package/utils/base64.d.ts +3 -0
  155. package/utils/base64.d.ts.map +1 -0
  156. package/utils/base64.js +7 -0
  157. package/utils/base64.js.map +1 -0
  158. package/utils/index.d.ts +3 -0
  159. package/utils/index.d.ts.map +1 -0
  160. package/{src/utils/index.ts → utils/index.js} +1 -1
  161. package/utils/index.js.map +1 -0
  162. package/utils/jwt.d.ts +5 -0
  163. package/utils/jwt.d.ts.map +1 -0
  164. package/utils/jwt.js +32 -0
  165. package/utils/jwt.js.map +1 -0
  166. package/.editorconfig +0 -16
  167. package/.github/renovate.json +0 -11
  168. package/.github/workflows/npm_build.yml +0 -67
  169. package/.prettierignore +0 -12
  170. package/.prettierrc +0 -7
  171. package/.vscode/settings.json +0 -6
  172. package/LICENSE +0 -21
  173. package/eslint.config.js +0 -22
  174. package/sonar-project.properties +0 -9
  175. package/src/app-insights/app-insights-configuration.ts +0 -18
  176. package/src/app-insights/index.ts +0 -39
  177. package/src/csrf-token/index.ts +0 -36
  178. package/src/health/index.ts +0 -32
  179. package/src/helmet/index.ts +0 -60
  180. package/src/interfaces/app-insights-config.ts +0 -7
  181. package/src/interfaces/launch-darkly-config.ts +0 -7
  182. package/src/interfaces/routes-config.ts +0 -8
  183. package/src/interfaces/securityToken.ts +0 -8
  184. package/src/interfaces/session-config.ts +0 -5
  185. package/src/interfaces/session-expiry-config.ts +0 -7
  186. package/src/interfaces/session-storage-config.ts +0 -12
  187. package/src/interfaces/sso-config.ts +0 -9
  188. package/src/interfaces/transfer-server-state.ts +0 -10
  189. package/src/interfaces/userState.ts +0 -18
  190. package/src/launch-darkly/index.ts +0 -17
  191. package/src/properties-volume/index.ts +0 -12
  192. package/src/proxy/opal-api-proxy/index.ts +0 -19
  193. package/src/routes/index.ts +0 -91
  194. package/src/session/session-expiry/index.ts +0 -31
  195. package/src/session/session-storage/index.ts +0 -68
  196. package/src/session/session-user-state/index.ts +0 -24
  197. package/src/sso/sso-authenticated.ts +0 -15
  198. package/src/sso/sso-login-callback.ts +0 -30
  199. package/src/sso/sso-login.ts +0 -31
  200. package/src/sso/sso-logout-callback.ts +0 -17
  201. package/src/sso/sso-logout.ts +0 -41
  202. package/src/stubs/sso/sso-authenticated.stub.ts +0 -16
  203. package/src/stubs/sso/sso-login-callback.stub.ts +0 -29
  204. package/src/stubs/sso/sso-login.stub.ts +0 -16
  205. package/src/stubs/sso/sso-logout-callback.stub.ts +0 -16
  206. package/src/stubs/sso/sso-logout.stub.ts +0 -6
  207. package/src/utils/base64.ts +0 -7
  208. package/src/utils/jwt.ts +0 -35
  209. package/tsconfig.json +0 -72
  210. /package/{src/global.d.ts → global.d.ts} +0 -0
  211. /package/{src/session.d.ts → session.d.ts} +0 -0
  212. /package/{src/type.d.ts → type.d.ts} +0 -0
@@ -0,0 +1,5 @@
1
+ import LaunchDarklyConfig from '../interfaces/launch-darkly-config';
2
+ export declare class LaunchDarkly {
3
+ enableFor(enabled: boolean, stream: boolean, clientId: string | null): LaunchDarklyConfig;
4
+ }
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/launch-darkly/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,oCAAoC,CAAC;AAEpE,qBAAa,YAAY;IAChB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB;CAajG"}
@@ -0,0 +1,14 @@
1
+ export class LaunchDarkly {
2
+ enableFor(enabled, stream, clientId) {
3
+ const launchDarklyConfig = {
4
+ enabled: enabled,
5
+ clientId: null,
6
+ stream: stream,
7
+ };
8
+ if (launchDarklyConfig.enabled && clientId) {
9
+ launchDarklyConfig.clientId = clientId;
10
+ }
11
+ return launchDarklyConfig;
12
+ }
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/launch-darkly/index.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IAChB,SAAS,CAAC,OAAgB,EAAE,MAAe,EAAE,QAAuB;QACzE,MAAM,kBAAkB,GAAuB;YAC7C,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,MAAM;SACf,CAAC;QAEF,IAAI,kBAAkB,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC3C,kBAAkB,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzC,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC5B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@hmcts/opal-frontend-common-node",
3
3
  "type": "module",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "description": "Common nodejs library components for opal",
6
6
  "main": "dist/index",
7
7
  "types": "dist/index.d.ts",
8
8
  "scripts": {
9
- "build": " yarn clean && tsc && cp package.json dist/ && cp src/*.d.ts dist/",
9
+ "build": " yarn clean && tsc && cp package.json dist/ && cp src/*.d.ts dist/ && cp README.md dist/",
10
10
  "clean": "rm -rf dist",
11
11
  "lint": "eslint ./src --ext .ts && yarn prettier",
12
12
  "prettier": "prettier --check \"./src/**/*.{ts,js,json}\"",
@@ -0,0 +1,6 @@
1
+ import { IConfig } from 'config';
2
+ import { Application } from 'express';
3
+ export declare class PropertiesVolume {
4
+ enableFor(server: Application, config: IConfig): IConfig;
5
+ }
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/properties-volume/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO;CAMzD"}
@@ -0,0 +1,10 @@
1
+ import * as propertiesVolume from '@hmcts/properties-volume';
2
+ export class PropertiesVolume {
3
+ enableFor(server, config) {
4
+ if (server.locals['ENV'] !== 'development') {
5
+ propertiesVolume.addTo(config);
6
+ }
7
+ return config;
8
+ }
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/properties-volume/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,0BAA0B,CAAC;AAI7D,MAAM,OAAO,gBAAgB;IAC3B,SAAS,CAAC,MAAmB,EAAE,MAAe;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,aAAa,EAAE,CAAC;YAC3C,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from './opal-api-proxy';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -1 +1,2 @@
1
1
  export * from './opal-api-proxy';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const opalApiProxy: (opalApiTarget: string) => import("http-proxy-middleware").RequestHandler<any, import("http").ServerResponse<import("http").IncomingMessage>, (err?: any) => void>;
2
+ export default opalApiProxy;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/proxy/opal-api-proxy/index.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,YAAY,GAAI,eAAe,MAAM,4IAc1C,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { createProxyMiddleware } from 'http-proxy-middleware';
2
+ const opalApiProxy = (opalApiTarget) => {
3
+ return createProxyMiddleware({
4
+ target: opalApiTarget,
5
+ changeOrigin: true,
6
+ logger: console,
7
+ on: {
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ proxyReq: (proxyReq, req) => {
10
+ if (req.session.securityToken?.access_token) {
11
+ proxyReq.setHeader('Authorization', `Bearer ${req.session.securityToken.access_token}`);
12
+ }
13
+ },
14
+ },
15
+ });
16
+ };
17
+ export default opalApiProxy;
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/proxy/opal-api-proxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,YAAY,GAAG,CAAC,aAAqB,EAAE,EAAE;IAC7C,OAAO,qBAAqB,CAAC;QAC3B,MAAM,EAAE,aAAa;QACrB,YAAY,EAAE,IAAI;QAClB,MAAM,EAAE,OAAO;QACf,EAAE,EAAE;YACF,8DAA8D;YAC9D,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAQ,EAAE,EAAE;gBAC/B,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;oBAC5C,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Application } from 'express';
2
+ import ExpiryConfiguration from '@hmcts/opal-frontend-common-node/interfaces/session-expiry-config';
3
+ import RoutesConfiguration from '@hmcts/opal-frontend-common-node/interfaces/routes-config';
4
+ import SsoConfiguration from '@hmcts/opal-frontend-common-node/interfaces/sso-config';
5
+ import SessionConfiguration from '@hmcts/opal-frontend-common-node/interfaces/session-config';
6
+ export declare class Routes {
7
+ enableFor(app: Application, ssoEnabled: boolean, expiryConfiguration: ExpiryConfiguration, routesConfiguration: RoutesConfiguration, sessionConfiguration: SessionConfiguration, ssoConfiguration: SsoConfiguration): void;
8
+ private setupSSORoutes;
9
+ }
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAatC,OAAO,mBAAmB,MAAM,mEAAmE,CAAC;AACpG,OAAO,mBAAmB,MAAM,2DAA2D,CAAC;AAC5F,OAAO,gBAAgB,MAAM,wDAAwD,CAAC;AACtF,OAAO,oBAAoB,MAAM,4DAA4D,CAAC;AAE9F,qBAAa,MAAM;IACV,SAAS,CACd,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,OAAO,EACnB,mBAAmB,EAAE,mBAAmB,EACxC,mBAAmB,EAAE,mBAAmB,EACxC,oBAAoB,EAAE,oBAAoB,EAC1C,gBAAgB,EAAE,gBAAgB,GACjC,IAAI;IA0BP,OAAO,CAAC,cAAc;CAsCvB"}
@@ -0,0 +1,36 @@
1
+ import bodyParser from 'body-parser';
2
+ import { ssoAuthenticated, ssoLoginCallback, ssoLogin, ssoLogout, ssoLogoutCallback } from '../sso';
3
+ import { ssoLoginStub, ssoLoginCallbackStub, ssoAuthenticatedStub, ssoLogoutStub, ssoLogoutCallbackStub, } from '../stubs/sso';
4
+ import sessionExpiry from '@hmcts/opal-frontend-common-node/session/session-expiry';
5
+ import sessionUserState from '@hmcts/opal-frontend-common-node/session/session-user-state';
6
+ export class Routes {
7
+ enableFor(app, ssoEnabled, expiryConfiguration, routesConfiguration, sessionConfiguration, ssoConfiguration) {
8
+ // Declare use of body-parser AFTER the use of proxy https://github.com/villadora/express-http-proxy
9
+ app.use(bodyParser.json());
10
+ app.use(bodyParser.urlencoded({ extended: false }));
11
+ this.setupSSORoutes(app, ssoEnabled, routesConfiguration.opalApiTarget, routesConfiguration.frontendHostname, routesConfiguration.prefix, ssoConfiguration);
12
+ app.get(sessionConfiguration.userStateUrl, (req, res) => sessionUserState(req, res));
13
+ app.get(sessionConfiguration.sessionExpiryUrl, (req, res) => sessionExpiry(req, res, expiryConfiguration.testMode, expiryConfiguration.expiryTimeInMilliseconds, expiryConfiguration.warningThresholdInMilliseconds));
14
+ }
15
+ setupSSORoutes(app, ssoEnabled, opalApiUrl, frontendHostname, prefix, ssoConfiguration) {
16
+ const login = ssoEnabled ? ssoLogin : ssoLoginStub;
17
+ const loginCallback = ssoEnabled ? ssoLoginCallback : ssoLoginCallbackStub;
18
+ const logout = ssoEnabled ? ssoLogout : ssoLogoutStub;
19
+ const logoutCallback = ssoEnabled ? ssoLogoutCallback : ssoLogoutCallbackStub;
20
+ const authenticated = ssoEnabled ? ssoAuthenticated : ssoAuthenticatedStub;
21
+ const loginCallbackType = ssoEnabled ? 'post' : 'get';
22
+ app.get(ssoConfiguration.login, (req, res, next) => login(req, res, next, opalApiUrl, frontendHostname));
23
+ const routePath = ssoConfiguration.loginCallback;
24
+ const callbackHandler = (req, res, next) => loginCallback(req, res, next, opalApiUrl);
25
+ if (loginCallbackType === 'post') {
26
+ app.post(routePath, callbackHandler);
27
+ }
28
+ else {
29
+ app.get(routePath, callbackHandler);
30
+ }
31
+ app.get(ssoConfiguration.logout, (req, res, next) => logout(req, res, next, opalApiUrl, frontendHostname));
32
+ app.get(ssoConfiguration.logoutCallback, (req, res, next) => logoutCallback(req, res, next, prefix));
33
+ app.get(ssoConfiguration.authenticated, (req, res) => authenticated(req, res));
34
+ }
35
+ }
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AACpG,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,aAAa,MAAM,yDAAyD,CAAC;AACpF,OAAO,gBAAgB,MAAM,6DAA6D,CAAC;AAM3F,MAAM,OAAO,MAAM;IACV,SAAS,CACd,GAAgB,EAChB,UAAmB,EACnB,mBAAwC,EACxC,mBAAwC,EACxC,oBAA0C,EAC1C,gBAAkC;QAElC,oGAAoG;QACpG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpD,IAAI,CAAC,cAAc,CACjB,GAAG,EACH,UAAU,EACV,mBAAmB,CAAC,aAAa,EACjC,mBAAmB,CAAC,gBAAgB,EACpC,mBAAmB,CAAC,MAAM,EAC1B,gBAAgB,CACjB,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE,CAC7E,aAAa,CACX,GAAG,EACH,GAAG,EACH,mBAAmB,CAAC,QAAQ,EAC5B,mBAAmB,CAAC,wBAAwB,EAC5C,mBAAmB,CAAC,8BAA8B,CACnD,CACF,CAAC;IACJ,CAAC;IAEO,cAAc,CACpB,GAAgB,EAChB,UAAmB,EACnB,UAAkB,EAClB,gBAAwB,EACxB,MAAc,EACd,gBAAkC;QAElC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;QACnD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;QACtD,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC;QAC9E,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAE3E,MAAM,iBAAiB,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAEtD,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE,CAClF,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC,CACpD,CAAC;QAEF,MAAM,SAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC;QACjD,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE,CAC1E,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAE5C,IAAI,iBAAiB,KAAK,MAAM,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE,CACnF,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC,CACrD,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE,CAC3F,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CACvC,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACpG,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import SessionStorage from './session-storage';
2
+ import sessionExpiry from './session-expiry';
3
+ import sessionUserState from './session-user-state';
4
+ export { SessionStorage, sessionUserState, sessionExpiry };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAC/C,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import SessionStorage from './session-storage';
2
2
  import sessionExpiry from './session-expiry';
3
3
  import sessionUserState from './session-user-state';
4
-
5
4
  export { SessionStorage, sessionUserState, sessionExpiry };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAC/C,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response } from 'express';
2
+ declare const sessionExpiry: (req: Request, res: Response, testMode: boolean, expiryTimeInMilliseconds: number, warningThresholdInMilliseconds: number) => void;
3
+ export default sessionExpiry;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/session-expiry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,QAAA,MAAM,aAAa,GACjB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,UAAU,OAAO,EACjB,0BAA0B,MAAM,EAChC,gCAAgC,MAAM,SAmBvC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { DateTime } from 'luxon';
2
+ import { Jwt } from '../../utils';
3
+ const sessionExpiry = (req, res, testMode, expiryTimeInMilliseconds, warningThresholdInMilliseconds) => {
4
+ const accessToken = req.session.securityToken?.access_token;
5
+ if (accessToken) {
6
+ const payload = Jwt.parseJwt(accessToken);
7
+ const jwtExpiry = testMode
8
+ ? DateTime.now().plus({ milliseconds: expiryTimeInMilliseconds }).toISO()
9
+ : DateTime.fromMillis(payload.exp * 1000).toISO();
10
+ res.status(200).send({
11
+ expiry: jwtExpiry,
12
+ warningThresholdInMilliseconds: warningThresholdInMilliseconds,
13
+ });
14
+ }
15
+ else {
16
+ res.status(200).send({
17
+ expiry: null,
18
+ warningThresholdInMilliseconds: null,
19
+ });
20
+ }
21
+ };
22
+ export default sessionExpiry;
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/session-expiry/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,aAAa,GAAG,CACpB,GAAY,EACZ,GAAa,EACb,QAAiB,EACjB,wBAAgC,EAChC,8BAAsC,EACtC,EAAE;IACF,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;IAC5D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,QAAQ;YACxB,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC,CAAC,KAAK,EAAE;YACzE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QAEpD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,SAAS;YACjB,8BAA8B,EAAE,8BAA8B;SAC/D,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,MAAM,EAAE,IAAI;YACZ,8BAA8B,EAAE,IAAI;SACrC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ import SessionStorageConfiguration from '@hmcts/opal-frontend-common-node/interfaces/session-storage-config';
2
+ import { Application } from 'express';
3
+ export default class SessionStorage {
4
+ enableFor(app: Application, sessionStorage: SessionStorageConfiguration): void;
5
+ private getStore;
6
+ }
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/session-storage/index.ts"],"names":[],"mappings":"AACA,OAAO,2BAA2B,MAAM,oEAAoE,CAAC;AAG7G,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAQtC,MAAM,CAAC,OAAO,OAAO,cAAc;IAC1B,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,2BAA2B,GAAG,IAAI;IAuBrF,OAAO,CAAC,QAAQ;CA+BjB"}
@@ -0,0 +1,58 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ import { RedisStore } from 'connect-redis';
3
+ import cookieParser from 'cookie-parser';
4
+ import session from 'express-session';
5
+ import { createClient } from 'redis';
6
+ import FileStoreFactory from 'session-file-store';
7
+ const FileStore = FileStoreFactory(session);
8
+ const logger = Logger.getLogger('session-storage');
9
+ export default class SessionStorage {
10
+ enableFor(app, sessionStorage) {
11
+ app.use(cookieParser(sessionStorage.secret));
12
+ app.set('trust proxy', 1);
13
+ app.use(session({
14
+ name: sessionStorage.prefix,
15
+ resave: false,
16
+ saveUninitialized: false,
17
+ secret: sessionStorage.secret,
18
+ cookie: {
19
+ httpOnly: true,
20
+ maxAge: sessionStorage.maxAge,
21
+ sameSite: sessionStorage.sameSite,
22
+ secure: sessionStorage.secure,
23
+ domain: sessionStorage.domain,
24
+ },
25
+ rolling: true,
26
+ store: this.getStore(app, sessionStorage.redisEnabled, sessionStorage.redisConnectionString),
27
+ }));
28
+ }
29
+ getStore(app, enabled, connectionString) {
30
+ if (enabled && connectionString) {
31
+ logger.info('Using Redis session store', connectionString);
32
+ const client = createClient({
33
+ url: connectionString,
34
+ socket: {
35
+ reconnectStrategy: function (retries) {
36
+ if (retries > 20) {
37
+ logger.log('Too many attempts to reconnect. Redis connection was terminated');
38
+ return new Error('Too many retries.');
39
+ }
40
+ else {
41
+ return retries * 500;
42
+ }
43
+ },
44
+ },
45
+ });
46
+ client.on('error', (err) => {
47
+ logger.error('Redis Client Error', err);
48
+ });
49
+ client.connect().catch(() => {
50
+ process.exit();
51
+ });
52
+ app.locals['redisClient'] = client;
53
+ return new RedisStore({ client });
54
+ }
55
+ return new FileStore({ path: '/tmp' });
56
+ }
57
+ }
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/session-storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,OAAO,OAAO,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAElD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,cAAc;IAC1B,SAAS,CAAC,GAAgB,EAAE,cAA2C;QAC5E,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAE1B,GAAG,CAAC,GAAG,CACL,OAAO,CAAC;YACN,IAAI,EAAE,cAAc,CAAC,MAAM;YAC3B,MAAM,EAAE,KAAK;YACb,iBAAiB,EAAE,KAAK;YACxB,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,MAAM,EAAE;gBACN,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,QAAQ,EAAE,cAAc,CAAC,QAAQ;gBACjC,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;aAC9B;YACD,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,qBAAqB,CAAC;SAC7F,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,GAAgB,EAAE,OAAgB,EAAE,gBAA+B;QAClF,IAAI,OAAO,IAAI,gBAAgB,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,YAAY,CAAC;gBAC1B,GAAG,EAAE,gBAAgB;gBACrB,MAAM,EAAE;oBACN,iBAAiB,EAAE,UAAU,OAAO;wBAClC,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;4BACjB,MAAM,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;4BAC9E,OAAO,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;wBACxC,CAAC;6BAAM,CAAC;4BACN,OAAO,OAAO,GAAG,GAAG,CAAC;wBACvB,CAAC;oBACH,CAAC;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC1B,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;YACnC,OAAO,IAAI,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response } from 'express';
2
+ declare const sessionUserState: (req: Request, res: Response) => void;
3
+ export default sessionUserState;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/session/session-user-state/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI5C,QAAA,MAAM,gBAAgB,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,SAiBpD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Jwt } from '../../utils';
2
+ const sessionUserState = (req, res) => {
3
+ const userState = req.session.securityToken?.user_state;
4
+ const accessToken = req.session.securityToken?.access_token;
5
+ const name = accessToken && userState ? Jwt.parseJwt(accessToken).name : '';
6
+ // Don't allow caching of this endpoint
7
+ res.set({
8
+ 'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0',
9
+ Pragma: 'no-cache',
10
+ Expires: '0',
11
+ });
12
+ if (!userState) {
13
+ res.send({});
14
+ }
15
+ else {
16
+ res.send({ ...userState, name });
17
+ }
18
+ };
19
+ export default sessionUserState;
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/session/session-user-state/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,gBAAgB,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACvD,MAAM,SAAS,GAA0B,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC;IAC/E,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;IAC5D,MAAM,IAAI,GAAG,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5E,uCAAuC;IACvC,GAAG,CAAC,GAAG,CAAC;QACN,eAAe,EAAE,gDAAgD;QACjE,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
package/sso/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import ssoLogin from './sso-login';
2
+ import ssoLogout from './sso-logout';
3
+ import ssoLoginCallback from './sso-login-callback';
4
+ import ssoLogoutCallback from './sso-logout-callback';
5
+ import ssoAuthenticated from './sso-authenticated';
6
+ export { ssoLogin, ssoLoginCallback, ssoLogout, ssoAuthenticated, ssoLogoutCallback };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AACpD,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AACtD,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -3,5 +3,5 @@ import ssoLogout from './sso-logout';
3
3
  import ssoLoginCallback from './sso-login-callback';
4
4
  import ssoLogoutCallback from './sso-logout-callback';
5
5
  import ssoAuthenticated from './sso-authenticated';
6
-
7
6
  export { ssoLogin, ssoLoginCallback, ssoLogout, ssoAuthenticated, ssoLogoutCallback };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AACpD,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AACtD,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-authenticated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-authenticated.d.ts","sourceRoot":"","sources":["../../src/sso/sso-authenticated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAG5B,KAAK,OAAO,EAAE,KAAK,QAAQ;AAA3C,wBAWE"}
@@ -0,0 +1,14 @@
1
+ import { Jwt } from '../utils';
2
+ export default (req, res) => {
3
+ const isJwtExpired = Jwt.isJwtExpired(req.session.securityToken?.access_token);
4
+ const userId = req.session.securityToken?.user_state?.user_id;
5
+ // Don't allow caching of this endpoint
6
+ res.header('Cache-Control', 'no-store, must-revalidate');
7
+ if (isJwtExpired || !userId) {
8
+ res.status(401).send(false);
9
+ }
10
+ else {
11
+ res.status(200).send(true);
12
+ }
13
+ };
14
+ //# sourceMappingURL=sso-authenticated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-authenticated.js","sourceRoot":"","sources":["../../src/sso/sso-authenticated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAC;IAC9D,uCAAuC;IACvC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAEzD,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, opalApiUrl: string) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-login-callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login-callback.d.ts","sourceRoot":"","sources":["../../src/sso/sso-login-callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAIpC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,EAAE,YAAY,MAAM;AAAzF,wBAyBE"}
@@ -0,0 +1,26 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ import axios from 'axios';
3
+ export default async (req, res, next, opalApiUrl) => {
4
+ const INTERNAL_USER_CALLBACK = `${opalApiUrl}/internal-user/handle-oauth-code`;
5
+ const logger = Logger.getLogger('login-callback');
6
+ try {
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const result = await axios.post(INTERNAL_USER_CALLBACK, req.body, {
9
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
10
+ });
11
+ const securityToken = result.data;
12
+ req.session.securityToken = securityToken;
13
+ req.session.save((err) => {
14
+ if (err) {
15
+ logger.error('Error saving session', err);
16
+ return next(err);
17
+ }
18
+ res.redirect('/');
19
+ });
20
+ }
21
+ catch (error) {
22
+ logger.error('Error on login-callback', error);
23
+ return next(error);
24
+ }
25
+ };
26
+ //# sourceMappingURL=sso-login-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login-callback.js","sourceRoot":"","sources":["../../src/sso/sso-login-callback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAe,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,UAAkB,EAAE,EAAE;IAC3F,MAAM,sBAAsB,GAAG,GAAG,UAAU,kCAAkC,CAAC;IAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAM,sBAAsB,EAAE,GAAG,CAAC,IAAI,EAAE;YACrE,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;SACjE,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QAE1C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YAED,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, opalApiUrl: string, frontendHostname: string) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login.d.ts","sourceRoot":"","sources":["../../src/sso/sso-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAKxD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,EAClB,YAAY,MAAM,EAClB,kBAAkB,MAAM;AAL1B,wBA0BE"}
@@ -0,0 +1,24 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ import axios from 'axios';
3
+ export default async (req, res, next, opalApiUrl, frontendHostname) => {
4
+ const INTERNAL_USER_LOGIN = `${opalApiUrl}/internal-user/login-or-refresh`;
5
+ const logger = Logger.getLogger('login');
6
+ const url = `${INTERNAL_USER_LOGIN}?redirect_uri=${frontendHostname}/sso/login-callback`;
7
+ try {
8
+ const response = await axios.get(url);
9
+ const redirectUrl = response.request.res.responseUrl;
10
+ if (redirectUrl) {
11
+ res.redirect(redirectUrl);
12
+ }
13
+ else {
14
+ const error = new Error('Error trying to fetch login page');
15
+ logger.error('Error on login', error);
16
+ return next(error);
17
+ }
18
+ }
19
+ catch (error) {
20
+ logger.error('Error on login', error);
21
+ return next(error);
22
+ }
23
+ };
24
+ //# sourceMappingURL=sso-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-login.js","sourceRoot":"","sources":["../../src/sso/sso-login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAe,KAAK,EAClB,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,UAAkB,EAClB,gBAAwB,EACxB,EAAE;IACF,MAAM,mBAAmB,GAAG,GAAG,UAAU,iCAAiC,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,mBAAmB,iBAAiB,gBAAgB,qBAAqB,CAAC;IAEzF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QAErD,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, prefix: string) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-logout-callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout-callback.d.ts","sourceRoot":"","sources":["../../src/sso/sso-logout-callback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAK1C,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,EAAE,QAAQ,MAAM;AAA/E,wBAWE"}
@@ -0,0 +1,13 @@
1
+ import { Logger } from '@hmcts/nodejs-logging';
2
+ const logger = Logger.getLogger('logout');
3
+ export default (req, res, next, prefix) => {
4
+ req.session.destroy((err) => {
5
+ if (err) {
6
+ logger.error('Error destroying session', err);
7
+ return next(err);
8
+ }
9
+ res.clearCookie(prefix);
10
+ res.redirect('/');
11
+ });
12
+ };
13
+ //# sourceMappingURL=sso-logout-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout-callback.js","sourceRoot":"","sources":["../../src/sso/sso-logout-callback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,MAAc,EAAE,EAAE;IACjF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAExB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response, next: NextFunction, opalApiUrl: string, frontendHostname: string) => Promise<void>;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout.d.ts","sourceRoot":"","sources":["../../src/sso/sso-logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;yBAIxD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,EAClB,YAAY,MAAM,EAClB,kBAAkB,MAAM;AAL1B,wBAoCE"}
@@ -0,0 +1,31 @@
1
+ import axios from 'axios';
2
+ import { Logger } from '@hmcts/nodejs-logging';
3
+ export default async (req, res, next, opalApiUrl, frontendHostname) => {
4
+ const INTERNAL_USER_LOGOUT = `${opalApiUrl}/internal-user/logout`;
5
+ const logger = Logger.getLogger('login');
6
+ const url = `${INTERNAL_USER_LOGOUT}?redirect_uri=${frontendHostname}/sso/logout-callback`;
7
+ try {
8
+ let accessToken;
9
+ if (req.session.securityToken) {
10
+ accessToken = req.session.securityToken.access_token;
11
+ }
12
+ if (!accessToken) {
13
+ return next(new Error('No access token found in session'));
14
+ }
15
+ const response = await axios.get(url, {
16
+ headers: { Authorization: `Bearer ${accessToken}` },
17
+ });
18
+ const logoutRedirect = response.request.res.responseUrl;
19
+ if (logoutRedirect) {
20
+ res.redirect(logoutRedirect);
21
+ }
22
+ else {
23
+ next(new Error('Error trying to fetch logout page'));
24
+ }
25
+ }
26
+ catch (error) {
27
+ logger.error('Error logging out', error);
28
+ return next(error);
29
+ }
30
+ };
31
+ //# sourceMappingURL=sso-logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-logout.js","sourceRoot":"","sources":["../../src/sso/sso-logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,eAAe,KAAK,EAClB,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,UAAkB,EAClB,gBAAwB,EACxB,EAAE;IACF,MAAM,oBAAoB,GAAG,GAAG,UAAU,uBAAuB,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,oBAAoB,iBAAiB,gBAAgB,sBAAsB,CAAC;IAE3F,IAAI,CAAC;QACH,IAAI,WAAW,CAAC;QAEhB,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9B,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACpC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;SACpD,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACxD,IAAI,cAAc,EAAE,CAAC;YACnB,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import ssoLoginStub from './sso-login.stub';
2
+ import ssoLoginCallbackStub from './sso-login-callback.stub';
3
+ import ssoAuthenticatedStub from './sso-authenticated.stub';
4
+ import ssoLogoutStub from './sso-logout.stub';
5
+ import ssoLogoutCallbackStub from './sso-logout-callback.stub';
6
+ export { ssoLoginStub, ssoLoginCallbackStub, ssoAuthenticatedStub, ssoLogoutStub, ssoLogoutCallbackStub };
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAC5D,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC"}
@@ -3,5 +3,5 @@ import ssoLoginCallbackStub from './sso-login-callback.stub';
3
3
  import ssoAuthenticatedStub from './sso-authenticated.stub';
4
4
  import ssoLogoutStub from './sso-logout.stub';
5
5
  import ssoLogoutCallbackStub from './sso-logout-callback.stub';
6
-
7
6
  export { ssoLoginStub, ssoLoginCallbackStub, ssoAuthenticatedStub, ssoLogoutStub, ssoLogoutCallbackStub };
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAC7D,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAC5D,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Request, Response } from 'express';
2
+ declare const _default: (req: Request, res: Response) => void;
3
+ export default _default;
4
+ //# sourceMappingURL=sso-authenticated.stub.d.ts.map