gitextract_n6eqdkjy/ ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── BUG_REPORT.yml │ │ ├── FEATURE_REQUEST.yml │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ └── workflows/ │ ├── build-frontend.yml │ ├── cli-publish.yml │ ├── codeql-analysis.yml │ ├── docker-publish.yml │ ├── e2e.yml │ ├── go.yml │ ├── release-frontend-sdk.yml │ ├── release-hanko-elements.yml │ ├── schema-generate-config.yml │ ├── schema-generate-import.yml │ ├── schema-markdown-config.yml │ └── schema-markdown-import.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── backend/ │ ├── .goreleaser.yaml │ ├── Dockerfile │ ├── Dockerfile.debug │ ├── README.md │ ├── audit_log/ │ │ └── logger.go │ ├── build_info/ │ │ └── build_info.go │ ├── cmd/ │ │ ├── cleanup/ │ │ │ └── cleanup.go │ │ ├── isready/ │ │ │ └── isready.go │ │ ├── jwk/ │ │ │ ├── create.go │ │ │ └── root.go │ │ ├── jwt/ │ │ │ ├── create.go │ │ │ └── root.go │ │ ├── migrate/ │ │ │ ├── down.go │ │ │ ├── root.go │ │ │ └── up.go │ │ ├── root.go │ │ ├── schema/ │ │ │ ├── generate.go │ │ │ ├── generate_config.go │ │ │ ├── generate_import.go │ │ │ ├── markdown.go │ │ │ ├── markdown_config.go │ │ │ ├── markdown_import.go │ │ │ └── root.go │ │ ├── serve/ │ │ │ ├── admin.go │ │ │ ├── all.go │ │ │ ├── public.go │ │ │ └── root.go │ │ ├── siwa/ │ │ │ └── siwa.go │ │ ├── user/ │ │ │ ├── export.go │ │ │ ├── format.go │ │ │ ├── format_test.go │ │ │ ├── generate.go │ │ │ ├── import.go │ │ │ ├── import_test.go │ │ │ ├── importer.go │ │ │ └── root.go │ │ └── version/ │ │ └── version.go │ ├── config/ │ │ ├── config.go │ │ ├── config.yaml │ │ ├── config_account.go │ │ ├── config_audit_log.go │ │ ├── config_database.go │ │ ├── config_default.go │ │ ├── config_email.go │ │ ├── config_email_delivery.go │ │ ├── config_emails.go │ │ ├── config_flow_locker.go │ │ ├── config_logger.go │ │ ├── config_mfa.go │ │ ├── config_passcode.go │ │ ├── config_passkey.go │ │ ├── config_password.go │ │ ├── config_privacy.go │ │ ├── config_rate_limiter.go │ │ ├── config_secrets.go │ │ ├── config_security_notifications.go │ │ ├── config_server.go │ │ ├── config_service.go │ │ ├── config_session.go │ │ ├── config_shared.go │ │ ├── config_test.go │ │ ├── config_third_party.go │ │ ├── config_username.go │ │ ├── config_webauthn.go │ │ ├── config_webhook.go │ │ ├── config_webhook_test.go │ │ ├── minimal-config.yaml │ │ ├── passcode-smtp-config.yaml │ │ ├── root-passcode-smtp-config.yaml │ │ └── security-notifications-disabled-config.yaml │ ├── crypto/ │ │ ├── aes_gcm/ │ │ │ ├── aes_gcm.go │ │ │ └── aes_gcm_test.go │ │ ├── jwk/ │ │ │ ├── aws_kms/ │ │ │ │ ├── adapter.go │ │ │ │ └── manager.go │ │ │ ├── local_db/ │ │ │ │ ├── generator.go │ │ │ │ ├── generator_rsa.go │ │ │ │ ├── generator_test.go │ │ │ │ ├── manager.go │ │ │ │ └── manager_test.go │ │ │ ├── manager.go │ │ │ └── types.go │ │ ├── passcode.go │ │ ├── passcode_test.go │ │ └── string.go │ ├── dto/ │ │ ├── admin/ │ │ │ ├── email.go │ │ │ ├── identity.go │ │ │ ├── metadata.go │ │ │ ├── otp.go │ │ │ ├── password.go │ │ │ ├── session.go │ │ │ ├── user.go │ │ │ ├── username.go │ │ │ ├── webauthn.go │ │ │ └── webhook.go │ │ ├── config.go │ │ ├── email.go │ │ ├── error_handler.go │ │ ├── intern/ │ │ │ ├── WebauthnCredential.go │ │ │ ├── WebauthnSessionData.go │ │ │ └── WebauthnUser.go │ │ ├── metadata.go │ │ ├── passcode.go │ │ ├── profile.go │ │ ├── session.go │ │ ├── session_test.go │ │ ├── thirdparty.go │ │ ├── user.go │ │ ├── username.go │ │ ├── validator.go │ │ ├── webauthn.go │ │ └── webhook/ │ │ └── email.go │ ├── ee/ │ │ └── saml/ │ │ ├── config/ │ │ │ ├── saml.go │ │ │ └── saml_test.go │ │ ├── dto/ │ │ │ └── saml.go │ │ ├── handler.go │ │ ├── provider/ │ │ │ ├── auth0.go │ │ │ ├── provider.go │ │ │ └── saml.go │ │ ├── router.go │ │ ├── service.go │ │ ├── state.go │ │ ├── state_test.go │ │ └── utils/ │ │ ├── response.go │ │ └── url.go │ ├── flow_api/ │ │ ├── flow/ │ │ │ ├── capabilities/ │ │ │ │ └── action_send_capabilities.go │ │ │ ├── credential_onboarding/ │ │ │ │ ├── action_continue_to_passkey.go │ │ │ │ ├── action_continue_to_password.go │ │ │ │ ├── action_register_password.go │ │ │ │ ├── action_skip_method_chooser.go │ │ │ │ ├── action_skip_passkey.go │ │ │ │ ├── action_skip_password.go │ │ │ │ ├── action_webauthn_generate_creation_options.go │ │ │ │ └── action_webauthn_verify_attestation_response.go │ │ │ ├── credential_usage/ │ │ │ │ ├── action_continue_to_passcode_confirmation.go │ │ │ │ ├── action_continue_to_passcode_confirmation_recovery.go │ │ │ │ ├── action_continue_to_password_login.go │ │ │ │ ├── action_continue_with_login_identifier.go │ │ │ │ ├── action_password_login.go │ │ │ │ ├── action_password_recovery.go │ │ │ │ ├── action_remember_me.go │ │ │ │ ├── action_resend_passcode.go │ │ │ │ ├── action_verify_passcode.go │ │ │ │ ├── action_webauthn_generate_request_options.go │ │ │ │ ├── action_webauthn_verify_assertion_response.go │ │ │ │ └── hook_send_passcode.go │ │ │ ├── device_trust/ │ │ │ │ ├── action_trust_device.go │ │ │ │ ├── hook_issue_trust_device_cookie.go │ │ │ │ └── hook_schedule_trust_device_state.go │ │ │ ├── flows.go │ │ │ ├── login/ │ │ │ │ ├── hook_create_email.go │ │ │ │ ├── hook_schedule_onboarding_states.go │ │ │ │ ├── hook_trigger_login_webhook.go │ │ │ │ └── hook_webauthn_generate_request_options_cond.go │ │ │ ├── mfa_creation/ │ │ │ │ ├── action_continue_to_otp_secret_creation.go │ │ │ │ ├── action_continue_to_security_key_creation.go │ │ │ │ ├── action_otp_code_verify.go │ │ │ │ ├── action_webauthn_generate_creation_options_for_security_keys.go │ │ │ │ ├── hook_otp_secret_generate.go │ │ │ │ └── skip_mfa.go │ │ │ ├── mfa_usage/ │ │ │ │ ├── action_continue_to_login_otp.go │ │ │ │ ├── action_continue_to_login_security_key.go │ │ │ │ ├── action_otp_code_validate.go │ │ │ │ └── action_webauthn_generate_request_options_security_key.go │ │ │ ├── profile/ │ │ │ │ ├── action_account_delete.go │ │ │ │ ├── action_connect_thirdparty_oauth_provider.go │ │ │ │ ├── action_continue_to_otp_secret_creation.go │ │ │ │ ├── action_continue_to_security_key_creation.go │ │ │ │ ├── action_disconnect_thirdparty_oauth_provider.go │ │ │ │ ├── action_email_create.go │ │ │ │ ├── action_email_delete.go │ │ │ │ ├── action_email_set_primary.go │ │ │ │ ├── action_email_verify.go │ │ │ │ ├── action_exchange_token.go │ │ │ │ ├── action_otp_secret_delete.go │ │ │ │ ├── action_password_create.go │ │ │ │ ├── action_password_delete.go │ │ │ │ ├── action_password_update.go │ │ │ │ ├── action_patch_metadata.go │ │ │ │ ├── action_security_key_create.go │ │ │ │ ├── action_security_key_delete.go │ │ │ │ ├── action_session_delete.go │ │ │ │ ├── action_username_create.go │ │ │ │ ├── action_username_delete.go │ │ │ │ ├── action_username_update.go │ │ │ │ ├── action_webauthn_credential_create.go │ │ │ │ ├── action_webauthn_credential_delete.go │ │ │ │ ├── action_webauthn_credential_rename.go │ │ │ │ ├── action_webauthn_verify_attestation_response.go │ │ │ │ ├── hook_get_profile_data.go │ │ │ │ ├── hook_get_sessions.go │ │ │ │ └── hook_refresh_session_user.go │ │ │ ├── registration/ │ │ │ │ ├── action_register_login_identifier.go │ │ │ │ ├── hook_create_user.go │ │ │ │ └── hook_determine_amr_values.go │ │ │ ├── shared/ │ │ │ │ ├── action_back.go │ │ │ │ ├── action_exchange_token.go │ │ │ │ ├── action_skip.go │ │ │ │ ├── action_thirdparty_oauth.go │ │ │ │ ├── const_action_names.go │ │ │ │ ├── const_email_templates.go │ │ │ │ ├── const_flow_names.go │ │ │ │ ├── const_stash_paths.go │ │ │ │ ├── const_state_names.go │ │ │ │ ├── errors.go │ │ │ │ ├── flow.go │ │ │ │ ├── hook_determine_amr_values.go │ │ │ │ ├── hook_email_persist_verified_status.go │ │ │ │ ├── hook_generate_oauth_links.go │ │ │ │ ├── hook_get_user_data.go │ │ │ │ ├── hook_issue_session.go │ │ │ │ ├── hook_password_save.go │ │ │ │ ├── hook_persist_webauthn_credential.go │ │ │ │ ├── hook_schedule_mfa_creation_states.go │ │ │ │ ├── hook_verify_attestation_response.go │ │ │ │ └── links.go │ │ │ └── user_details/ │ │ │ ├── action_set_email.go │ │ │ ├── action_set_username.go │ │ │ ├── action_skip_email.go │ │ │ └── action_skip_username.go │ │ ├── flow_locker/ │ │ │ ├── flow_locker.go │ │ │ ├── flow_locker_test.go │ │ │ ├── memory.go │ │ │ ├── memory_test.go │ │ │ ├── noop.go │ │ │ ├── redis.go │ │ │ └── redis_test.go │ │ ├── handler.go │ │ ├── services/ │ │ │ ├── device_trust.go │ │ │ ├── email.go │ │ │ ├── passcode.go │ │ │ ├── password.go │ │ │ ├── security_notification.go │ │ │ ├── user.go │ │ │ └── webauthn.go │ │ └── static/ │ │ └── generic_client.html │ ├── flowpilot/ │ │ ├── action_input.go │ │ ├── builder.go │ │ ├── builder_subflow.go │ │ ├── context.go │ │ ├── context_action_exec.go │ │ ├── context_action_init.go │ │ ├── context_flow.go │ │ ├── db.go │ │ ├── errors.go │ │ ├── flow.go │ │ ├── input.go │ │ ├── input_allowed_value.go │ │ ├── input_schema.go │ │ ├── jsonmanager/ │ │ │ └── manager.go │ │ ├── link.go │ │ ├── payload.go │ │ ├── query_param.go │ │ ├── random.go │ │ ├── response.go │ │ ├── stash.go │ │ ├── state_action.go │ │ └── state_detail.go │ ├── go.mod │ ├── go.sum │ ├── handler/ │ │ ├── admin_router.go │ │ ├── audit_log.go │ │ ├── email.go │ │ ├── email_admin.go │ │ ├── email_admin_test.go │ │ ├── email_test.go │ │ ├── health.go │ │ ├── health_test.go │ │ ├── helpers_test.go │ │ ├── metadata_admin.go │ │ ├── metadata_admin_test.go │ │ ├── otp_admin.go │ │ ├── otp_admin_test.go │ │ ├── passcode.go │ │ ├── passcode_test.go │ │ ├── password.go │ │ ├── password_admin.go │ │ ├── password_admin_test.go │ │ ├── password_test.go │ │ ├── public_router.go │ │ ├── session.go │ │ ├── session_admin.go │ │ ├── session_admin_test.go │ │ ├── status.go │ │ ├── thirdparty.go │ │ ├── thirdparty_auth_test.go │ │ ├── thirdparty_callback_error_test.go │ │ ├── thirdparty_callback_test.go │ │ ├── thirdparty_test.go │ │ ├── token.go │ │ ├── token_test.go │ │ ├── user.go │ │ ├── user_admin.go │ │ ├── user_admin_test.go │ │ ├── user_test.go │ │ ├── utils.go │ │ ├── webauthn.go │ │ ├── webauthn_credential_admin.go │ │ ├── webauthn_credential_admin_test.go │ │ ├── webauthn_test.go │ │ ├── webhook.go │ │ ├── webhook_test.go │ │ ├── well_known.go │ │ └── well_known_test.go │ ├── json_schema/ │ │ ├── hanko.config.json │ │ └── hanko.user_import.json │ ├── mail/ │ │ ├── locales/ │ │ │ ├── passcode.bn.yaml │ │ │ ├── passcode.de.yaml │ │ │ ├── passcode.en.yaml │ │ │ ├── passcode.fr.yaml │ │ │ ├── passcode.it.yaml │ │ │ ├── passcode.nl.yaml │ │ │ ├── passcode.pt-BR.yaml │ │ │ ├── passcode.zh-CN.yaml │ │ │ ├── security-notifications.bn.yaml │ │ │ ├── security-notifications.de.yaml │ │ │ ├── security-notifications.en.yaml │ │ │ ├── security-notifications.fr.yaml │ │ │ ├── security-notifications.it.yaml │ │ │ ├── security-notifications.nl.yaml │ │ │ ├── security-notifications.pt-BR.yaml │ │ │ └── security-notifications.zh-CN.yaml │ │ ├── mailer.go │ │ ├── mailer_test.go │ │ ├── render.go │ │ ├── render_test.go │ │ └── templates/ │ │ ├── email_create.html.tmpl │ │ ├── email_create.txt.tmpl │ │ ├── email_delete.html.tmpl │ │ ├── email_delete.txt.tmpl │ │ ├── email_login_attempted.html.tmpl │ │ ├── email_login_attempted.txt.tmpl │ │ ├── email_registration_attempted.html.tmpl │ │ ├── email_registration_attempted.txt.tmpl │ │ ├── email_verification.html.tmpl │ │ ├── email_verification.txt.tmpl │ │ ├── layout.html.tmpl │ │ ├── login.html.tmpl │ │ ├── login.txt.tmpl │ │ ├── mfa_create.html.tmpl │ │ ├── mfa_create.txt.tmpl │ │ ├── mfa_delete.html.tmpl │ │ ├── mfa_delete.txt.tmpl │ │ ├── passkey_create.html.tmpl │ │ ├── passkey_create.txt.tmpl │ │ ├── password_update.html.tmpl │ │ ├── password_update.txt.tmpl │ │ ├── primary_email_update.html.tmpl │ │ ├── primary_email_update.txt.tmpl │ │ ├── recovery.html.tmpl │ │ └── recovery.txt.tmpl │ ├── main.go │ ├── mapper/ │ │ ├── aaguid.json │ │ └── authenticator_mapper.go │ ├── middleware/ │ │ ├── logger.go │ │ ├── session.go │ │ └── webhook.go │ ├── pagination/ │ │ ├── header.go │ │ └── header_test.go │ ├── persistence/ │ │ ├── audit_log_persister.go │ │ ├── email_persister.go │ │ ├── flow_persister.go │ │ ├── identity_persister.go │ │ ├── jwk_persister.go │ │ ├── migrations/ │ │ │ ├── 20220405153240_create_users.down.fizz │ │ │ ├── 20220405153240_create_users.up.fizz │ │ │ ├── 20220405153750_create_passcodes.down.fizz │ │ │ ├── 20220405153750_create_passcodes.up.fizz │ │ │ ├── 20220405154240_create_webauthn_credentials.down.fizz │ │ │ ├── 20220405154240_create_webauthn_credentials.up.fizz │ │ │ ├── 20220405154750_create_webauthn_session_data.down.fizz │ │ │ ├── 20220405154750_create_webauthn_session_data.up.fizz │ │ │ ├── 20220405155120_create_webauthn_session_data_allowed_credentials.down.fizz │ │ │ ├── 20220405155120_create_webauthn_session_data_allowed_credentials.up.fizz │ │ │ ├── 20220413152500_create_jwk.down.fizz │ │ │ ├── 20220413152500_create_jwk.up.fizz │ │ │ ├── 20220425122015_create_password_credentials.down.fizz │ │ │ ├── 20220425122015_create_password_credentials.up.fizz │ │ │ ├── 20220711121022_create_credential_transports.down.fizz │ │ │ ├── 20220711121022_create_credential_transports.up.fizz │ │ │ ├── 20220818111000_create_audit_logs.down.fizz │ │ │ ├── 20220818111000_create_audit_logs.up.fizz │ │ │ ├── 20221027104800_create_emails.down.fizz │ │ │ ├── 20221027104800_create_emails.up.fizz │ │ │ ├── 20221027104900_change_users.down.fizz │ │ │ ├── 20221027104900_change_users.up.fizz │ │ │ ├── 20221027123530_change_passcodes.down.fizz │ │ │ ├── 20221027123530_change_passcodes.up.fizz │ │ │ ├── 20221222134900_change_webauthn_credentials.down.fizz │ │ │ ├── 20221222134900_change_webauthn_credentials.up.fizz │ │ │ ├── 20230112152816_create_identities.down.fizz │ │ │ ├── 20230112152816_create_identities.up.fizz │ │ │ ├── 20230206102000_change_webauthn_credentials.down.fizz │ │ │ ├── 20230206102000_change_webauthn_credentials.up.fizz │ │ │ ├── 20230222114100_change_webauthn_credentials.down.fizz │ │ │ ├── 20230222114100_change_webauthn_credentials.up.fizz │ │ │ ├── 20230317114334_create_tokens.down.fizz │ │ │ ├── 20230317114334_create_tokens.up.fizz │ │ │ ├── 20230801124808_webauthn_session_data_add_expiry.down.fizz │ │ │ ├── 20230801124808_webauthn_session_data_add_expiry.up.fizz │ │ │ ├── 20230810173315_create_flows.down.fizz │ │ │ ├── 20230810173315_create_flows.up.fizz │ │ │ ├── 20230905102601_create_saml_state.down.fizz │ │ │ ├── 20230905102601_create_saml_state.up.fizz │ │ │ ├── 20230915111552_create_saml_certs.down.fizz │ │ │ ├── 20230915111552_create_saml_certs.up.fizz │ │ │ ├── 20231012141100_change_user_table.down.fizz │ │ │ ├── 20231012141100_change_user_table.up.fizz │ │ │ ├── 20231013113800_change_passcode_table.down.fizz │ │ │ ├── 20231013113800_change_passcode_table.up.fizz │ │ │ ├── 20240108094151_create_webhooks.down.fizz │ │ │ ├── 20240108094151_create_webhooks.up.fizz │ │ │ ├── 20240108094210_create_webhook_events.down.fizz │ │ │ ├── 20240108094210_create_webhook_events.up.fizz │ │ │ ├── 20240207150616_change_audit_logs.down.fizz │ │ │ ├── 20240207150616_change_audit_logs.up.fizz │ │ │ ├── 20240530122100_change_tokens.down.fizz │ │ │ ├── 20240530122100_change_tokens.up.fizz │ │ │ ├── 20240530145724_change_users.down.fizz │ │ │ ├── 20240530145724_change_users.up.fizz │ │ │ ├── 20240612122326_change_flows.down.fizz │ │ │ ├── 20240612122326_change_flows.up.fizz │ │ │ ├── 20240717020131_drop_transitions.down.fizz │ │ │ ├── 20240717020131_drop_transitions.up.fizz │ │ │ ├── 20240717020707_change_flows.down.fizz │ │ │ ├── 20240717020707_change_flows.up.fizz │ │ │ ├── 20240723171257_change_passcodes.down.fizz │ │ │ ├── 20240723171257_change_passcodes.up.fizz │ │ │ ├── 20240723173648_create_usernames.down.fizz │ │ │ ├── 20240723173648_create_usernames.up.fizz │ │ │ ├── 20240826132046_create_otp_secrets.down.fizz │ │ │ ├── 20240826132046_create_otp_secrets.up.fizz │ │ │ ├── 20240826133417_change_webauthn_credentials.down.fizz │ │ │ ├── 20240826133417_change_webauthn_credentials.up.fizz │ │ │ ├── 20241002113000_create_sessions.down.fizz │ │ │ ├── 20241002113000_create_sessions.up.fizz │ │ │ ├── 20241106171500_change_sessions.down.fizz │ │ │ ├── 20241106171500_change_sessions.up.fizz │ │ │ ├── 20241112181011_create_trusted_devices.down.fizz │ │ │ ├── 20241112181011_create_trusted_devices.up.fizz │ │ │ ├── 20241118114500_change_webauthn_credentials.down.fizz │ │ │ ├── 20241118114500_change_webauthn_credentials.up.fizz │ │ │ ├── 20250130154010_change_identities.down.fizz │ │ │ ├── 20250130154010_change_identities.up.fizz │ │ │ ├── 20250130170131_create_saml_identities.down.fizz │ │ │ ├── 20250130170131_create_saml_identities.up.fizz │ │ │ ├── 20250210095906_create_saml_idp_initiated_requests.down.fizz │ │ │ ├── 20250210095906_create_saml_idp_initiated_requests.up.fizz │ │ │ ├── 20250313160348_change_flows.down.fizz │ │ │ ├── 20250313160348_change_flows.up.fizz │ │ │ ├── 20250414165334_create_user_metadata.down.fizz │ │ │ ├── 20250414165334_create_user_metadata.up.fizz │ │ │ ├── 20251002113000_change_tokens.down.fizz │ │ │ ├── 20251002113000_change_tokens.up.fizz │ │ │ ├── 20251104000000_add_user_id_to_identities.down.fizz │ │ │ ├── 20251104000000_add_user_id_to_identities.up.fizz │ │ │ ├── 20251119000000_change_tokens.down.fizz │ │ │ ├── 20251119000000_change_tokens.up.fizz │ │ │ ├── 20260204151021_change_user.down.fizz │ │ │ └── 20260204151021_change_user.up.fizz │ │ ├── models/ │ │ │ ├── audit_log.go │ │ │ ├── email.go │ │ │ ├── flow.go │ │ │ ├── identity.go │ │ │ ├── jwk.go │ │ │ ├── otp_secret.go │ │ │ ├── passcode.go │ │ │ ├── password_credential.go │ │ │ ├── primary_email.go │ │ │ ├── saml_certificate.go │ │ │ ├── saml_identity.go │ │ │ ├── saml_idp_initiated_request.go │ │ │ ├── saml_state.go │ │ │ ├── session.go │ │ │ ├── token.go │ │ │ ├── trusted_device.go │ │ │ ├── user.go │ │ │ ├── user_metadata.go │ │ │ ├── username.go │ │ │ ├── webauthn_credential.go │ │ │ ├── webauthn_credential_transport.go │ │ │ ├── webauthn_credential_user_handle.go │ │ │ ├── webauthn_session_data.go │ │ │ ├── webauthn_session_data_allowed_credential.go │ │ │ ├── webhook.go │ │ │ └── webhook_event.go │ │ ├── otp_secret_persister.go │ │ ├── passcode_persister.go │ │ ├── password_credential_persister.go │ │ ├── persister.go │ │ ├── primary_email_persister.go │ │ ├── saml_certificate_persister.go │ │ ├── saml_identity_persister.go │ │ ├── saml_idp_inititated_request_persister.go │ │ ├── saml_state_persister.go │ │ ├── session_persister.go │ │ ├── token_persister.go │ │ ├── trusted_device_persister.go │ │ ├── user_metadata_persister.go │ │ ├── user_persister.go │ │ ├── username_persister.go │ │ ├── webauthn_credential_persister.go │ │ ├── webauthn_credential_user_handle_persister.go │ │ ├── webauthn_session_data_persister.go │ │ └── webhook_persister.go │ ├── rate_limiter/ │ │ ├── rate_limiter.go │ │ └── rate_limiter_test.go │ ├── server/ │ │ └── server.go │ ├── session/ │ │ ├── session.go │ │ ├── session_test.go │ │ ├── template.go │ │ └── template_test.go │ ├── template/ │ │ ├── template.go │ │ └── templates/ │ │ └── status.tmpl │ ├── test/ │ │ ├── audit_logger.go │ │ ├── config.go │ │ ├── database.go │ │ ├── fixtures/ │ │ │ ├── actions/ │ │ │ │ ├── get_wa_creation_options/ │ │ │ │ │ └── flows.yaml │ │ │ │ ├── send_capabilities/ │ │ │ │ │ └── flows.yaml │ │ │ │ ├── send_wa_attestation_response/ │ │ │ │ │ ├── flows.yaml │ │ │ │ │ └── webauthn_session_data.yaml │ │ │ │ ├── submit_new_password/ │ │ │ │ │ └── flows.yaml │ │ │ │ ├── submit_passcode/ │ │ │ │ │ ├── flows.yaml │ │ │ │ │ └── passcodes.yaml │ │ │ │ └── submit_registration_identifier/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── flows.yaml │ │ │ │ └── users.yaml │ │ │ ├── email/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── metadata/ │ │ │ │ ├── user_metadata.yaml │ │ │ │ └── users.yaml │ │ │ ├── otp/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── otp_secrets.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── passcode/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── password/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── password_credentials.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── saml_state/ │ │ │ │ └── saml_states.yaml │ │ │ ├── sessions/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ ├── sessions.yaml │ │ │ │ └── users.yaml │ │ │ ├── thirdparty/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── identities.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── token/ │ │ │ │ ├── tokens.yaml │ │ │ │ └── users.yaml │ │ │ ├── user/ │ │ │ │ ├── emails.yaml │ │ │ │ └── users.yaml │ │ │ ├── user_admin/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── usernames.yaml │ │ │ │ └── users.yaml │ │ │ ├── user_with_webauthn_credential/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── identities.yaml │ │ │ │ ├── user_metadata.yaml │ │ │ │ ├── usernames.yaml │ │ │ │ ├── users.yaml │ │ │ │ └── webauthn_credentials.yaml │ │ │ ├── webauthn/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ ├── users.yaml │ │ │ │ ├── webauthn_credentials.yaml │ │ │ │ └── webauthn_session_data.yaml │ │ │ ├── webauthn_registration/ │ │ │ │ ├── emails.yaml │ │ │ │ ├── primary_emails.yaml │ │ │ │ ├── users.yaml │ │ │ │ ├── webauthn_credentials.yaml │ │ │ │ └── webauthn_session_data.yaml │ │ │ └── webhooks/ │ │ │ ├── webhook_events.yaml │ │ │ └── webhooks.yaml │ │ ├── jwk_manager.go │ │ ├── mailslurper.go │ │ └── suite.go │ ├── thirdparty/ │ │ ├── claims.go │ │ ├── error.go │ │ ├── helper.go │ │ ├── helper_test.go │ │ ├── linking.go │ │ ├── provider.go │ │ ├── provider_apple.go │ │ ├── provider_custom.go │ │ ├── provider_discord.go │ │ ├── provider_facebook.go │ │ ├── provider_github.go │ │ ├── provider_google.go │ │ ├── provider_linkedin.go │ │ ├── provider_microsoft.go │ │ ├── state.go │ │ └── state_test.go │ ├── utils/ │ │ ├── cookie.go │ │ ├── cookie_test.go │ │ ├── mask.go │ │ ├── mask_test.go │ │ ├── url.go │ │ └── url_test.go │ └── webhooks/ │ ├── config_hook.go │ ├── config_hook_test.go │ ├── database_hook.go │ ├── database_hook_test.go │ ├── events/ │ │ └── events.go │ ├── manager.go │ ├── manager_test.go │ ├── utils/ │ │ ├── webhook.go │ │ └── webhook_test.go │ ├── webhook.go │ ├── webhook_test.go │ ├── worker.go │ └── worker_test.go ├── deploy/ │ ├── docker-compose/ │ │ ├── base.yaml │ │ ├── config-disable-signup.yaml │ │ ├── config-rate-limiting.yaml │ │ ├── config.yaml │ │ ├── quickstart-with-redis.yaml │ │ ├── quickstart.debug.yaml │ │ ├── quickstart.e2e.yaml │ │ ├── quickstart.yaml │ │ ├── todo-angular.yaml │ │ ├── todo-nextjs.yaml │ │ ├── todo-react.yaml │ │ ├── todo-svelte.yaml │ │ └── todo-vue.yaml │ └── k8s/ │ ├── README.md │ ├── base/ │ │ ├── elements/ │ │ │ ├── deployment.yaml │ │ │ ├── ingress.yaml │ │ │ ├── kustomization.yaml │ │ │ └── service.yaml │ │ ├── mailhog/ │ │ │ ├── deployment.yaml │ │ │ ├── ingress.yaml │ │ │ ├── kustomization.yaml │ │ │ └── service.yaml │ │ ├── postgres/ │ │ │ ├── deployment.yaml │ │ │ ├── initdbscript.sh │ │ │ ├── kustomization.yaml │ │ │ ├── persistent-volume.yaml │ │ │ └── service.yaml │ │ └── quickstart/ │ │ ├── deployment.yaml │ │ ├── ingress.yaml │ │ ├── kustomization.yaml │ │ └── service.yaml │ └── overlays/ │ ├── quickstart/ │ │ └── kustomization.yaml │ └── thirdparty-x-domain/ │ ├── README.md │ ├── config.yaml │ ├── env-patch.yaml │ ├── ingress-patch.yaml │ └── kustomization.yaml ├── e2e/ │ ├── .eslintignore │ ├── .eslintrc.cjs │ ├── .nvmrc │ ├── README.md │ ├── fixtures/ │ │ └── Pages.ts │ ├── global.d.ts │ ├── helper/ │ │ ├── Accounts.ts │ │ ├── Endpoints.ts │ │ ├── MailSlurper.ts │ │ ├── Matchers.ts │ │ └── Setup.ts │ ├── package.json │ ├── pages/ │ │ ├── BasePage.ts │ │ ├── Error.ts │ │ ├── LoginEmail.ts │ │ ├── LoginEmailNoSignUp.ts │ │ ├── LoginPasscode.ts │ │ ├── LoginPassword.ts │ │ ├── NoAccountFound.ts │ │ ├── RegisterAuthenticator.ts │ │ ├── RegisterConfirm.ts │ │ ├── RegisterPassword.ts │ │ └── SecuredContent.ts │ ├── playwright.config.ts │ ├── seed/ │ │ ├── Dockerfile │ │ ├── init.sh │ │ └── seed.sql │ ├── tests/ │ │ ├── common.spec.ts │ │ ├── nosignup.spec.ts │ │ ├── passwordless.spec.ts │ │ └── passwords.spec.ts │ └── tsconfig.json ├── frontend/ │ ├── .dockerignore │ ├── Dockerfile │ ├── Dockerfile.debug │ ├── elements/ │ │ ├── .dockerignore │ │ ├── .eslintignore │ │ ├── .eslintrc.cjs │ │ ├── .nvmrc │ │ ├── LICENSE │ │ ├── README.md │ │ ├── babel.config.cjs │ │ ├── example.css │ │ ├── nginx/ │ │ │ └── default.conf │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Elements.tsx │ │ │ ├── _mixins.sass │ │ │ ├── _preset.sass │ │ │ ├── _variables.sass │ │ │ ├── components/ │ │ │ │ ├── accordion/ │ │ │ │ │ ├── Accordion.tsx │ │ │ │ │ ├── AddEmailDropdown.tsx │ │ │ │ │ ├── AddWebauthnCredentialDropdown.tsx │ │ │ │ │ ├── ChangePasswordDropdown.tsx │ │ │ │ │ ├── ChangeUsernameDropdown.tsx │ │ │ │ │ ├── ConnectIdentityDropdown.tsx │ │ │ │ │ ├── Dropdown.tsx │ │ │ │ │ ├── ListEmailsAccordion.tsx │ │ │ │ │ ├── ListIdentities.tsx │ │ │ │ │ ├── ListSessionsAccordion.tsx │ │ │ │ │ ├── ListWebauthnCredentialsAccordion.tsx │ │ │ │ │ ├── ManageAuthAppDropdown.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── error/ │ │ │ │ │ ├── ErrorBox.tsx │ │ │ │ │ ├── ErrorMessage.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── form/ │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── Checkbox.tsx │ │ │ │ │ ├── CodeInput.tsx │ │ │ │ │ ├── Form.tsx │ │ │ │ │ ├── Input.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── headline/ │ │ │ │ │ ├── Headline1.tsx │ │ │ │ │ ├── Headline2.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── icons/ │ │ │ │ │ ├── Apple.tsx │ │ │ │ │ ├── Checkmark.tsx │ │ │ │ │ ├── Copy.tsx │ │ │ │ │ ├── CustomProvider.tsx │ │ │ │ │ ├── Discord.tsx │ │ │ │ │ ├── ExclamationMark.tsx │ │ │ │ │ ├── Facebook.tsx │ │ │ │ │ ├── GitHub.tsx │ │ │ │ │ ├── Google.tsx │ │ │ │ │ ├── Icon.tsx │ │ │ │ │ ├── LinkedIn.tsx │ │ │ │ │ ├── LoadingSpinner.tsx │ │ │ │ │ ├── Mail.tsx │ │ │ │ │ ├── Microsoft.tsx │ │ │ │ │ ├── Passkey.tsx │ │ │ │ │ ├── Password.tsx │ │ │ │ │ ├── QRCodeScanner.tsx │ │ │ │ │ ├── SecurityKey.tsx │ │ │ │ │ ├── Spinner.tsx │ │ │ │ │ ├── icons.ts │ │ │ │ │ └── styles.sass │ │ │ │ ├── link/ │ │ │ │ │ ├── Link.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── otp/ │ │ │ │ │ ├── OTPCreationDetails.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── paragraph/ │ │ │ │ │ ├── Paragraph.tsx │ │ │ │ │ └── styles.sass │ │ │ │ ├── spacer/ │ │ │ │ │ ├── Divider.tsx │ │ │ │ │ ├── Spacer.tsx │ │ │ │ │ └── styles.sass │ │ │ │ └── wrapper/ │ │ │ │ ├── Clipboard.tsx │ │ │ │ ├── Container.tsx │ │ │ │ ├── Content.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ └── styles.sass │ │ │ ├── contexts/ │ │ │ │ └── AppProvider.tsx │ │ │ ├── declarations.d.ts │ │ │ ├── example.html │ │ │ ├── hooks/ │ │ │ │ ├── UseFlowEffects.ts │ │ │ │ └── UseFlowState.ts │ │ │ ├── i18n/ │ │ │ │ ├── all.ts │ │ │ │ ├── bn.ts │ │ │ │ ├── de.ts │ │ │ │ ├── en.ts │ │ │ │ ├── fr.ts │ │ │ │ ├── it.ts │ │ │ │ ├── nl.ts │ │ │ │ ├── pt-BR.ts │ │ │ │ ├── translations.ts │ │ │ │ └── zh.ts │ │ │ ├── index.ts │ │ │ └── pages/ │ │ │ ├── CreateEmailPage.tsx │ │ │ ├── CreateOTPSecretPage.tsx │ │ │ ├── CreatePasswordPage.tsx │ │ │ ├── CreateSecurityKeyPage.tsx │ │ │ ├── CreateUsernamePage.tsx │ │ │ ├── CredentialOnboardingChooser.tsx │ │ │ ├── DeleteAccountPage.tsx │ │ │ ├── DeviceTrustPage.tsx │ │ │ ├── EditPasswordPage.tsx │ │ │ ├── ErrorPage.tsx │ │ │ ├── InitPage.tsx │ │ │ ├── LoginInitPage.tsx │ │ │ ├── LoginMethodChooser.tsx │ │ │ ├── LoginOTPPage.tsx │ │ │ ├── LoginPasswordPage.tsx │ │ │ ├── LoginSecurityKeyPage.tsx │ │ │ ├── MFAMethodChooserPage.tsx │ │ │ ├── PasscodePage.tsx │ │ │ ├── ProfilePage.tsx │ │ │ ├── RegisterPasskeyPage.tsx │ │ │ ├── RegistrationInitPage.tsx │ │ │ └── RenameWebauthnCredentialPage.tsx │ │ ├── tsconfig.json │ │ ├── webpack.config.cjs │ │ └── webpack.config.dev.cjs │ ├── examples/ │ │ ├── README.md │ │ ├── angular/ │ │ │ ├── .browserslistrc │ │ │ ├── .dockerignore │ │ │ ├── .editorconfig │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── angular.json │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── app/ │ │ │ │ │ ├── app-routing.module.ts │ │ │ │ │ ├── app.component.css │ │ │ │ │ ├── app.component.html │ │ │ │ │ ├── app.component.ts │ │ │ │ │ ├── login/ │ │ │ │ │ │ ├── login.component.html │ │ │ │ │ │ └── login.component.ts │ │ │ │ │ ├── modal/ │ │ │ │ │ │ ├── session-expired-modal.component.html │ │ │ │ │ │ └── session-expired-modal.component.ts │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── profile.component.html │ │ │ │ │ │ └── profile.component.ts │ │ │ │ │ ├── services/ │ │ │ │ │ │ ├── hanko.services.ts │ │ │ │ │ │ └── todo.service.ts │ │ │ │ │ └── todo/ │ │ │ │ │ ├── todo.component.css │ │ │ │ │ ├── todo.component.html │ │ │ │ │ └── todo.component.ts │ │ │ │ ├── assets/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── environments/ │ │ │ │ │ └── environment.ts │ │ │ │ ├── index.html │ │ │ │ ├── main.ts │ │ │ │ ├── polyfills.ts │ │ │ │ └── styles.css │ │ │ ├── tsconfig.app.json │ │ │ └── tsconfig.json │ │ ├── express/ │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ └── src/ │ │ │ └── server.js │ │ ├── nextjs/ │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── components/ │ │ │ │ ├── HankoAuth.tsx │ │ │ │ ├── HankoProfile.tsx │ │ │ │ └── SessionExpiredModal.tsx │ │ │ ├── next.config.js │ │ │ ├── package.json │ │ │ ├── pages/ │ │ │ │ ├── _app.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── profile.tsx │ │ │ │ └── todo.tsx │ │ │ ├── styles/ │ │ │ │ ├── Todo.module.css │ │ │ │ └── index.css │ │ │ ├── tsconfig.json │ │ │ └── util/ │ │ │ └── TodoClient.ts │ │ ├── react/ │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── public/ │ │ │ │ ├── manifest.json │ │ │ │ └── robots.txt │ │ │ ├── src/ │ │ │ │ ├── HankoAuth.tsx │ │ │ │ ├── HankoProfile.tsx │ │ │ │ ├── SessionExpiredModal.tsx │ │ │ │ ├── Todo.module.css │ │ │ │ ├── Todo.tsx │ │ │ │ ├── TodoClient.ts │ │ │ │ ├── index.css │ │ │ │ ├── index.tsx │ │ │ │ └── react-app-env.d.ts │ │ │ ├── tsconfig.app.json │ │ │ ├── tsconfig.json │ │ │ ├── tsconfig.node.json │ │ │ ├── vite-env.d.ts │ │ │ └── vite.config.js │ │ └── vue/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── .prettierrc.json │ │ ├── .vscode/ │ │ │ └── extensions.json │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── env.d.ts │ │ ├── index.html │ │ ├── package.json │ │ ├── src/ │ │ │ ├── App.vue │ │ │ ├── assets/ │ │ │ │ └── base.css │ │ │ ├── components/ │ │ │ │ └── SessionExpiredModal.vue │ │ │ ├── main.ts │ │ │ ├── router/ │ │ │ │ └── index.ts │ │ │ ├── utils/ │ │ │ │ └── TodoClient.ts │ │ │ └── views/ │ │ │ ├── LoginView.vue │ │ │ ├── ProfileView.vue │ │ │ └── TodoView.vue │ │ ├── tsconfig.app.json │ │ ├── tsconfig.json │ │ ├── tsconfig.node.json │ │ └── vite.config.ts │ ├── frontend-sdk/ │ │ ├── .dockerignore │ │ ├── .eslintignore │ │ ├── .eslintrc.cjs │ │ ├── .gitignore │ │ ├── .nvmrc │ │ ├── LICENSE │ │ ├── README.md │ │ ├── jest.config.cjs │ │ ├── jsdoc.json │ │ ├── nginx/ │ │ │ └── default.conf │ │ ├── package.json │ │ ├── src/ │ │ │ ├── Hanko.ts │ │ │ ├── declarations.d.ts │ │ │ ├── index.ts │ │ │ └── lib/ │ │ │ ├── Cookie.ts │ │ │ ├── Dto.ts │ │ │ ├── Errors.ts │ │ │ ├── Pkce.ts │ │ │ ├── SessionStorage.ts │ │ │ ├── Throttle.ts │ │ │ ├── WebauthnSupport.ts │ │ │ ├── client/ │ │ │ │ ├── Client.ts │ │ │ │ ├── HttpClient.ts │ │ │ │ ├── SessionClient.ts │ │ │ │ └── UserClient.ts │ │ │ ├── events/ │ │ │ │ ├── CustomEvents.ts │ │ │ │ ├── Dispatcher.ts │ │ │ │ ├── Listener.ts │ │ │ │ ├── Relay.ts │ │ │ │ ├── Scheduler.ts │ │ │ │ ├── SessionChannel.ts │ │ │ │ ├── SessionState.ts │ │ │ │ └── WindowActivityManager.ts │ │ │ └── flow-api/ │ │ │ ├── State.ts │ │ │ ├── WebauthnManager.ts │ │ │ ├── auto-steps.ts │ │ │ ├── passkey-autofill-activation.ts │ │ │ └── types/ │ │ │ ├── action.ts │ │ │ ├── flow.ts │ │ │ ├── flowError.ts │ │ │ ├── input.ts │ │ │ ├── payload.ts │ │ │ └── state.ts │ │ ├── tests/ │ │ │ ├── Hanko.spec.ts │ │ │ ├── lib/ │ │ │ │ ├── Cookie.spec.ts │ │ │ │ ├── Throttle.spec.ts │ │ │ │ ├── WebauthnSupport.spec.ts │ │ │ │ ├── client/ │ │ │ │ │ ├── HttpClient.spec.ts │ │ │ │ │ └── UserClient.spec.ts │ │ │ │ ├── events/ │ │ │ │ │ ├── Dispatcher.spec.ts │ │ │ │ │ └── Listener.spec.ts │ │ │ │ └── flow-api/ │ │ │ │ └── State.spec.ts │ │ │ ├── setup.ts │ │ │ └── types.d.ts │ │ ├── tsconfig.json │ │ └── tsconfig.prod.json │ ├── package.json │ └── turbo.json ├── quickstart/ │ ├── Dockerfile │ ├── README.md │ ├── go.mod │ ├── go.sum │ ├── main.go │ ├── middleware/ │ │ ├── cache_control.go │ │ └── session.go │ └── public/ │ ├── assets/ │ │ └── css/ │ │ ├── common.css │ │ ├── fonts.css │ │ ├── index.css │ │ └── secured.css │ └── html/ │ ├── error.html │ ├── index.html │ ├── secured.html │ └── unauthorized.html └── skaffold.yaml