dh-auth-library 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +39 -0
  2. package/dist/auth/api/apiAuthentication.d.ts +10 -0
  3. package/dist/auth/api/apiTokenHelper.d.ts +17 -0
  4. package/dist/auth/api/index.d.ts +3 -0
  5. package/dist/auth/api/sessionHandlerResolvers.d.ts +6 -0
  6. package/dist/auth/getLoginHandler.d.ts +3 -0
  7. package/dist/auth/index.d.ts +6 -0
  8. package/dist/auth/loginhandlers/adLoginHandler.d.ts +6 -0
  9. package/dist/auth/loginhandlers/digidGemachtigdeLoginHandler.d.ts +6 -0
  10. package/dist/auth/loginhandlers/digidLoginHandler.d.ts +6 -0
  11. package/dist/auth/loginhandlers/eHerkenningBewindvoerderLoginHandler.d.ts +6 -0
  12. package/dist/auth/loginhandlers/eHerkenningLoginHandler.d.ts +6 -0
  13. package/dist/auth/loginhandlers/index.d.ts +6 -0
  14. package/dist/auth/loginhandlers/localhostLoginHandler.d.ts +6 -0
  15. package/dist/auth/pages/adLoginPage.d.ts +23 -0
  16. package/dist/auth/pages/digidLoginPage.d.ts +15 -0
  17. package/dist/auth/pages/eHerkenningLoginPage.d.ts +22 -0
  18. package/dist/auth/pages/index.d.ts +4 -0
  19. package/dist/auth/pages/loginOverzichtPage.d.ts +16 -0
  20. package/dist/auth/sessionHandler.d.ts +13 -0
  21. package/dist/auth/utils/index.d.ts +1 -0
  22. package/dist/auth/utils/sessionFileHelper.d.ts +14 -0
  23. package/dist/constants/accountTypes.d.ts +34 -0
  24. package/dist/constants/accounts.d.ts +12 -0
  25. package/dist/constants/authTypes.d.ts +1 -0
  26. package/dist/constants/index.d.ts +6 -0
  27. package/dist/constants/loginHandler.d.ts +5 -0
  28. package/dist/constants/testAccounts.d.ts +38 -0
  29. package/dist/constants/testProfiles.d.ts +27 -0
  30. package/dist/index.cjs.js +860 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.es.js +806 -0
  33. package/dist/sha-B5xpXfPW.mjs +911 -0
  34. package/dist/sha-Eh0BcCJ_.js +911 -0
  35. package/package.json +54 -0
@@ -0,0 +1,806 @@
1
+ import { BasePage, LocalLoginPage, SessionManager, Url, baseTest, getUrl, isRunningOnLocalhost, urls } from "nl-portal-playwright-libraries";
2
+ import * as process$2 from "node:process";
3
+ import process$1 from "node:process";
4
+ import { expect } from "@playwright/test";
5
+ import * as path from "node:path";
6
+ //#region \0rolldown/runtime.js
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error("Calling `require` for \"" + x + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.");
10
+ });
11
+ //#endregion
12
+ //#region src/auth/loginhandlers/localhostLoginHandler.ts
13
+ var LocalhostLoginHandler = class {
14
+ async loginAndCreateSessionStorage(page, account, file) {
15
+ await new LocalLoginPage(page).loginAndCreateNewSession(account, file);
16
+ }
17
+ };
18
+ //#endregion
19
+ //#region src/auth/pages/loginOverzichtPage.ts
20
+ var LoginOverzichtPage = class extends BasePage {
21
+ digidLoginKnop;
22
+ digidMachtigenLoginKnop;
23
+ eHerkenningLoginKnop;
24
+ eHerkenningMachtigingLoginKnop;
25
+ constructor(page) {
26
+ super(page);
27
+ this.digidLoginKnop = page.locator("#oidc-digid");
28
+ this.digidMachtigenLoginKnop = page.locator("#digid-machtigen");
29
+ this.eHerkenningLoginKnop = page.locator("#oidc-eHerkenning");
30
+ this.eHerkenningMachtigingLoginKnop = page.locator("#eherkenning-bewindvoering");
31
+ }
32
+ async klikOpDigidLoginOptie() {
33
+ await this.digidLoginKnop.waitFor();
34
+ await this.page.waitForTimeout(2e3);
35
+ await this.digidLoginKnop.click();
36
+ }
37
+ async klikOpDigidMachtigenLoginOptie() {
38
+ await this.digidMachtigenLoginKnop.waitFor();
39
+ await this.page.waitForTimeout(2e3);
40
+ await this.digidMachtigenLoginKnop.click();
41
+ }
42
+ async klikOpEHerkenningLoginOptie() {
43
+ await this.eHerkenningLoginKnop.waitFor();
44
+ await this.page.waitForTimeout(2e3);
45
+ try {
46
+ await this.eHerkenningLoginKnop.click();
47
+ } catch (_error) {
48
+ await this.reloadPage();
49
+ await this.eHerkenningLoginKnop.waitFor();
50
+ await this.page.waitForTimeout(2e3);
51
+ await this.eHerkenningLoginKnop.click();
52
+ }
53
+ }
54
+ async klikOpProfessioneelBewindvoerderLoginOptie() {
55
+ await this.eHerkenningMachtigingLoginKnop.waitFor();
56
+ await this.page.waitForTimeout(2e3);
57
+ try {
58
+ await this.eHerkenningMachtigingLoginKnop.click();
59
+ } catch (_error) {
60
+ await this.reloadPage();
61
+ await this.eHerkenningMachtigingLoginKnop.waitFor();
62
+ await this.page.waitForTimeout(2e3);
63
+ await this.eHerkenningMachtigingLoginKnop.click();
64
+ }
65
+ }
66
+ async valideerDatHetLoginOverzichtZichtbaarIs() {
67
+ await expect(this.page.getByRole("heading", { name: "Inloggen voor mijzelf" })).toBeVisible();
68
+ }
69
+ async accepteerCookies() {
70
+ try {
71
+ await this.page.locator("#ppms_cm_agree-to-all").click();
72
+ } catch (_ignore) {}
73
+ }
74
+ async reloadPage() {
75
+ try {
76
+ await this.page.reload();
77
+ } catch (_error) {}
78
+ }
79
+ };
80
+ //#endregion
81
+ //#region src/constants/accounts.ts
82
+ /**
83
+ * To use these accounts they should be available as environment variables
84
+ */
85
+ var localhostBurgerAccount = {
86
+ username: `${process.env.LOCAL_BURGER_USERNAME}`,
87
+ password: `${process.env.LOCAL_BURGER_PASSWORD}`
88
+ };
89
+ var localhostBedrijfAccount = {
90
+ username: `${process.env.LOCAL_BEDRIJF_USERNAME}`,
91
+ password: `${process.env.LOCAL_BEDRIJF_PASSWORD}`
92
+ };
93
+ var defaultDigidAccount = {
94
+ username: `${process.env.DIGID_USER}`,
95
+ password: `${process.env.DIGID_PASSWORD}`,
96
+ bsn: `${process.env.DIGID_BSN}`
97
+ };
98
+ var defaultDigidGemachtigdAccount = {
99
+ username: `${process.env.DIGID_GEMACHTIGDE_USER}`,
100
+ password: `${process.env.DIGID_GEMACHTIGDE_PASSWORD}`,
101
+ bsn: `${process.env.DIGID_GEMACHTIGDE_BSN}`
102
+ };
103
+ var defaultEHerkenningAccount = {
104
+ username: `${process.env.EHERKENNING_USER}`,
105
+ password: `${process.env.EHERKENNING_PASSWORD}`,
106
+ bsn: `${process.env.EHERKENNING_NUMMER}`
107
+ };
108
+ var defaultVestigingAccount = {
109
+ username: `${process.env.EHERKENNING_VESTIGING_NAME}`,
110
+ password: `${process.env.EHERKENNING_VESTIGING_PASSWORD}`,
111
+ bsn: `${process.env.EHERKENNING_VESTIGING_NUMMER}`
112
+ };
113
+ var defaultProfessioneelBewindvoerderAccount = {
114
+ username: `${process.env.EHERKENNING_BEWINDVOERDER_USER}`,
115
+ password: `${process.env.EHERKENNING_BEWINDVOERDER_PASSWORD}`,
116
+ bsn: `${process.env.EHERKENNING_BEWINDVOERDER_BSN}`
117
+ };
118
+ var defaultADAccount = {
119
+ username: `${process.env.AD_USER}`,
120
+ password: `${process.env.AD_PASSWORD}`
121
+ };
122
+ //#endregion
123
+ //#region src/auth/pages/digidLoginPage.ts
124
+ var DigidLoginPage = class extends LoginOverzichtPage {
125
+ constructor(page) {
126
+ super(page);
127
+ }
128
+ async loginAndCreateNewSession(account, fileName) {
129
+ await this.openPage();
130
+ await this.handleAnySpecialADLoginScreen();
131
+ try {
132
+ await this.klikOpDigidLoginOptie();
133
+ } catch (_error) {
134
+ await this.openPage();
135
+ await this.handleAnySpecialADLoginScreen();
136
+ await this.klikOpDigidLoginOptie();
137
+ }
138
+ if (!this.page.url().match(/authn/)) {
139
+ await this.loginWithDigid(account);
140
+ await this.accepteerCookies();
141
+ }
142
+ await this.page.context().storageState({ path: fileName });
143
+ }
144
+ async loginAndCreateNewGemachtigdeSession(account, fileName) {
145
+ await this.openPage();
146
+ await this.handleAnySpecialADLoginScreen();
147
+ try {
148
+ await this.klikOpDigidMachtigenLoginOptie();
149
+ } catch (_error) {
150
+ await this.openPage();
151
+ await this.klikOpDigidMachtigenLoginOptie();
152
+ }
153
+ await this.loginWithDigid(account, true);
154
+ await this.accepteerCookies();
155
+ await this.page.context().storageState({ path: fileName });
156
+ }
157
+ /**
158
+ * Indien er al een AD sessie is maar voor de verkeerde omgeving
159
+ * Je krijgt dan een speciaal scherm waar je moet bevestigen voordat je door kan
160
+ */
161
+ async handleAnySpecialADLoginScreen() {
162
+ try {
163
+ await this.page.locator(`//div[contains(@data-test-id,'${process$1.env.AD_USER}')]`).first().waitFor({ timeout: 1e3 });
164
+ await this.page.locator(`//div[contains(@data-test-id,'${process$1.env.AD_USER}')]`).first().click();
165
+ } catch (_error) {}
166
+ }
167
+ async loginWithDigid(account, gemachtigde) {
168
+ account ??= defaultDigidAccount;
169
+ await this.page.getByLabel("Inlogoptie 5 van 5: Inloggen").click();
170
+ await this.page.getByLabel("Testen betrouwbaarheidsniveau").selectOption("25");
171
+ await this.page.getByLabel("DigiD gebruikersnaam").fill(account.username);
172
+ await this.page.getByLabel("Wachtwoord", { exact: true }).fill(account.password);
173
+ const responsePromise = this.page.waitForResponse(/callback/, { timeout: 6e4 });
174
+ await this.page.getByRole("button", { name: "Inloggen" }).click();
175
+ if (gemachtigde) await this.page.getByRole("button", { name: "Kies" }).click();
176
+ return await responsePromise;
177
+ }
178
+ async loginAlsDigidGemachtigde() {
179
+ const gemachtigde = {
180
+ username: `${process$1.env.DIGID_GEMACHTIGDE_USER}`,
181
+ password: `${process$1.env.DIGID_GEMACHTIGDE_PASSWORD}`
182
+ };
183
+ await this.klikOpDigidMachtigenLoginOptie();
184
+ await this.loginWithDigid(gemachtigde, true);
185
+ }
186
+ };
187
+ //#endregion
188
+ //#region src/auth/loginhandlers/digidLoginHandler.ts
189
+ var DigidLoginHandler = class {
190
+ async loginAndCreateSessionStorage(page, account, file) {
191
+ await new DigidLoginPage(page).loginAndCreateNewSession(account, file);
192
+ }
193
+ };
194
+ //#endregion
195
+ //#region src/auth/pages/eHerkenningLoginPage.ts
196
+ var EHerkenningLoginPage = class extends LoginOverzichtPage {
197
+ dropdownSelectIdentityProvider;
198
+ buttonConfirmIdentityProviderSelection;
199
+ textfieldUsername;
200
+ textfieldPassword;
201
+ inloggenKnop;
202
+ verderKnop;
203
+ verderLink;
204
+ inputBsn;
205
+ buttonZoek;
206
+ constructor(page) {
207
+ super(page);
208
+ this.dropdownSelectIdentityProvider = page.locator("#identity_provider");
209
+ this.buttonConfirmIdentityProviderSelection = page.locator("//*[@name='commit']");
210
+ this.textfieldUsername = page.locator("#account_username");
211
+ this.textfieldPassword = page.locator("#account_password");
212
+ this.inloggenKnop = page.getByRole("button", { name: /Inloggen|Log in/ });
213
+ this.verderKnop = page.getByRole("button", { name: /Verder|Continue|Ga verder/ });
214
+ this.inputBsn = page.locator("#bsn-input");
215
+ this.buttonZoek = page.locator("#search-submit");
216
+ this.verderLink = page.getByRole("link", { name: /Verder|Continue|Ga verder/ });
217
+ }
218
+ async probeerInTeLoggenMetEHerkenning(account) {
219
+ account ??= defaultEHerkenningAccount;
220
+ await this.dropdownSelectIdentityProvider.selectOption("Digidentity AD 1.13 (preproduction)");
221
+ await this.page.locator("#remember").click();
222
+ await this.buttonConfirmIdentityProviderSelection.click();
223
+ await this.textfieldUsername.fill(account.username);
224
+ await this.verderKnop.click();
225
+ await this.textfieldPassword.fill(account.password);
226
+ await this.inloggenKnop.click();
227
+ }
228
+ async loginWithEHerkenningAndCreateSession(fileName, account) {
229
+ await this.openPage();
230
+ try {
231
+ await this.klikOpEHerkenningLoginOptie();
232
+ } catch (_error) {
233
+ await this.openPage();
234
+ await this.klikOpEHerkenningLoginOptie();
235
+ }
236
+ await this.loginWithEHerkenning(account);
237
+ await this.page.context().storageState({ path: fileName });
238
+ }
239
+ async loginWithEHerkenning(account) {
240
+ await this.probeerInTeLoggenMetEHerkenning(account);
241
+ await this.page.waitForTimeout(2e3);
242
+ if (await this.verderKnop.isVisible()) await this.verderKnop.click();
243
+ await this.accepteerCookies();
244
+ }
245
+ async loginWithEHerkenningVestigingAndCreateSession(fileName, account) {
246
+ await this.openPage();
247
+ try {
248
+ await this.klikOpEHerkenningLoginOptie();
249
+ } catch (_error) {
250
+ await this.openPage();
251
+ await this.klikOpEHerkenningLoginOptie();
252
+ }
253
+ await this.loginWithEHerkenningVestiging(account);
254
+ await this.page.context().storageState({ path: fileName });
255
+ }
256
+ async loginWithEHerkenningVestiging(account) {
257
+ await this.probeerInTeLoggenMetEHerkenning(account);
258
+ await this.page.waitForTimeout(2e3);
259
+ if (await this.verderKnop.isVisible()) await this.verderKnop.click();
260
+ await this.accepteerCookies();
261
+ }
262
+ async loginAlsProfessioneelBewindvoerder(gemachtigde, file) {
263
+ await this.openPage();
264
+ await this.klikOpProfessioneelBewindvoerderLoginOptie();
265
+ if (gemachtigde) try {
266
+ await this.probeerInTeLoggenMetEHerkenning(gemachtigde);
267
+ } catch (_error) {
268
+ await this.openPage();
269
+ await this.probeerInTeLoggenMetEHerkenning(gemachtigde);
270
+ }
271
+ else {
272
+ gemachtigde = defaultProfessioneelBewindvoerderAccount;
273
+ try {
274
+ await this.loginWithEHerkenning(gemachtigde);
275
+ } catch (_error) {
276
+ await this.openPage();
277
+ await this.loginWithEHerkenning(gemachtigde);
278
+ }
279
+ }
280
+ if (gemachtigde.bsn != null) {
281
+ await this.verderLink.click();
282
+ await this.inputBsn.fill(gemachtigde.bsn);
283
+ }
284
+ await this.buttonZoek.click();
285
+ await this.verderLink.click();
286
+ await this.accepteerCookies();
287
+ if (file) await this.page.context().storageState({ path: file });
288
+ }
289
+ async valideerDatNietGemachtigdBerichtZichtbaarIs() {
290
+ await expect(this.page.getByText("Helaas bent u niet gemachtigd")).toBeVisible();
291
+ await expect(this.page.getByText("Helaas bent u niet gemachtigd voor toegang tot Aanvragen en regelen producten en diensten als bewindvoerder van Gemeente Den Haag.")).toBeVisible();
292
+ }
293
+ };
294
+ //#endregion
295
+ //#region src/auth/loginhandlers/eHerkenningLoginHandler.ts
296
+ var EHerkenningLoginHandler = class {
297
+ async loginAndCreateSessionStorage(page, account, file) {
298
+ await new EHerkenningLoginPage(page).loginWithEHerkenningVestigingAndCreateSession(file, account);
299
+ }
300
+ };
301
+ //#endregion
302
+ //#region src/auth/loginhandlers/digidGemachtigdeLoginHandler.ts
303
+ var DigidGemachtigdeLoginHandler = class {
304
+ async loginAndCreateSessionStorage(page, account, file) {
305
+ await new DigidLoginPage(page).loginAndCreateNewGemachtigdeSession(account, file);
306
+ }
307
+ };
308
+ //#endregion
309
+ //#region src/auth/loginhandlers/eHerkenningBewindvoerderLoginHandler.ts
310
+ var EHerkenningBewindvoerderLoginHandler = class {
311
+ async loginAndCreateSessionStorage(page, account, file) {
312
+ await new EHerkenningLoginPage(page).loginAlsProfessioneelBewindvoerder(account, file);
313
+ }
314
+ };
315
+ //#endregion
316
+ //#region node_modules/.pnpm/totp-generator@2.0.1/node_modules/totp-generator/lib/esm/index.js
317
+ var TOTP = class TOTP {
318
+ static _sign = async (t, e, r) => {
319
+ try {
320
+ const a = (globalThis.crypto || __require("node:crypto").webcrypto).subtle, i = await a.importKey("raw", t, {
321
+ name: "HMAC",
322
+ hash: { name: r }
323
+ }, !1, ["sign"]), n = TOTP.hex2buf(e);
324
+ return await a.sign("HMAC", i, n);
325
+ } catch (a) {
326
+ const { default: i } = await import("./sha-B5xpXfPW.mjs"), n = new i(r, "ARRAYBUFFER");
327
+ return n.setHMACKey(t, "ARRAYBUFFER"), n.update(TOTP.hex2buf(e)), n.getHMAC("ARRAYBUFFER");
328
+ }
329
+ };
330
+ static async generate(t, e) {
331
+ const r = {
332
+ digits: 6,
333
+ algorithm: "SHA-1",
334
+ encoding: "hex",
335
+ period: 30,
336
+ timestamp: Date.now(),
337
+ explicitZeroPad: !1,
338
+ ...e
339
+ }, a = Math.floor(r.timestamp / 1e3), i = TOTP.dec2hex(Math.floor(a / r.period)).padStart(16, "0"), n = "hex" === r.encoding ? TOTP.base32ToBuffer(t) : TOTP.asciiToBuffer(t), o = await TOTP._sign(n, i, r.algorithm), s = TOTP.buf2hex(o), c = 2 * TOTP.hex2dec(s.slice(-1)), h = (2147483647 & TOTP.hex2dec(s.slice(c, c + 8))).toString().slice(-r.digits), T = r.explicitZeroPad ? h.padStart(r.digits, "0") : h, d = 1e3 * r.period;
340
+ return {
341
+ otp: T,
342
+ expires: Math.ceil((r.timestamp + 1) / d) * d
343
+ };
344
+ }
345
+ static hex2dec(t) {
346
+ return parseInt(t, 16);
347
+ }
348
+ static dec2hex(t) {
349
+ return (t < 15.5 ? "0" : "") + Math.round(t).toString(16);
350
+ }
351
+ static base32ToBuffer(t) {
352
+ let e = (t = t.toUpperCase()).length;
353
+ for (; 61 === t.charCodeAt(e - 1);) e--;
354
+ const r = new Uint8Array(5 * e / 8);
355
+ let a = 0, i = 0, n = 0;
356
+ for (let o = 0; o < e; o++) {
357
+ const e = TOTP.base32[t.charCodeAt(o)];
358
+ if (void 0 === e) throw new Error("Invalid base32 character in key");
359
+ a = a << 5 | e, i += 5, i >= 8 && (r[n++] = a >>> (i -= 8));
360
+ }
361
+ return r.buffer;
362
+ }
363
+ static asciiToBuffer(t) {
364
+ const e = new Uint8Array(t.length);
365
+ for (let r = 0; r < t.length; r++) e[r] = t.charCodeAt(r);
366
+ return e.buffer;
367
+ }
368
+ static hex2buf(t) {
369
+ const e = new Uint8Array(t.length / 2);
370
+ for (let r = 0, a = 0; r < t.length; r += 2, a++) e[a] = TOTP.hex2dec(t.slice(r, r + 2));
371
+ return e.buffer;
372
+ }
373
+ static buf2hex(t) {
374
+ return [...new Uint8Array(t)].map((t) => t.toString(16).padStart(2, "0")).join("");
375
+ }
376
+ static base32 = {
377
+ 50: 26,
378
+ 51: 27,
379
+ 52: 28,
380
+ 53: 29,
381
+ 54: 30,
382
+ 55: 31,
383
+ 65: 0,
384
+ 66: 1,
385
+ 67: 2,
386
+ 68: 3,
387
+ 69: 4,
388
+ 70: 5,
389
+ 71: 6,
390
+ 72: 7,
391
+ 73: 8,
392
+ 74: 9,
393
+ 75: 10,
394
+ 76: 11,
395
+ 77: 12,
396
+ 78: 13,
397
+ 79: 14,
398
+ 80: 15,
399
+ 81: 16,
400
+ 82: 17,
401
+ 83: 18,
402
+ 84: 19,
403
+ 85: 20,
404
+ 86: 21,
405
+ 87: 22,
406
+ 88: 23,
407
+ 89: 24,
408
+ 90: 25
409
+ };
410
+ };
411
+ //#endregion
412
+ //#region src/auth/pages/adLoginPage.ts
413
+ var gzacUrlProd = "https://alg-zgw.denhaag.nl";
414
+ var gzacUrlAcp = "https://alg-zgw.acc.denhaag.nl";
415
+ var gzacUrlTest = "https://alg-zgw.test.denhaag.nl";
416
+ var ADLoginPage = class ADLoginPage extends BasePage {
417
+ gebruikersnaamInput;
418
+ wachtwoordInput;
419
+ volgendeInput;
420
+ aanmeldenInput;
421
+ kanAuthAppNietGebruikenLink;
422
+ gebruikVerificatieCode;
423
+ codeInput;
424
+ verifierenInput;
425
+ constructor(page) {
426
+ super(page);
427
+ this.gebruikersnaamInput = page.locator("//input[@type='email']");
428
+ this.wachtwoordInput = page.locator("//input[@name='passwd']");
429
+ this.volgendeInput = page.locator("//input[@type='submit']");
430
+ this.aanmeldenInput = page.locator("//input[@type='submit']");
431
+ this.kanAuthAppNietGebruikenLink = page.locator("//*[@id='signInAnotherWay']");
432
+ this.gebruikVerificatieCode = page.locator("//div[@id='idDiv_SAOTCS_Proofs']//div[contains(@role,'listitem')][2]");
433
+ this.codeInput = page.locator("//input[@name='otc']");
434
+ this.verifierenInput = page.locator("//input[@type='submit']");
435
+ }
436
+ async openPage(path) {
437
+ await this.page.goto(path);
438
+ }
439
+ /**
440
+ * Login with the AD account so we can get behind the firewall
441
+ *
442
+ * @param account
443
+ * @param fileName
444
+ */
445
+ async loginWithADAccountAndCreateSession(account, fileName) {
446
+ const adLoginPage = new ADLoginPage(this.page);
447
+ await this.page.goto(this.getGzacUrl());
448
+ await adLoginPage.gebruikersnaamInput.waitFor();
449
+ await adLoginPage.gebruikersnaamInput.fill(account.username);
450
+ await adLoginPage.volgendeInput.click();
451
+ await adLoginPage.wachtwoordInput.fill(account.password);
452
+ await adLoginPage.aanmeldenInput.click();
453
+ await this.page.waitForTimeout(1e3);
454
+ try {
455
+ if (await this.page.getByText("Uw account is niet geverifieerd. Probeer het opnieuw").isVisible()) await this.tryAgainUntilSuccesful();
456
+ } catch (_error) {}
457
+ await adLoginPage.kanAuthAppNietGebruikenLink.click();
458
+ await adLoginPage.gebruikVerificatieCode.click();
459
+ const token = await TOTP.generate(`${process.env.AD_SECRET}`);
460
+ await adLoginPage.codeInput.fill(token.otp);
461
+ await adLoginPage.verifierenInput.click();
462
+ await adLoginPage.page.waitForTimeout(5e3);
463
+ adLoginPage.page.on("domcontentloaded", () => {});
464
+ await adLoginPage.page.context().storageState({ path: fileName });
465
+ }
466
+ async tryAgainUntilSuccesful() {
467
+ let maxNumberOfTries = 6;
468
+ let foutMeldingIsSHowing = true;
469
+ while (foutMeldingIsSHowing) {
470
+ await this.page.waitForTimeout(1e4);
471
+ maxNumberOfTries--;
472
+ if (maxNumberOfTries == 0) return;
473
+ try {
474
+ await this.page.goBack();
475
+ await this.page.waitForTimeout(1e3);
476
+ await this.page.locator("//div[contains(@role,'listitem')]").first().click();
477
+ await this.page.waitForTimeout(1e3);
478
+ foutMeldingIsSHowing = await this.page.getByText("Uw account is niet geverifieerd. Probeer het opnieuw").isVisible();
479
+ } catch (_error) {}
480
+ }
481
+ }
482
+ getGzacUrl() {
483
+ const baseUrl = this.getBaseUrl();
484
+ if (/klantportaal-zgw.denhaag.nl./.exec(baseUrl)) return gzacUrlProd;
485
+ if (/.acc./.exec(baseUrl)) return gzacUrlAcp;
486
+ if (/.test./.exec(baseUrl)) return gzacUrlTest;
487
+ else throw new Error("Cannot find current environment for baseUrl: " + baseUrl);
488
+ }
489
+ };
490
+ //#endregion
491
+ //#region src/auth/loginhandlers/adLoginHandler.ts
492
+ var ADLoginHandler = class {
493
+ async loginAndCreateSessionStorage(page, account, file) {
494
+ await new ADLoginPage(page).loginWithADAccountAndCreateSession(account, file);
495
+ }
496
+ };
497
+ //#endregion
498
+ //#region src/auth/getLoginHandler.ts
499
+ function getLoginHandler(authType) {
500
+ switch (authType) {
501
+ case "digid": return isRunningOnLocalhost() ? new LocalhostLoginHandler() : new DigidLoginHandler();
502
+ case "digid_gemachtigde": return new DigidGemachtigdeLoginHandler();
503
+ case "eherkenning": return isRunningOnLocalhost() ? new LocalhostLoginHandler() : new EHerkenningLoginHandler();
504
+ case "eherkenning_vestiging": return new EHerkenningLoginHandler();
505
+ case "eherkenning_bewindvoerder": return new EHerkenningBewindvoerderLoginHandler();
506
+ case "ad-session": return new ADLoginHandler();
507
+ default: throw new Error(`Unsupported auth type: ${authType}. If needed please create a new LoginHandler and register it here in getLoginHandler().`);
508
+ }
509
+ }
510
+ //#endregion
511
+ //#region src/auth/utils/sessionFileHelper.ts
512
+ var sessionsDir = process$2.env.SESSIONS_DIR ?? path.resolve(process$2.cwd(), "sessions");
513
+ var environment = process$2.env.ENV ?? "test";
514
+ /**
515
+ * Easy way to create the filenames for the sessions
516
+ */
517
+ var SessionFileHelper = class {
518
+ static getLocalhostFileName(browser) {
519
+ return path.join(sessionsDir, `${browser.browserType().name()}-${environment}-${localhostBurgerAccount.username}.json`);
520
+ }
521
+ static getLocalhostFileNameBedrijf(browser) {
522
+ return path.join(sessionsDir, `${browser.browserType().name()}-${environment}-${localhostBedrijfAccount.username}.json`);
523
+ }
524
+ static getDigidFileName(browser) {
525
+ return path.join(sessionsDir, `${browser.browserType().name()}-digid-${environment}-${defaultDigidAccount.username}.json`);
526
+ }
527
+ static getDigidGemachtigdeFileName(browser) {
528
+ return path.join(sessionsDir, `${browser.browserType().name()}-digid-gemachtigde-${environment}-${defaultDigidGemachtigdAccount.username}.json`);
529
+ }
530
+ static getEHerkenningFileName(browser) {
531
+ return path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-${environment}.json`);
532
+ }
533
+ static getEHerkenningVestigingFileName(browser) {
534
+ return path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-vestiging-${environment}.json`);
535
+ }
536
+ static getEHerkenningBewindvoerderFileName(browser) {
537
+ return path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-bewindvoerder-${environment}.json`);
538
+ }
539
+ static getADFileName(browser) {
540
+ return path.join(sessionsDir, `${browser.browserType().name()}-ad-${environment}.json`);
541
+ }
542
+ };
543
+ //#endregion
544
+ //#region src/auth/sessionHandler.ts
545
+ var MAX_SESSION_TIME_IN_MINUTES = 10;
546
+ /**
547
+ * This class creates the correct SessionHandler
548
+ * It will also perform the process of setting op the session
549
+ *
550
+ * @param authType type of login
551
+ * @param account with login details
552
+ * @param loginHandler that will handle the login itself
553
+ */
554
+ function createSessionHandler(authType, account, loginHandler) {
555
+ return {
556
+ getFile: (browser) => {
557
+ switch (authType) {
558
+ case "digid": return SessionFileHelper.getDigidFileName(browser);
559
+ case "digid_gemachtigde": return SessionFileHelper.getDigidGemachtigdeFileName(browser);
560
+ case "eherkenning": return SessionFileHelper.getEHerkenningFileName(browser);
561
+ case "eherkenning_vestiging": return SessionFileHelper.getEHerkenningVestigingFileName(browser);
562
+ case "eherkenning_bewindvoerder": return SessionFileHelper.getEHerkenningBewindvoerderFileName(browser);
563
+ case "ad-session": return SessionFileHelper.getADFileName(browser);
564
+ default: throw new Error(`Unsupported auth type: ${authType}`);
565
+ }
566
+ },
567
+ /**
568
+ * Setup the new session
569
+ * If needed the AD Session if used (Needed outside the firewall)
570
+ *
571
+ * @param browser
572
+ * @param file
573
+ */
574
+ setupSession: async (browser, file) => {
575
+ const useADSession = process.env.WITH_AD_SESSION === "true";
576
+ const page = await browser.newPage({
577
+ ignoreHTTPSErrors: true,
578
+ storageState: useADSession && authType !== "ad-session" ? SessionFileHelper.getADFileName(browser) : void 0
579
+ });
580
+ console.log(`New session will be created: ${file}`);
581
+ try {
582
+ await loginHandler.loginAndCreateSessionStorage(page, account, file);
583
+ } finally {
584
+ await page.close();
585
+ }
586
+ },
587
+ /**
588
+ * Refresh the current session by opening a page and storing that session
589
+ * The UI should have refreshed the session meanwhile
590
+ *
591
+ * This is being called from the nl-portal-base-library
592
+ *
593
+ * @param browser
594
+ * @param file
595
+ */
596
+ refreshSession: async (browser, file) => {
597
+ const page = await browser.newPage({
598
+ ignoreHTTPSErrors: true,
599
+ storageState: file
600
+ });
601
+ console.log(`Refresh of session started for : ${file}`);
602
+ await page.goto(getUrl(Url.PortalBaseUrl));
603
+ await page.waitForLoadState("networkidle");
604
+ if (page.url().match(/authn/)) {
605
+ console.log(`New session will be created as the current one is no longer valid: ${file}`);
606
+ try {
607
+ await loginHandler.loginAndCreateSessionStorage(page, account, file);
608
+ } catch (_error) {
609
+ console.error(_error);
610
+ }
611
+ } else {
612
+ console.log(`Current session was still valid and will be refreshed now: ${file}`);
613
+ await page.context().storageState({ path: file });
614
+ }
615
+ await page.close();
616
+ }
617
+ };
618
+ }
619
+ //#endregion
620
+ //#region src/auth/api/apiTokenHelper.ts
621
+ /**
622
+ * The token is often being refreshed so the easiest is to open a browser using the current session
623
+ * The UI will automatically refresh the token and that is the token we will return
624
+ *
625
+ * That token can be used to perform some api requests for a short time
626
+ * Per specfile it is not problem but this should be done in every specfile to assure a valid token
627
+ *
628
+ * @param baseTest
629
+ * @param handlerResolver
630
+ */
631
+ function getApiTokenFromSession(baseTest, handlerResolver) {
632
+ return baseTest.extend({
633
+ urls: async ({}, use) => {
634
+ await use(urls);
635
+ },
636
+ token: async ({ browser }, use) => {
637
+ const handler = handlerResolver();
638
+ const storageState = await SessionManager.getOrCreateSession(browser, handler);
639
+ const context = await browser.newContext(storageState ? { storageState } : {});
640
+ const page = await context.newPage();
641
+ try {
642
+ await page.goto("/");
643
+ await page.waitForFunction(() => {
644
+ const key = Object.keys(sessionStorage).find((k) => k.startsWith("oidc"));
645
+ if (!key) return false;
646
+ const raw = sessionStorage.getItem(key);
647
+ if (!raw) return false;
648
+ try {
649
+ return !!JSON.parse(raw)?.access_token;
650
+ } catch {
651
+ return false;
652
+ }
653
+ });
654
+ const token = await page.evaluate(() => {
655
+ const key = Object.keys(sessionStorage).find((k) => k.startsWith("oidc"));
656
+ if (!key) return null;
657
+ const raw = sessionStorage.getItem(key);
658
+ if (!raw) return null;
659
+ try {
660
+ return JSON.parse(raw)?.access_token ?? null;
661
+ } catch {
662
+ return null;
663
+ }
664
+ });
665
+ if (!token) throw new Error("❌ Token not found in sessionStorage");
666
+ await use(token);
667
+ } finally {
668
+ await context.close();
669
+ }
670
+ }
671
+ });
672
+ }
673
+ //#endregion
674
+ //#region src/auth/api/sessionHandlerResolvers.ts
675
+ function getBurgerSessionHandler() {
676
+ if (isRunningOnLocalhost()) return createSessionHandler("digid", localhostBurgerAccount, getLoginHandler("digid"));
677
+ return createSessionHandler("digid", defaultDigidAccount, getLoginHandler("digid"));
678
+ }
679
+ function getBedrijfSessionHandler() {
680
+ if (isRunningOnLocalhost()) return createSessionHandler("eherkenning", localhostBedrijfAccount, getLoginHandler("eherkenning"));
681
+ return createSessionHandler("eherkenning", defaultEHerkenningAccount, getLoginHandler("eherkenning"));
682
+ }
683
+ function getVestigingSessionHandler() {
684
+ return createSessionHandler("eherkenning_vestiging", defaultVestigingAccount, getLoginHandler("eherkenning_vestiging"));
685
+ }
686
+ function getDigidGemachtigdeSessionHandler() {
687
+ return createSessionHandler("digid_gemachtigde", defaultDigidGemachtigdAccount, getLoginHandler("digid_gemachtigde"));
688
+ }
689
+ function getEHerkenningBewindvoerderSessionHandler() {
690
+ return createSessionHandler("eherkenning_bewindvoerder", defaultProfessioneelBewindvoerderAccount, getLoginHandler("eherkenning_bewindvoerder"));
691
+ }
692
+ function getAdSessionHandler() {
693
+ return createSessionHandler("ad-session", defaultADAccount, getLoginHandler("ad-session"));
694
+ }
695
+ //#endregion
696
+ //#region src/auth/api/apiAuthentication.ts
697
+ /**
698
+ * The api's will use an existing session and use that token for the requests.
699
+ * The reason for this is that the token life-span is short and the UI always does a token-refresh.
700
+ * By using the UI session and stealing that token it will always be valid.
701
+ */
702
+ var burgerApiTest = getApiTokenFromSession(baseTest, getBurgerSessionHandler);
703
+ var bedrijfApiTest = getApiTokenFromSession(baseTest, getBedrijfSessionHandler);
704
+ var vestigingApiTest = getApiTokenFromSession(baseTest, getVestigingSessionHandler);
705
+ var digidGemachtigdeApiTest = getApiTokenFromSession(baseTest, getDigidGemachtigdeSessionHandler);
706
+ var eHerkenningBewindvoerderApiTest = getApiTokenFromSession(baseTest, getEHerkenningBewindvoerderSessionHandler);
707
+ //#endregion
708
+ //#region src/constants/accountTypes.ts
709
+ var profiles = {
710
+ burger: {
711
+ accountType: "burger",
712
+ authType: "digid",
713
+ id: "999994499"
714
+ },
715
+ bedrijf: {
716
+ accountType: "bedrijf",
717
+ authType: "eherkenning",
718
+ id: "90002768"
719
+ },
720
+ vestiging: {
721
+ accountType: "vestiging",
722
+ authType: "eherkenning_vestiging",
723
+ id: "990000262129"
724
+ },
725
+ gemachtigde: {
726
+ accountType: "digid-gemachtigde",
727
+ authType: "digid_gemachtigde",
728
+ id: ""
729
+ },
730
+ bewindvoerder: {
731
+ accountType: "bedrijf",
732
+ authType: "eherkenning_bewindvoerder",
733
+ id: "999994499"
734
+ }
735
+ };
736
+ //#endregion
737
+ //#region src/constants/testAccounts.ts
738
+ var TestAccounts = {
739
+ zgwdigiduser1: {
740
+ id: "999991954",
741
+ type: "burger"
742
+ },
743
+ zgwdigiduser2: {
744
+ id: "999991115",
745
+ type: "burger"
746
+ },
747
+ zgwdigiduser3: {
748
+ id: "999991966",
749
+ type: "burger"
750
+ },
751
+ zgwdigiduser4: {
752
+ id: "999992922",
753
+ type: "burger"
754
+ },
755
+ zgwdigiduser5: {
756
+ id: "999991322",
757
+ type: "burger"
758
+ },
759
+ testautomatisering: {
760
+ id: "999994499",
761
+ type: "burger"
762
+ },
763
+ localhostaccount: {
764
+ id: "999993847",
765
+ type: "burger"
766
+ },
767
+ kvkAccount: {
768
+ id: "90002768",
769
+ type: "bedrijf"
770
+ },
771
+ kvkVestiging: {
772
+ id: "990000262129",
773
+ type: "vestiging"
774
+ }
775
+ };
776
+ //#endregion
777
+ //#region src/constants/testProfiles.ts
778
+ var testProfiles = {
779
+ burger: {
780
+ accountType: "burger",
781
+ authType: "digid",
782
+ id: "999994499"
783
+ },
784
+ bedrijf: {
785
+ accountType: "bedrijf",
786
+ authType: "eherkenning",
787
+ id: "90002768"
788
+ },
789
+ vestiging: {
790
+ accountType: "vestiging",
791
+ authType: "eherkenning_vestiging",
792
+ id: "990000262129"
793
+ },
794
+ gemachtigde: {
795
+ accountType: "digid-gemachtigde",
796
+ authType: "digid_gemachtigde",
797
+ id: ""
798
+ },
799
+ bewindvoerder: {
800
+ accountType: "bedrijf",
801
+ authType: "eherkenning_bewindvoerder",
802
+ id: "999994499"
803
+ }
804
+ };
805
+ //#endregion
806
+ export { ADLoginHandler, ADLoginPage, DigidGemachtigdeLoginHandler, DigidLoginHandler, DigidLoginPage, EHerkenningBewindvoerderLoginHandler, EHerkenningLoginHandler, EHerkenningLoginPage, LocalhostLoginHandler, LoginOverzichtPage, MAX_SESSION_TIME_IN_MINUTES, SessionFileHelper, TestAccounts, bedrijfApiTest, burgerApiTest, createSessionHandler, defaultADAccount, defaultDigidAccount, defaultDigidGemachtigdAccount, defaultEHerkenningAccount, defaultProfessioneelBewindvoerderAccount, defaultVestigingAccount, digidGemachtigdeApiTest, eHerkenningBewindvoerderApiTest, getAdSessionHandler, getApiTokenFromSession, getBedrijfSessionHandler, getBurgerSessionHandler, getDigidGemachtigdeSessionHandler, getEHerkenningBewindvoerderSessionHandler, getLoginHandler, getVestigingSessionHandler, localhostBedrijfAccount, localhostBurgerAccount, profiles, testProfiles, vestigingApiTest };