dh-auth-library 1.1.0 → 1.2.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 (36) hide show
  1. package/dist/index.cjs.js +562 -0
  2. package/dist/index.es.js +523 -0
  3. package/package.json +55 -50
  4. package/dist/auth/api/apiAuthentication.d.ts +0 -10
  5. package/dist/auth/api/apiAuthentication.js +0 -13
  6. package/dist/auth/api/apiTokenHelper.js +0 -68
  7. package/dist/auth/api/index.js +0 -2
  8. package/dist/auth/api/sessionHandlerResolvers.js +0 -5
  9. package/dist/auth/getLoginHandler.js +0 -25
  10. package/dist/auth/index.js +0 -6
  11. package/dist/auth/loginhandlers/adLoginHandler.js +0 -7
  12. package/dist/auth/loginhandlers/digidGemachtigdeLoginHandler.js +0 -7
  13. package/dist/auth/loginhandlers/digidLoginHandler.js +0 -7
  14. package/dist/auth/loginhandlers/eHerkenningBewindvoerderLoginHandler.js +0 -7
  15. package/dist/auth/loginhandlers/eHerkenningLoginHandler.js +0 -7
  16. package/dist/auth/loginhandlers/index.js +0 -6
  17. package/dist/auth/loginhandlers/localhostLoginHandler.js +0 -7
  18. package/dist/auth/pages/adLoginPage.js +0 -94
  19. package/dist/auth/pages/digidLoginPage.js +0 -73
  20. package/dist/auth/pages/eHerkenningLoginPage.js +0 -94
  21. package/dist/auth/pages/index.js +0 -4
  22. package/dist/auth/pages/loginOverzichtPage.js +0 -70
  23. package/dist/auth/sessionHandler.js +0 -88
  24. package/dist/auth/utils/index.js +0 -1
  25. package/dist/auth/utils/sessionFileHelper.js +0 -33
  26. package/dist/constants/accountTypes.js +0 -1
  27. package/dist/constants/accounts.d.ts +0 -12
  28. package/dist/constants/accounts.js +0 -40
  29. package/dist/constants/authTypes.js +0 -1
  30. package/dist/constants/index.js +0 -3
  31. package/dist/constants/loginHandler.js +0 -1
  32. package/dist/constants/testAccounts.d.ts +0 -38
  33. package/dist/constants/testAccounts.js +0 -39
  34. package/dist/constants/testProfiles.d.ts +0 -27
  35. package/dist/constants/testProfiles.js +0 -27
  36. package/dist/index.js +0 -2
@@ -0,0 +1,562 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region \0rolldown/runtime.js
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
20
+ value: mod,
21
+ enumerable: true
22
+ }) : target, mod));
23
+ //#endregion
24
+ let nl_portal_playwright_libraries = require("nl-portal-playwright-libraries");
25
+ let node_process = require("node:process");
26
+ node_process = __toESM(node_process);
27
+ let _playwright_test = require("@playwright/test");
28
+ let totp_generator = require("totp-generator");
29
+ let node_path = require("node:path");
30
+ node_path = __toESM(node_path);
31
+ //#region src/auth/loginhandlers/localhostLoginHandler.ts
32
+ var LocalhostLoginHandler = class {
33
+ async loginAndCreateSessionStorage(page, account, file) {
34
+ await new nl_portal_playwright_libraries.LocalLoginPage(page).loginAndCreateNewSession(account, file);
35
+ }
36
+ };
37
+ //#endregion
38
+ //#region src/auth/pages/loginOverzichtPage.ts
39
+ var LoginOverzichtPage = class extends nl_portal_playwright_libraries.BasePage {
40
+ digidLoginKnop;
41
+ digidMachtigenLoginKnop;
42
+ eHerkenningLoginKnop;
43
+ eHerkenningMachtigingLoginKnop;
44
+ constructor(page) {
45
+ super(page);
46
+ this.digidLoginKnop = page.locator("#oidc-digid");
47
+ this.digidMachtigenLoginKnop = page.locator("#digid-machtigen");
48
+ this.eHerkenningLoginKnop = page.locator("#oidc-eHerkenning");
49
+ this.eHerkenningMachtigingLoginKnop = page.locator("#eherkenning-bewindvoering");
50
+ }
51
+ async klikOpDigidLoginOptie() {
52
+ await this.digidLoginKnop.waitFor();
53
+ await this.page.waitForTimeout(2e3);
54
+ await this.digidLoginKnop.click();
55
+ }
56
+ async klikOpDigidMachtigenLoginOptie() {
57
+ await this.digidMachtigenLoginKnop.waitFor();
58
+ await this.page.waitForTimeout(2e3);
59
+ await this.digidMachtigenLoginKnop.click();
60
+ }
61
+ async klikOpEHerkenningLoginOptie() {
62
+ await this.eHerkenningLoginKnop.waitFor();
63
+ await this.page.waitForTimeout(2e3);
64
+ try {
65
+ await this.eHerkenningLoginKnop.click();
66
+ } catch (_error) {
67
+ await this.reloadPage();
68
+ await this.eHerkenningLoginKnop.waitFor();
69
+ await this.page.waitForTimeout(2e3);
70
+ await this.eHerkenningLoginKnop.click();
71
+ }
72
+ }
73
+ async klikOpProfessioneelBewindvoerderLoginOptie() {
74
+ await this.eHerkenningMachtigingLoginKnop.waitFor();
75
+ await this.page.waitForTimeout(2e3);
76
+ try {
77
+ await this.eHerkenningMachtigingLoginKnop.click();
78
+ } catch (_error) {
79
+ await this.reloadPage();
80
+ await this.eHerkenningMachtigingLoginKnop.waitFor();
81
+ await this.page.waitForTimeout(2e3);
82
+ await this.eHerkenningMachtigingLoginKnop.click();
83
+ }
84
+ }
85
+ async valideerDatHetLoginOverzichtZichtbaarIs() {
86
+ await (0, _playwright_test.expect)(this.page.getByRole("heading", { name: "Inloggen voor mijzelf" })).toBeVisible();
87
+ }
88
+ async accepteerCookies() {
89
+ try {
90
+ await this.page.locator("#ppms_cm_agree-to-all").click();
91
+ } catch (_ignore) {}
92
+ }
93
+ async reloadPage() {
94
+ try {
95
+ await this.page.reload();
96
+ } catch (_error) {}
97
+ }
98
+ };
99
+ //#endregion
100
+ //#region src/auth/pages/digidLoginPage.ts
101
+ var DigidLoginPage = class extends LoginOverzichtPage {
102
+ constructor(page) {
103
+ super(page);
104
+ }
105
+ async loginAndCreateNewSession(account, fileName) {
106
+ await this.openPage();
107
+ await this.handleAnySpecialADLoginScreen();
108
+ try {
109
+ await this.klikOpDigidLoginOptie();
110
+ } catch (_error) {
111
+ await this.openPage();
112
+ await this.handleAnySpecialADLoginScreen();
113
+ await this.klikOpDigidLoginOptie();
114
+ }
115
+ if (!this.page.url().match(/authn/)) {
116
+ await this.loginWithDigid(account);
117
+ await this.accepteerCookies();
118
+ }
119
+ await this.page.context().storageState({ path: fileName });
120
+ }
121
+ async loginAndCreateNewGemachtigdeSession(account, fileName) {
122
+ await this.openPage();
123
+ await this.handleAnySpecialADLoginScreen();
124
+ try {
125
+ await this.klikOpDigidMachtigenLoginOptie();
126
+ } catch (_error) {
127
+ await this.openPage();
128
+ await this.klikOpDigidMachtigenLoginOptie();
129
+ }
130
+ await this.loginWithDigid(account, true);
131
+ await this.accepteerCookies();
132
+ await this.page.context().storageState({ path: fileName });
133
+ }
134
+ /**
135
+ * Indien er al een AD sessie is maar voor de verkeerde omgeving
136
+ * Je krijgt dan een speciaal scherm waar je moet bevestigen voordat je door kan
137
+ */
138
+ async handleAnySpecialADLoginScreen() {
139
+ try {
140
+ await this.page.locator(`//div[contains(@data-test-id,'${node_process.default.env.AD_USER}')]`).first().waitFor({ timeout: 1e3 });
141
+ await this.page.locator(`//div[contains(@data-test-id,'${node_process.default.env.AD_USER}')]`).first().click();
142
+ } catch (_error) {}
143
+ }
144
+ async loginWithDigid(account, gemachtigde) {
145
+ await this.page.getByLabel("Inlogoptie 5 van 5: Inloggen").click();
146
+ await this.page.getByLabel("Testen betrouwbaarheidsniveau").selectOption("25");
147
+ await this.page.getByLabel("DigiD gebruikersnaam").fill(account.username);
148
+ await this.page.getByLabel("Wachtwoord", { exact: true }).fill(account.password);
149
+ const responsePromise = this.page.waitForResponse(/callback/, { timeout: 6e4 });
150
+ await this.page.getByRole("button", { name: "Inloggen" }).click();
151
+ if (gemachtigde) await this.page.getByRole("button", { name: "Kies" }).click();
152
+ return await responsePromise;
153
+ }
154
+ async loginAlsDigidGemachtigde() {
155
+ const gemachtigde = {
156
+ username: `${node_process.default.env.DIGID_GEMACHTIGDE_USER}`,
157
+ password: `${node_process.default.env.DIGID_GEMACHTIGDE_PASSWORD}`
158
+ };
159
+ await this.klikOpDigidMachtigenLoginOptie();
160
+ await this.loginWithDigid(gemachtigde, true);
161
+ }
162
+ };
163
+ //#endregion
164
+ //#region src/auth/loginhandlers/digidLoginHandler.ts
165
+ var DigidLoginHandler = class {
166
+ async loginAndCreateSessionStorage(page, account, file) {
167
+ await new DigidLoginPage(page).loginAndCreateNewSession(account, file);
168
+ }
169
+ };
170
+ //#endregion
171
+ //#region src/auth/pages/eHerkenningLoginPage.ts
172
+ var EHerkenningLoginPage = class extends LoginOverzichtPage {
173
+ dropdownSelectIdentityProvider;
174
+ buttonConfirmIdentityProviderSelection;
175
+ textfieldUsername;
176
+ textfieldPassword;
177
+ inloggenKnop;
178
+ verderKnop;
179
+ verderLink;
180
+ inputBsn;
181
+ buttonZoek;
182
+ constructor(page) {
183
+ super(page);
184
+ this.dropdownSelectIdentityProvider = page.locator("#identity_provider");
185
+ this.buttonConfirmIdentityProviderSelection = page.locator("//*[@name='commit']");
186
+ this.textfieldUsername = page.locator("#account_username");
187
+ this.textfieldPassword = page.locator("#account_password");
188
+ this.inloggenKnop = page.getByRole("button", { name: /Inloggen|Log in/ });
189
+ this.verderKnop = page.getByRole("button", { name: /Verder|Continue|Ga verder/ });
190
+ this.inputBsn = page.locator("#bsn-input");
191
+ this.buttonZoek = page.locator("#search-submit");
192
+ this.verderLink = page.getByRole("link", { name: /Verder|Continue|Ga verder/ });
193
+ }
194
+ async probeerInTeLoggenMetEHerkenning(account) {
195
+ await this.dropdownSelectIdentityProvider.selectOption("Digidentity AD 1.13 (preproduction)");
196
+ await this.page.locator("#remember").click();
197
+ await this.buttonConfirmIdentityProviderSelection.click();
198
+ await this.textfieldUsername.fill(account.username);
199
+ await this.verderKnop.click();
200
+ await this.textfieldPassword.fill(account.password);
201
+ await this.inloggenKnop.click();
202
+ }
203
+ async loginWithEHerkenningAndCreateSession(fileName, account) {
204
+ await this.openPage();
205
+ try {
206
+ await this.klikOpEHerkenningLoginOptie();
207
+ } catch (_error) {
208
+ await this.openPage();
209
+ await this.klikOpEHerkenningLoginOptie();
210
+ }
211
+ await this.loginWithEHerkenning(account);
212
+ await this.page.context().storageState({ path: fileName });
213
+ }
214
+ async loginWithEHerkenning(account) {
215
+ await this.probeerInTeLoggenMetEHerkenning(account);
216
+ await this.page.waitForTimeout(2e3);
217
+ if (await this.verderKnop.isVisible()) await this.verderKnop.click();
218
+ await this.accepteerCookies();
219
+ }
220
+ async loginWithEHerkenningVestigingAndCreateSession(fileName, account) {
221
+ await this.openPage();
222
+ try {
223
+ await this.klikOpEHerkenningLoginOptie();
224
+ } catch (_error) {
225
+ await this.openPage();
226
+ await this.klikOpEHerkenningLoginOptie();
227
+ }
228
+ await this.loginWithEHerkenningVestiging(account);
229
+ await this.page.context().storageState({ path: fileName });
230
+ }
231
+ async loginWithEHerkenningVestiging(account) {
232
+ await this.probeerInTeLoggenMetEHerkenning(account);
233
+ await this.page.waitForTimeout(2e3);
234
+ if (await this.verderKnop.isVisible()) await this.verderKnop.click();
235
+ await this.accepteerCookies();
236
+ }
237
+ async loginAlsProfessioneelBewindvoerder(gemachtigde, file) {
238
+ await this.openPage();
239
+ await this.klikOpProfessioneelBewindvoerderLoginOptie();
240
+ try {
241
+ await this.probeerInTeLoggenMetEHerkenning(gemachtigde);
242
+ } catch (_error) {
243
+ await this.openPage();
244
+ await this.probeerInTeLoggenMetEHerkenning(gemachtigde);
245
+ }
246
+ if (gemachtigde.bsn != null) {
247
+ await this.verderLink.click();
248
+ await this.inputBsn.fill(gemachtigde.bsn);
249
+ }
250
+ await this.buttonZoek.click();
251
+ await this.verderLink.click();
252
+ await this.accepteerCookies();
253
+ if (file) await this.page.context().storageState({ path: file });
254
+ }
255
+ };
256
+ //#endregion
257
+ //#region src/auth/loginhandlers/eHerkenningLoginHandler.ts
258
+ var EHerkenningLoginHandler = class {
259
+ async loginAndCreateSessionStorage(page, account, file) {
260
+ await new EHerkenningLoginPage(page).loginWithEHerkenningVestigingAndCreateSession(file, account);
261
+ }
262
+ };
263
+ //#endregion
264
+ //#region src/auth/loginhandlers/digidGemachtigdeLoginHandler.ts
265
+ var DigidGemachtigdeLoginHandler = class {
266
+ async loginAndCreateSessionStorage(page, account, file) {
267
+ await new DigidLoginPage(page).loginAndCreateNewGemachtigdeSession(account, file);
268
+ }
269
+ };
270
+ //#endregion
271
+ //#region src/auth/loginhandlers/eHerkenningBewindvoerderLoginHandler.ts
272
+ var EHerkenningBewindvoerderLoginHandler = class {
273
+ async loginAndCreateSessionStorage(page, account, file) {
274
+ await new EHerkenningLoginPage(page).loginAlsProfessioneelBewindvoerder(account, file);
275
+ }
276
+ };
277
+ //#endregion
278
+ //#region src/auth/pages/adLoginPage.ts
279
+ var gzacUrlProd = "https://alg-zgw.denhaag.nl";
280
+ var gzacUrlAcp = "https://alg-zgw.acc.denhaag.nl";
281
+ var gzacUrlTest = "https://alg-zgw.test.denhaag.nl";
282
+ var ADLoginPage = class ADLoginPage extends nl_portal_playwright_libraries.BasePage {
283
+ gebruikersnaamInput;
284
+ wachtwoordInput;
285
+ volgendeInput;
286
+ aanmeldenInput;
287
+ kanAuthAppNietGebruikenLink;
288
+ gebruikVerificatieCode;
289
+ codeInput;
290
+ verifierenInput;
291
+ constructor(page) {
292
+ super(page);
293
+ this.gebruikersnaamInput = page.locator("//input[@type='email']");
294
+ this.wachtwoordInput = page.locator("//input[@name='passwd']");
295
+ this.volgendeInput = page.locator("//input[@type='submit']");
296
+ this.aanmeldenInput = page.locator("//input[@type='submit']");
297
+ this.kanAuthAppNietGebruikenLink = page.locator("//*[@id='signInAnotherWay']");
298
+ this.gebruikVerificatieCode = page.locator("//div[@id='idDiv_SAOTCS_Proofs']//div[contains(@role,'listitem')][2]");
299
+ this.codeInput = page.locator("//input[@name='otc']");
300
+ this.verifierenInput = page.locator("//input[@type='submit']");
301
+ }
302
+ async openPage(path) {
303
+ await this.page.goto(path);
304
+ }
305
+ /**
306
+ * Login with the AD account so we can get behind the firewall
307
+ *
308
+ * @param account
309
+ * @param fileName
310
+ */
311
+ async loginWithADAccountAndCreateSession(account, fileName) {
312
+ const adLoginPage = new ADLoginPage(this.page);
313
+ await this.page.goto(this.getGzacUrl());
314
+ await adLoginPage.gebruikersnaamInput.waitFor();
315
+ await adLoginPage.gebruikersnaamInput.fill(account.username);
316
+ await adLoginPage.volgendeInput.click();
317
+ await adLoginPage.wachtwoordInput.fill(account.password);
318
+ await adLoginPage.aanmeldenInput.click();
319
+ await this.page.waitForTimeout(1e3);
320
+ try {
321
+ if (await this.page.getByText("Uw account is niet geverifieerd. Probeer het opnieuw").isVisible()) await this.tryAgainUntilSuccesful();
322
+ } catch (_error) {}
323
+ await adLoginPage.kanAuthAppNietGebruikenLink.click();
324
+ await adLoginPage.gebruikVerificatieCode.click();
325
+ const token = await totp_generator.TOTP.generate(`${process.env.AD_SECRET}`);
326
+ await adLoginPage.codeInput.fill(token.otp);
327
+ await adLoginPage.verifierenInput.click();
328
+ await adLoginPage.page.waitForTimeout(5e3);
329
+ adLoginPage.page.on("domcontentloaded", () => {});
330
+ await adLoginPage.page.context().storageState({ path: fileName });
331
+ }
332
+ async tryAgainUntilSuccesful() {
333
+ let maxNumberOfTries = 6;
334
+ let foutMeldingIsSHowing = true;
335
+ while (foutMeldingIsSHowing) {
336
+ await this.page.waitForTimeout(1e4);
337
+ maxNumberOfTries--;
338
+ if (maxNumberOfTries == 0) return;
339
+ try {
340
+ await this.page.goBack();
341
+ await this.page.waitForTimeout(1e3);
342
+ await this.page.locator("//div[contains(@role,'listitem')]").first().click();
343
+ await this.page.waitForTimeout(1e3);
344
+ foutMeldingIsSHowing = await this.page.getByText("Uw account is niet geverifieerd. Probeer het opnieuw").isVisible();
345
+ } catch (_error) {}
346
+ }
347
+ }
348
+ getGzacUrl() {
349
+ const baseUrl = this.getBaseUrl();
350
+ if (/klantportaal-zgw.denhaag.nl./.exec(baseUrl)) return gzacUrlProd;
351
+ if (/.acc./.exec(baseUrl)) return gzacUrlAcp;
352
+ if (/.test./.exec(baseUrl)) return gzacUrlTest;
353
+ else throw new Error("Cannot find current environment for baseUrl: " + baseUrl);
354
+ }
355
+ };
356
+ //#endregion
357
+ //#region src/auth/loginhandlers/adLoginHandler.ts
358
+ var ADLoginHandler = class {
359
+ async loginAndCreateSessionStorage(page, account, file) {
360
+ await new ADLoginPage(page).loginWithADAccountAndCreateSession(account, file);
361
+ }
362
+ };
363
+ //#endregion
364
+ //#region src/auth/getLoginHandler.ts
365
+ function getLoginHandler(authType) {
366
+ switch (authType) {
367
+ case "digid": return (0, nl_portal_playwright_libraries.isRunningOnLocalhost)() ? new LocalhostLoginHandler() : new DigidLoginHandler();
368
+ case "digid_gemachtigde": return new DigidGemachtigdeLoginHandler();
369
+ case "eherkenning": return (0, nl_portal_playwright_libraries.isRunningOnLocalhost)() ? new LocalhostLoginHandler() : new EHerkenningLoginHandler();
370
+ case "eherkenning_vestiging": return new EHerkenningLoginHandler();
371
+ case "eherkenning_bewindvoerder": return new EHerkenningBewindvoerderLoginHandler();
372
+ case "ad-session": return new ADLoginHandler();
373
+ default: throw new Error(`Unsupported auth type: ${authType}. If needed please create a new LoginHandler and register it here in getLoginHandler().`);
374
+ }
375
+ }
376
+ //#endregion
377
+ //#region src/auth/utils/sessionFileHelper.ts
378
+ var sessionsDir = node_process.env.SESSIONS_DIR ?? node_path.resolve(node_process.cwd(), "sessions");
379
+ var environment = node_process.env.ENV ?? "test";
380
+ /**
381
+ * Easy way to create the filenames for the sessions
382
+ */
383
+ var SessionFileHelper = class {
384
+ static getLocalhostFileName(browser, account) {
385
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-${environment}-${account.username}.json`);
386
+ }
387
+ static getLocalhostFileNameBedrijf(browser, account) {
388
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-${environment}-${account.username}.json`);
389
+ }
390
+ static getDigidFileName(browser, account) {
391
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-digid-${environment}-${account.username}.json`);
392
+ }
393
+ static getDigidGemachtigdeFileName(browser, account) {
394
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-digid-gemachtigde-${environment}-${account.username}.json`);
395
+ }
396
+ static getEHerkenningFileName(browser, account) {
397
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-${environment}-${account.username}.json`);
398
+ }
399
+ static getEHerkenningVestigingFileName(browser, account) {
400
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-vestiging-${environment}-${account.username}.json`);
401
+ }
402
+ static getEHerkenningBewindvoerderFileName(browser, account) {
403
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-eherkenning-bewindvoerder-${environment}-${account.username}.json`);
404
+ }
405
+ static getADFileName(browser, account) {
406
+ return node_path.join(sessionsDir, `${browser.browserType().name()}-ad-${environment}-${account.username}.json`);
407
+ }
408
+ };
409
+ //#endregion
410
+ //#region src/auth/sessionHandler.ts
411
+ var MAX_SESSION_TIME_IN_MINUTES = 10;
412
+ /**
413
+ * This class creates the correct SessionHandler
414
+ * It will also perform the process of setting op the session
415
+ *
416
+ * @param authType type of login
417
+ * @param account with login details
418
+ * @param loginHandler that will handle the login itself
419
+ */
420
+ function createSessionHandler(authType, account, loginHandler) {
421
+ return {
422
+ getFile: (browser) => {
423
+ switch (authType) {
424
+ case "digid": return SessionFileHelper.getDigidFileName(browser, account);
425
+ case "digid_gemachtigde": return SessionFileHelper.getDigidGemachtigdeFileName(browser, account);
426
+ case "eherkenning": return SessionFileHelper.getEHerkenningFileName(browser, account);
427
+ case "eherkenning_vestiging": return SessionFileHelper.getEHerkenningVestigingFileName(browser, account);
428
+ case "eherkenning_bewindvoerder": return SessionFileHelper.getEHerkenningBewindvoerderFileName(browser, account);
429
+ case "ad-session": return SessionFileHelper.getADFileName(browser, account);
430
+ default: throw new Error(`Unsupported auth type: ${authType}`);
431
+ }
432
+ },
433
+ /**
434
+ * Setup the new session
435
+ * If needed the AD Session if used (Needed outside the firewall)
436
+ *
437
+ * @param browser
438
+ * @param file
439
+ */
440
+ setupSession: async (browser, file) => {
441
+ const useADSession = process.env.WITH_AD_SESSION === "true";
442
+ const page = await browser.newPage({
443
+ ignoreHTTPSErrors: true,
444
+ storageState: useADSession && authType !== "ad-session" ? SessionFileHelper.getADFileName(browser, {
445
+ username: `${process.env.AD_USER}`,
446
+ password: `${process.env.AD_PASSWORD}`
447
+ }) : void 0
448
+ });
449
+ console.log(`New session will be created: ${file}`);
450
+ try {
451
+ await loginHandler.loginAndCreateSessionStorage(page, account, file);
452
+ } finally {
453
+ await page.close();
454
+ }
455
+ },
456
+ /**
457
+ * Refresh the current session by opening a page and storing that session
458
+ * The UI should have refreshed the session meanwhile
459
+ *
460
+ * This is being called from the nl-portal-base-library
461
+ *
462
+ * @param browser
463
+ * @param file
464
+ */
465
+ refreshSession: async (browser, file) => {
466
+ const page = await browser.newPage({
467
+ ignoreHTTPSErrors: true,
468
+ storageState: file
469
+ });
470
+ console.log(`Refresh of session started for : ${file}`);
471
+ await page.goto((0, nl_portal_playwright_libraries.getUrl)(nl_portal_playwright_libraries.Url.PortalBaseUrl));
472
+ await page.waitForLoadState("networkidle");
473
+ if (page.url().match(/authn/)) {
474
+ console.log(`New session will be created as the current one is no longer valid: ${file}`);
475
+ try {
476
+ await loginHandler.loginAndCreateSessionStorage(page, account, file);
477
+ } catch (_error) {
478
+ console.error(_error);
479
+ }
480
+ } else {
481
+ console.log(`Current session was still valid and will be refreshed now: ${file}`);
482
+ await page.context().storageState({ path: file });
483
+ }
484
+ await page.close();
485
+ }
486
+ };
487
+ }
488
+ //#endregion
489
+ //#region src/auth/api/apiTokenHelper.ts
490
+ /**
491
+ * The token is often being refreshed so the easiest is to open a browser using the current session
492
+ * The UI will automatically refresh the token and that is the token we will return
493
+ *
494
+ * That token can be used to perform some api requests for a short time
495
+ * Per specfile it is not problem but this should be done in every specfile to assure a valid token
496
+ *
497
+ * @param baseTest
498
+ * @param handler
499
+ */
500
+ function getApiTokenFromSession(baseTest, handler) {
501
+ return baseTest.extend({
502
+ urls: async ({}, use) => {
503
+ await use(nl_portal_playwright_libraries.urls);
504
+ },
505
+ token: async ({ browser }, use) => {
506
+ const storageState = await nl_portal_playwright_libraries.SessionManager.getOrCreateSession(browser, handler);
507
+ const context = await browser.newContext(storageState ? { storageState } : {});
508
+ const page = await context.newPage();
509
+ try {
510
+ await page.goto("/");
511
+ await page.waitForFunction(() => {
512
+ const key = Object.keys(sessionStorage).find((k) => k.startsWith("oidc"));
513
+ if (!key) return false;
514
+ const raw = sessionStorage.getItem(key);
515
+ if (!raw) return false;
516
+ try {
517
+ return !!JSON.parse(raw)?.access_token;
518
+ } catch {
519
+ return false;
520
+ }
521
+ });
522
+ const token = await page.evaluate(() => {
523
+ const key = Object.keys(sessionStorage).find((k) => k.startsWith("oidc"));
524
+ if (!key) return null;
525
+ const raw = sessionStorage.getItem(key);
526
+ if (!raw) return null;
527
+ try {
528
+ return JSON.parse(raw)?.access_token ?? null;
529
+ } catch {
530
+ return null;
531
+ }
532
+ });
533
+ if (!token) throw new Error("❌ Token not found in sessionStorage");
534
+ await use(token);
535
+ } finally {
536
+ await context.close();
537
+ }
538
+ }
539
+ });
540
+ }
541
+ //#endregion
542
+ //#region src/auth/api/sessionHandlerResolvers.ts
543
+ function getSessionHandler(authType, account) {
544
+ return createSessionHandler(authType, account, getLoginHandler(authType));
545
+ }
546
+ //#endregion
547
+ exports.ADLoginHandler = ADLoginHandler;
548
+ exports.ADLoginPage = ADLoginPage;
549
+ exports.DigidGemachtigdeLoginHandler = DigidGemachtigdeLoginHandler;
550
+ exports.DigidLoginHandler = DigidLoginHandler;
551
+ exports.DigidLoginPage = DigidLoginPage;
552
+ exports.EHerkenningBewindvoerderLoginHandler = EHerkenningBewindvoerderLoginHandler;
553
+ exports.EHerkenningLoginHandler = EHerkenningLoginHandler;
554
+ exports.EHerkenningLoginPage = EHerkenningLoginPage;
555
+ exports.LocalhostLoginHandler = LocalhostLoginHandler;
556
+ exports.LoginOverzichtPage = LoginOverzichtPage;
557
+ exports.MAX_SESSION_TIME_IN_MINUTES = MAX_SESSION_TIME_IN_MINUTES;
558
+ exports.SessionFileHelper = SessionFileHelper;
559
+ exports.createSessionHandler = createSessionHandler;
560
+ exports.getApiTokenFromSession = getApiTokenFromSession;
561
+ exports.getLoginHandler = getLoginHandler;
562
+ exports.getSessionHandler = getSessionHandler;