@gemeentenijmegen/webapp 0.0.1 → 0.0.2
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/.jsii +72 -3
- package/API.md +56 -0
- package/README.md +71 -1
- package/assets/webapp/auth/auth.lambda/index.js +3 -3
- package/assets/webapp/login/login.lambda/index.js +6 -6
- package/assets/webapp/logout/logout.lambda/index.js +5 -5
- package/lib/index.d.ts +2 -0
- package/lib/index.js +4 -1
- package/lib/webapp/Webapp.js +1 -1
- package/lib/webapp/Webpage.js +1 -1
- package/lib/webapp/auth/auth.lambda.js +2 -2
- package/lib/webapp/login/login.lambda.js +3 -3
- package/lib/webapp/logout/logout.lambda.js +2 -2
- package/lib/webapp/util/Files.d.ts +2 -2
- package/lib/webapp/util/Files.js +7 -3
- package/lib/webapp/util/render.js +3 -3
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -3700,7 +3700,7 @@
|
|
|
3700
3700
|
},
|
|
3701
3701
|
"name": "@gemeentenijmegen/webapp",
|
|
3702
3702
|
"readme": {
|
|
3703
|
-
"markdown": "#
|
|
3703
|
+
"markdown": "# Generic webapp\n\nThis packages provides the building blocks to create a standardized webapp.\nIt contains both infrastructure (CloudFront, S3 buckets etc.) as application code (login/authetnication)\n\n\n## Usage\n\nCreating the webapp foundation is easy.\n```ts\n/**\n * Create the webapp!\n */\nconst webapp = new WebappConstruct(this, 'app', {\n applicationName: Statics.projectName,\n cloudFrontCertificate: certificate,\n domainName: `${hostedZone.zoneName}`,\n additionalSourceFilesDir: 'src/resources',\n hostedZone: hostedZone,\n staticResourcesDirectory: './src/app/static-resources/',\n defaultPath: '/home',\n postLoginProcessor: this.postLoginHook(secretBrpMtlsPrivateKey, ssmBrpMtlsCertficate, ssmBrpMtlsRootCa),\n oidcProfiles: props.configuration.oidcProfiles,\n});\n```\n\n<details>\n<summary>Post login processor</summary>\nExample on how to setup a post login processor function\n\n```ts\n /**\n * Constrcut a post-login hook function that is passed directly\n * to the webapp. It will register the function and redirect trafic\n * there after the pre-login (auth lambda).\n * @returns\n */\n postLoginHook(privateKey: ISecret, cert: IStringParameter, rootCa: IStringParameter) {\n const hook = new ApiFunction(this, 'post-login-function', {\n description: 'Post-login lambda',\n apiFunction: PostloginFunction,\n environment: {\n BRP_API_URL: StringParameter.valueForStringParameter(this, Statics.ssmBrpApiEndpointUrl),\n MTLS_PRIVATE_KEY_ARN: privateKey.secretArn,\n MTLS_CLIENT_CERT_NAME: Statics.ssmBrpMtlsCertificate,\n MTLS_ROOT_CA_NAME: Statics.ssmBrpMtlsRootCA,\n },\n });\n privateKey.grantRead(hook.lambda);\n cert.grantRead(hook.lambda);\n rootCa.grantRead(hook.lambda);\n return hook;\n }\n```\n\n</details>\n\n## Adding multiple pages\n```ts\n/**\n * Add a home page to the webapp\n * @param webapp\n */\naddHomePage(webapp: WebappConstruct) {\n const homeFunction = new ApiFunction(this, 'home-function', {\n description: 'Home lambda',\n apiFunction: HomeFunction,\n });\n webapp.addPage('home', homeFunction, '/home');\n}\n```"
|
|
3704
3704
|
},
|
|
3705
3705
|
"repository": {
|
|
3706
3706
|
"type": "git",
|
|
@@ -3713,6 +3713,75 @@
|
|
|
3713
3713
|
}
|
|
3714
3714
|
},
|
|
3715
3715
|
"types": {
|
|
3716
|
+
"@gemeentenijmegen/webapp.Files": {
|
|
3717
|
+
"assembly": "@gemeentenijmegen/webapp",
|
|
3718
|
+
"docs": {
|
|
3719
|
+
"stability": "stable"
|
|
3720
|
+
},
|
|
3721
|
+
"fqn": "@gemeentenijmegen/webapp.Files",
|
|
3722
|
+
"initializer": {
|
|
3723
|
+
"docs": {
|
|
3724
|
+
"stability": "stable"
|
|
3725
|
+
}
|
|
3726
|
+
},
|
|
3727
|
+
"kind": "class",
|
|
3728
|
+
"locationInModule": {
|
|
3729
|
+
"filename": "src/webapp/util/Files.ts",
|
|
3730
|
+
"line": 3
|
|
3731
|
+
},
|
|
3732
|
+
"methods": [
|
|
3733
|
+
{
|
|
3734
|
+
"docs": {
|
|
3735
|
+
"returns": "the list of profiles",
|
|
3736
|
+
"stability": "stable",
|
|
3737
|
+
"summary": "Get the authentication JSON file and parse it."
|
|
3738
|
+
},
|
|
3739
|
+
"locationInModule": {
|
|
3740
|
+
"filename": "src/webapp/util/Files.ts",
|
|
3741
|
+
"line": 22
|
|
3742
|
+
},
|
|
3743
|
+
"name": "loadAuthenticationProfiles",
|
|
3744
|
+
"returns": {
|
|
3745
|
+
"type": {
|
|
3746
|
+
"primitive": "any"
|
|
3747
|
+
}
|
|
3748
|
+
},
|
|
3749
|
+
"static": true
|
|
3750
|
+
},
|
|
3751
|
+
{
|
|
3752
|
+
"docs": {
|
|
3753
|
+
"returns": "template as string or undefined",
|
|
3754
|
+
"stability": "stable",
|
|
3755
|
+
"summary": "Check if the template is found in the file system."
|
|
3756
|
+
},
|
|
3757
|
+
"locationInModule": {
|
|
3758
|
+
"filename": "src/webapp/util/Files.ts",
|
|
3759
|
+
"line": 10
|
|
3760
|
+
},
|
|
3761
|
+
"name": "loadTemplateOverwrite",
|
|
3762
|
+
"parameters": [
|
|
3763
|
+
{
|
|
3764
|
+
"docs": {
|
|
3765
|
+
"summary": "to template should start with /opt/."
|
|
3766
|
+
},
|
|
3767
|
+
"name": "path",
|
|
3768
|
+
"type": {
|
|
3769
|
+
"primitive": "string"
|
|
3770
|
+
}
|
|
3771
|
+
}
|
|
3772
|
+
],
|
|
3773
|
+
"returns": {
|
|
3774
|
+
"optional": true,
|
|
3775
|
+
"type": {
|
|
3776
|
+
"primitive": "string"
|
|
3777
|
+
}
|
|
3778
|
+
},
|
|
3779
|
+
"static": true
|
|
3780
|
+
}
|
|
3781
|
+
],
|
|
3782
|
+
"name": "Files",
|
|
3783
|
+
"symbolId": "src/webapp/util/Files:Files"
|
|
3784
|
+
},
|
|
3716
3785
|
"@gemeentenijmegen/webapp.OpenIdConnectConnectionProfile": {
|
|
3717
3786
|
"assembly": "@gemeentenijmegen/webapp",
|
|
3718
3787
|
"datatype": true,
|
|
@@ -4514,6 +4583,6 @@
|
|
|
4514
4583
|
"symbolId": "src/webapp/Webpage:WebpageProps"
|
|
4515
4584
|
}
|
|
4516
4585
|
},
|
|
4517
|
-
"version": "0.0.
|
|
4518
|
-
"fingerprint": "
|
|
4586
|
+
"version": "0.0.2",
|
|
4587
|
+
"fingerprint": "80lB6GOdg1LDtbQ05YcmMQOtTbrNoC4z69ebcA/LrE4="
|
|
4519
4588
|
}
|
package/API.md
CHANGED
|
@@ -758,5 +758,61 @@ Set a lambda timeout in miliseconds.
|
|
|
758
758
|
|
|
759
759
|
---
|
|
760
760
|
|
|
761
|
+
## Classes <a name="Classes" id="Classes"></a>
|
|
762
|
+
|
|
763
|
+
### Files <a name="Files" id="@gemeentenijmegen/webapp.Files"></a>
|
|
764
|
+
|
|
765
|
+
#### Initializers <a name="Initializers" id="@gemeentenijmegen/webapp.Files.Initializer"></a>
|
|
766
|
+
|
|
767
|
+
```typescript
|
|
768
|
+
import { Files } from '@gemeentenijmegen/webapp'
|
|
769
|
+
|
|
770
|
+
new Files()
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
| **Name** | **Type** | **Description** |
|
|
774
|
+
| --- | --- | --- |
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
#### Static Functions <a name="Static Functions" id="Static Functions"></a>
|
|
780
|
+
|
|
781
|
+
| **Name** | **Description** |
|
|
782
|
+
| --- | --- |
|
|
783
|
+
| <code><a href="#@gemeentenijmegen/webapp.Files.loadAuthenticationProfiles">loadAuthenticationProfiles</a></code> | Get the authentication JSON file and parse it. |
|
|
784
|
+
| <code><a href="#@gemeentenijmegen/webapp.Files.loadTemplateOverwrite">loadTemplateOverwrite</a></code> | Check if the template is found in the file system. |
|
|
785
|
+
|
|
786
|
+
---
|
|
787
|
+
|
|
788
|
+
##### `loadAuthenticationProfiles` <a name="loadAuthenticationProfiles" id="@gemeentenijmegen/webapp.Files.loadAuthenticationProfiles"></a>
|
|
789
|
+
|
|
790
|
+
```typescript
|
|
791
|
+
import { Files } from '@gemeentenijmegen/webapp'
|
|
792
|
+
|
|
793
|
+
Files.loadAuthenticationProfiles()
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
Get the authentication JSON file and parse it.
|
|
797
|
+
|
|
798
|
+
##### `loadTemplateOverwrite` <a name="loadTemplateOverwrite" id="@gemeentenijmegen/webapp.Files.loadTemplateOverwrite"></a>
|
|
799
|
+
|
|
800
|
+
```typescript
|
|
801
|
+
import { Files } from '@gemeentenijmegen/webapp'
|
|
802
|
+
|
|
803
|
+
Files.loadTemplateOverwrite(path: string)
|
|
804
|
+
```
|
|
805
|
+
|
|
806
|
+
Check if the template is found in the file system.
|
|
807
|
+
|
|
808
|
+
###### `path`<sup>Required</sup> <a name="path" id="@gemeentenijmegen/webapp.Files.loadTemplateOverwrite.parameter.path"></a>
|
|
809
|
+
|
|
810
|
+
- *Type:* string
|
|
811
|
+
|
|
812
|
+
to template should start with /opt/.
|
|
813
|
+
|
|
814
|
+
---
|
|
815
|
+
|
|
816
|
+
|
|
761
817
|
|
|
762
818
|
|
package/README.md
CHANGED
|
@@ -1 +1,71 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Generic webapp
|
|
2
|
+
|
|
3
|
+
This packages provides the building blocks to create a standardized webapp.
|
|
4
|
+
It contains both infrastructure (CloudFront, S3 buckets etc.) as application code (login/authetnication)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
Creating the webapp foundation is easy.
|
|
10
|
+
```ts
|
|
11
|
+
/**
|
|
12
|
+
* Create the webapp!
|
|
13
|
+
*/
|
|
14
|
+
const webapp = new WebappConstruct(this, 'app', {
|
|
15
|
+
applicationName: Statics.projectName,
|
|
16
|
+
cloudFrontCertificate: certificate,
|
|
17
|
+
domainName: `${hostedZone.zoneName}`,
|
|
18
|
+
additionalSourceFilesDir: 'src/resources',
|
|
19
|
+
hostedZone: hostedZone,
|
|
20
|
+
staticResourcesDirectory: './src/app/static-resources/',
|
|
21
|
+
defaultPath: '/home',
|
|
22
|
+
postLoginProcessor: this.postLoginHook(secretBrpMtlsPrivateKey, ssmBrpMtlsCertficate, ssmBrpMtlsRootCa),
|
|
23
|
+
oidcProfiles: props.configuration.oidcProfiles,
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
<details>
|
|
28
|
+
<summary>Post login processor</summary>
|
|
29
|
+
Example on how to setup a post login processor function
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
/**
|
|
33
|
+
* Constrcut a post-login hook function that is passed directly
|
|
34
|
+
* to the webapp. It will register the function and redirect trafic
|
|
35
|
+
* there after the pre-login (auth lambda).
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
postLoginHook(privateKey: ISecret, cert: IStringParameter, rootCa: IStringParameter) {
|
|
39
|
+
const hook = new ApiFunction(this, 'post-login-function', {
|
|
40
|
+
description: 'Post-login lambda',
|
|
41
|
+
apiFunction: PostloginFunction,
|
|
42
|
+
environment: {
|
|
43
|
+
BRP_API_URL: StringParameter.valueForStringParameter(this, Statics.ssmBrpApiEndpointUrl),
|
|
44
|
+
MTLS_PRIVATE_KEY_ARN: privateKey.secretArn,
|
|
45
|
+
MTLS_CLIENT_CERT_NAME: Statics.ssmBrpMtlsCertificate,
|
|
46
|
+
MTLS_ROOT_CA_NAME: Statics.ssmBrpMtlsRootCA,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
privateKey.grantRead(hook.lambda);
|
|
50
|
+
cert.grantRead(hook.lambda);
|
|
51
|
+
rootCa.grantRead(hook.lambda);
|
|
52
|
+
return hook;
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
</details>
|
|
57
|
+
|
|
58
|
+
## Adding multiple pages
|
|
59
|
+
```ts
|
|
60
|
+
/**
|
|
61
|
+
* Add a home page to the webapp
|
|
62
|
+
* @param webapp
|
|
63
|
+
*/
|
|
64
|
+
addHomePage(webapp: WebappConstruct) {
|
|
65
|
+
const homeFunction = new ApiFunction(this, 'home-function', {
|
|
66
|
+
description: 'Home lambda',
|
|
67
|
+
apiFunction: HomeFunction,
|
|
68
|
+
});
|
|
69
|
+
webapp.addPage('home', homeFunction, '/home');
|
|
70
|
+
}
|
|
71
|
+
```
|
|
@@ -12234,7 +12234,7 @@ var Files = class {
|
|
|
12234
12234
|
* @param path to template should start with /opt/
|
|
12235
12235
|
* @returns template as string or undefined
|
|
12236
12236
|
*/
|
|
12237
|
-
static
|
|
12237
|
+
static loadTemplateOverwrite(path) {
|
|
12238
12238
|
if (fs.existsSync(path)) {
|
|
12239
12239
|
console.info(`${path} template overwrite found!`);
|
|
12240
12240
|
return fs.readFileSync(path).toString("utf8");
|
|
@@ -12245,7 +12245,7 @@ var Files = class {
|
|
|
12245
12245
|
* Get the authentication JSON file and parse it
|
|
12246
12246
|
* @returns the list of profiles
|
|
12247
12247
|
*/
|
|
12248
|
-
static
|
|
12248
|
+
static loadAuthenticationProfiles() {
|
|
12249
12249
|
const profiles2 = JSON.parse(fs.readFileSync("/opt/authentication.json").toString("utf8"));
|
|
12250
12250
|
console.info("Initializing authentication profiles", profiles2);
|
|
12251
12251
|
return profiles2;
|
|
@@ -12254,7 +12254,7 @@ var Files = class {
|
|
|
12254
12254
|
|
|
12255
12255
|
// src/webapp/auth/auth.lambda.ts
|
|
12256
12256
|
var dynamoDBClient = new import_client_dynamodb.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
12257
|
-
var profiles = Files.
|
|
12257
|
+
var profiles = Files.loadAuthenticationProfiles();
|
|
12258
12258
|
function parseEvent(event) {
|
|
12259
12259
|
return {
|
|
12260
12260
|
cookies: event?.cookies?.join(";"),
|
|
@@ -10109,7 +10109,7 @@ var Files = class {
|
|
|
10109
10109
|
* @param path to template should start with /opt/
|
|
10110
10110
|
* @returns template as string or undefined
|
|
10111
10111
|
*/
|
|
10112
|
-
static
|
|
10112
|
+
static loadTemplateOverwrite(path) {
|
|
10113
10113
|
if (fs.existsSync(path)) {
|
|
10114
10114
|
console.info(`${path} template overwrite found!`);
|
|
10115
10115
|
return fs.readFileSync(path).toString("utf8");
|
|
@@ -10120,7 +10120,7 @@ var Files = class {
|
|
|
10120
10120
|
* Get the authentication JSON file and parse it
|
|
10121
10121
|
* @returns the list of profiles
|
|
10122
10122
|
*/
|
|
10123
|
-
static
|
|
10123
|
+
static loadAuthenticationProfiles() {
|
|
10124
10124
|
const profiles = JSON.parse(fs.readFileSync("/opt/authentication.json").toString("utf8"));
|
|
10125
10125
|
console.info("Initializing authentication profiles", profiles);
|
|
10126
10126
|
return profiles;
|
|
@@ -10134,8 +10134,8 @@ var footer_default = '<footer class="page-footer">\n <div class="footer-c
|
|
|
10134
10134
|
var header_default = '<!doctype html>\n<html lang="nl">\n<head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">\n <meta http-equiv="x-ua-compatible" content="ie=edge">\n <link rel="shortcut icon" href="/static/favicon.ico" type="image/x-icon">\n \n <!-- Preload fonts and external styles -->\n <link rel="preload" \n as="style"\n href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,700&display=swap">\n <link rel="preconnect" \n href="https://fonts.gstatic.com/" \n crossorigin="anonymous">\n \n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bold_bt.04c85cb2.woff2" \n type="font/woff2"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bold_bt.8e266873.woff" \n type="font/woff"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bt.bde3d05f.woff2" \n type="font/woff2"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bt.05235f9a.woff" \n type="font/woff"\n crossorigin="anonymous">\n\n <!-- Start: Core styling -->\n <!-- Bootstrap core CSS -->\n <link rel="stylesheet" \n href="https://componenten.nijmegen.nl/v6.1.0/css/bootstrap.min.css"\n integrity="sha512-bnCn1haQjQGPoq90nqpOWUiu9i60sex8WQI639yU2yElzx0pfG0hpaJrKuJTJD3bZ3lEUw+HRGEHrWm6TGsKSg=="\n crossorigin="anonymous">\n <!-- Material Design Bootstrap combined with custom Nijmegen styles -->\n <link rel="stylesheet" \n href="https://componenten.nijmegen.nl/v6.1.0/nijmegen.css"\n integrity="sha512-blgrU3wXs0CIV9iars0ZyneHar1CFTEojkN3O9sGQrkvwT4PZX5wXD6dv7Gde+mUGPhgrr9ej92UCuzDkmk7cQ=="\n crossorigin="anonymous">\n <!-- End: Core styling -->\n <link rel="stylesheet" href="/static/styles/screen.css">\n <title>Webformulieren management{{#title}} - {{.}} {{/title}}</title>\n </head>\n<body>\n<nav class="navbar fixed-top navbar-expand-lg scrolling-navbar navbar-primary">\n <ul class="navbar-skiplinks">\n <li>\n <a href="#section-1 ">Direct naar inhoud</a>\n </li>\n </ul>\n <div class="container">\n <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false">\n <span class="sr-only">Menu</span>\n <span class="navbar-toggler-icon" aria-hidden="true"></span>\n </button>\n <a class="navbar-brand" href="https://nijmegen.nl">\n <span class="sr-only">Hoofdpagina</span>\n <div class="navbar-brand-container">\n <img src="https://componenten.nijmegen.nl/v6.0.0/img/beeldmerklabelwit.svg" class="logo-labeled" alt="Logo Nijmegen">\n <img src="https://componenten.nijmegen.nl/v6.0.0/img/beeldmerkwit.svg" class="logo" aria-hidden="true" alt="Logo Nijmegen">\n </div>\n </a>\n {{#shownav}}\n <div class="collapse navbar-collapse" id="navbar-collapse">\n <ul class="navbar-nav mr-auto nijmegen-smooth-scroll">\n <li class="nav-item">\n <a href="/" class="nav-link">Overzicht</a>\n </li>\n {{#nav}}\n <li class="nav-item">\n <a href="{{{url}}}" class="nav-link">{{title}}</a>\n </li>\n {{/nav}}\n </ul>\n <ul class="navbar-nav ml-auto">\n <li class="nav-item">\n <a class="nav-link nav-no-link" href="/logout">{{volledigenaam}}\n <svg title="uitloggen" class="mdi mdi-logout" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16,17V14H9V10H16V7L21,12L16,17M14,2A2,2 0 0,1 16,4V6H14V4H5V20H14V18H16V20A2,2 0 0,1 14,22H5A2,2 0 0,1 3,20V4A2,2 0 0,1 5,2H14Z" /></svg>\n </a>\n </li>\n </ul>\n </div>\n {{/shownav}}\n </div>\n</nav>\n';
|
|
10135
10135
|
|
|
10136
10136
|
// src/webapp/util/render.ts
|
|
10137
|
-
var overwriteHeader = Files.
|
|
10138
|
-
var overwriteFooter = Files.
|
|
10137
|
+
var overwriteHeader = Files.loadTemplateOverwrite("/opt/header.mustache");
|
|
10138
|
+
var overwriteFooter = Files.loadTemplateOverwrite("/opt/footer.mustache");
|
|
10139
10139
|
async function render4(data, template, partials) {
|
|
10140
10140
|
const fullPartials = {
|
|
10141
10141
|
header: overwriteHeader ?? header_default,
|
|
@@ -10204,8 +10204,8 @@ var LoginRequestHandler = class {
|
|
|
10204
10204
|
// src/webapp/login/login.lambda.ts
|
|
10205
10205
|
var dynamoDBClient = new import_client_dynamodb.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
10206
10206
|
var loginRequestHandler = new LoginRequestHandler({
|
|
10207
|
-
oidcProfiles: Files.
|
|
10208
|
-
templateOverwrite: Files.
|
|
10207
|
+
oidcProfiles: Files.loadAuthenticationProfiles(),
|
|
10208
|
+
templateOverwrite: Files.loadTemplateOverwrite("/opt/login.mustache")
|
|
10209
10209
|
});
|
|
10210
10210
|
function parseEvent(event) {
|
|
10211
10211
|
return { cookies: event?.cookies?.join(";") };
|
|
@@ -1039,7 +1039,7 @@ var Files = class {
|
|
|
1039
1039
|
* @param path to template should start with /opt/
|
|
1040
1040
|
* @returns template as string or undefined
|
|
1041
1041
|
*/
|
|
1042
|
-
static
|
|
1042
|
+
static loadTemplateOverwrite(path) {
|
|
1043
1043
|
if (fs.existsSync(path)) {
|
|
1044
1044
|
console.info(`${path} template overwrite found!`);
|
|
1045
1045
|
return fs.readFileSync(path).toString("utf8");
|
|
@@ -1050,7 +1050,7 @@ var Files = class {
|
|
|
1050
1050
|
* Get the authentication JSON file and parse it
|
|
1051
1051
|
* @returns the list of profiles
|
|
1052
1052
|
*/
|
|
1053
|
-
static
|
|
1053
|
+
static loadAuthenticationProfiles() {
|
|
1054
1054
|
const profiles = JSON.parse(fs.readFileSync("/opt/authentication.json").toString("utf8"));
|
|
1055
1055
|
console.info("Initializing authentication profiles", profiles);
|
|
1056
1056
|
return profiles;
|
|
@@ -1064,8 +1064,8 @@ var footer_default = '<footer class="page-footer">\n <div class="footer-c
|
|
|
1064
1064
|
var header_default = '<!doctype html>\n<html lang="nl">\n<head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">\n <meta http-equiv="x-ua-compatible" content="ie=edge">\n <link rel="shortcut icon" href="/static/favicon.ico" type="image/x-icon">\n \n <!-- Preload fonts and external styles -->\n <link rel="preload" \n as="style"\n href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,700&display=swap">\n <link rel="preconnect" \n href="https://fonts.gstatic.com/" \n crossorigin="anonymous">\n \n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bold_bt.04c85cb2.woff2" \n type="font/woff2"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bold_bt.8e266873.woff" \n type="font/woff"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bt.bde3d05f.woff2" \n type="font/woff2"\n crossorigin="anonymous">\n <link rel="preload" \n as="font" \n href="/static/fonts/oranda_bt.05235f9a.woff" \n type="font/woff"\n crossorigin="anonymous">\n\n <!-- Start: Core styling -->\n <!-- Bootstrap core CSS -->\n <link rel="stylesheet" \n href="https://componenten.nijmegen.nl/v6.1.0/css/bootstrap.min.css"\n integrity="sha512-bnCn1haQjQGPoq90nqpOWUiu9i60sex8WQI639yU2yElzx0pfG0hpaJrKuJTJD3bZ3lEUw+HRGEHrWm6TGsKSg=="\n crossorigin="anonymous">\n <!-- Material Design Bootstrap combined with custom Nijmegen styles -->\n <link rel="stylesheet" \n href="https://componenten.nijmegen.nl/v6.1.0/nijmegen.css"\n integrity="sha512-blgrU3wXs0CIV9iars0ZyneHar1CFTEojkN3O9sGQrkvwT4PZX5wXD6dv7Gde+mUGPhgrr9ej92UCuzDkmk7cQ=="\n crossorigin="anonymous">\n <!-- End: Core styling -->\n <link rel="stylesheet" href="/static/styles/screen.css">\n <title>Webformulieren management{{#title}} - {{.}} {{/title}}</title>\n </head>\n<body>\n<nav class="navbar fixed-top navbar-expand-lg scrolling-navbar navbar-primary">\n <ul class="navbar-skiplinks">\n <li>\n <a href="#section-1 ">Direct naar inhoud</a>\n </li>\n </ul>\n <div class="container">\n <button class="navbar-toggler collapsed" type="button" data-toggle="collapse" data-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false">\n <span class="sr-only">Menu</span>\n <span class="navbar-toggler-icon" aria-hidden="true"></span>\n </button>\n <a class="navbar-brand" href="https://nijmegen.nl">\n <span class="sr-only">Hoofdpagina</span>\n <div class="navbar-brand-container">\n <img src="https://componenten.nijmegen.nl/v6.0.0/img/beeldmerklabelwit.svg" class="logo-labeled" alt="Logo Nijmegen">\n <img src="https://componenten.nijmegen.nl/v6.0.0/img/beeldmerkwit.svg" class="logo" aria-hidden="true" alt="Logo Nijmegen">\n </div>\n </a>\n {{#shownav}}\n <div class="collapse navbar-collapse" id="navbar-collapse">\n <ul class="navbar-nav mr-auto nijmegen-smooth-scroll">\n <li class="nav-item">\n <a href="/" class="nav-link">Overzicht</a>\n </li>\n {{#nav}}\n <li class="nav-item">\n <a href="{{{url}}}" class="nav-link">{{title}}</a>\n </li>\n {{/nav}}\n </ul>\n <ul class="navbar-nav ml-auto">\n <li class="nav-item">\n <a class="nav-link nav-no-link" href="/logout">{{volledigenaam}}\n <svg title="uitloggen" class="mdi mdi-logout" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24"><path d="M16,17V14H9V10H16V7L21,12L16,17M14,2A2,2 0 0,1 16,4V6H14V4H5V20H14V18H16V20A2,2 0 0,1 14,22H5A2,2 0 0,1 3,20V4A2,2 0 0,1 5,2H14Z" /></svg>\n </a>\n </li>\n </ul>\n </div>\n {{/shownav}}\n </div>\n</nav>\n';
|
|
1065
1065
|
|
|
1066
1066
|
// src/webapp/util/render.ts
|
|
1067
|
-
var overwriteHeader = Files.
|
|
1068
|
-
var overwriteFooter = Files.
|
|
1067
|
+
var overwriteHeader = Files.loadTemplateOverwrite("/opt/header.mustache");
|
|
1068
|
+
var overwriteFooter = Files.loadTemplateOverwrite("/opt/footer.mustache");
|
|
1069
1069
|
async function render4(data, template, partials) {
|
|
1070
1070
|
const fullPartials = {
|
|
1071
1071
|
header: overwriteHeader ?? header_default,
|
|
@@ -1100,7 +1100,7 @@ async function handleLogoutRequest(cookies, dynamoDBClient2, templateOverwrite2)
|
|
|
1100
1100
|
|
|
1101
1101
|
// src/webapp/logout/logout.lambda.ts
|
|
1102
1102
|
var dynamoDBClient = new import_client_dynamodb.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
1103
|
-
var templateOverwrite = Files.
|
|
1103
|
+
var templateOverwrite = Files.loadTemplateOverwrite("/opt/logout.mustache");
|
|
1104
1104
|
function parseEvent(event) {
|
|
1105
1105
|
return {
|
|
1106
1106
|
cookies: event?.cookies?.join(";")
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -14,4 +14,7 @@ __exportStar(require("./webapp/Webapp"), exports);
|
|
|
14
14
|
__exportStar(require("./webapp/WebappOptions"), exports);
|
|
15
15
|
__exportStar(require("./webapp/OIDCConnectionProfile"), exports);
|
|
16
16
|
__exportStar(require("./webapp/Webpage"), exports);
|
|
17
|
-
|
|
17
|
+
// Runtime utils
|
|
18
|
+
__exportStar(require("./webapp/util/render"), exports);
|
|
19
|
+
__exportStar(require("./webapp/util/Files"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQWdDO0FBQ2hDLHlEQUF1QztBQUN2QyxpRUFBK0M7QUFDL0MsbURBQWlDO0FBRWpDLGdCQUFnQjtBQUNoQix1REFBcUM7QUFDckMsc0RBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi93ZWJhcHAvV2ViYXBwJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViYXBwL1dlYmFwcE9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93ZWJhcHAvT0lEQ0Nvbm5lY3Rpb25Qcm9maWxlJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViYXBwL1dlYnBhZ2UnO1xuXG4vLyBSdW50aW1lIHV0aWxzXG5leHBvcnQgKiBmcm9tICcuL3dlYmFwcC91dGlsL3JlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL3dlYmFwcC91dGlsL0ZpbGVzJzsiXX0=
|
package/lib/webapp/Webapp.js
CHANGED
|
@@ -53,5 +53,5 @@ class Webapp extends constructs_1.Construct {
|
|
|
53
53
|
}
|
|
54
54
|
exports.Webapp = Webapp;
|
|
55
55
|
_a = JSII_RTTI_SYMBOL_1;
|
|
56
|
-
Webapp[_a] = { fqn: "@gemeentenijmegen/webapp.Webapp", version: "0.0.
|
|
56
|
+
Webapp[_a] = { fqn: "@gemeentenijmegen/webapp.Webapp", version: "0.0.2" };
|
|
57
57
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYmFwcC9XZWJhcHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtRUFBMEQ7QUFFMUQsMkNBQXVDO0FBQ3ZDLCtCQUE0QjtBQUM1Qiw2Q0FBMEM7QUFDMUMsbURBQWdEO0FBSWhELE1BQWEsTUFBTyxTQUFRLHNCQUFTO0lBS25DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixXQUFXO1FBQ1gsS0FBSyxHQUFHO1lBQ04sZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLElBQUksRUFBRTtZQUM1QyxHQUFHLEtBQUs7U0FDVCxDQUFDO1FBQ0YsV0FBVztRQUNYLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw2QkFBYSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbEQsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsaUJBQWlCO1NBQ2hELENBQUMsQ0FBQztRQUVILGNBQWM7UUFDZCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDOUIsYUFBYSxFQUFFLEtBQUs7WUFDcEIsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0MsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSx1QkFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDbkQsYUFBYSxFQUFFLEtBQUs7WUFDcEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3Qyw4QkFBOEI7UUFDOUIsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3JFO0lBRUgsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsRUFBVSxFQUFFLE9BQWdCLEVBQUUsSUFBWSxFQUFFLFVBQXdCLENBQUMsNkJBQVUsQ0FBQyxHQUFHLENBQUM7UUFDMUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7QUFwREgsd0JBc0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cE1ldGhvZCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djInO1xuaW1wb3J0IHsgSUdyYW50YWJsZSwgSVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBcGkgfSBmcm9tICcuL0FwaSc7XG5pbXBvcnQgeyBDbG91ZGZyb250IH0gZnJvbSAnLi9DbG91ZGZyb250JztcbmltcG9ydCB7IFNlc3Npb25zVGFibGUgfSBmcm9tICcuL1Nlc3Npb25zVGFibGUnO1xuaW1wb3J0IHsgV2ViYXBwT3B0aW9ucyB9IGZyb20gJy4vV2ViYXBwT3B0aW9ucyc7XG5pbXBvcnQgeyBXZWJwYWdlIH0gZnJvbSAnLi9XZWJwYWdlJztcblxuZXhwb3J0IGNsYXNzIFdlYmFwcCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElHcmFudGFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogQXBpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb3VkZnJvbnQ6IENsb3VkZnJvbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbnM6IFNlc3Npb25zVGFibGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYmFwcE9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gRGVmYXVsdHNcbiAgICBwcm9wcyA9IHtcbiAgICAgIHNlc3Npb25MaWZldGltZTogcHJvcHMuc2Vzc2lvbkxpZmV0aW1lID8/IDE1LFxuICAgICAgLi4ucHJvcHMsXG4gICAgfTtcbiAgICAvLyBTZXNzaW9uc1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbnNUYWJsZSh0aGlzLCAnc2Vzc2lvbnMnLCB7XG4gICAgICBuYW1lOiBgJHtwcm9wcy5hcHBsaWNhdGlvbk5hbWV9LXNlc3Npb25zLXRhYmxlYCxcbiAgICB9KTtcblxuICAgIC8vIEFQSSBnYXRld2F5XG4gICAgdGhpcy5hcGkgPSBuZXcgQXBpKHRoaXMsICdhcGknLCB7XG4gICAgICB3ZWJhcHBPcHRpb25zOiBwcm9wcyxcbiAgICAgIHNlc3Npb25zVGFibGU6IHRoaXMuc2Vzc2lvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5hcGkubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuc2Vzc2lvbnMpO1xuXG4gICAgLy8gQ2xvdWRmcm9udCBkaXN0cmlidXRpb25cbiAgICB0aGlzLmNsb3VkZnJvbnQgPSBuZXcgQ2xvdWRmcm9udCh0aGlzLCAnY2xvdWRmcm9udCcsIHtcbiAgICAgIHdlYmFwcE9wdGlvbnM6IHByb3BzLFxuICAgICAgYXBpR2F0ZXdheURvbWFpbjogdGhpcy5hcGkuZG9tYWluKCksXG4gICAgfSk7XG4gICAgdGhpcy5jbG91ZGZyb250Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmFwaSk7XG5cbiAgICAvLyBQb3N0IHByb2Nlc3MgbG9naW4gZnVuY3Rpb25cbiAgICBpZiAocHJvcHMucG9zdExvZ2luUHJvY2Vzc29yKSB7XG4gICAgICB0aGlzLmFkZFBhZ2UoJ3Bvc3QtbG9naW4nLCBwcm9wcy5wb3N0TG9naW5Qcm9jZXNzb3IsICcvcG9zdC1sb2dpbicpO1xuICAgIH1cblxuICB9XG5cbiAgZ2V0IGdyYW50UHJpbmNpcGFsKCkgOiBJUHJpbmNpcGFsIHsgLy8gSGFjayB0byBrZWVwIHRoZSByb2xlIGluIHRoZSBBUEkgY29uc3RydWN0XG4gICAgcmV0dXJuIHRoaXMuYXBpLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFub3RoZXIgcGFnZSB0byB0aGUgd2ViYXBwXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kc1xuICAgKiBAcGFyYW0gaGFuZGxlclxuICAgKi9cbiAgYWRkUGFnZShpZDogc3RyaW5nLCBoYW5kbGVyOiBXZWJwYWdlLCBwYXRoOiBzdHJpbmcsIG1ldGhvZHM6IEh0dHBNZXRob2RbXSA9IFtIdHRwTWV0aG9kLkdFVF0gKSB7XG4gICAgdGhpcy5hcGkuYWRkUm91dGUoaWQsIGhhbmRsZXIsIHBhdGgsIG1ldGhvZHMpO1xuICB9XG5cbn0iXX0=
|
package/lib/webapp/Webpage.js
CHANGED
|
@@ -87,5 +87,5 @@ class Webpage extends constructs_1.Construct {
|
|
|
87
87
|
}
|
|
88
88
|
exports.Webpage = Webpage;
|
|
89
89
|
_a = JSII_RTTI_SYMBOL_1;
|
|
90
|
-
Webpage[_a] = { fqn: "@gemeentenijmegen/webapp.Webpage", version: "0.0.
|
|
90
|
+
Webpage[_a] = { fqn: "@gemeentenijmegen/webapp.Webpage", version: "0.0.2" };
|
|
91
91
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2VicGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJhcHAvV2VicGFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRztBQUNqRywrREFBbUQ7QUFHbkQsbURBQWtHO0FBQ2xHLDJDQUF1QztBQWdCdkMsTUFBYSxPQUFRLFNBQVEsc0JBQVM7SUFHcEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQjtRQUMzRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLG1IQUFtSDtRQUNuSCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnREFBZ0QsQ0FBQztRQUU1RyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBc0YsQ0FBQztRQUNqSCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDNUMsT0FBTyxFQUFFLHdCQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLHdCQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDckMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsVUFBVSxFQUFFLEdBQUc7WUFDZixlQUFlLEVBQUUsd0JBQU0sQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7WUFDaEYsWUFBWSxFQUFFLHdCQUFhLENBQUMsU0FBUztZQUNyQyxXQUFXLEVBQUU7Z0JBQ1gsR0FBRyxLQUFLLENBQUMsV0FBVzthQUNyQjtTQUNGLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsS0FBbUI7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQixDQUFDLEtBQTBCO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLE9BQWU7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILHNCQUFzQixDQUFDLGVBQXVCO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsZUFBdUIsRUFBRSxhQUE4QjtRQUM3RCxNQUFNLGlCQUFpQixHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQy9ELFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFDOUIsZUFBZSxFQUFFLEdBQUcsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3JELFVBQVUsRUFBRSxRQUFRO1lBQ3BCLGFBQWEsRUFBRSxhQUFhLElBQUksd0JBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzlELFdBQVcsRUFBRSxHQUFHO1NBQ2pCLENBQUMsQ0FBQztRQUNILGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLDJCQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxzQkFBSyxDQUFDLElBQUksRUFBRSxHQUFHLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFO1lBQ3hFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQzVCLENBQUM7WUFDRixpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLFNBQVMsRUFBRSxDQUFDO1lBQ1osU0FBUyxFQUFFLDRCQUE0QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxnQkFBZ0IsRUFBRSx1Q0FBdUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLGdEQUFnRDtTQUN0SCxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsMkJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsRCxDQUFDOztBQXZGSCwwQkF5RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfbGFtYmRhIGFzIExhbWJkYSwgYXdzX2R5bmFtb2RiLCBSZW1vdmFsUG9saWN5LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbGFybSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IElSb2xlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBMYXllclZlcnNpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IEZpbHRlclBhdHRlcm4sIElGaWx0ZXJQYXR0ZXJuLCBNZXRyaWNGaWx0ZXIsIFJldGVudGlvbkRheXMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxudHlwZSBUID0gTGFtYmRhLkZ1bmN0aW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhZ2VQcm9wcyB7XG4gIHJlYWRvbmx5IGFwaUZ1bmN0aW9uOiBhbnk7IC8vIFR5cGUgaGFjayBjYXN0IGxhdGVyIHRvIHtuZXcoc2NvcGU6IENvbnN0cnVjdCwgaWQ6c3RyaW5nLCBwcm9wcz86IExhbWJkYS5GdW5jdGlvblByb3BzKTogVCB9XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIHJlYWRvbmx5IHJvbGU/OiBJUm9sZTtcbiAgLyoqXG4gICAqIFNldCBhIGxhbWJkYSB0aW1lb3V0IGluIG1pbGlzZWNvbmRzXG4gICAqIEBkZWZhdWx0IDMwMDAgKG1zKVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IER1cmF0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgV2VicGFnZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGxhbWJkYTogTGFtYmRhLkZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJwYWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0xhbWJkYS1JbnNpZ2h0cy1leHRlbnNpb24tdmVyc2lvbnN4ODYtNjQuaHRtbFxuICAgIGNvbnN0IGluc2lnaHRzQXJuID0gYGFybjphd3M6bGFtYmRhOiR7U3RhY2sub2YodGhpcykucmVnaW9ufTo1ODAyNDcyNzU0MzU6bGF5ZXI6TGFtYmRhSW5zaWdodHNFeHRlbnNpb246MjFgO1xuXG4gICAgY29uc3QgYXBpRnVuY3Rpb24gPSBwcm9wcy5hcGlGdW5jdGlvbiBhcyB7bmV3KGZTY29wZTogQ29uc3RydWN0LCBmSWQ6c3RyaW5nLCBmUHJvcHM/OiBMYW1iZGEuRnVuY3Rpb25Qcm9wcyk6IFQgfTtcbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBhcGlGdW5jdGlvbih0aGlzLCAnbGFtYmRhJywge1xuICAgICAgcnVudGltZTogTGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsIC8vIFJlcXVpcmVkIGJ1dCBvdmVyd3JpdHRlblxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLCAvLyBSZXF1aXJlZCBidXQgb3ZlcndyaXR0ZW5cbiAgICAgIGNvZGU6IExhbWJkYS5Db2RlLmZyb21JbmxpbmUoJ2VtcHR5JyksIC8vIHJlcXVpcmVkIGJ1dCBvdmVyd3JpdHRlblxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogcHJvcHMucm9sZSxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQsXG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICBpbnNpZ2h0c1ZlcnNpb246IExhbWJkYS5MYW1iZGFJbnNpZ2h0c1ZlcnNpb24uZnJvbUluc2lnaHRWZXJzaW9uQXJuKGluc2lnaHRzQXJuKSxcbiAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAuLi5wcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdGhlIHNoYXJlZCByZXNvdXJjZXMgbGF5ZXIgdGhhdCBpcyBjb25zdHJ1Y3RlZCBmb3IgdGhpcyB3ZWJhcHAuXG4gICAqIEBwYXJhbSBsYXllclxuICAgKi9cbiAgYWRkTGFtYmRhTGF5ZXIobGF5ZXI6IExheWVyVmVyc2lvbikge1xuICAgIHRoaXMubGFtYmRhLmFkZExheWVycyhsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgYWNjZXNzIHRvIHRoZSBzZXNzaW9uIHN0b3JlIGFuZCBhZGQgU0VTU0lPTl9UQUJMRSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgKiBAcGFyYW0gdGFibGVcbiAgICovXG4gIGFsbG93U2Vzc2lvbkFjY2Vzcyh0YWJsZTogYXdzX2R5bmFtb2RiLklUYWJsZSkge1xuICAgIHRoaXMubGFtYmRhLmFkZEVudmlyb25tZW50KCdTRVNTSU9OX1RBQkxFJywgdGFibGUudGFibGVOYW1lKTtcbiAgICB0YWJsZS5ncmFudFJlYWRXcml0ZURhdGEodGhpcy5sYW1iZGEuZ3JhbnRQcmluY2lwYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzZXNzaW9uIGVudiB2YXJpYWJsZS5cbiAgICogQHBhcmFtIG1pbnV0ZXNcbiAgICovXG4gIG92ZXJ3cml0ZVNlc3Npb25MaWZldGltZShtaW51dGVzOiBudW1iZXIpIHtcbiAgICB0aGlzLmxhbWJkYS5hZGRFbnZpcm9ubWVudCgnU0VTU0lPTl9UVExfTUlOJywgbWludXRlcy50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZSBsYW1iZGFcbiAgICogQHBhcmFtIGFwcGxpY2F0aW9uTmFtZVxuICAgKi9cbiAgYWRkU3RhbmRhcmRFbnZpcm9ubWVudChhcHBsaWNhdGlvbk5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubGFtYmRhLmFkZEVudmlyb25tZW50KCdXRUJBUFBfTkFNRScsIGFwcGxpY2F0aW9uTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogTW9uaXRvciB0aGUgbG9ncyBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbiBmb3IgYSBmaWx0ZXIgcGF0dGVybiwgZ2VuZXJhdGUgbWV0cmljXG4gICAqIGFuZCBhbGFybSBvbiBpbmNyZWFzZWQgZXJyb3IgcmF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlclBhdHRlcm4gUGF0dGVybiB0byBmaWx0ZXIgYnkgKGRlZmF1bHQ6IGNvbnRhaW5pbmcgRVJST1IpXG4gICAqL1xuICBtb25pdG9yKGFwcGxpY2F0aW9uTmFtZTogc3RyaW5nLCBmaWx0ZXJQYXR0ZXJuPzogSUZpbHRlclBhdHRlcm4pIHtcbiAgICBjb25zdCBlcnJvck1ldHJpY0ZpbHRlciA9IG5ldyBNZXRyaWNGaWx0ZXIodGhpcywgJ01ldHJpY0ZpbHRlcicsIHtcbiAgICAgIGxvZ0dyb3VwOiB0aGlzLmxhbWJkYS5sb2dHcm91cCxcbiAgICAgIG1ldHJpY05hbWVzcGFjZTogYCR7YXBwbGljYXRpb25OYW1lfS8ke3RoaXMubm9kZS5pZH1gLFxuICAgICAgbWV0cmljTmFtZTogJ0Vycm9ycycsXG4gICAgICBmaWx0ZXJQYXR0ZXJuOiBmaWx0ZXJQYXR0ZXJuID8/IEZpbHRlclBhdHRlcm4uYW55VGVybSgnRVJST1InKSxcbiAgICAgIG1ldHJpY1ZhbHVlOiAnMScsXG4gICAgfSk7XG4gICAgZXJyb3JNZXRyaWNGaWx0ZXIuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICBjb25zdCBhbGFybSA9IG5ldyBBbGFybSh0aGlzLCBgJHthcHBsaWNhdGlvbk5hbWV9LSR7dGhpcy5ub2RlLmlkfS1hbGFybWAsIHtcbiAgICAgIG1ldHJpYzogZXJyb3JNZXRyaWNGaWx0ZXIubWV0cmljKHtcbiAgICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgfSksXG4gICAgICBldmFsdWF0aW9uUGVyaW9kczogMyxcbiAgICAgIHRocmVzaG9sZDogNSxcbiAgICAgIGFsYXJtTmFtZTogYEluY3JlYXNlZCBlcnJvciByYXRlIGZvciAke3RoaXMubm9kZS5pZH1gLFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFRoaXMgYWxhcm0gdHJpZ2dlcnMgaWYgdGhlIGZ1bmN0aW9uICR7dGhpcy5ub2RlLmlkfSBpcyBsb2dnaW5nIG1vcmUgdGhhbiA1IGVycm9ycyBvdmVyIG4gbWludXRlcy5gLFxuICAgIH0pO1xuICAgIGFsYXJtLmFwcGx5UmVtb3ZhbFBvbGljeShSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICB9XG5cbn1cbiJdfQ==
|
|
@@ -6,7 +6,7 @@ const Response_1 = require("@gemeentenijmegen/apigateway-http/lib/V2/Response");
|
|
|
6
6
|
const AuthRequestHandler_1 = require("./AuthRequestHandler");
|
|
7
7
|
const Files_1 = require("../util/Files");
|
|
8
8
|
const dynamoDBClient = new client_dynamodb_1.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
9
|
-
const profiles = Files_1.Files.
|
|
9
|
+
const profiles = Files_1.Files.loadAuthenticationProfiles();
|
|
10
10
|
function parseEvent(event) {
|
|
11
11
|
return {
|
|
12
12
|
cookies: event?.cookies?.join(';'),
|
|
@@ -33,4 +33,4 @@ async function handler(event, _context) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
exports.handler = handler;
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViYXBwL2F1dGgvYXV0aC5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQTBEO0FBQzFELGdGQUFtRztBQUNuRyw2REFBMEQ7QUFDMUQseUNBQXNDO0FBRXRDLE1BQU0sY0FBYyxHQUFHLElBQUksZ0NBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDOUUsTUFBTSxRQUFRLEdBQUcsYUFBSyxDQUFDLDBCQUEwQixFQUFFLENBQUM7QUFFcEQsU0FBUyxVQUFVLENBQUMsS0FBVTtJQUM1QixPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQyxJQUFJLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLElBQUk7UUFDeEMsS0FBSyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxLQUFLO0tBQzNDLENBQUM7QUFDSixDQUFDO0FBRU0sS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFVLEVBQUUsUUFBYTtJQUNyRCxJQUFJO1FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sY0FBYyxHQUFHLElBQUksdUNBQWtCLENBQUM7WUFDNUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25DLGNBQWM7WUFDZCxZQUFZLEVBQUUsUUFBUTtZQUN0Qix1QkFBdUIsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixLQUFLLE1BQU07U0FDNUUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztLQUM3QztJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixPQUFPLG1CQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVCO0FBQ0gsQ0FBQztBQWhCRCwwQkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbW9EQkNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XG5pbXBvcnQgeyBBcGlHYXRld2F5VjJSZXNwb25zZSwgUmVzcG9uc2UgfSBmcm9tICdAZ2VtZWVudGVuaWptZWdlbi9hcGlnYXRld2F5LWh0dHAvbGliL1YyL1Jlc3BvbnNlJztcbmltcG9ydCB7IEF1dGhSZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4vQXV0aFJlcXVlc3RIYW5kbGVyJztcbmltcG9ydCB7IEZpbGVzIH0gZnJvbSAnLi4vdXRpbC9GaWxlcyc7XG5cbmNvbnN0IGR5bmFtb0RCQ2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KHsgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIH0pO1xuY29uc3QgcHJvZmlsZXMgPSBGaWxlcy5sb2FkQXV0aGVudGljYXRpb25Qcm9maWxlcygpO1xuXG5mdW5jdGlvbiBwYXJzZUV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgcmV0dXJuIHtcbiAgICBjb29raWVzOiBldmVudD8uY29va2llcz8uam9pbignOycpLFxuICAgIGNvZGU6IGV2ZW50Py5xdWVyeVN0cmluZ1BhcmFtZXRlcnM/LmNvZGUsXG4gICAgc3RhdGU6IGV2ZW50Py5xdWVyeVN0cmluZ1BhcmFtZXRlcnM/LnN0YXRlLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogYW55LCBfY29udGV4dDogYW55KTpQcm9taXNlPEFwaUdhdGV3YXlWMlJlc3BvbnNlPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyYW1zID0gcGFyc2VFdmVudChldmVudCk7XG4gICAgY29uc3QgcmVxdWVzdEhhbmRsZXIgPSBuZXcgQXV0aFJlcXVlc3RIYW5kbGVyKHtcbiAgICAgIGNvb2tpZXM6IHBhcmFtcy5jb29raWVzLFxuICAgICAgcXVlcnlTdHJpbmdQYXJhbUNvZGU6IHBhcmFtcy5jb2RlLFxuICAgICAgcXVlcnlTdHJpbmdQYXJhbVN0YXRlOiBwYXJhbXMuc3RhdGUsXG4gICAgICBkeW5hbW9EQkNsaWVudCxcbiAgICAgIG9pZGNQcm9maWxlczogcHJvZmlsZXMsXG4gICAgICByZWRpcmVjdFRvUG9zdExvZ2luSG9vazogcHJvY2Vzcy5lbnYuUkVESVJFQ1RfVE9fUE9TVF9MT0dJTl9IT09LID09PSAndHJ1ZScsXG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RIYW5kbGVyLmhhbmRsZVJlcXVlc3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHJldHVybiBSZXNwb25zZS5lcnJvcig1MDApO1xuICB9XG59Il19
|
|
@@ -7,8 +7,8 @@ const loginRequestHandler_1 = require("./loginRequestHandler");
|
|
|
7
7
|
const Files_1 = require("../util/Files");
|
|
8
8
|
const dynamoDBClient = new client_dynamodb_1.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
9
9
|
const loginRequestHandler = new loginRequestHandler_1.LoginRequestHandler({
|
|
10
|
-
oidcProfiles: Files_1.Files.
|
|
11
|
-
templateOverwrite: Files_1.Files.
|
|
10
|
+
oidcProfiles: Files_1.Files.loadAuthenticationProfiles(),
|
|
11
|
+
templateOverwrite: Files_1.Files.loadTemplateOverwrite('/opt/login.mustache'),
|
|
12
12
|
});
|
|
13
13
|
function parseEvent(event) {
|
|
14
14
|
return { cookies: event?.cookies?.join(';') };
|
|
@@ -26,4 +26,4 @@ async function handler(event, _context) {
|
|
|
26
26
|
}
|
|
27
27
|
exports.handler = handler;
|
|
28
28
|
;
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4ubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYmFwcC9sb2dpbi9sb2dpbi5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQTBEO0FBQzFELGdGQUFtRztBQUNuRywrREFBNEQ7QUFDNUQseUNBQXNDO0FBRXRDLE1BQU0sY0FBYyxHQUFHLElBQUksZ0NBQWMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFFOUUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLHlDQUFtQixDQUFDO0lBQ2xELFlBQVksRUFBRSxhQUFLLENBQUMsMEJBQTBCLEVBQUU7SUFDaEQsaUJBQWlCLEVBQUUsYUFBSyxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDO0NBQ3RFLENBQUMsQ0FBQztBQUVILFNBQVMsVUFBVSxDQUFDLEtBQVU7SUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ2hELENBQUM7QUFFTSxLQUFLLFVBQVUsT0FBTyxDQUFFLEtBQVUsRUFBRSxRQUFhO0lBQ3RELElBQUk7UUFDRixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN6RixPQUFPLFFBQVEsQ0FBQztLQUNqQjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixPQUFPLG1CQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVCO0FBQ0gsQ0FBQztBQVRELDBCQVNDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7IEFwaUdhdGV3YXlWMlJlc3BvbnNlLCBSZXNwb25zZSB9IGZyb20gJ0BnZW1lZW50ZW5pam1lZ2VuL2FwaWdhdGV3YXktaHR0cC9saWIvVjIvUmVzcG9uc2UnO1xuaW1wb3J0IHsgTG9naW5SZXF1ZXN0SGFuZGxlciB9IGZyb20gJy4vbG9naW5SZXF1ZXN0SGFuZGxlcic7XG5pbXBvcnQgeyBGaWxlcyB9IGZyb20gJy4uL3V0aWwvRmlsZXMnO1xuXG5jb25zdCBkeW5hbW9EQkNsaWVudCA9IG5ldyBEeW5hbW9EQkNsaWVudCh7IHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB9KTtcblxuY29uc3QgbG9naW5SZXF1ZXN0SGFuZGxlciA9IG5ldyBMb2dpblJlcXVlc3RIYW5kbGVyKHtcbiAgb2lkY1Byb2ZpbGVzOiBGaWxlcy5sb2FkQXV0aGVudGljYXRpb25Qcm9maWxlcygpLFxuICB0ZW1wbGF0ZU92ZXJ3cml0ZTogRmlsZXMubG9hZFRlbXBsYXRlT3ZlcndyaXRlKCcvb3B0L2xvZ2luLm11c3RhY2hlJyksXG59KTtcblxuZnVuY3Rpb24gcGFyc2VFdmVudChldmVudDogYW55KSB7XG4gIHJldHVybiB7IGNvb2tpZXM6IGV2ZW50Py5jb29raWVzPy5qb2luKCc7JykgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIgKGV2ZW50OiBhbnksIF9jb250ZXh0OiBhbnkpOlByb21pc2U8QXBpR2F0ZXdheVYyUmVzcG9uc2U+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBwYXJzZUV2ZW50KGV2ZW50KTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxvZ2luUmVxdWVzdEhhbmRsZXIuaGFuZGxlUmVxdWVzdChwYXJhbXMuY29va2llcywgZHluYW1vREJDbGllbnQpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHJldHVybiBSZXNwb25zZS5lcnJvcig1MDApO1xuICB9XG59OyJdfQ==
|
|
@@ -5,7 +5,7 @@ const Response_1 = require("@gemeentenijmegen/apigateway-http/lib/V2/Response");
|
|
|
5
5
|
const handleLogoutRequest_1 = require("./handleLogoutRequest");
|
|
6
6
|
const Files_1 = require("../util/Files");
|
|
7
7
|
const dynamoDBClient = new client_dynamodb_1.DynamoDBClient({ region: process.env.AWS_REGION });
|
|
8
|
-
const templateOverwrite = Files_1.Files.
|
|
8
|
+
const templateOverwrite = Files_1.Files.loadTemplateOverwrite('/opt/logout.mustache');
|
|
9
9
|
function parseEvent(event) {
|
|
10
10
|
return {
|
|
11
11
|
cookies: event?.cookies?.join(';'),
|
|
@@ -21,4 +21,4 @@ exports.handler = async (event, _context) => {
|
|
|
21
21
|
return Response_1.Response.error(500);
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0LmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWJhcHAvbG9nb3V0L2xvZ291dC5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4REFBMEQ7QUFDMUQsZ0ZBQTZFO0FBQzdFLCtEQUE0RDtBQUM1RCx5Q0FBc0M7QUFFdEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUM5RSxNQUFNLGlCQUFpQixHQUFHLGFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRTlFLFNBQVMsVUFBVSxDQUFDLEtBQVU7SUFDNUIsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDbkMsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssRUFBRSxLQUFVLEVBQUUsUUFBYSxFQUFFLEVBQUU7SUFDcEQsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxPQUFPLE1BQU0seUNBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztLQUNyRjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixPQUFPLG1CQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVCO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHluYW1vREJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xuaW1wb3J0IHsgUmVzcG9uc2UgfSBmcm9tICdAZ2VtZWVudGVuaWptZWdlbi9hcGlnYXRld2F5LWh0dHAvbGliL1YyL1Jlc3BvbnNlJztcbmltcG9ydCB7IGhhbmRsZUxvZ291dFJlcXVlc3QgfSBmcm9tICcuL2hhbmRsZUxvZ291dFJlcXVlc3QnO1xuaW1wb3J0IHsgRmlsZXMgfSBmcm9tICcuLi91dGlsL0ZpbGVzJztcblxuY29uc3QgZHluYW1vREJDbGllbnQgPSBuZXcgRHluYW1vREJDbGllbnQoeyByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfSk7XG5jb25zdCB0ZW1wbGF0ZU92ZXJ3cml0ZSA9IEZpbGVzLmxvYWRUZW1wbGF0ZU92ZXJ3cml0ZSgnL29wdC9sb2dvdXQubXVzdGFjaGUnKTtcblxuZnVuY3Rpb24gcGFyc2VFdmVudChldmVudDogYW55KSB7XG4gIHJldHVybiB7XG4gICAgY29va2llczogZXZlbnQ/LmNvb2tpZXM/LmpvaW4oJzsnKSxcbiAgfTtcbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBhbnksIF9jb250ZXh0OiBhbnkpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJhbXMgPSBwYXJzZUV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlTG9nb3V0UmVxdWVzdChwYXJhbXMuY29va2llcywgZHluYW1vREJDbGllbnQsIHRlbXBsYXRlT3ZlcndyaXRlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIHJldHVybiBSZXNwb25zZS5lcnJvcig1MDApO1xuICB9XG59OyJdfQ==
|
|
@@ -4,10 +4,10 @@ export declare class Files {
|
|
|
4
4
|
* @param path to template should start with /opt/
|
|
5
5
|
* @returns template as string or undefined
|
|
6
6
|
*/
|
|
7
|
-
static
|
|
7
|
+
static loadTemplateOverwrite(path: string): undefined | string;
|
|
8
8
|
/**
|
|
9
9
|
* Get the authentication JSON file and parse it
|
|
10
10
|
* @returns the list of profiles
|
|
11
11
|
*/
|
|
12
|
-
static
|
|
12
|
+
static loadAuthenticationProfiles(): any;
|
|
13
13
|
}
|
package/lib/webapp/util/Files.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var _a;
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
4
|
exports.Files = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
4
6
|
const fs = require("fs");
|
|
5
7
|
class Files {
|
|
6
8
|
/**
|
|
@@ -8,7 +10,7 @@ class Files {
|
|
|
8
10
|
* @param path to template should start with /opt/
|
|
9
11
|
* @returns template as string or undefined
|
|
10
12
|
*/
|
|
11
|
-
static
|
|
13
|
+
static loadTemplateOverwrite(path) {
|
|
12
14
|
if (fs.existsSync(path)) {
|
|
13
15
|
console.info(`${path} template overwrite found!`);
|
|
14
16
|
return fs.readFileSync(path).toString('utf8');
|
|
@@ -19,11 +21,13 @@ class Files {
|
|
|
19
21
|
* Get the authentication JSON file and parse it
|
|
20
22
|
* @returns the list of profiles
|
|
21
23
|
*/
|
|
22
|
-
static
|
|
24
|
+
static loadAuthenticationProfiles() {
|
|
23
25
|
const profiles = JSON.parse(fs.readFileSync('/opt/authentication.json').toString('utf8'));
|
|
24
26
|
console.info('Initializing authentication profiles', profiles);
|
|
25
27
|
return profiles;
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
exports.Files = Files;
|
|
29
|
-
|
|
31
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
32
|
+
Files[_a] = { fqn: "@gemeentenijmegen/webapp.Files", version: "0.0.2" };
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViYXBwL3V0aWwvRmlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFFekIsTUFBYSxLQUFLO0lBRWhCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBWTtRQUN2QyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksNEJBQTRCLENBQUMsQ0FBQztZQUNsRCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQywwQkFBMEI7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDMUYsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDOztBQXZCSCxzQkF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlcyB7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0ZW1wbGF0ZSBpcyBmb3VuZCBpbiB0aGUgZmlsZSBzeXN0ZW1cbiAgICogQHBhcmFtIHBhdGggdG8gdGVtcGxhdGUgc2hvdWxkIHN0YXJ0IHdpdGggL29wdC9cbiAgICogQHJldHVybnMgdGVtcGxhdGUgYXMgc3RyaW5nIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgc3RhdGljIGxvYWRUZW1wbGF0ZU92ZXJ3cml0ZShwYXRoOiBzdHJpbmcpIDogdW5kZWZpbmVkIHwgc3RyaW5nIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgY29uc29sZS5pbmZvKGAke3BhdGh9IHRlbXBsYXRlIG92ZXJ3cml0ZSBmb3VuZCFgKTtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aCkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGF1dGhlbnRpY2F0aW9uIEpTT04gZmlsZSBhbmQgcGFyc2UgaXRcbiAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgcHJvZmlsZXNcbiAgICovXG4gIHN0YXRpYyBsb2FkQXV0aGVudGljYXRpb25Qcm9maWxlcygpIDogYW55IHtcbiAgICBjb25zdCBwcm9maWxlcyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKCcvb3B0L2F1dGhlbnRpY2F0aW9uLmpzb24nKS50b1N0cmluZygndXRmOCcpKTtcbiAgICBjb25zb2xlLmluZm8oJ0luaXRpYWxpemluZyBhdXRoZW50aWNhdGlvbiBwcm9maWxlcycsIHByb2ZpbGVzKTtcbiAgICByZXR1cm4gcHJvZmlsZXM7XG4gIH1cbn0iXX0=
|
|
@@ -6,8 +6,8 @@ const Files_1 = require("./Files");
|
|
|
6
6
|
const footer = require("./footer.mustache");
|
|
7
7
|
const header = require("./header.mustache");
|
|
8
8
|
// Load from lambda layer
|
|
9
|
-
const overwriteHeader = Files_1.Files.
|
|
10
|
-
const overwriteFooter = Files_1.Files.
|
|
9
|
+
const overwriteHeader = Files_1.Files.loadTemplateOverwrite('/opt/header.mustache');
|
|
10
|
+
const overwriteFooter = Files_1.Files.loadTemplateOverwrite('/opt/footer.mustache');
|
|
11
11
|
/**
|
|
12
12
|
* Render data in a mustache template
|
|
13
13
|
*
|
|
@@ -30,4 +30,4 @@ async function render(data, template, partials) {
|
|
|
30
30
|
}
|
|
31
31
|
exports.render = render;
|
|
32
32
|
;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYmFwcC91dGlsL3JlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBcUM7QUFDckMsbUNBQWdDO0FBQ2hDLDRDQUE0QztBQUM1Qyw0Q0FBNEM7QUFFNUMseUJBQXlCO0FBQ3pCLE1BQU0sZUFBZSxHQUFHLGFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sZUFBZSxHQUFHLGFBQUssQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsTUFBTSxDQUFDLElBQVMsRUFBRSxRQUFnQixFQUFFLFFBQW1DO0lBQzNGLE1BQU0sWUFBWSxHQUFHO1FBQ25CLE1BQU0sRUFBRSxlQUFlLElBQUksTUFBTSxDQUFDLE9BQU87UUFDekMsTUFBTSxFQUFFLGVBQWUsSUFBSSxNQUFNLENBQUMsT0FBTztRQUN6QyxHQUFHLFFBQVE7S0FDWixDQUFDO0lBRUYsSUFBSSxHQUFHO1FBQ0wsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLElBQUk7S0FDUixDQUFDO0lBRUYsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQWJELHdCQWFDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCB7IEZpbGVzIH0gZnJvbSAnLi9GaWxlcyc7XG5pbXBvcnQgKiBhcyBmb290ZXIgZnJvbSAnLi9mb290ZXIubXVzdGFjaGUnO1xuaW1wb3J0ICogYXMgaGVhZGVyIGZyb20gJy4vaGVhZGVyLm11c3RhY2hlJztcblxuLy8gTG9hZCBmcm9tIGxhbWJkYSBsYXllclxuY29uc3Qgb3ZlcndyaXRlSGVhZGVyID0gRmlsZXMubG9hZFRlbXBsYXRlT3ZlcndyaXRlKCcvb3B0L2hlYWRlci5tdXN0YWNoZScpO1xuY29uc3Qgb3ZlcndyaXRlRm9vdGVyID0gRmlsZXMubG9hZFRlbXBsYXRlT3ZlcndyaXRlKCcvb3B0L2Zvb3Rlci5tdXN0YWNoZScpO1xuXG4vKipcbiAqIFJlbmRlciBkYXRhIGluIGEgbXVzdGFjaGUgdGVtcGxhdGVcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YSBBbiBvYmplY3Qgb2YgZGF0YSB0byB1c2UgaW4gdGhlIHRlbXBsYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVtcGxhdGUgdGhlIG1haW4gbXVzdGFjaGUgdGVtcGxhdGUgYXMgYSBzdHJpbmdcbiAqIEBwYXJhbSB7e1trZXk6c3RyaW5nXSA6IHN0cmluZ30gfCB1bmRlZmluZWR9IHBhcnRpYWxzIG5hbWUgYW5kIHRlbXBsYXRlIHN0cmluZ1xuICogQHJldHVybnMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXIoZGF0YTogYW55LCB0ZW1wbGF0ZTogc3RyaW5nLCBwYXJ0aWFscz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICBjb25zdCBmdWxsUGFydGlhbHMgPSB7XG4gICAgaGVhZGVyOiBvdmVyd3JpdGVIZWFkZXIgPz8gaGVhZGVyLmRlZmF1bHQsXG4gICAgZm9vdGVyOiBvdmVyd3JpdGVGb290ZXIgPz8gZm9vdGVyLmRlZmF1bHQsXG4gICAgLi4ucGFydGlhbHMsXG4gIH07XG5cbiAgZGF0YSA9IHtcbiAgICBsb2dvczogZmFsc2UsXG4gICAgLi4uZGF0YSxcbiAgfTtcblxuICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKHRlbXBsYXRlLCBkYXRhLCBmdWxsUGFydGlhbHMpO1xufTtcbiJdfQ==
|