@forgerock/journey-client 0.0.0-beta-20251222204813
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/CHANGELOG.md +45 -0
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +101 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/package.json +62 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/lib/callbacks/attribute-input-callback.d.ts +44 -0
- package/dist/src/lib/callbacks/attribute-input-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/attribute-input-callback.js +71 -0
- package/dist/src/lib/callbacks/base-callback.d.ts +45 -0
- package/dist/src/lib/callbacks/base-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/base-callback.js +88 -0
- package/dist/src/lib/callbacks/choice-callback.d.ts +33 -0
- package/dist/src/lib/callbacks/choice-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/choice-callback.js +57 -0
- package/dist/src/lib/callbacks/confirmation-callback.d.ts +41 -0
- package/dist/src/lib/callbacks/confirmation-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/confirmation-callback.js +69 -0
- package/dist/src/lib/callbacks/device-profile-callback.d.ts +30 -0
- package/dist/src/lib/callbacks/device-profile-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/device-profile-callback.js +43 -0
- package/dist/src/lib/callbacks/factory.d.ts +8 -0
- package/dist/src/lib/callbacks/factory.d.ts.map +1 -0
- package/dist/src/lib/callbacks/factory.js +87 -0
- package/dist/src/lib/callbacks/hidden-value-callback.d.ts +13 -0
- package/dist/src/lib/callbacks/hidden-value-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/hidden-value-callback.js +19 -0
- package/dist/src/lib/callbacks/kba-create-callback.d.ts +34 -0
- package/dist/src/lib/callbacks/kba-create-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/kba-create-callback.js +59 -0
- package/dist/src/lib/callbacks/metadata-callback.d.ts +17 -0
- package/dist/src/lib/callbacks/metadata-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/metadata-callback.js +25 -0
- package/dist/src/lib/callbacks/name-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/name-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/name-callback.js +31 -0
- package/dist/src/lib/callbacks/password-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/password-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/password-callback.js +43 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.d.ts +52 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/ping-protect-evaluation-callback.js +64 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/ping-protect-initialize-callback.js +40 -0
- package/dist/src/lib/callbacks/polling-wait-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/polling-wait-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/polling-wait-callback.js +31 -0
- package/dist/src/lib/callbacks/recaptcha-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/recaptcha-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/recaptcha-callback.js +31 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.d.ts +41 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/recaptcha-enterprise-callback.js +65 -0
- package/dist/src/lib/callbacks/redirect-callback.d.ts +17 -0
- package/dist/src/lib/callbacks/redirect-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/redirect-callback.js +25 -0
- package/dist/src/lib/callbacks/select-idp-callback.d.ts +28 -0
- package/dist/src/lib/callbacks/select-idp-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/select-idp-callback.js +35 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.d.ts +13 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/suspended-text-output-callback.js +19 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.d.ts +29 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/terms-and-conditions-callback.js +45 -0
- package/dist/src/lib/callbacks/text-input-callback.d.ts +21 -0
- package/dist/src/lib/callbacks/text-input-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/text-input-callback.js +31 -0
- package/dist/src/lib/callbacks/text-output-callback.d.ts +22 -0
- package/dist/src/lib/callbacks/text-output-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/text-output-callback.js +32 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.d.ts +37 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/validated-create-password-callback.js +63 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.d.ts +37 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.d.ts.map +1 -0
- package/dist/src/lib/callbacks/validated-create-username-callback.js +64 -0
- package/dist/src/lib/client.store.d.ts +37 -0
- package/dist/src/lib/client.store.d.ts.map +1 -0
- package/dist/src/lib/client.store.js +147 -0
- package/dist/src/lib/client.store.utils.d.ts +81 -0
- package/dist/src/lib/client.store.utils.d.ts.map +1 -0
- package/dist/src/lib/client.store.utils.js +28 -0
- package/dist/src/lib/config.types.d.ts +8 -0
- package/dist/src/lib/config.types.d.ts.map +1 -0
- package/dist/src/lib/config.types.js +7 -0
- package/dist/src/lib/device/defaults.d.ts +13 -0
- package/dist/src/lib/device/defaults.d.ts.map +1 -0
- package/dist/src/lib/device/defaults.js +78 -0
- package/dist/src/lib/device/device-profile.d.ts +41 -0
- package/dist/src/lib/device/device-profile.d.ts.map +1 -0
- package/dist/src/lib/device/device-profile.js +216 -0
- package/dist/src/lib/device/device-profile.mock.data.d.ts +109 -0
- package/dist/src/lib/device/device-profile.mock.data.d.ts.map +1 -0
- package/dist/src/lib/device/device-profile.mock.data.js +117 -0
- package/dist/src/lib/device/interfaces.d.ts +43 -0
- package/dist/src/lib/device/interfaces.d.ts.map +1 -0
- package/dist/src/lib/device/interfaces.js +10 -0
- package/dist/src/lib/interfaces.d.ts +15 -0
- package/dist/src/lib/interfaces.d.ts.map +1 -0
- package/dist/src/lib/interfaces.js +7 -0
- package/dist/src/lib/journey.api.d.ts +15 -0
- package/dist/src/lib/journey.api.d.ts.map +1 -0
- package/dist/src/lib/journey.api.js +129 -0
- package/dist/src/lib/journey.slice.d.ts +12 -0
- package/dist/src/lib/journey.slice.d.ts.map +1 -0
- package/dist/src/lib/journey.slice.js +18 -0
- package/dist/src/lib/journey.utils.d.ts +7 -0
- package/dist/src/lib/journey.utils.d.ts.map +1 -0
- package/dist/src/lib/journey.utils.js +33 -0
- package/dist/src/lib/login-failure.utils.d.ts +16 -0
- package/dist/src/lib/login-failure.utils.d.ts.map +1 -0
- package/dist/src/lib/login-failure.utils.js +34 -0
- package/dist/src/lib/login-success.utils.d.ts +16 -0
- package/dist/src/lib/login-success.utils.d.ts.map +1 -0
- package/dist/src/lib/login-success.utils.js +25 -0
- package/dist/src/lib/policy/interfaces.d.ts +11 -0
- package/dist/src/lib/policy/interfaces.d.ts.map +1 -0
- package/dist/src/lib/policy/interfaces.js +6 -0
- package/dist/src/lib/policy/message-creator.d.ts +3 -0
- package/dist/src/lib/policy/message-creator.d.ts.map +1 -0
- package/dist/src/lib/policy/message-creator.js +58 -0
- package/dist/src/lib/policy/policy.d.ts +57 -0
- package/dist/src/lib/policy/policy.d.ts.map +1 -0
- package/dist/src/lib/policy/policy.js +108 -0
- package/dist/src/lib/qr-code/qr-code.d.ts +35 -0
- package/dist/src/lib/qr-code/qr-code.d.ts.map +1 -0
- package/dist/src/lib/qr-code/qr-code.js +73 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.d.ts +66 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.d.ts.map +1 -0
- package/dist/src/lib/qr-code/qr-code.mock.data.js +175 -0
- package/dist/src/lib/recovery-codes/recovery-codes.d.ts +40 -0
- package/dist/src/lib/recovery-codes/recovery-codes.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/recovery-codes.js +64 -0
- package/dist/src/lib/recovery-codes/script-parser.d.ts +8 -0
- package/dist/src/lib/recovery-codes/script-parser.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/script-parser.js +45 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.d.ts +27 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.d.ts.map +1 -0
- package/dist/src/lib/recovery-codes/script-text.mock.data.js +103 -0
- package/dist/src/lib/step.types.d.ts +14 -0
- package/dist/src/lib/step.types.d.ts.map +1 -0
- package/dist/src/lib/step.types.js +7 -0
- package/dist/src/lib/step.utils.d.ts +10 -0
- package/dist/src/lib/step.utils.d.ts.map +1 -0
- package/dist/src/lib/step.utils.js +62 -0
- package/dist/src/lib/webauthn/enums.d.ts +24 -0
- package/dist/src/lib/webauthn/enums.d.ts.map +1 -0
- package/dist/src/lib/webauthn/enums.js +35 -0
- package/dist/src/lib/webauthn/helpers.d.ts +18 -0
- package/dist/src/lib/webauthn/helpers.d.ts.map +1 -0
- package/dist/src/lib/webauthn/helpers.js +103 -0
- package/dist/src/lib/webauthn/helpers.mock.data.d.ts +6 -0
- package/dist/src/lib/webauthn/helpers.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/helpers.mock.data.js +14 -0
- package/dist/src/lib/webauthn/interfaces.d.ts +92 -0
- package/dist/src/lib/webauthn/interfaces.d.ts.map +1 -0
- package/dist/src/lib/webauthn/interfaces.js +34 -0
- package/dist/src/lib/webauthn/script-text.mock.data.d.ts +76 -0
- package/dist/src/lib/webauthn/script-text.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/script-text.mock.data.js +451 -0
- package/dist/src/lib/webauthn/webauthn.d.ts +124 -0
- package/dist/src/lib/webauthn/webauthn.d.ts.map +1 -0
- package/dist/src/lib/webauthn/webauthn.js +383 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.d.ts +331 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.d.ts.map +1 -0
- package/dist/src/lib/webauthn/webauthn.mock.data.js +446 -0
- package/dist/src/types.d.ts +31 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +34 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/eslint.config.mjs +19 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/attribute-input-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/fr-auth-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/text-input-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/validated-create-password-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/callbacks/validated-create-username-callback.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/fr-device/device-profile.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/src/lib/fr-policy/fr-policy.test.d.ts +1 -0
- package/out-tsc/vitest/packages/journey-client/tsconfig.spec.tsbuildinfo +1 -0
- package/out-tsc/vitest/packages/journey-client/vite.config.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/attribute-input-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/base-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/base-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-types.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-types.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/callback-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/choice-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/confirmation-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/device-profile-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/device-profile-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/factory.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/factory.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/fr-auth-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/fr-auth-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/hidden-value-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/kba-create-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/metadata-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/name-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/password-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-evaluation-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/ping-protect-initialize-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/polling-wait-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/recaptcha-enterprise-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/redirect-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/select-idp-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/suspended-text-output-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/terms-and-conditions-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-input-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/text-output-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-password-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback-operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback-operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.operators.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.operators.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/callbacks/validated-create-username-callback.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/client.store.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/client.store.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-policy/fr-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-policy/fr-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-qrcode/fr-qrcode.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-qrcode/fr-qrcode.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/recovery-codes.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/recovery-codes.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-recovery-codes/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/fr-webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/fr-webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/fr-webauthn/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-client.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-client.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-device/device-profile.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-device/device-profile.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-login-failure.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-login-failure.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-login-success.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-login-success.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-policy/fr-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-policy/fr-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-policy/journey-policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-policy/journey-policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-qrcode/journey-qrcode.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-qrcode/journey-qrcode.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/enums.d.ts +24 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/enums.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.d.ts +18 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.mock.data.d.ts +6 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/index.d.ts +123 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/index.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/interfaces.d.ts +93 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/interfaces.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.mock.data.d.ts +331 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/journey-webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.d.ts +4 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-text.mock.data.d.ts +76 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/script-text.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/webauthn-utils.d.ts +38 -0
- package/out-tsc/vitest/src/lib/journey-webauthn/webauthn-utils.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey.api.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey.api.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/journey.store.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/journey.store.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/login-failure.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/login-failure.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/login-success.utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/login-success.utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/object-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/object-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/policy/policy.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/policy/policy.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/qr-code/qr-code.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/qr-code/qr-code.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/index.d.ts +37 -0
- package/out-tsc/vitest/src/lib/recovery-codes/index.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/recovery-codes.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/recovery-codes/recovery-codes.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.d.ts +9 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-parser.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-text.mock.data.d.ts +27 -0
- package/out-tsc/vitest/src/lib/recovery-codes/script-text.mock.data.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/step-utils.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/step-utils.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/step.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/step.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/webauthn/helpers.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/webauthn/helpers.test.d.ts.map +1 -0
- package/out-tsc/vitest/src/lib/webauthn/webauthn.test.d.ts +2 -0
- package/out-tsc/vitest/src/lib/webauthn/webauthn.test.d.ts.map +1 -0
- package/out-tsc/vitest/tsconfig.spec.tsbuildinfo +1 -0
- package/out-tsc/vitest/vite.config.d.ts +3 -0
- package/out-tsc/vitest/vite.config.d.ts.map +1 -0
- package/package.json +62 -0
- package/src/index.ts +8 -0
- package/src/lib/callbacks/attribute-input-callback.test.ts +89 -0
- package/src/lib/callbacks/attribute-input-callback.ts +81 -0
- package/src/lib/callbacks/base-callback.test.ts +42 -0
- package/src/lib/callbacks/base-callback.ts +101 -0
- package/src/lib/callbacks/choice-callback.test.ts +77 -0
- package/src/lib/callbacks/choice-callback.ts +64 -0
- package/src/lib/callbacks/confirmation-callback.test.ts +94 -0
- package/src/lib/callbacks/confirmation-callback.ts +78 -0
- package/src/lib/callbacks/device-profile-callback.test.ts +68 -0
- package/src/lib/callbacks/device-profile-callback.ts +51 -0
- package/src/lib/callbacks/factory.test.ts +89 -0
- package/src/lib/callbacks/factory.ts +95 -0
- package/src/lib/callbacks/hidden-value-callback.test.ts +26 -0
- package/src/lib/callbacks/hidden-value-callback.ts +21 -0
- package/src/lib/callbacks/kba-create-callback.test.ts +62 -0
- package/src/lib/callbacks/kba-create-callback.ts +68 -0
- package/src/lib/callbacks/metadata-callback.test.ts +31 -0
- package/src/lib/callbacks/metadata-callback.ts +28 -0
- package/src/lib/callbacks/name-callback.test.ts +42 -0
- package/src/lib/callbacks/name-callback.ts +35 -0
- package/src/lib/callbacks/password-callback.test.ts +60 -0
- package/src/lib/callbacks/password-callback.ts +49 -0
- package/src/lib/callbacks/ping-protect-evaluation-callback.test.ts +69 -0
- package/src/lib/callbacks/ping-protect-evaluation-callback.ts +70 -0
- package/src/lib/callbacks/ping-protect-initialize-callback.test.ts +153 -0
- package/src/lib/callbacks/ping-protect-initialize-callback.ts +44 -0
- package/src/lib/callbacks/polling-wait-callback.test.ts +36 -0
- package/src/lib/callbacks/polling-wait-callback.ts +35 -0
- package/src/lib/callbacks/recaptcha-callback.test.ts +42 -0
- package/src/lib/callbacks/recaptcha-callback.ts +35 -0
- package/src/lib/callbacks/recaptcha-enterprise-callback.test.ts +86 -0
- package/src/lib/callbacks/recaptcha-enterprise-callback.ts +72 -0
- package/src/lib/callbacks/redirect-callback.test.ts +31 -0
- package/src/lib/callbacks/redirect-callback.ts +28 -0
- package/src/lib/callbacks/select-idp-callback.test.ts +51 -0
- package/src/lib/callbacks/select-idp-callback.ts +48 -0
- package/src/lib/callbacks/suspended-text-output-callback.test.ts +35 -0
- package/src/lib/callbacks/suspended-text-output-callback.ts +21 -0
- package/src/lib/callbacks/terms-and-conditions-callback.test.ts +55 -0
- package/src/lib/callbacks/terms-and-conditions-callback.ts +51 -0
- package/src/lib/callbacks/text-input-callback.test.ts +43 -0
- package/src/lib/callbacks/text-input-callback.ts +35 -0
- package/src/lib/callbacks/text-output-callback.test.ts +36 -0
- package/src/lib/callbacks/text-output-callback.ts +36 -0
- package/src/lib/callbacks/validated-create-password-callback.test.ts +84 -0
- package/src/lib/callbacks/validated-create-password-callback.ts +75 -0
- package/src/lib/callbacks/validated-create-username-callback.test.ts +84 -0
- package/src/lib/callbacks/validated-create-username-callback.ts +76 -0
- package/src/lib/client.store.test.ts +324 -0
- package/src/lib/client.store.ts +194 -0
- package/src/lib/client.store.utils.ts +46 -0
- package/src/lib/config.types.ts +17 -0
- package/src/lib/device/defaults.ts +79 -0
- package/src/lib/device/device-profile.mock.data.ts +120 -0
- package/src/lib/device/device-profile.test.ts +128 -0
- package/src/lib/device/device-profile.ts +287 -0
- package/src/lib/device/interfaces.ts +63 -0
- package/src/lib/device/sample-profile.json +45 -0
- package/src/lib/interfaces.ts +25 -0
- package/src/lib/journey.api.ts +198 -0
- package/src/lib/journey.slice.ts +33 -0
- package/src/lib/journey.utils.ts +44 -0
- package/src/lib/login-failure.utils.test.ts +31 -0
- package/src/lib/login-failure.utils.ts +62 -0
- package/src/lib/login-success.utils.test.ts +29 -0
- package/src/lib/login-success.utils.ts +43 -0
- package/src/lib/policy/interfaces.ts +16 -0
- package/src/lib/policy/message-creator.ts +66 -0
- package/src/lib/policy/policy.test.ts +202 -0
- package/src/lib/policy/policy.ts +134 -0
- package/src/lib/qr-code/qr-code.mock.data.ts +184 -0
- package/src/lib/qr-code/qr-code.test.ts +78 -0
- package/src/lib/qr-code/qr-code.ts +96 -0
- package/src/lib/recovery-codes/recovery-codes.test.ts +43 -0
- package/src/lib/recovery-codes/recovery-codes.ts +72 -0
- package/src/lib/recovery-codes/script-parser.test.ts +34 -0
- package/src/lib/recovery-codes/script-parser.ts +50 -0
- package/src/lib/recovery-codes/script-text.mock.data.ts +120 -0
- package/src/lib/step.test.ts +104 -0
- package/src/lib/step.types.ts +22 -0
- package/src/lib/step.utils.ts +99 -0
- package/src/lib/webauthn/enums.ts +36 -0
- package/src/lib/webauthn/helpers.mock.data.ts +24 -0
- package/src/lib/webauthn/helpers.test.ts +54 -0
- package/src/lib/webauthn/helpers.ts +124 -0
- package/src/lib/webauthn/interfaces.ts +112 -0
- package/src/lib/webauthn/script-text.mock.data.ts +463 -0
- package/src/lib/webauthn/webauthn.mock.data.ts +478 -0
- package/src/lib/webauthn/webauthn.test.ts +100 -0
- package/src/lib/webauthn/webauthn.ts +508 -0
- package/src/types.ts +50 -0
- package/tsconfig.json +28 -0
- package/tsconfig.lib.json +37 -0
- package/tsconfig.spec.json +42 -0
- package/vite.config.ts +0 -0
- package/vitest.setup.ts +1 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @forgerock/ping-javascript-sdk
|
|
3
|
+
*
|
|
4
|
+
* fr-policy.test.ts
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2020 - 2025 Ping Identity Corporation. All rights reserved.
|
|
7
|
+
* This software may be modified and distributed under the terms
|
|
8
|
+
* of the MIT license. See the LICENSE file for details.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { PolicyKey } from '@forgerock/sdk-types';
|
|
12
|
+
|
|
13
|
+
import { Policy, MessageCreator } from './policy.js';
|
|
14
|
+
|
|
15
|
+
describe('The IDM error handling', () => {
|
|
16
|
+
const property = 'userName';
|
|
17
|
+
|
|
18
|
+
it('returns a human readable error message', () => {
|
|
19
|
+
const test = {
|
|
20
|
+
expectedString: `${property} must be unique`,
|
|
21
|
+
policy: {
|
|
22
|
+
policyRequirement: 'UNIQUE',
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const message = Policy.parsePolicyRequirement(property, test.policy);
|
|
26
|
+
expect(message).toBe(test.expectedString);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('returns a human readable error message with param data', () => {
|
|
30
|
+
const test = {
|
|
31
|
+
expectedString: `${property} must be at least 6 characters`,
|
|
32
|
+
policy: {
|
|
33
|
+
params: {
|
|
34
|
+
minLength: 6,
|
|
35
|
+
},
|
|
36
|
+
policyRequirement: 'MIN_LENGTH',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const message = Policy.parsePolicyRequirement(property, test.policy);
|
|
40
|
+
expect(message).toBe(test.expectedString);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('returns a human readable generic message for unknown error', () => {
|
|
44
|
+
const test = {
|
|
45
|
+
expectedString: `${property}: Unknown policy requirement "SOME_UNKNOWN_POLICY"`,
|
|
46
|
+
policy: {
|
|
47
|
+
params: {
|
|
48
|
+
unknownParam: 6,
|
|
49
|
+
},
|
|
50
|
+
policyRequirement: 'SOME_UNKNOWN_POLICY',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const message = Policy.parsePolicyRequirement(property, test.policy);
|
|
54
|
+
expect(message).toBe(test.expectedString);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('error handling is extensible by customer', () => {
|
|
58
|
+
const test = {
|
|
59
|
+
customMessage: {
|
|
60
|
+
CUSTOM_POLICY: (property: string, params?: { [key: string]: unknown }): string =>
|
|
61
|
+
`this is a custom message for "${params?.policyRequirement}" policy of ${property}`,
|
|
62
|
+
},
|
|
63
|
+
expectedString: `this is a custom message for "CUSTOM_POLICY" policy of ${property}`,
|
|
64
|
+
policy: {
|
|
65
|
+
policyRequirement: 'CUSTOM_POLICY',
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
const message = Policy.parsePolicyRequirement(
|
|
69
|
+
property,
|
|
70
|
+
test.policy,
|
|
71
|
+
test.customMessage as MessageCreator,
|
|
72
|
+
);
|
|
73
|
+
expect(message).toBe(test.expectedString);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('error handling is overwritable by customer', () => {
|
|
77
|
+
const test = {
|
|
78
|
+
customMessage: {
|
|
79
|
+
[PolicyKey.Unique]: (property: string): string =>
|
|
80
|
+
`this is a custom message for "UNIQUE" policy of ${property}`,
|
|
81
|
+
},
|
|
82
|
+
expectedString: `this is a custom message for "UNIQUE" policy of ${property}`,
|
|
83
|
+
policy: {
|
|
84
|
+
policyRequirement: 'UNIQUE',
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const message = Policy.parsePolicyRequirement(property, test.policy, test.customMessage);
|
|
88
|
+
expect(message).toBe(test.expectedString);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('groups failed policies for one property', () => {
|
|
92
|
+
const policy = {
|
|
93
|
+
policyRequirements: [
|
|
94
|
+
{
|
|
95
|
+
policyRequirement: 'UNIQUE',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
params: {
|
|
99
|
+
minLength: 6,
|
|
100
|
+
},
|
|
101
|
+
policyRequirement: 'MIN_LENGTH',
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
property: 'userName',
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const messageArray = Policy.parseFailedPolicyRequirement(policy);
|
|
108
|
+
expect(messageArray).toEqual([
|
|
109
|
+
'userName must be unique',
|
|
110
|
+
'userName must be at least 6 characters',
|
|
111
|
+
]);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('returns an object array with a human readable error and the server error', () => {
|
|
115
|
+
const errorResponse = {
|
|
116
|
+
code: 403,
|
|
117
|
+
reason: 'Forbidden',
|
|
118
|
+
message: 'Policy validation failed',
|
|
119
|
+
detail: {
|
|
120
|
+
failedPolicyRequirements: [
|
|
121
|
+
{
|
|
122
|
+
policyRequirements: [
|
|
123
|
+
{
|
|
124
|
+
policyRequirement: 'UNIQUE',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
params: {
|
|
128
|
+
minLength: 6,
|
|
129
|
+
},
|
|
130
|
+
policyRequirement: 'MIN_LENGTH',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
policyRequirement: 'CUSTOM_POLICY',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
property: 'userName',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
policyRequirements: [
|
|
140
|
+
{
|
|
141
|
+
params: {
|
|
142
|
+
numCaps: 1,
|
|
143
|
+
},
|
|
144
|
+
policyRequirement: 'AT_LEAST_X_CAPITAL_LETTERS',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
params: {
|
|
148
|
+
minLength: 6,
|
|
149
|
+
},
|
|
150
|
+
policyRequirement: 'MIN_LENGTH',
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
property: 'password',
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
result: false,
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
const customMessage: MessageCreator = {
|
|
160
|
+
[PolicyKey.Unique]: (property: string): string =>
|
|
161
|
+
`this is a custom message for "UNIQUE" policy of ${property}`,
|
|
162
|
+
CUSTOM_POLICY: (property: string, params?: { [key: string]: unknown }): string =>
|
|
163
|
+
`this is a custom message for "${params?.policyRequirement}" policy of ${property}`,
|
|
164
|
+
};
|
|
165
|
+
const expected = [
|
|
166
|
+
{
|
|
167
|
+
messages: [
|
|
168
|
+
'this is a custom message for "UNIQUE" policy of userName',
|
|
169
|
+
'userName must be at least 6 characters',
|
|
170
|
+
'this is a custom message for "CUSTOM_POLICY" policy of userName',
|
|
171
|
+
],
|
|
172
|
+
detail: {
|
|
173
|
+
policyRequirements: [
|
|
174
|
+
{ policyRequirement: 'UNIQUE' },
|
|
175
|
+
{ params: { minLength: 6 }, policyRequirement: 'MIN_LENGTH' },
|
|
176
|
+
{ policyRequirement: 'CUSTOM_POLICY' },
|
|
177
|
+
],
|
|
178
|
+
property: 'userName',
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
messages: [
|
|
183
|
+
'password must contain at least 1 capital letter',
|
|
184
|
+
'password must be at least 6 characters',
|
|
185
|
+
],
|
|
186
|
+
detail: {
|
|
187
|
+
policyRequirements: [
|
|
188
|
+
{
|
|
189
|
+
params: { numCaps: 1 },
|
|
190
|
+
policyRequirement: 'AT_LEAST_X_CAPITAL_LETTERS',
|
|
191
|
+
},
|
|
192
|
+
{ params: { minLength: 6 }, policyRequirement: 'MIN_LENGTH' },
|
|
193
|
+
],
|
|
194
|
+
property: 'password',
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
const errorObjArr = Policy.parseErrors(errorResponse, customMessage);
|
|
200
|
+
expect(errorObjArr).toEqual(expected);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2020 - 2025 Ping Identity Corporation. All rights reserved.
|
|
3
|
+
* This software may be modified and distributed under the terms
|
|
4
|
+
* of the MIT license. See the LICENSE file for details.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { PolicyKey } from '@forgerock/sdk-types';
|
|
8
|
+
|
|
9
|
+
import type { FailedPolicyRequirement, PolicyRequirement, Step } from '@forgerock/sdk-types';
|
|
10
|
+
|
|
11
|
+
import { defaultMessageCreator } from './message-creator.js';
|
|
12
|
+
|
|
13
|
+
import type { MessageCreator, ProcessedPropertyError } from './interfaces.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Utility for processing policy failures into human readable messages.
|
|
17
|
+
*
|
|
18
|
+
* Example:
|
|
19
|
+
*
|
|
20
|
+
* ```js
|
|
21
|
+
* // Create message overrides and extensions as needed
|
|
22
|
+
* const messageCreator = {
|
|
23
|
+
* [PolicyKey.unique]: (property: string) => (
|
|
24
|
+
* `this is a custom message for "UNIQUE" policy of ${property}`
|
|
25
|
+
* ),
|
|
26
|
+
* CUSTOM_POLICY: (property: string, params: any) => (
|
|
27
|
+
* `this is a custom message for "${params.policyRequirement}" policy of ${property}`
|
|
28
|
+
* ),
|
|
29
|
+
* };
|
|
30
|
+
*
|
|
31
|
+
* const thisStep = await journeyClient.next(previousStep);
|
|
32
|
+
*
|
|
33
|
+
* if (thisStep.type === StepType.LoginFailure) {
|
|
34
|
+
* const messagesStepMethod = thisStep.getProcessedMessage(messageCreator);
|
|
35
|
+
* const messagesClassMethod = Policy.parseErrors(thisStep, messageCreator)
|
|
36
|
+
* }
|
|
37
|
+
*/
|
|
38
|
+
export abstract class Policy {
|
|
39
|
+
/**
|
|
40
|
+
* Parses policy errors and generates human readable error messages.
|
|
41
|
+
*
|
|
42
|
+
* @param {Step} err The step containing the error.
|
|
43
|
+
* @param {MessageCreator} messageCreator
|
|
44
|
+
* Extensible and overridable custom error messages for policy failures.
|
|
45
|
+
* @return {ProcessedPropertyError[]} Array of objects containing all processed policy errors.
|
|
46
|
+
*/
|
|
47
|
+
public static parseErrors(
|
|
48
|
+
err: Partial<Step>,
|
|
49
|
+
messageCreator?: MessageCreator,
|
|
50
|
+
): ProcessedPropertyError[] {
|
|
51
|
+
const errors: ProcessedPropertyError[] = [];
|
|
52
|
+
if (err.detail && err.detail.failedPolicyRequirements) {
|
|
53
|
+
err.detail.failedPolicyRequirements.map((x: FailedPolicyRequirement) => {
|
|
54
|
+
errors.push.apply(errors, [
|
|
55
|
+
{
|
|
56
|
+
detail: x,
|
|
57
|
+
messages: this.parseFailedPolicyRequirement(x, messageCreator),
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return errors;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Parses a failed policy and returns a string array of error messages.
|
|
67
|
+
*
|
|
68
|
+
* @param {FailedPolicyRequirement} failedPolicy The detail data of the failed policy.
|
|
69
|
+
* @param {MessageCreator} customMessage
|
|
70
|
+
* Extensible and overridable custom error messages for policy failures.
|
|
71
|
+
* @return {string[]} Array of strings with all processed policy errors.
|
|
72
|
+
*/
|
|
73
|
+
public static parseFailedPolicyRequirement(
|
|
74
|
+
failedPolicy: FailedPolicyRequirement,
|
|
75
|
+
messageCreator?: MessageCreator,
|
|
76
|
+
): string[] {
|
|
77
|
+
const errors: string[] = [];
|
|
78
|
+
failedPolicy.policyRequirements.map((policyRequirement: PolicyRequirement) => {
|
|
79
|
+
errors.push(
|
|
80
|
+
this.parsePolicyRequirement(failedPolicy.property, policyRequirement, messageCreator),
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
return errors;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Parses a policy error into a human readable error message.
|
|
88
|
+
*
|
|
89
|
+
* @param {string} property The property with the policy failure.
|
|
90
|
+
* @param {PolicyRequirement} policy The policy failure data.
|
|
91
|
+
* @param {MessageCreator} customMessage
|
|
92
|
+
* Extensible and overridable custom error messages for policy failures.
|
|
93
|
+
* @return {string} Human readable error message.
|
|
94
|
+
*/
|
|
95
|
+
public static parsePolicyRequirement(
|
|
96
|
+
property: string,
|
|
97
|
+
policy: PolicyRequirement,
|
|
98
|
+
messageCreator: MessageCreator = {},
|
|
99
|
+
): string {
|
|
100
|
+
// AM is returning policy requirement failures as JSON strings
|
|
101
|
+
let policyObject: { policyRequirement: string; params?: Record<string, unknown> };
|
|
102
|
+
if (typeof policy === 'string') {
|
|
103
|
+
try {
|
|
104
|
+
const parsed = JSON.parse(policy);
|
|
105
|
+
policyObject =
|
|
106
|
+
typeof parsed === 'string'
|
|
107
|
+
? { policyRequirement: parsed }
|
|
108
|
+
: (parsed as { policyRequirement: string; params?: Record<string, unknown> });
|
|
109
|
+
} catch {
|
|
110
|
+
policyObject = { policyRequirement: policy };
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
policyObject = { ...policy };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const policyRequirement = policyObject.policyRequirement;
|
|
117
|
+
|
|
118
|
+
// Determine which message creator function to use
|
|
119
|
+
const effectiveMessageCreator =
|
|
120
|
+
messageCreator[policyRequirement] ||
|
|
121
|
+
defaultMessageCreator[policyRequirement] ||
|
|
122
|
+
defaultMessageCreator[PolicyKey.UnknownPolicy];
|
|
123
|
+
|
|
124
|
+
// Flatten the parameters and create the message
|
|
125
|
+
const params = policyObject.params
|
|
126
|
+
? { ...policyObject.params, policyRequirement }
|
|
127
|
+
: { policyRequirement };
|
|
128
|
+
const message = effectiveMessageCreator(property, params);
|
|
129
|
+
|
|
130
|
+
return message;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export type { MessageCreator, ProcessedPropertyError };
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @forgerock/ping-javascript-sdk
|
|
3
|
+
*
|
|
4
|
+
* fr-qr-code.mock.data.ts
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2024 - 2025 Ping Identity Corporation. All rights reserved.
|
|
7
|
+
* This software may be modified and distributed under the terms
|
|
8
|
+
* of the MIT license. See the LICENSE file for details.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { callbackType } from '@forgerock/sdk-types';
|
|
12
|
+
|
|
13
|
+
export const otpQRCodeStep = {
|
|
14
|
+
authId: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9',
|
|
15
|
+
callbacks: [
|
|
16
|
+
{
|
|
17
|
+
type: callbackType.TextOutputCallback,
|
|
18
|
+
output: [
|
|
19
|
+
{
|
|
20
|
+
name: 'message',
|
|
21
|
+
value:
|
|
22
|
+
'Scan the QR code image below with the ForgeRock Authenticator app to register your ' +
|
|
23
|
+
'device with your login.',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'messageType',
|
|
27
|
+
value: '0',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
type: callbackType.TextOutputCallback,
|
|
33
|
+
output: [
|
|
34
|
+
{
|
|
35
|
+
name: 'message',
|
|
36
|
+
value:
|
|
37
|
+
`window.QRCodeReader.createCode({\n id: 'callback_0',\n text: 'otpauth\\x3A\\x` +
|
|
38
|
+
`2F\\x2Ftotp\\x2FForgeRock\\x3Ajlowery\\x3Fperiod\\x3D30\\x26b\\x3D032b75\\x26` +
|
|
39
|
+
`digits\\x3D6\\x26secret\\QITSTC234FRIU8DD987DW3VPICFY\\x3D\\x3D\\x3D\\x3D\\x3` +
|
|
40
|
+
`D\\x',\n 3D\\x26issuer\\x3DForgeRock version: '20',\n code: 'L'\n});`,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'messageType',
|
|
44
|
+
value: '4',
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
type: callbackType.HiddenValueCallback,
|
|
50
|
+
output: [
|
|
51
|
+
{
|
|
52
|
+
name: 'value',
|
|
53
|
+
value:
|
|
54
|
+
'otpauth://totp/ForgeRock:jlowery?secret=QITSTC234FRIU8DD987DW3VPICFY======&issue' +
|
|
55
|
+
'r=ForgeRock&period=30&digits=6&b=032b75',
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'id',
|
|
59
|
+
value: 'mfaDeviceRegistration',
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
input: [
|
|
63
|
+
{
|
|
64
|
+
name: 'IDToken3',
|
|
65
|
+
value: 'mfaDeviceRegistration',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
type: callbackType.ConfirmationCallback,
|
|
71
|
+
output: [
|
|
72
|
+
{
|
|
73
|
+
name: 'prompt',
|
|
74
|
+
value: '',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'messageType',
|
|
78
|
+
value: 0,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'options',
|
|
82
|
+
value: ['Next'],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'optionType',
|
|
86
|
+
value: -1,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'defaultOption',
|
|
90
|
+
value: 0,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
input: [
|
|
94
|
+
{
|
|
95
|
+
name: 'IDToken4',
|
|
96
|
+
value: 0,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const pushQRCodeStep = {
|
|
104
|
+
authId: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9',
|
|
105
|
+
callbacks: [
|
|
106
|
+
{
|
|
107
|
+
type: callbackType.TextOutputCallback,
|
|
108
|
+
output: [
|
|
109
|
+
{
|
|
110
|
+
name: 'message',
|
|
111
|
+
value:
|
|
112
|
+
'Scan the QR code image below with the ForgeRock Authenticator app to register ' +
|
|
113
|
+
'your device with your login.',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'messageType',
|
|
117
|
+
value: '0',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: callbackType.TextOutputCallback,
|
|
123
|
+
output: [
|
|
124
|
+
{
|
|
125
|
+
name: 'message',
|
|
126
|
+
value:
|
|
127
|
+
`window.QRCodeReader.createCode({\n id: 'callback_0',\n text: 'pushauth\\x` +
|
|
128
|
+
`3A\\x2F\\x2Fpush\\x2Fforgerock\\x3AJustin\\x2520Lowery\\x3Fa\\x3DaHR0cHM6Ly9vc` +
|
|
129
|
+
`GVuYW0tZm9yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi9hbHBoYS9wdXN` +
|
|
130
|
+
`oL3Nucy9tZXNzYWdlP19hY3Rpb249YXV0aGVudGljYXRl\\x26r\\x3DaHR0cHM6Ly9vcGVuYW0tZm` +
|
|
131
|
+
`9yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi9hbHBoYS9wdXNoL3Nucy9t` +
|
|
132
|
+
`ZXNzYWdlP19hY3Rpb249cmVnaXN0ZXI\\x26b\\x3D032b75\\x26s\\x3DFoxEr5uAzrys1yBmuyg` +
|
|
133
|
+
`PbxrVjysElmzsmqifi6eO_AI\\x26c\\x3DXD\\x2DMxsK2sRGa7sUw7kinSKoUDf_eNYMZUV2f0z5` +
|
|
134
|
+
`kjgw\\x26l\\x3DYW1sYmNvb2tpZT0wMQ\\x26m\\x3DREGISTER\\x3A53b85112\\x2D8ba9\\x2` +
|
|
135
|
+
`D4b7e\\x2D9107\\x2Decbca2d65f7b1695151603616\\x26issuer\\x3DRm9yZ2VSb2Nr',\n ` +
|
|
136
|
+
` version: '20',\n code: 'L'\n});`,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'messageType',
|
|
140
|
+
value: '4',
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
type: callbackType.HiddenValueCallback,
|
|
146
|
+
output: [
|
|
147
|
+
{
|
|
148
|
+
name: 'value',
|
|
149
|
+
value:
|
|
150
|
+
'pushauth://push/forgerock:Justin%20Lowery?l=YW1sYmNvb2tpZT0wMQ&issuer=Rm9yZ2VSb' +
|
|
151
|
+
'2Nr&m=REGISTER:53b85112-8ba9-4b7e-9107-ecbca2d65f7b1695151603616&s=FoxEr5uAzrys' +
|
|
152
|
+
'1yBmuygPbxrVjysElmzsmqifi6eO_AI&c=XD-MxsK2sRGa7sUw7kinSKoUDf_eNYMZUV2f0z5kjgw&r' +
|
|
153
|
+
'=aHR0cHM6Ly9vcGVuYW0tZm9yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi' +
|
|
154
|
+
'9hbHBoYS9wdXNoL3Nucy9tZXNzYWdlP19hY3Rpb249cmVnaXN0ZXI&a=aHR0cHM6Ly9vcGVuYW0tZm9' +
|
|
155
|
+
'yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi9hbHBoYS9wdXNoL3Nucy9tZ' +
|
|
156
|
+
'XNzYWdlP19hY3Rpb249YXV0aGVudGljYXRl&b=032b75',
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: 'id',
|
|
160
|
+
value: 'mfaDeviceRegistration',
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
input: [
|
|
164
|
+
{
|
|
165
|
+
name: 'IDToken3',
|
|
166
|
+
value: 'mfaDeviceRegistration',
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: callbackType.PollingWaitCallback,
|
|
172
|
+
output: [
|
|
173
|
+
{
|
|
174
|
+
name: 'waitTime',
|
|
175
|
+
value: '5000',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: 'message',
|
|
179
|
+
value: 'Waiting for response...',
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @forgerock/ping-javascript-sdk
|
|
3
|
+
*
|
|
4
|
+
* index.test.ts
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2024 - 2025 Ping Identity Corporation. All rights reserved.
|
|
7
|
+
* This software may be modified and distributed under the terms
|
|
8
|
+
* of the MIT license. See the LICENSE file for details.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { QRCode } from './qr-code.js';
|
|
12
|
+
import { otpQRCodeStep, pushQRCodeStep } from './qr-code.mock.data.js';
|
|
13
|
+
import { createJourneyStep } from '../step.utils.js';
|
|
14
|
+
// import WebAuthn step as it's similar in structure for testing non-QR Code steps
|
|
15
|
+
import { webAuthnRegJSCallback70 } from '../webauthn/webauthn.mock.data.js';
|
|
16
|
+
|
|
17
|
+
describe('Class for managing QR Codes', () => {
|
|
18
|
+
it('should return true for step containing OTP QR Code callbacks', () => {
|
|
19
|
+
const expected = true;
|
|
20
|
+
const step = createJourneyStep(otpQRCodeStep);
|
|
21
|
+
const result = QRCode.isQRCodeStep(step);
|
|
22
|
+
|
|
23
|
+
expect(result).toBe(expected);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should return true for step containing Push QR Code callbacks', () => {
|
|
27
|
+
const expected = true;
|
|
28
|
+
const step = createJourneyStep(pushQRCodeStep);
|
|
29
|
+
const result = QRCode.isQRCodeStep(step);
|
|
30
|
+
|
|
31
|
+
expect(result).toBe(expected);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should return false for step containing WebAuthn step', () => {
|
|
35
|
+
const expected = false;
|
|
36
|
+
const step = createJourneyStep(webAuthnRegJSCallback70);
|
|
37
|
+
const result = QRCode.isQRCodeStep(step);
|
|
38
|
+
|
|
39
|
+
expect(result).toBe(expected);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should return an object with OTP QR Code data', () => {
|
|
43
|
+
const expected = {
|
|
44
|
+
message:
|
|
45
|
+
'Scan the QR code image below with the ForgeRock Authenticator app to register your ' +
|
|
46
|
+
'device with your login.',
|
|
47
|
+
use: 'otp',
|
|
48
|
+
uri:
|
|
49
|
+
'otpauth://totp/ForgeRock:jlowery?secret=QITSTC234FRIU8DD987DW3VPICFY======&issue' +
|
|
50
|
+
'r=ForgeRock&period=30&digits=6&b=032b75',
|
|
51
|
+
};
|
|
52
|
+
const step = createJourneyStep(otpQRCodeStep);
|
|
53
|
+
const result = QRCode.getQRCodeData(step);
|
|
54
|
+
|
|
55
|
+
expect(result).toStrictEqual(expected);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('should return an object with Push QR Code data', () => {
|
|
59
|
+
const expected = {
|
|
60
|
+
message:
|
|
61
|
+
'Scan the QR code image below with the ForgeRock Authenticator app to register ' +
|
|
62
|
+
'your device with your login.',
|
|
63
|
+
use: 'push',
|
|
64
|
+
uri:
|
|
65
|
+
'pushauth://push/forgerock:Justin%20Lowery?l=YW1sYmNvb2tpZT0wMQ&issuer=Rm9yZ2VSb' +
|
|
66
|
+
'2Nr&m=REGISTER:53b85112-8ba9-4b7e-9107-ecbca2d65f7b1695151603616&s=FoxEr5uAzrys' +
|
|
67
|
+
'1yBmuygPbxrVjysElmzsmqifi6eO_AI&c=XD-MxsK2sRGa7sUw7kinSKoUDf_eNYMZUV2f0z5kjgw&r' +
|
|
68
|
+
'=aHR0cHM6Ly9vcGVuYW0tZm9yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi' +
|
|
69
|
+
'9hbHBoYS9wdXNoL3Nucy9tZXNzYWdlP19hY3Rpb249cmVnaXN0ZXI&a=aHR0cHM6Ly9vcGVuYW0tZm9' +
|
|
70
|
+
'yZ2Vycm9jay1zZGtzLmZvcmdlYmxvY2tzLmNvbTo0NDMvYW0vanNvbi9hbHBoYS9wdXNoL3Nucy9tZ' +
|
|
71
|
+
'XNzYWdlP19hY3Rpb249YXV0aGVudGljYXRl&b=032b75',
|
|
72
|
+
};
|
|
73
|
+
const step = createJourneyStep(pushQRCodeStep);
|
|
74
|
+
const result = QRCode.getQRCodeData(step);
|
|
75
|
+
|
|
76
|
+
expect(result).toStrictEqual(expected);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @forgerock/ping-javascript-sdk
|
|
3
|
+
*
|
|
4
|
+
* index.ts
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) 2024 - 2025 Ping Identity Corporation. All rights reserved.
|
|
7
|
+
* This software may be modified and distributed under the terms
|
|
8
|
+
* of the MIT license. See the LICENSE file for details.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { callbackType } from '@forgerock/sdk-types';
|
|
12
|
+
|
|
13
|
+
import { TextOutputCallback } from '../callbacks/text-output-callback.js';
|
|
14
|
+
import { HiddenValueCallback } from '../callbacks/hidden-value-callback.js';
|
|
15
|
+
|
|
16
|
+
import type { JourneyStep } from '../step.utils.js';
|
|
17
|
+
|
|
18
|
+
export type QRCodeData = {
|
|
19
|
+
message: string;
|
|
20
|
+
use: string;
|
|
21
|
+
uri: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @class QRCode - A utility class for handling QR Code steps
|
|
26
|
+
*
|
|
27
|
+
* Example:
|
|
28
|
+
*
|
|
29
|
+
* ```js
|
|
30
|
+
* const isQRCodeStep = QRCode.isQRCodeStep(step);
|
|
31
|
+
* let qrCodeData;
|
|
32
|
+
* if (isQRCodeStep) {
|
|
33
|
+
* qrCodeData = QRCode.getQRCodeData(step);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export abstract class QRCode {
|
|
38
|
+
/**
|
|
39
|
+
* @method isQRCodeStep - determines if step contains QR Code callbacks
|
|
40
|
+
* @param {JourneyStep} step - step object from AM response
|
|
41
|
+
* @returns {boolean}
|
|
42
|
+
*/
|
|
43
|
+
public static isQRCodeStep(step: JourneyStep): boolean {
|
|
44
|
+
const hiddenValueCb = step.getCallbacksOfType(callbackType.HiddenValueCallback);
|
|
45
|
+
|
|
46
|
+
// QR Codes step should have at least one HiddenValueCallback
|
|
47
|
+
if (hiddenValueCb.length === 0) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return !!this.getQRCodeURICb(hiddenValueCb);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @method getQRCodeData - gets the necessary information from the QR Code callbacks
|
|
55
|
+
* @param {JourneyStep} step - step object from AM response
|
|
56
|
+
* @returns {QRCodeData}
|
|
57
|
+
*/
|
|
58
|
+
public static getQRCodeData(step: JourneyStep): QRCodeData {
|
|
59
|
+
const hiddenValueCb = step.getCallbacksOfType(callbackType.HiddenValueCallback);
|
|
60
|
+
|
|
61
|
+
// QR Codes step should have at least one HiddenValueCallback
|
|
62
|
+
if (hiddenValueCb.length === 0) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
'QR Code step must contain a HiddenValueCallback. Use `QRCode.isQRCodeStep` to guard.',
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
const qrCodeURICb = this.getQRCodeURICb(hiddenValueCb) as HiddenValueCallback;
|
|
68
|
+
const outputValue = qrCodeURICb ? qrCodeURICb.getOutputValue('value') : '';
|
|
69
|
+
const qrCodeUse =
|
|
70
|
+
typeof outputValue === 'string' && outputValue.includes('otpauth://') ? 'otp' : 'push';
|
|
71
|
+
|
|
72
|
+
const messageCbs = step.getCallbacksOfType(callbackType.TextOutputCallback);
|
|
73
|
+
const displayMessageCb = messageCbs.find((cb) => {
|
|
74
|
+
const textOutputCallback = cb as TextOutputCallback;
|
|
75
|
+
return textOutputCallback.getMessageType() !== '4';
|
|
76
|
+
}) as TextOutputCallback | null;
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
message: displayMessageCb ? displayMessageCb.getMessage() : '',
|
|
80
|
+
use: qrCodeUse,
|
|
81
|
+
uri: typeof outputValue === 'string' ? outputValue : '',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private static getQRCodeURICb(hiddenValueCbs: HiddenValueCallback[]) {
|
|
86
|
+
// Look for a HiddenValueCallback with an OTP URI
|
|
87
|
+
return hiddenValueCbs.find((cb) => {
|
|
88
|
+
const outputValue = cb.getOutputValue('value');
|
|
89
|
+
|
|
90
|
+
if (typeof outputValue === 'string') {
|
|
91
|
+
return outputValue?.includes('otpauth://') || outputValue?.includes('pushauth://');
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|