@hmcts/opal-frontend-common-node 0.0.13 → 0.0.15
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.
- package/csrf-token/index.js +2 -2
- package/csrf-token/index.js.map +1 -1
- package/health/index.js +1 -1
- package/health/index.js.map +1 -1
- package/interfaces/index.d.ts +9 -10
- package/interfaces/index.d.ts.map +1 -1
- package/interfaces/index.js +9 -10
- package/interfaces/index.js.map +1 -1
- package/package.json +3 -3
- package/session/index.d.ts +2 -3
- package/session/index.d.ts.map +1 -1
- package/session/index.js +2 -3
- package/session/index.js.map +1 -1
- package/sso/index.d.ts +5 -6
- package/sso/index.d.ts.map +1 -1
- package/sso/index.js +5 -6
- package/sso/index.js.map +1 -1
- package/sso/sso-authenticated.d.ts +22 -8
- package/sso/sso-authenticated.d.ts.map +1 -1
- package/sso/sso-authenticated.js +25 -13
- package/sso/sso-authenticated.js.map +1 -1
- package/sso/sso-login.d.ts +2 -2
- package/sso/sso-login.d.ts.map +1 -1
- package/sso/sso-login.js +2 -1
- package/sso/sso-login.js.map +1 -1
- package/sso/sso-logout-callback.d.ts +1 -2
- package/sso/sso-logout-callback.d.ts.map +1 -1
- package/sso/sso-logout-callback.js +2 -2
- package/sso/sso-logout-callback.js.map +1 -1
- package/stubs/sso/index.d.ts +5 -6
- package/stubs/sso/index.d.ts.map +1 -1
- package/stubs/sso/index.js +5 -6
- package/stubs/sso/index.js.map +1 -1
- package/stubs/sso/sso-authenticated.stub.d.ts +16 -9
- package/stubs/sso/sso-authenticated.stub.d.ts.map +1 -1
- package/stubs/sso/sso-authenticated.stub.js +20 -10
- package/stubs/sso/sso-authenticated.stub.js.map +1 -1
- package/stubs/sso/sso-login-callback.stub.d.ts +1 -2
- package/stubs/sso/sso-login-callback.stub.d.ts.map +1 -1
- package/stubs/sso/sso-login-callback.stub.js +2 -3
- package/stubs/sso/sso-login-callback.stub.js.map +1 -1
- package/stubs/sso/sso-login.stub.d.ts +1 -2
- package/stubs/sso/sso-login.stub.d.ts.map +1 -1
- package/stubs/sso/sso-login.stub.js +2 -2
- package/stubs/sso/sso-login.stub.js.map +1 -1
- package/stubs/sso/sso-logout-callback.stub.d.ts +2 -2
- package/stubs/sso/sso-logout-callback.stub.d.ts.map +1 -1
- package/stubs/sso/sso-logout-callback.stub.js +2 -1
- package/stubs/sso/sso-logout-callback.stub.js.map +1 -1
- package/stubs/sso/sso-logout.stub.d.ts +2 -2
- package/stubs/sso/sso-logout.stub.d.ts.map +1 -1
- package/stubs/sso/sso-logout.stub.js +2 -1
- package/stubs/sso/sso-logout.stub.js.map +1 -1
- package/utils/index.d.ts +1 -2
- package/utils/index.d.ts.map +1 -1
- package/utils/index.js +1 -2
- package/utils/index.js.map +1 -1
package/csrf-token/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { doubleCsrf } from 'csrf-csrf';
|
|
2
2
|
export class CSRFToken {
|
|
3
3
|
enableFor(app, secret, cookieName, sameSite, secure) {
|
|
4
|
-
const ignore = ['/sso/login-callback'];
|
|
4
|
+
const ignore = new Set(['/sso/login-callback']);
|
|
5
5
|
const { doubleCsrfProtection } = doubleCsrf({
|
|
6
6
|
getSecret: () => secret,
|
|
7
7
|
cookieName: cookieName,
|
|
@@ -14,7 +14,7 @@ export class CSRFToken {
|
|
|
14
14
|
getCsrfTokenFromRequest: (req) => req.cookies[cookieName].split('|')[0] ?? null,
|
|
15
15
|
});
|
|
16
16
|
app.use((req, res, next) => {
|
|
17
|
-
if (ignore.
|
|
17
|
+
if (ignore.has(req.url)) {
|
|
18
18
|
next();
|
|
19
19
|
}
|
|
20
20
|
else {
|
package/csrf-token/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/csrf-token/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,MAAM,OAAO,SAAS;IACb,SAAS,CAAC,GAAgB,EAAE,MAAc,EAAE,UAAkB,EAAE,QAAiB,EAAE,MAAe;QACvG,MAAM,MAAM,GAAG,CAAC,qBAAqB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/csrf-token/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,MAAM,OAAO,SAAS;IACb,SAAS,CAAC,GAAgB,EAAE,MAAc,EAAE,UAAkB,EAAE,QAAiB,EAAE,MAAe;QACvG,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAEhD,MAAM,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC;YAC1C,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;YACvB,UAAU,EAAE,UAAU;YACtB,aAAa,EAAE;gBACb,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,GAAG;aACV;YACD,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC7C,uBAAuB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;SAChF,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,IAAI,EAAE,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/health/index.js
CHANGED
package/health/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,WAAW,MAAM,2BAA2B,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAO,WAAW;IACf,SAAS,CAAC,GAAgB,EAAE,aAAqB;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YACrC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACtG,CAAC,CAAC,IAAI,CAAC;QAET,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE;gBACN,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B;YACD,GAAG,CAAC,KAAK;gBACP,CAAC,CAAC;oBACE,eAAe,EAAE;wBACf,KAAK;qBACN;iBACF;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,SAAS,EAAE;gBACT,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;aACzB;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/interfaces/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export { SecurityToken, launchDarklyConfig, appInsightsConfig, TransferServerState, ExpiryConfiguration, SessionStorageConfiguration, RoutesConfiguration, SsoConfiguration, SessionConfiguration, };
|
|
1
|
+
export { default as SecurityToken } from './securityToken';
|
|
2
|
+
export { default as launchDarklyConfig } from './launch-darkly-config';
|
|
3
|
+
export { default as appInsightsConfig } from './app-insights-config';
|
|
4
|
+
export { default as TransferServerState } from './transfer-server-state';
|
|
5
|
+
export { default as ExpiryConfiguration } from './session-expiry-config';
|
|
6
|
+
export { default as SessionStorageConfiguration } from './session-storage-config';
|
|
7
|
+
export { default as RoutesConfiguration } from './routes-config';
|
|
8
|
+
export { default as SsoConfiguration } from './sso-config';
|
|
9
|
+
export { default as SessionConfiguration } from './session-config';
|
|
11
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/interfaces/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export { SecurityToken, launchDarklyConfig, appInsightsConfig, TransferServerState, ExpiryConfiguration, SessionStorageConfiguration, RoutesConfiguration, SsoConfiguration, SessionConfiguration, };
|
|
1
|
+
export { default as SecurityToken } from './securityToken';
|
|
2
|
+
export { default as launchDarklyConfig } from './launch-darkly-config';
|
|
3
|
+
export { default as appInsightsConfig } from './app-insights-config';
|
|
4
|
+
export { default as TransferServerState } from './transfer-server-state';
|
|
5
|
+
export { default as ExpiryConfiguration } from './session-expiry-config';
|
|
6
|
+
export { default as SessionStorageConfiguration } from './session-storage-config';
|
|
7
|
+
export { default as RoutesConfiguration } from './routes-config';
|
|
8
|
+
export { default as SsoConfiguration } from './sso-config';
|
|
9
|
+
export { default as SessionConfiguration } from './session-config';
|
|
11
10
|
//# sourceMappingURL=index.js.map
|
package/interfaces/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hmcts/opal-frontend-common-node",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.15",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Common nodejs library components for opal",
|
|
7
7
|
"main": "dist/index",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"@types/luxon": "^3.4.2",
|
|
46
46
|
"@types/node": "^22.0.0",
|
|
47
47
|
"@types/session-file-store": "^1.2.5",
|
|
48
|
-
"@typescript-eslint/eslint-plugin": "8.
|
|
49
|
-
"@typescript-eslint/parser": "8.
|
|
48
|
+
"@typescript-eslint/eslint-plugin": "8.45.0",
|
|
49
|
+
"@typescript-eslint/parser": "8.45.0",
|
|
50
50
|
"eslint": "^9.0.0",
|
|
51
51
|
"eslint-plugin-prettier": "^5.2.6",
|
|
52
52
|
"typescript": "~5.9.0",
|
package/session/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export { SessionStorage, sessionExpiry };
|
|
1
|
+
export { default as SessionStorage } from './session-storage';
|
|
2
|
+
export { default as sessionExpiry } from './session-expiry';
|
|
4
3
|
//# sourceMappingURL=index.d.ts.map
|
package/session/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/session/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export { SessionStorage, sessionExpiry };
|
|
1
|
+
export { default as SessionStorage } from './session-storage';
|
|
2
|
+
export { default as sessionExpiry } from './session-expiry';
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
package/session/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
package/sso/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { ssoLogin, ssoLoginCallback, ssoLogout, ssoAuthenticated, ssoConfig };
|
|
1
|
+
export { default as ssoLogin } from './sso-login';
|
|
2
|
+
export { default as ssoLogout } from './sso-logout';
|
|
3
|
+
export { default as ssoLoginCallback } from './sso-login-callback';
|
|
4
|
+
export { default as ssoAuthenticated } from './sso-authenticated';
|
|
5
|
+
export { default as ssoConfig } from './sso-configuration';
|
|
7
6
|
//# sourceMappingURL=index.d.ts.map
|
package/sso/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
|
package/sso/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { ssoLogin, ssoLoginCallback, ssoLogout, ssoAuthenticated, ssoConfig };
|
|
1
|
+
export { default as ssoLogin } from './sso-login';
|
|
2
|
+
export { default as ssoLogout } from './sso-logout';
|
|
3
|
+
export { default as ssoLoginCallback } from './sso-login-callback';
|
|
4
|
+
export { default as ssoAuthenticated } from './sso-authenticated';
|
|
5
|
+
export { default as ssoConfig } from './sso-configuration';
|
|
7
6
|
//# sourceMappingURL=index.js.map
|
package/sso/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
2
|
/**
|
|
3
|
-
* Express
|
|
3
|
+
* Express handler that verifies whether the current session has a valid (non-expired) access token.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Reads the access token from
|
|
7
|
-
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - Reads the access token from `req.session.securityToken?.access_token`.
|
|
7
|
+
* - Prevents caching of the endpoint by setting the `Cache-Control: no-store, must-revalidate` header.
|
|
8
|
+
* - If the token is missing or expired (determined by `Jwt.isJwtExpired`), responds with HTTP 401 and sends `false`.
|
|
9
|
+
* - If the token is present and not expired, responds with HTTP 200 and sends `true`.
|
|
8
10
|
*
|
|
9
|
-
* @param req - Express
|
|
10
|
-
* @param res - Express
|
|
11
|
+
* @param req - Express Request; expected to contain `session.securityToken?.access_token` (string).
|
|
12
|
+
* @param res - Express Response used to set headers, status code, and send a boolean result.
|
|
13
|
+
* @returns void
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This endpoint is a lightweight authentication status check and has the side-effect of modifying response headers
|
|
17
|
+
* and sending an HTTP status and boolean payload. It relies on `Jwt.isJwtExpired` for token expiry checks.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // GET /sso/authenticated
|
|
21
|
+
* // -> 200 true (valid token)
|
|
22
|
+
* // -> 401 false (missing or expired token)
|
|
23
|
+
*
|
|
24
|
+
* @see Jwt.isJwtExpired
|
|
11
25
|
*/
|
|
12
|
-
declare const
|
|
13
|
-
export default
|
|
26
|
+
declare const ssoAuthenticatedHandler: (req: Request, res: Response) => void;
|
|
27
|
+
export default ssoAuthenticatedHandler;
|
|
14
28
|
//# sourceMappingURL=sso-authenticated.d.ts.map
|
|
@@ -1 +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;AAG5C
|
|
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;AAG5C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,QAAA,MAAM,uBAAuB,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,SAW3D,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
package/sso/sso-authenticated.js
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
import { Jwt } from '../utils';
|
|
2
2
|
/**
|
|
3
|
-
* Express
|
|
3
|
+
* Express handler that verifies whether the current session has a valid (non-expired) access token.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Reads the access token from
|
|
7
|
-
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - Reads the access token from `req.session.securityToken?.access_token`.
|
|
7
|
+
* - Prevents caching of the endpoint by setting the `Cache-Control: no-store, must-revalidate` header.
|
|
8
|
+
* - If the token is missing or expired (determined by `Jwt.isJwtExpired`), responds with HTTP 401 and sends `false`.
|
|
9
|
+
* - If the token is present and not expired, responds with HTTP 200 and sends `true`.
|
|
8
10
|
*
|
|
9
|
-
* @param req - Express
|
|
10
|
-
* @param res - Express
|
|
11
|
+
* @param req - Express Request; expected to contain `session.securityToken?.access_token` (string).
|
|
12
|
+
* @param res - Express Response used to set headers, status code, and send a boolean result.
|
|
13
|
+
* @returns void
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This endpoint is a lightweight authentication status check and has the side-effect of modifying response headers
|
|
17
|
+
* and sending an HTTP status and boolean payload. It relies on `Jwt.isJwtExpired` for token expiry checks.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // GET /sso/authenticated
|
|
21
|
+
* // -> 200 true (valid token)
|
|
22
|
+
* // -> 401 false (missing or expired token)
|
|
23
|
+
*
|
|
24
|
+
* @see Jwt.isJwtExpired
|
|
11
25
|
*/
|
|
12
|
-
|
|
13
|
-
res.set('Cache-Control', 'no-store, no-cache, private');
|
|
14
|
-
res.set('Pragma', 'no-cache');
|
|
15
|
-
// Read the access token from the session (set during the SSO login callback).
|
|
26
|
+
const ssoAuthenticatedHandler = (req, res) => {
|
|
16
27
|
const accessToken = req.session.securityToken?.access_token;
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
if (!accessToken || isJwtExpired) {
|
|
28
|
+
// Don't allow caching of this endpoint
|
|
29
|
+
res.header('Cache-Control', 'no-store, must-revalidate');
|
|
30
|
+
if (!accessToken || Jwt.isJwtExpired(accessToken)) {
|
|
20
31
|
res.status(401).send(false);
|
|
21
32
|
}
|
|
22
33
|
else {
|
|
23
34
|
res.status(200).send(true);
|
|
24
35
|
}
|
|
25
36
|
};
|
|
37
|
+
export default ssoAuthenticatedHandler;
|
|
26
38
|
//# sourceMappingURL=sso-authenticated.js.map
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,uBAAuB,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9D,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;IAE5D,uCAAuC;IACvC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAEzD,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,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;AAEF,eAAe,uBAAuB,CAAC"}
|
package/sso/sso-login.d.ts
CHANGED
|
@@ -14,6 +14,6 @@ import { ConfidentialClientApplication } from '@azure/msal-node';
|
|
|
14
14
|
* then redirects the user to the authentication provider. If an error occurs, it logs the error and
|
|
15
15
|
* passes it to the next middleware.
|
|
16
16
|
*/
|
|
17
|
-
declare const
|
|
18
|
-
export default
|
|
17
|
+
declare const ssoLoginHandler: (res: Response, next: NextFunction, msalInstance: ConfidentialClientApplication, frontendHostname: string, ssoLoginCallback: string) => Promise<void>;
|
|
18
|
+
export default ssoLoginHandler;
|
|
19
19
|
//# sourceMappingURL=sso-login.d.ts.map
|
package/sso/sso-login.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-login.d.ts","sourceRoot":"","sources":["../../src/sso/sso-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"sso-login.d.ts","sourceRoot":"","sources":["../../src/sso/sso-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,eAAe,GACnB,KAAK,QAAQ,EACb,MAAM,YAAY,EAClB,cAAc,6BAA6B,EAC3C,kBAAkB,MAAM,EACxB,kBAAkB,MAAM,kBAezB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
package/sso/sso-login.js
CHANGED
|
@@ -13,7 +13,7 @@ import { Logger } from '@hmcts/nodejs-logging';
|
|
|
13
13
|
* then redirects the user to the authentication provider. If an error occurs, it logs the error and
|
|
14
14
|
* passes it to the next middleware.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
const ssoLoginHandler = async (res, next, msalInstance, frontendHostname, ssoLoginCallback) => {
|
|
17
17
|
const logger = Logger.getLogger('sso-login');
|
|
18
18
|
try {
|
|
19
19
|
const authCodeUrl = await msalInstance.getAuthCodeUrl({
|
|
@@ -28,4 +28,5 @@ export default async (res, next, msalInstance, frontendHostname, ssoLoginCallbac
|
|
|
28
28
|
next(error);
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
+
export default ssoLoginHandler;
|
|
31
32
|
//# sourceMappingURL=sso-login.js.map
|
package/sso/sso-login.js.map
CHANGED
|
@@ -1 +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;AAG/C;;;;;;;;;;;;;GAaG;AACH,eAAe,KAAK,
|
|
1
|
+
{"version":3,"file":"sso-login.js","sourceRoot":"","sources":["../../src/sso/sso-login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C;;;;;;;;;;;;;GAaG;AACH,MAAM,eAAe,GAAG,KAAK,EAC3B,GAAa,EACb,IAAkB,EAClB,YAA2C,EAC3C,gBAAwB,EACxB,gBAAwB,EACxB,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC;YACpD,MAAM,EAAE,CAAC,WAAW,CAAC;YACrB,WAAW,EAAE,GAAG,gBAAgB,GAAG,gBAAgB,EAAE;YACrD,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QAEH,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -9,6 +9,5 @@ import { NextFunction, Request, Response } from 'express';
|
|
|
9
9
|
* @param next - Express next middleware function.
|
|
10
10
|
* @param prefix - The name of the cookie to clear.
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
export default _default;
|
|
12
|
+
export default function handleLogoutCallback(req: Request, res: Response, next: NextFunction, prefix: string): void;
|
|
14
13
|
//# sourceMappingURL=sso-logout-callback.d.ts.map
|
|
@@ -1 +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;AAK1D;;;;;;;;;GASG;
|
|
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;AAK1D;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAW3G"}
|
|
@@ -10,7 +10,7 @@ const logger = Logger.getLogger('logout');
|
|
|
10
10
|
* @param next - Express next middleware function.
|
|
11
11
|
* @param prefix - The name of the cookie to clear.
|
|
12
12
|
*/
|
|
13
|
-
export default (req, res, next, prefix)
|
|
13
|
+
export default function handleLogoutCallback(req, res, next, prefix) {
|
|
14
14
|
req.session.destroy((err) => {
|
|
15
15
|
if (err) {
|
|
16
16
|
logger.error('Error destroying session', err);
|
|
@@ -19,5 +19,5 @@ export default (req, res, next, prefix) => {
|
|
|
19
19
|
res.clearCookie(prefix);
|
|
20
20
|
res.redirect('/');
|
|
21
21
|
});
|
|
22
|
-
}
|
|
22
|
+
}
|
|
23
23
|
//# sourceMappingURL=sso-logout-callback.js.map
|
|
@@ -1 +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;;;;;;;;;GASG;AACH,
|
|
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;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,MAAc;IAC1G,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"}
|
package/stubs/sso/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { ssoLoginStub, ssoLoginCallbackStub, ssoAuthenticatedStub, ssoLogoutStub, ssoLogoutCallbackStub };
|
|
1
|
+
export { default as ssoLoginStub } from './sso-login.stub';
|
|
2
|
+
export { default as ssoLoginCallbackStub } from './sso-login-callback.stub';
|
|
3
|
+
export { default as ssoAuthenticatedStub } from './sso-authenticated.stub';
|
|
4
|
+
export { default as ssoLogoutStub } from './sso-logout.stub';
|
|
5
|
+
export { default as ssoLogoutCallbackStub } from './sso-logout-callback.stub';
|
|
7
6
|
//# sourceMappingURL=index.d.ts.map
|
package/stubs/sso/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
package/stubs/sso/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export { ssoLoginStub, ssoLoginCallbackStub, ssoAuthenticatedStub, ssoLogoutStub, ssoLogoutCallbackStub };
|
|
1
|
+
export { default as ssoLoginStub } from './sso-login.stub';
|
|
2
|
+
export { default as ssoLoginCallbackStub } from './sso-login-callback.stub';
|
|
3
|
+
export { default as ssoAuthenticatedStub } from './sso-authenticated.stub';
|
|
4
|
+
export { default as ssoLogoutStub } from './sso-logout.stub';
|
|
5
|
+
export { default as ssoLogoutCallbackStub } from './sso-logout-callback.stub';
|
|
7
6
|
//# sourceMappingURL=index.js.map
|
package/stubs/sso/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/stubs/sso/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Middleware stub that validates whether the current request is authenticated via a JWT stored on the session.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
5
|
+
* This handler:
|
|
6
|
+
* - Reads the access token from req.session.securityToken?.access_token.
|
|
7
|
+
* - Prevents caching of the response by setting the "Cache-Control" header to "no-store, must-revalidate".
|
|
8
|
+
* - If there is no access token or the token is expired (via Jwt.isJwtExpired), it responds with HTTP 401 and a body of false.
|
|
9
|
+
* - If the token exists and is valid, it responds with HTTP 200 and a body of true.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
11
|
+
* The function writes the response directly to the provided Express Response object and does not return a value.
|
|
12
|
+
*
|
|
13
|
+
* @param req - The incoming Express Request. Expects a session object with an optional securityToken containing access_token.
|
|
14
|
+
* @param res - The Express Response used to set headers, status, and send the boolean authentication result.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* - This is a simple stub intended for testing or service-mocking; it performs no additional authentication logic beyond token existence and expiry check.
|
|
18
|
+
* - Side effects: sets Cache-Control header and sends an HTTP response (status + boolean body).
|
|
12
19
|
*/
|
|
13
|
-
declare const
|
|
14
|
-
export default
|
|
20
|
+
declare const ssoAuthenticatedStub: (req: Request, res: Response) => void;
|
|
21
|
+
export default ssoAuthenticatedStub;
|
|
15
22
|
//# sourceMappingURL=sso-authenticated.stub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-authenticated.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C
|
|
1
|
+
{"version":3,"file":"sso-authenticated.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,oBAAoB,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,SAWxD,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
import { Jwt } from '../../utils';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Middleware stub that validates whether the current request is authenticated via a JWT stored on the session.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
5
|
+
* This handler:
|
|
6
|
+
* - Reads the access token from req.session.securityToken?.access_token.
|
|
7
|
+
* - Prevents caching of the response by setting the "Cache-Control" header to "no-store, must-revalidate".
|
|
8
|
+
* - If there is no access token or the token is expired (via Jwt.isJwtExpired), it responds with HTTP 401 and a body of false.
|
|
9
|
+
* - If the token exists and is valid, it responds with HTTP 200 and a body of true.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
11
|
+
* The function writes the response directly to the provided Express Response object and does not return a value.
|
|
12
|
+
*
|
|
13
|
+
* @param req - The incoming Express Request. Expects a session object with an optional securityToken containing access_token.
|
|
14
|
+
* @param res - The Express Response used to set headers, status, and send the boolean authentication result.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* - This is a simple stub intended for testing or service-mocking; it performs no additional authentication logic beyond token existence and expiry check.
|
|
18
|
+
* - Side effects: sets Cache-Control header and sends an HTTP response (status + boolean body).
|
|
12
19
|
*/
|
|
13
|
-
|
|
20
|
+
const ssoAuthenticatedStub = (req, res) => {
|
|
21
|
+
const accessToken = req.session.securityToken?.access_token;
|
|
14
22
|
// Don't allow caching of this endpoint
|
|
15
23
|
res.header('Cache-Control', 'no-store, must-revalidate');
|
|
16
|
-
const accessToken = req.session.securityToken?.access_token;
|
|
17
24
|
if (!accessToken || Jwt.isJwtExpired(accessToken)) {
|
|
18
25
|
res.status(401).send(false);
|
|
19
26
|
}
|
|
20
|
-
|
|
27
|
+
else {
|
|
28
|
+
res.status(200).send(true);
|
|
29
|
+
}
|
|
21
30
|
};
|
|
31
|
+
export default ssoAuthenticatedStub;
|
|
22
32
|
//# sourceMappingURL=sso-authenticated.stub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-authenticated.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC
|
|
1
|
+
{"version":3,"file":"sso-authenticated.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-authenticated.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC3D,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;IAE5D,uCAAuC;IACvC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAEzD,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,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;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -16,6 +16,5 @@ import { NextFunction, Request, Response } from 'express';
|
|
|
16
16
|
* - On success, the access token is stored in `req.session.securityToken` and the user is redirected to the root path.
|
|
17
17
|
* - Intended for use in test and development environments only.
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
export default _default;
|
|
19
|
+
export default function ssoLoginCallback(req: Request, res: Response, next: NextFunction, opalApiUrl: string): Promise<void>;
|
|
21
20
|
//# sourceMappingURL=sso-login-callback.stub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-login-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1D;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"sso-login-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAA8B,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBA0CjH"}
|
|
@@ -17,7 +17,7 @@ import axios from 'axios';
|
|
|
17
17
|
* - On success, the access token is stored in `req.session.securityToken` and the user is redirected to the root path.
|
|
18
18
|
* - Intended for use in test and development environments only.
|
|
19
19
|
*/
|
|
20
|
-
export default async (req, res, next, opalApiUrl)
|
|
20
|
+
export default async function ssoLoginCallback(req, res, next, opalApiUrl) {
|
|
21
21
|
const logger = Logger.getLogger('login-callback-stub');
|
|
22
22
|
try {
|
|
23
23
|
const email = req.query['email']?.trim();
|
|
@@ -46,7 +46,6 @@ export default async (req, res, next, opalApiUrl) => {
|
|
|
46
46
|
logger.error('Error saving session', err);
|
|
47
47
|
return next(err);
|
|
48
48
|
}
|
|
49
|
-
logger.info('Session saved (access token only)');
|
|
50
49
|
return res.redirect('/');
|
|
51
50
|
});
|
|
52
51
|
}
|
|
@@ -54,5 +53,5 @@ export default async (req, res, next, opalApiUrl) => {
|
|
|
54
53
|
logger.error('Error on login-stub callback', error);
|
|
55
54
|
return next(error);
|
|
56
55
|
}
|
|
57
|
-
}
|
|
56
|
+
}
|
|
58
57
|
//# sourceMappingURL=sso-login-callback.stub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-login-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,
|
|
1
|
+
{"version":3,"file":"sso-login-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,UAAkB;IAChH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,KAAK,GAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAwB,EAAE,IAAI,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,cAAc,GAAG,GAAG,UAAU,6BAA6B,CAAC;QAElE,6DAA6D;QAC7D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE;YAC7C,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;SACnC,CAAC,CAAC;QAEH,4EAA4E;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,YAAY,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC;QAE1E,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACvE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,iDAAiD;QACjD,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAEpE,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;YACD,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -10,6 +10,5 @@ import { Request, Response, NextFunction } from 'express';
|
|
|
10
10
|
* @param next - Express next middleware function
|
|
11
11
|
* @returns A redirect response or calls `next` with an error if no email is provided.
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
export default _default;
|
|
13
|
+
export default function ssoLoginStub(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
15
14
|
//# sourceMappingURL=sso-login.stub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-login.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK1D;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"sso-login.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK1D;;;;;;;;;;GAUG;AACH,wBAA8B,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,iBAUzF"}
|
|
@@ -11,7 +11,7 @@ const logger = Logger.getLogger('login-stub');
|
|
|
11
11
|
* @param next - Express next middleware function
|
|
12
12
|
* @returns A redirect response or calls `next` with an error if no email is provided.
|
|
13
13
|
*/
|
|
14
|
-
export default async (req, res, next)
|
|
14
|
+
export default async function ssoLoginStub(req, res, next) {
|
|
15
15
|
const email = req.query['email']?.trim();
|
|
16
16
|
if (email) {
|
|
17
17
|
return res.redirect(`/sso/login-callback?email=${encodeURIComponent(email)}`);
|
|
@@ -19,5 +19,5 @@ export default async (req, res, next) => {
|
|
|
19
19
|
const error = new Error('No email provided.');
|
|
20
20
|
logger.error('Error on login-stub', error);
|
|
21
21
|
return next(error);
|
|
22
|
-
}
|
|
22
|
+
}
|
|
23
23
|
//# sourceMappingURL=sso-login.stub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-login.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,
|
|
1
|
+
{"version":3,"file":"sso-login.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-login.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,YAAY,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACxF,MAAM,KAAK,GAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAwB,EAAE,IAAI,EAAE,CAAC;IAEjE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,QAAQ,CAAC,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -11,6 +11,6 @@ import { NextFunction, Request, Response } from 'express';
|
|
|
11
11
|
* @remarks
|
|
12
12
|
* If an error occurs while destroying the session, it is logged and passed to the next middleware.
|
|
13
13
|
*/
|
|
14
|
-
declare const
|
|
15
|
-
export default
|
|
14
|
+
declare const ssoLogoutCallback: (req: Request, res: Response, next: NextFunction, prefix: string) => void;
|
|
15
|
+
export default ssoLogoutCallback;
|
|
16
16
|
//# sourceMappingURL=sso-logout-callback.stub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-logout-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"sso-logout-callback.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,iBAAiB,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,EAAE,QAAQ,MAAM,SAYzF,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { Logger } from '@hmcts/nodejs-logging';
|
|
|
11
11
|
* @remarks
|
|
12
12
|
* If an error occurs while destroying the session, it is logged and passed to the next middleware.
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
const ssoLogoutCallback = (req, res, next, prefix) => {
|
|
15
15
|
const logger = Logger.getLogger('logout-callback-stub');
|
|
16
16
|
req.session.destroy((err) => {
|
|
17
17
|
if (err) {
|
|
@@ -22,4 +22,5 @@ export default (req, res, next, prefix) => {
|
|
|
22
22
|
res.redirect('/');
|
|
23
23
|
});
|
|
24
24
|
};
|
|
25
|
+
export default ssoLogoutCallback;
|
|
25
26
|
//# sourceMappingURL=sso-logout-callback.stub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-logout-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,
|
|
1
|
+
{"version":3,"file":"sso-logout-callback.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout-callback.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,MAAc,EAAE,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAExD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -11,6 +11,6 @@ import { Request, Response } from 'express';
|
|
|
11
11
|
* @param res - The Express response object.
|
|
12
12
|
* @returns Sends a boolean response indicating the validity of the access token.
|
|
13
13
|
*/
|
|
14
|
-
declare const
|
|
15
|
-
export default
|
|
14
|
+
declare const handleSsoLogout: (req: Request, res: Response) => Response<any, Record<string, any>>;
|
|
15
|
+
export default handleSsoLogout;
|
|
16
16
|
//# sourceMappingURL=sso-logout.stub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-logout.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"sso-logout.stub.d.ts","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,uCAWnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { Jwt } from '../../utils';
|
|
|
11
11
|
* @param res - The Express response object.
|
|
12
12
|
* @returns Sends a boolean response indicating the validity of the access token.
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
const handleSsoLogout = (req, res) => {
|
|
15
15
|
// Don't allow caching of this endpoint
|
|
16
16
|
res.header('Cache-Control', 'no-store, must-revalidate');
|
|
17
17
|
const accessToken = req.session.securityToken?.access_token;
|
|
@@ -20,4 +20,5 @@ export default (req, res) => {
|
|
|
20
20
|
}
|
|
21
21
|
return res.status(200).send(true);
|
|
22
22
|
};
|
|
23
|
+
export default handleSsoLogout;
|
|
23
24
|
//# sourceMappingURL=sso-logout.stub.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sso-logout.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"sso-logout.stub.js","sourceRoot":"","sources":["../../../src/stubs/sso/sso-logout.stub.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC;;;;;;;;;;;GAWG;AACH,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IACtD,uCAAuC;IACvC,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;IAEzD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC;IAE5D,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
package/utils/index.d.ts
CHANGED
package/utils/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC"}
|
package/utils/index.js
CHANGED
package/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC"}
|