@tinyrack/issuary-server 0.30.0 → 0.32.1
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/dist/entities/auth-budget.entity.d.ts +20 -0
- package/dist/entities/auth-budget.entity.d.ts.map +1 -0
- package/dist/entities/auth-budget.entity.js +11 -0
- package/dist/entities/auth-budget.entity.js.map +1 -0
- package/dist/entities/browser-session.entity.d.ts +32 -0
- package/dist/entities/browser-session.entity.d.ts.map +1 -0
- package/dist/entities/browser-session.entity.js +12 -0
- package/dist/entities/browser-session.entity.js.map +1 -0
- package/dist/entities/email-verification.entity.d.ts +18 -0
- package/dist/entities/email-verification.entity.d.ts.map +1 -1
- package/dist/entities/email-verification.entity.js +2 -0
- package/dist/entities/email-verification.entity.js.map +1 -1
- package/dist/entities/oauth-client.entity.d.ts +120 -0
- package/dist/entities/oauth-client.entity.d.ts.map +1 -1
- package/dist/entities/oauth-code.entity.d.ts +120 -0
- package/dist/entities/oauth-code.entity.d.ts.map +1 -1
- package/dist/entities/oauth-code.entity.js +3 -0
- package/dist/entities/oauth-code.entity.js.map +1 -1
- package/dist/entities/oauth-device-code.entity.d.ts +120 -0
- package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
- package/dist/entities/oauth-device-code.entity.js +3 -0
- package/dist/entities/oauth-device-code.entity.js.map +1 -1
- package/dist/entities/oauth-grant.entity.d.ts +52 -0
- package/dist/entities/oauth-grant.entity.d.ts.map +1 -0
- package/dist/entities/oauth-grant.entity.js +19 -0
- package/dist/entities/oauth-grant.entity.js.map +1 -0
- package/dist/entities/password-reset.entity.d.ts +18 -0
- package/dist/entities/password-reset.entity.d.ts.map +1 -1
- package/dist/entities/password-reset.entity.js +2 -0
- package/dist/entities/password-reset.entity.js.map +1 -1
- package/dist/entities/pending-oauth-registration.entity.d.ts +9 -0
- package/dist/entities/pending-oauth-registration.entity.d.ts.map +1 -1
- package/dist/entities/pending-oauth-registration.entity.js +1 -0
- package/dist/entities/pending-oauth-registration.entity.js.map +1 -1
- package/dist/entities/revoked-token.entity.d.ts +120 -0
- package/dist/entities/revoked-token.entity.d.ts.map +1 -1
- package/dist/entities/terms-content.entity.d.ts +36 -0
- package/dist/entities/terms-content.entity.d.ts.map +1 -1
- package/dist/entities/terms.entity.d.ts +36 -0
- package/dist/entities/terms.entity.d.ts.map +1 -1
- package/dist/entities/user-consent.entity.d.ts +120 -0
- package/dist/entities/user-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-terms-consent.entity.d.ts +36 -0
- package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
- package/dist/entities/user-totp-recovery-code.entity.d.ts +36 -0
- package/dist/entities/user-totp-recovery-code.entity.d.ts.map +1 -1
- package/dist/entities/user-totp.entity.d.ts +36 -0
- package/dist/entities/user-totp.entity.d.ts.map +1 -1
- package/dist/entities/user-totp.entity.js +1 -0
- package/dist/entities/user-totp.entity.js.map +1 -1
- package/dist/entities/user.entity.d.ts +36 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +3 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/entrypoints/app.d.ts +438 -424
- package/dist/entrypoints/app.d.ts.map +1 -1
- package/dist/entrypoints/app.js +78 -6
- package/dist/entrypoints/app.js.map +1 -1
- package/dist/entrypoints/database/postgres/compiled-functions.d.ts +326 -200
- package/dist/entrypoints/database/postgres/compiled-functions.js +1849 -518
- package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
- package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +326 -200
- package/dist/entrypoints/database/sqlite/compiled-functions.js +1849 -518
- package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
- package/dist/entrypoints/database/sqlite/sqlite.d.ts.map +1 -1
- package/dist/entrypoints/database/sqlite/sqlite.js +1 -0
- package/dist/entrypoints/database/sqlite/sqlite.js.map +1 -1
- package/dist/entrypoints/scheduler/database.d.ts +3 -1
- package/dist/entrypoints/scheduler/database.d.ts.map +1 -1
- package/dist/entrypoints/scheduler/database.js +13 -2
- package/dist/entrypoints/scheduler/database.js.map +1 -1
- package/dist/entrypoints/scheduler/distributed-runner.d.ts +4 -0
- package/dist/entrypoints/scheduler/distributed-runner.d.ts.map +1 -1
- package/dist/entrypoints/scheduler/distributed-runner.js +26 -1
- package/dist/entrypoints/scheduler/distributed-runner.js.map +1 -1
- package/dist/lib/config/client.js +1 -1
- package/dist/lib/config/client.js.map +1 -1
- package/dist/lib/config/email.d.ts +1 -0
- package/dist/lib/config/email.d.ts.map +1 -1
- package/dist/lib/config/email.js.map +1 -1
- package/dist/lib/database/entities.d.ts.map +1 -1
- package/dist/lib/database/entities.js +6 -0
- package/dist/lib/database/entities.js.map +1 -1
- package/dist/lib/openapi.d.ts +2 -0
- package/dist/lib/openapi.d.ts.map +1 -1
- package/dist/lib/openapi.js +36 -1
- package/dist/lib/openapi.js.map +1 -1
- package/dist/lib/request-ip.d.ts +4 -0
- package/dist/lib/request-ip.d.ts.map +1 -0
- package/dist/lib/request-ip.js +39 -0
- package/dist/lib/request-ip.js.map +1 -0
- package/dist/middleware/auth-budget.d.ts +3 -0
- package/dist/middleware/auth-budget.d.ts.map +1 -0
- package/dist/middleware/auth-budget.js +80 -0
- package/dist/middleware/auth-budget.js.map +1 -0
- package/dist/middleware/session.d.ts +23 -5
- package/dist/middleware/session.d.ts.map +1 -1
- package/dist/middleware/session.js +152 -12
- package/dist/middleware/session.js.map +1 -1
- package/dist/middleware/strict-input.d.ts +4 -0
- package/dist/middleware/strict-input.d.ts.map +1 -0
- package/dist/middleware/strict-input.js +144 -0
- package/dist/middleware/strict-input.js.map +1 -0
- package/dist/migrations/postgres/Migration20260910120000_api_security.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260910120000_api_security.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260910120000_api_security.js +20 -0
- package/dist/migrations/postgres/Migration20260910120000_api_security.js.map +1 -0
- package/dist/migrations/postgres/Migration20260910160000_security_followup.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260910160000_security_followup.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260910160000_security_followup.js +23 -0
- package/dist/migrations/postgres/Migration20260910160000_security_followup.js.map +1 -0
- package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.js +28 -0
- package/dist/migrations/postgres/Migration20260910200000_authentication_epoch.js.map +1 -0
- package/dist/migrations/postgres/Migration20260910220000_flow_revocation.d.ts +6 -0
- package/dist/migrations/postgres/Migration20260910220000_flow_revocation.d.ts.map +1 -0
- package/dist/migrations/postgres/Migration20260910220000_flow_revocation.js +19 -0
- package/dist/migrations/postgres/Migration20260910220000_flow_revocation.js.map +1 -0
- package/dist/migrations/postgres/index.d.ts.map +1 -1
- package/dist/migrations/postgres/index.js +8 -0
- package/dist/migrations/postgres/index.js.map +1 -1
- package/dist/migrations/sqlite/Migration20260910120000_api_security.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260910120000_api_security.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260910120000_api_security.js +20 -0
- package/dist/migrations/sqlite/Migration20260910120000_api_security.js.map +1 -0
- package/dist/migrations/sqlite/Migration20260910160000_security_followup.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260910160000_security_followup.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260910160000_security_followup.js +23 -0
- package/dist/migrations/sqlite/Migration20260910160000_security_followup.js.map +1 -0
- package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.d.ts +8 -0
- package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.js +72 -0
- package/dist/migrations/sqlite/Migration20260910200000_authentication_epoch.js.map +1 -0
- package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.d.ts +6 -0
- package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.d.ts.map +1 -0
- package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.js +19 -0
- package/dist/migrations/sqlite/Migration20260910220000_flow_revocation.js.map +1 -0
- package/dist/migrations/sqlite/index.d.ts.map +1 -1
- package/dist/migrations/sqlite/index.js +8 -0
- package/dist/migrations/sqlite/index.js.map +1 -1
- package/dist/repositories/email-verification.repository.d.ts +1 -0
- package/dist/repositories/email-verification.repository.d.ts.map +1 -1
- package/dist/repositories/email-verification.repository.js +8 -17
- package/dist/repositories/email-verification.repository.js.map +1 -1
- package/dist/repositories/oauth-code.repository.d.ts +2 -0
- package/dist/repositories/oauth-code.repository.d.ts.map +1 -1
- package/dist/repositories/oauth-code.repository.js +8 -0
- package/dist/repositories/oauth-code.repository.js.map +1 -1
- package/dist/repositories/oauth-device-code.repository.d.ts +3 -0
- package/dist/repositories/oauth-device-code.repository.d.ts.map +1 -1
- package/dist/repositories/oauth-device-code.repository.js +64 -29
- package/dist/repositories/oauth-device-code.repository.js.map +1 -1
- package/dist/repositories/password-reset.repository.d.ts +1 -0
- package/dist/repositories/password-reset.repository.d.ts.map +1 -1
- package/dist/repositories/password-reset.repository.js +6 -19
- package/dist/repositories/password-reset.repository.js.map +1 -1
- package/dist/repositories/pending-oauth-registration.repository.d.ts +2 -0
- package/dist/repositories/pending-oauth-registration.repository.d.ts.map +1 -1
- package/dist/repositories/pending-oauth-registration.repository.js +16 -2
- package/dist/repositories/pending-oauth-registration.repository.js.map +1 -1
- package/dist/repositories/terms.repository.d.ts.map +1 -1
- package/dist/repositories/terms.repository.js +1 -0
- package/dist/repositories/terms.repository.js.map +1 -1
- package/dist/repositories/user-consent.repository.d.ts.map +1 -1
- package/dist/repositories/user-consent.repository.js +9 -3
- package/dist/repositories/user-consent.repository.js.map +1 -1
- package/dist/repositories/user-terms-consent.repository.d.ts.map +1 -1
- package/dist/repositories/user-terms-consent.repository.js +2 -0
- package/dist/repositories/user-terms-consent.repository.js.map +1 -1
- package/dist/repositories/user-totp-recovery-code.repository.d.ts +24 -0
- package/dist/repositories/user-totp-recovery-code.repository.d.ts.map +1 -1
- package/dist/repositories/user-totp.repository.d.ts +36 -0
- package/dist/repositories/user-totp.repository.d.ts.map +1 -1
- package/dist/routes/.well-known/openid-configuration/get.d.ts.map +1 -1
- package/dist/routes/.well-known/openid-configuration/get.js +5 -1
- package/dist/routes/.well-known/openid-configuration/get.js.map +1 -1
- package/dist/routes/api/admin/console/index.d.ts.map +1 -1
- package/dist/routes/api/admin/console/index.js +29 -14
- package/dist/routes/api/admin/console/index.js.map +1 -1
- package/dist/routes/api/admin/me/get.js +2 -3
- package/dist/routes/api/admin/me/get.js.map +1 -1
- package/dist/routes/api/admin/users/index.d.ts.map +1 -1
- package/dist/routes/api/admin/users/index.js +59 -52
- package/dist/routes/api/admin/users/index.js.map +1 -1
- package/dist/routes/api/auth/accounts/select.post.d.ts +6 -6
- package/dist/routes/api/auth/email/resend/post.d.ts.map +1 -1
- package/dist/routes/api/auth/email/resend/post.js +3 -24
- package/dist/routes/api/auth/email/resend/post.js.map +1 -1
- package/dist/routes/api/auth/email/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/email/verify/post.js +29 -12
- package/dist/routes/api/auth/email/verify/post.js.map +1 -1
- package/dist/routes/api/auth/login/post.d.ts.map +1 -1
- package/dist/routes/api/auth/login/post.js +4 -3
- package/dist/routes/api/auth/login/post.js.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/passkey/verify/post.js +25 -11
- package/dist/routes/api/auth/passkey/verify/post.js.map +1 -1
- package/dist/routes/api/auth/password/forgot/post.d.ts.map +1 -1
- package/dist/routes/api/auth/password/forgot/post.js +2 -19
- package/dist/routes/api/auth/password/forgot/post.js.map +1 -1
- package/dist/routes/api/auth/register/post.d.ts.map +1 -1
- package/dist/routes/api/auth/register/post.js +4 -3
- package/dist/routes/api/auth/register/post.js.map +1 -1
- package/dist/routes/api/auth/totp/recovery/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/totp/recovery/verify/post.js +7 -5
- package/dist/routes/api/auth/totp/recovery/verify/post.js.map +1 -1
- package/dist/routes/api/auth/totp/verify/post.d.ts.map +1 -1
- package/dist/routes/api/auth/totp/verify/post.js +7 -5
- package/dist/routes/api/auth/totp/verify/post.js.map +1 -1
- package/dist/routes/api/consent/get.d.ts +3 -0
- package/dist/routes/api/consent/get.d.ts.map +1 -1
- package/dist/routes/api/consent/get.js +26 -4
- package/dist/routes/api/consent/get.js.map +1 -1
- package/dist/routes/api/consent/index.d.ts +3 -0
- package/dist/routes/api/consent/index.d.ts.map +1 -1
- package/dist/routes/api/consent/post.d.ts.map +1 -1
- package/dist/routes/api/consent/post.js +142 -114
- package/dist/routes/api/consent/post.js.map +1 -1
- package/dist/routes/api/docs/get.d.ts.map +1 -1
- package/dist/routes/api/docs/get.js +8 -1
- package/dist/routes/api/docs/get.js.map +1 -1
- package/dist/routes/api/index.d.ts +382 -379
- package/dist/routes/api/index.d.ts.map +1 -1
- package/dist/routes/api/oauth/_provider/authorize/get.d.ts.map +1 -1
- package/dist/routes/api/oauth/_provider/authorize/get.js +5 -1
- package/dist/routes/api/oauth/_provider/authorize/get.js.map +1 -1
- package/dist/routes/api/oauth/_provider/callback/get.d.ts.map +1 -1
- package/dist/routes/api/oauth/_provider/callback/get.js +30 -6
- package/dist/routes/api/oauth/_provider/callback/get.js.map +1 -1
- package/dist/routes/api/oauth/_provider/callback/post.d.ts +9 -9
- package/dist/routes/api/oauth/_provider/callback/post.d.ts.map +1 -1
- package/dist/routes/api/oauth/_provider/callback/post.js +31 -31
- package/dist/routes/api/oauth/_provider/callback/post.js.map +1 -1
- package/dist/routes/api/oauth/_provider/delete.d.ts.map +1 -1
- package/dist/routes/api/oauth/_provider/delete.js +14 -11
- package/dist/routes/api/oauth/_provider/delete.js.map +1 -1
- package/dist/routes/api/terms/consent/post.d.ts.map +1 -1
- package/dist/routes/api/terms/consent/post.js +59 -43
- package/dist/routes/api/terms/consent/post.js.map +1 -1
- package/dist/routes/api/user/delete.d.ts.map +1 -1
- package/dist/routes/api/user/delete.js +8 -8
- package/dist/routes/api/user/delete.js.map +1 -1
- package/dist/routes/api/user/passkeys/_id/delete.d.ts.map +1 -1
- package/dist/routes/api/user/passkeys/_id/delete.js +17 -29
- package/dist/routes/api/user/passkeys/_id/delete.js.map +1 -1
- package/dist/routes/api/user/passkeys/_id/patch.d.ts.map +1 -1
- package/dist/routes/api/user/passkeys/_id/patch.js +16 -13
- package/dist/routes/api/user/passkeys/_id/patch.js.map +1 -1
- package/dist/routes/api/user/passkeys/register/verify/post.d.ts.map +1 -1
- package/dist/routes/api/user/passkeys/register/verify/post.js +27 -19
- package/dist/routes/api/user/passkeys/register/verify/post.js.map +1 -1
- package/dist/routes/api/user/password/delete.d.ts.map +1 -1
- package/dist/routes/api/user/password/delete.js +13 -10
- package/dist/routes/api/user/password/delete.js.map +1 -1
- package/dist/routes/api/user/password/post.d.ts.map +1 -1
- package/dist/routes/api/user/password/post.js +13 -10
- package/dist/routes/api/user/password/post.js.map +1 -1
- package/dist/routes/api/user/password/put.d.ts.map +1 -1
- package/dist/routes/api/user/password/put.js +13 -10
- package/dist/routes/api/user/password/put.js.map +1 -1
- package/dist/routes/api/user/totp/confirm/post.d.ts.map +1 -1
- package/dist/routes/api/user/totp/confirm/post.js +33 -18
- package/dist/routes/api/user/totp/confirm/post.js.map +1 -1
- package/dist/routes/api/user/totp/delete.d.ts.map +1 -1
- package/dist/routes/api/user/totp/delete.js +13 -18
- package/dist/routes/api/user/totp/delete.js.map +1 -1
- package/dist/routes/api/user/totp/recovery/regenerate/post.d.ts.map +1 -1
- package/dist/routes/api/user/totp/recovery/regenerate/post.js +13 -10
- package/dist/routes/api/user/totp/recovery/regenerate/post.js.map +1 -1
- package/dist/routes/api/user/totp/setup/post.d.ts.map +1 -1
- package/dist/routes/api/user/totp/setup/post.js +13 -8
- package/dist/routes/api/user/totp/setup/post.js.map +1 -1
- package/dist/routes/api/user/totp/verify/post.d.ts.map +1 -1
- package/dist/routes/api/user/totp/verify/post.js +23 -12
- package/dist/routes/api/user/totp/verify/post.js.map +1 -1
- package/dist/routes/index.d.ts +243 -230
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/oauth/authorize/get.d.ts.map +1 -1
- package/dist/routes/oauth/authorize/get.js +12 -4
- package/dist/routes/oauth/authorize/get.js.map +1 -1
- package/dist/routes/oauth/device/get-post.d.ts +10 -0
- package/dist/routes/oauth/device/get-post.d.ts.map +1 -1
- package/dist/routes/oauth/device/get-post.js +32 -3
- package/dist/routes/oauth/device/get-post.js.map +1 -1
- package/dist/routes/oauth/device-authorization/post.d.ts.map +1 -1
- package/dist/routes/oauth/device-authorization/post.js +13 -7
- package/dist/routes/oauth/device-authorization/post.js.map +1 -1
- package/dist/routes/oauth/end-session/get.d.ts +9 -9
- package/dist/routes/oauth/end-session/get.d.ts.map +1 -1
- package/dist/routes/oauth/end-session/get.js +2 -3
- package/dist/routes/oauth/end-session/get.js.map +1 -1
- package/dist/routes/oauth/index.d.ts +19 -9
- package/dist/routes/oauth/index.d.ts.map +1 -1
- package/dist/routes/oauth/revoke/post.d.ts.map +1 -1
- package/dist/routes/oauth/revoke/post.js +10 -2
- package/dist/routes/oauth/revoke/post.js.map +1 -1
- package/dist/routes/oauth/token/post.d.ts.map +1 -1
- package/dist/routes/oauth/token/post.js +69 -57
- package/dist/routes/oauth/token/post.js.map +1 -1
- package/dist/schemas/error.d.ts +75 -0
- package/dist/schemas/error.d.ts.map +1 -1
- package/dist/schemas/error.js +3 -0
- package/dist/schemas/error.js.map +1 -1
- package/dist/schemas/field.d.ts.map +1 -1
- package/dist/schemas/field.js +3 -0
- package/dist/schemas/field.js.map +1 -1
- package/dist/seeders/config.seeder.d.ts +1 -1
- package/dist/seeders/config.seeder.d.ts.map +1 -1
- package/dist/seeders/config.seeder.js +100 -36
- package/dist/seeders/config.seeder.js.map +1 -1
- package/dist/services/admin-console.service.d.ts.map +1 -1
- package/dist/services/admin-console.service.js +137 -100
- package/dist/services/admin-console.service.js.map +1 -1
- package/dist/services/auth-budget.service.d.ts +6 -0
- package/dist/services/auth-budget.service.d.ts.map +1 -0
- package/dist/services/auth-budget.service.js +30 -0
- package/dist/services/auth-budget.service.js.map +1 -0
- package/dist/services/authentication-epoch.d.ts +5 -0
- package/dist/services/authentication-epoch.d.ts.map +1 -0
- package/dist/services/authentication-epoch.js +22 -0
- package/dist/services/authentication-epoch.js.map +1 -0
- package/dist/services/authorization-browser.service.d.ts +18 -0
- package/dist/services/authorization-browser.service.d.ts.map +1 -0
- package/dist/services/authorization-browser.service.js +28 -0
- package/dist/services/authorization-browser.service.js.map +1 -0
- package/dist/services/browser-security.service.d.ts +14 -0
- package/dist/services/browser-security.service.d.ts.map +1 -0
- package/dist/services/browser-security.service.js +85 -0
- package/dist/services/browser-security.service.js.map +1 -0
- package/dist/services/browser-session.service.d.ts +25 -0
- package/dist/services/browser-session.service.d.ts.map +1 -0
- package/dist/services/browser-session.service.js +102 -0
- package/dist/services/browser-session.service.js.map +1 -0
- package/dist/services/cleanup.service.d.ts +1 -0
- package/dist/services/cleanup.service.d.ts.map +1 -1
- package/dist/services/cleanup.service.js +31 -0
- package/dist/services/cleanup.service.js.map +1 -1
- package/dist/services/client-security.d.ts +641 -0
- package/dist/services/client-security.d.ts.map +1 -0
- package/dist/services/client-security.js +10 -0
- package/dist/services/client-security.js.map +1 -0
- package/dist/services/container.d.ts +2 -0
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +7 -3
- package/dist/services/container.js.map +1 -1
- package/dist/services/email.service.d.ts +2 -14
- package/dist/services/email.service.d.ts.map +1 -1
- package/dist/services/email.service.js +35 -29
- package/dist/services/email.service.js.map +1 -1
- package/dist/services/jwt.service.d.ts +1 -0
- package/dist/services/jwt.service.d.ts.map +1 -1
- package/dist/services/jwt.service.js +13 -1
- package/dist/services/jwt.service.js.map +1 -1
- package/dist/services/mail-queue.service.d.ts +24 -0
- package/dist/services/mail-queue.service.d.ts.map +1 -0
- package/dist/services/mail-queue.service.js +223 -0
- package/dist/services/mail-queue.service.js.map +1 -0
- package/dist/services/mikro.service.d.ts.map +1 -1
- package/dist/services/mikro.service.js +2 -0
- package/dist/services/mikro.service.js.map +1 -1
- package/dist/services/oauth-authorize.service.d.ts +6 -1
- package/dist/services/oauth-authorize.service.d.ts.map +1 -1
- package/dist/services/oauth-authorize.service.js +136 -77
- package/dist/services/oauth-authorize.service.js.map +1 -1
- package/dist/services/oauth-browser-security.service.d.ts +7 -0
- package/dist/services/oauth-browser-security.service.d.ts.map +1 -0
- package/dist/services/oauth-browser-security.service.js +67 -0
- package/dist/services/oauth-browser-security.service.js.map +1 -0
- package/dist/services/oauth-client.service.d.ts +24 -1
- package/dist/services/oauth-client.service.d.ts.map +1 -1
- package/dist/services/oauth-client.service.js +52 -13
- package/dist/services/oauth-client.service.js.map +1 -1
- package/dist/services/oauth-connect.service.d.ts +37 -3
- package/dist/services/oauth-connect.service.d.ts.map +1 -1
- package/dist/services/oauth-connect.service.js +236 -212
- package/dist/services/oauth-connect.service.js.map +1 -1
- package/dist/services/oauth-token.service.d.ts +6 -4
- package/dist/services/oauth-token.service.d.ts.map +1 -1
- package/dist/services/oauth-token.service.js +295 -209
- package/dist/services/oauth-token.service.js.map +1 -1
- package/dist/services/passkey.service.d.ts +26 -7
- package/dist/services/passkey.service.d.ts.map +1 -1
- package/dist/services/passkey.service.js +71 -42
- package/dist/services/passkey.service.js.map +1 -1
- package/dist/services/password-auth.service.d.ts +5 -1
- package/dist/services/password-auth.service.d.ts.map +1 -1
- package/dist/services/password-auth.service.js +79 -52
- package/dist/services/password-auth.service.js.map +1 -1
- package/dist/services/password-reset.service.d.ts.map +1 -1
- package/dist/services/password-reset.service.js +34 -15
- package/dist/services/password-reset.service.js.map +1 -1
- package/dist/services/security.service.d.ts +3 -1
- package/dist/services/security.service.d.ts.map +1 -1
- package/dist/services/security.service.js +11 -2
- package/dist/services/security.service.js.map +1 -1
- package/dist/services/terms-policy.service.d.ts +7 -0
- package/dist/services/terms-policy.service.d.ts.map +1 -0
- package/dist/services/terms-policy.service.js +26 -0
- package/dist/services/terms-policy.service.js.map +1 -0
- package/dist/services/terms.service.d.ts.map +1 -1
- package/dist/services/terms.service.js +3 -2
- package/dist/services/terms.service.js.map +1 -1
- package/dist/services/totp.service.d.ts +4 -5
- package/dist/services/totp.service.d.ts.map +1 -1
- package/dist/services/totp.service.js +116 -86
- package/dist/services/totp.service.js.map +1 -1
- package/dist/services/user-consent.service.d.ts +12 -0
- package/dist/services/user-consent.service.d.ts.map +1 -1
- package/dist/services/user-consent.service.js +19 -1
- package/dist/services/user-consent.service.js.map +1 -1
- package/dist/services/user-security.service.d.ts +15 -0
- package/dist/services/user-security.service.d.ts.map +1 -0
- package/dist/services/user-security.service.js +57 -0
- package/dist/services/user-security.service.js.map +1 -0
- package/dist/services/user.service.d.ts +6 -4
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +143 -121
- package/dist/services/user.service.js.map +1 -1
- package/frontend/client/assets/{auth-layout-B4h13HhN.js → auth-layout-sea6nww4.js} +1 -1
- package/frontend/client/assets/{auth-page-header-BVY4zRzF.js → auth-page-header-CV85AJLW.js} +1 -1
- package/frontend/client/assets/document-navigation-FZbb5ldf.js +1 -0
- package/frontend/client/assets/i18n-vfKY-byx.js +1 -0
- package/frontend/client/assets/language-selector-Jso2cQNI.js +1 -0
- package/frontend/client/assets/manifest-90703545.js +1 -0
- package/frontend/client/assets/oauth-search-DebNssaC.js +1 -0
- package/frontend/client/assets/{passkey-CWcdr7Vy.js → passkey-CJhT-7yO.js} +1 -1
- package/frontend/client/assets/{promise-EbDcmV0j.js → promise-BP9iSIs-.js} +1 -1
- package/frontend/client/assets/{root-C2SlHCkE.js → root-BkavuloG.js} +1 -1
- package/frontend/client/assets/{route-3gQ9Nsqa.js → route-B0udr9eT.js} +1 -1
- package/frontend/client/assets/route-B3Uv9aTa.js +1 -0
- package/frontend/client/assets/{route-DSD60oyb.js → route-B6hIfgxz.js} +1 -1
- package/frontend/client/assets/{route-DO38I3ML.js → route-BEWds2g-.js} +1 -1
- package/frontend/client/assets/route-Bm9LsorH.js +1 -0
- package/frontend/client/assets/route-Btv5Y69z.js +1 -0
- package/frontend/client/assets/route-BvyDzziE.js +1 -0
- package/frontend/client/assets/route-C6kG9u7j.js +1 -0
- package/frontend/client/assets/route-C7C3Z0vI.js +1 -0
- package/frontend/client/assets/{route-DQpLeFuG.js → route-CVyefM3x.js} +1 -1
- package/frontend/client/assets/{route-CkpB3-_U.js → route-CXth2Wqz.js} +1 -1
- package/frontend/client/assets/{route-9FLiqn21.js → route-Clxc1C2d.js} +1 -1
- package/frontend/client/assets/route-D0IqOurp.js +1 -0
- package/frontend/client/assets/route-DHmYUnJR.js +1 -0
- package/frontend/client/assets/route-DTjZQ_Fl.js +1 -0
- package/frontend/client/assets/route-D_dTeu1b.js +1 -0
- package/frontend/client/assets/{route-CrswLAAa.js → route-Dj8gVemC.js} +1 -1
- package/frontend/client/assets/{route-BUM2hTU8.js → route-DnhPlHOi.js} +1 -1
- package/frontend/client/assets/route-FY92YQhF.js +1 -0
- package/frontend/client/assets/{route-DH6kQz8L.js → route-PcLpZHbT.js} +1 -1
- package/frontend/client/assets/{route-bKG0wKRh.js → route-qpE7i22X.js} +1 -1
- package/frontend/client/assets/{route-3IIrVTOK.js → route-wK89gmoS.js} +1 -1
- package/frontend/client/assets/security-error-message-CMsTsiWf.js +1 -0
- package/frontend/client/assets/{shell-header-bar-Bg85QIAq.js → shell-header-bar-DRx10tE5.js} +1 -1
- package/frontend/client/assets/{terms-DV0oDTRf.js → terms-Bu9Itxxs.js} +1 -1
- package/frontend/client/assets/{use-totp-setup-D7XZ6Nos.js → use-totp-setup-CoOXWOcT.js} +1 -1
- package/frontend/server/assets/{hydration-Cvbp7-6s.js → hydration-DWMjpNav.js} +1 -1
- package/frontend/server/assets/{root-loader.server-DaTcVcNU.js → root-loader.server-B4OqoLGG.js} +3 -3
- package/frontend/server/assets/{route-runtime.server-CEa264cW.js → route-runtime.server-03_pjVDT.js} +1 -1
- package/frontend/server/assets/{session-QqvIIQ6R.js → session-sJkmzJie.js} +51 -57
- package/frontend/server/index.js +337 -403
- package/package.json +1 -1
- package/frontend/client/assets/authorization-context-banner-az4f8FCY.js +0 -1
- package/frontend/client/assets/document-navigation-Cnp3Alf0.js +0 -1
- package/frontend/client/assets/i18n-CMepi_uj.js +0 -1
- package/frontend/client/assets/language-selector-Chn-k7Pw.js +0 -1
- package/frontend/client/assets/manifest-8c4a603f.js +0 -1
- package/frontend/client/assets/oauth-search-DybZ6VWp.js +0 -1
- package/frontend/client/assets/route-BFU8OK2a.js +0 -1
- package/frontend/client/assets/route-BKI6LDOW.js +0 -1
- package/frontend/client/assets/route-CusK9Y2K.js +0 -1
- package/frontend/client/assets/route-DEVG2czp.js +0 -1
- package/frontend/client/assets/route-DjCJn53Y.js +0 -1
- package/frontend/client/assets/route-E-_SSP-x.js +0 -1
- package/frontend/client/assets/route-J9z_OG4L.js +0 -1
- package/frontend/client/assets/route-LjqDZz5f.js +0 -1
- package/frontend/client/assets/route-N586tYcn.js +0 -1
- package/frontend/client/assets/route-nHjY3_n0.js +0 -1
- package/frontend/client/assets/route-sHm4cfOd.js +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { e } from '../schemas/error.js';
|
|
2
|
+
import { withUserSecurity } from './user-security.service.js';
|
|
2
3
|
export class PasswordResetService {
|
|
3
4
|
mikro;
|
|
4
5
|
passwordAuthService;
|
|
@@ -11,11 +12,14 @@ export class PasswordResetService {
|
|
|
11
12
|
* Invalidates all previous unused tokens
|
|
12
13
|
*/
|
|
13
14
|
async generateToken(params) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
return withUserSecurity(this.mikro, params.userSub, async (user) => {
|
|
16
|
+
const token = await this.mikro.passwordReset.generateToken({
|
|
17
|
+
userSub: params.userSub,
|
|
18
|
+
userEpoch: user.token_epoch,
|
|
19
|
+
expiresInHours: params.expiresInHours || 1,
|
|
20
|
+
});
|
|
21
|
+
return token;
|
|
17
22
|
});
|
|
18
|
-
return token;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Request password reset for an email
|
|
@@ -37,18 +41,33 @@ export class PasswordResetService {
|
|
|
37
41
|
* Verifies token and updates user password
|
|
38
42
|
*/
|
|
39
43
|
async resetPassword(params) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
failHandler: () => new e.UserNotFound.Error(),
|
|
44
|
+
const candidate = await this.mikro.passwordReset.findOne({
|
|
45
|
+
token: params.token,
|
|
46
|
+
used: false,
|
|
47
|
+
revoked_at: null,
|
|
48
|
+
expiresAt: { $gt: new Date() },
|
|
46
49
|
});
|
|
47
|
-
if (
|
|
48
|
-
throw new e.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
if (!candidate)
|
|
51
|
+
throw new e.InvalidPasswordResetToken.Error();
|
|
52
|
+
return withUserSecurity(this.mikro, candidate.user.sub, async (freshUser) => {
|
|
53
|
+
if (freshUser.deleted_at ||
|
|
54
|
+
candidate.user_epoch !== freshUser.token_epoch)
|
|
55
|
+
throw new e.InvalidPasswordResetToken.Error();
|
|
56
|
+
const resetEntity = await this.mikro.passwordReset.verifyToken(params.token);
|
|
57
|
+
if (!resetEntity) {
|
|
58
|
+
throw new e.InvalidPasswordResetToken.Error();
|
|
59
|
+
}
|
|
60
|
+
const user = await resetEntity.user.loadOrFail({
|
|
61
|
+
failHandler: () => new e.UserNotFound.Error(),
|
|
62
|
+
});
|
|
63
|
+
if (user.deleted_at)
|
|
64
|
+
throw new e.InvalidPasswordResetToken.Error();
|
|
65
|
+
if (user.managed_by === 'config') {
|
|
66
|
+
throw new e.UserNotEditable.Error();
|
|
67
|
+
}
|
|
68
|
+
await this.passwordAuthService.replacePassword(user, params.password);
|
|
69
|
+
return user;
|
|
70
|
+
}, { includeDeleted: true });
|
|
52
71
|
}
|
|
53
72
|
}
|
|
54
73
|
//# sourceMappingURL=password-reset.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset.service.js","sourceRoot":"","sources":["../../src/services/password-reset.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"password-reset.service.js","sourceRoot":"","sources":["../../src/services/password-reset.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { IssuaryRuntimeConfig } from '../lib/config/index.ts';
|
|
2
|
-
export type OpaquePurpose = 'oauth-code' | 'oauth-device-code' | 'oauth-device-user-code' | 'totp-recovery';
|
|
2
|
+
export type OpaquePurpose = 'oauth-client-authentication' | 'oauth-code' | 'oauth-device-code' | 'oauth-device-user-code' | 'totp-recovery' | 'auth-budget' | 'mail-queue';
|
|
3
3
|
export declare class SecurityService {
|
|
4
4
|
private readonly hashMasterSecret;
|
|
5
5
|
private readonly pbkdf2Iterations;
|
|
6
6
|
private readonly purposeKeyCache;
|
|
7
7
|
constructor(config: IssuaryRuntimeConfig);
|
|
8
|
+
sealMailPayload(payload: string): Promise<string>;
|
|
9
|
+
openMailPayload(payload: string): Promise<string | null>;
|
|
8
10
|
private resolvePurposeKey;
|
|
9
11
|
private hashPbkdf2Secret;
|
|
10
12
|
private verifyPbkdf2Secret;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.service.d.ts","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"security.service.d.ts","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAqBnE,MAAM,MAAM,aAAa,GACrB,6BAA6B,GAC7B,YAAY,GACZ,mBAAmB,GACnB,wBAAwB,GACxB,eAAe,GACf,aAAa,GACb,YAAY,CAAC;AAkBjB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0C;IAE1E,YAAmB,MAAM,EAAE,oBAAoB,EAQ9C;IAEY,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7D;IACY,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKpE;YAEa,iBAAiB;YAiBjB,gBAAgB;YAyBhB,kBAAkB;IAyBnB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE3D;IAEY,cAAc,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;IAEY,kBAAkB,CAC7B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC,CAElB;IAEY,eAAe,CAC1B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CASjB;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { fromBase64Url } from '../lib/base64url.js';
|
|
2
|
-
import { derivePbkdf2Bytes, derivePurposeKeyBytes, formatOpaqueHash, formatPbkdf2Hash, getRandomBytes, parsePbkdf2Hash, signOpaqueValue, timingSafeEqualBytes, } from '../lib/crypto.js';
|
|
1
|
+
import { bytesToHex, fromBase64Url } from '../lib/base64url.js';
|
|
2
|
+
import { decrypt, derivePbkdf2Bytes, derivePurposeKeyBytes, encrypt, formatOpaqueHash, formatPbkdf2Hash, getRandomBytes, parsePbkdf2Hash, signOpaqueValue, timingSafeEqualBytes, } from '../lib/crypto.js';
|
|
3
3
|
const PBKDF2_ALGORITHM = 'pbkdf2-sha256';
|
|
4
4
|
const HMAC_ALGORITHM = 'hmac-sha256';
|
|
5
5
|
const CURRENT_HASH_FORMAT_VERSION = 2;
|
|
@@ -11,9 +11,12 @@ const HASH_POLICY = {
|
|
|
11
11
|
password: 'password-v2',
|
|
12
12
|
'client-secret': 'client-secret-v2',
|
|
13
13
|
'oauth-code': 'oauth-code-v2',
|
|
14
|
+
'oauth-client-authentication': 'oauth-client-authentication-v1',
|
|
14
15
|
'oauth-device-code': 'oauth-device-code-v2',
|
|
15
16
|
'oauth-device-user-code': 'oauth-device-user-code-v2',
|
|
16
17
|
'totp-recovery': 'totp-recovery-v2',
|
|
18
|
+
'auth-budget': 'auth-budget-v1',
|
|
19
|
+
'mail-queue': 'mail-queue-v1',
|
|
17
20
|
},
|
|
18
21
|
};
|
|
19
22
|
export class SecurityService {
|
|
@@ -28,6 +31,12 @@ export class SecurityService {
|
|
|
28
31
|
this.hashMasterSecret = decodedSecret;
|
|
29
32
|
this.pbkdf2Iterations = config.security.pbkdf2_iterations;
|
|
30
33
|
}
|
|
34
|
+
async sealMailPayload(payload) {
|
|
35
|
+
return encrypt(payload, bytesToHex(await this.resolvePurposeKey('mail-queue')));
|
|
36
|
+
}
|
|
37
|
+
async openMailPayload(payload) {
|
|
38
|
+
return decrypt(payload, bytesToHex(await this.resolvePurposeKey('mail-queue')));
|
|
39
|
+
}
|
|
31
40
|
async resolvePurposeKey(purpose) {
|
|
32
41
|
const cached = this.purposeKeyCache.get(purpose);
|
|
33
42
|
if (cached) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"security.service.js","sourceRoot":"","sources":["../../src/services/security.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type EntityManager } from '@mikro-orm/core';
|
|
2
|
+
export type TermsPolicyAccess = 'read' | 'write';
|
|
3
|
+
/** Initialize before serving requests, even when config seeding is disabled. */
|
|
4
|
+
export declare function initializeTermsPolicy(em: EntityManager): Promise<void>;
|
|
5
|
+
/** Acquire before user/session/client locks; the transaction owns its lifetime. */
|
|
6
|
+
export declare function lockTermsPolicy(em: EntityManager, access: TermsPolicyAccess): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=terms-policy.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms-policy.service.d.ts","sourceRoot":"","sources":["../../src/services/terms-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,iBAAiB,CAAC;AAKpE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5E;AAED,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,EAAE,EAAE,aAAa,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LockMode, raw } from '@mikro-orm/core';
|
|
2
|
+
import { PostgreSqlPlatform } from '@mikro-orm/postgresql';
|
|
3
|
+
import { BootstrapStateEntitySchema } from '../entities/bootstrap-state.entity.js';
|
|
4
|
+
const TERMS_POLICY_LOCK = 'terms-policy-lock';
|
|
5
|
+
/** Initialize before serving requests, even when config seeding is disabled. */
|
|
6
|
+
export async function initializeTermsPolicy(em) {
|
|
7
|
+
await em.upsert(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK, value: '1' }, { onConflictFields: ['id'], onConflictAction: 'ignore' });
|
|
8
|
+
}
|
|
9
|
+
/** Acquire before user/session/client locks; the transaction owns its lifetime. */
|
|
10
|
+
export async function lockTermsPolicy(em, access) {
|
|
11
|
+
if (!em.isInTransaction())
|
|
12
|
+
throw new Error('Terms policy requires a transaction');
|
|
13
|
+
if (em.getPlatform() instanceof PostgreSqlPlatform) {
|
|
14
|
+
await em.findOneOrFail(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK }, {
|
|
15
|
+
refresh: true,
|
|
16
|
+
lockMode: access === 'read'
|
|
17
|
+
? LockMode.PESSIMISTIC_READ
|
|
18
|
+
: LockMode.PESSIMISTIC_WRITE,
|
|
19
|
+
});
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const changed = await em.nativeUpdate(BootstrapStateEntitySchema, { id: TERMS_POLICY_LOCK }, { value: raw('value') });
|
|
23
|
+
if (changed !== 1)
|
|
24
|
+
throw new Error('Terms policy lock is not initialized');
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=terms-policy.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terms-policy.service.js","sourceRoot":"","sources":["../../src/services/terms-policy.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAEnF,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAG9C,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAiB;IAC3D,MAAM,EAAE,CAAC,MAAM,CACb,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,EACrC,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CACzD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAiB,EACjB,MAAyB;IAEzB,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,kBAAkB,EAAE,CAAC;QACnD,MAAM,EAAE,CAAC,aAAa,CACpB,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,EACzB;YACE,OAAO,EAAE,IAAI;YACb,QAAQ,EACN,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,QAAQ,CAAC,gBAAgB;gBAC3B,CAAC,CAAC,QAAQ,CAAC,iBAAiB;SACjC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CACnC,0BAA0B,EAC1B,EAAE,EAAE,EAAE,iBAAiB,EAAE,EACzB,EAAE,KAAK,EAAE,GAAG,CAAS,OAAO,CAAC,EAAE,CAChC,CAAC;IACF,IAAI,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.service.d.ts","sourceRoot":"","sources":["../../src/services/terms.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,KAAK,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;IAC5C,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,YAAmB,KAAK,EAAE,YAAY,EAErC;IAED;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAEpD;IAED;;OAEG;IACI,mBAAmB,CACxB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,GACX,oBAAoB,GAAG,IAAI,CAe7B;IAED;;OAEG;IACU,yBAAyB,CACpC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmC9B;IAED;;;;OAIG;IACI,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"terms.service.d.ts","sourceRoot":"","sources":["../../src/services/terms.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,KAAK,WAAW,GAAG,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;IAC5C,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,UAAU,GAAG,UAAU,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,YAAmB,KAAK,EAAE,YAAY,EAErC;IAED;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAEpD;IAED;;OAEG;IACI,mBAAmB,CACxB,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,MAAM,GACX,oBAAoB,GAAG,IAAI,CAe7B;IAED;;OAEG;IACU,yBAAyB,CACpC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmC9B;IAED;;;;OAIG;IACI,4BAA4B,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAQxE;IAED;;;OAGG;IACU,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBtE;IAED;;;OAGG;IACU,cAAc,CAAC,MAAM,EAAE;QAClC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,KAAK,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,OAAO,CAAC;YAChB,WAAW,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;SACnD,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;KACvB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA2BpC;IAED;;;;;OAKG;IACU,sBAAsB,CAAC,MAAM,EAAE;QAC1C,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;KACvB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAmBpC;IAED;;;;OAIG;IACU,gBAAgB,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAG3E;IAED;;;;;OAKG;IACU,wBAAwB,CACnC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,EACrD,KAAK,CAAC,EAAE,WAAW,EAAE,GACpB,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAqBrD;IAED;;;OAGG;IACU,yBAAyB,CAAC,MAAM,EAAE;QAC7C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACvD,GAAG,OAAO,CAAC;QACV,UAAU,EAAE;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACvD,OAAO,EAAE,sBAAsB,EAAE,CAAC;KACnC,CAAC,CAgCD;CACF"}
|
|
@@ -68,7 +68,8 @@ export class TermsService {
|
|
|
68
68
|
*/
|
|
69
69
|
getPendingFromLocalizedTerms(terms) {
|
|
70
70
|
return terms
|
|
71
|
-
.filter((t) => t.required &&
|
|
71
|
+
.filter((t) => t.required &&
|
|
72
|
+
(!t.userConsent?.agreed || t.userConsent.requiresUpdate))
|
|
72
73
|
.map((t) => t.id);
|
|
73
74
|
}
|
|
74
75
|
/**
|
|
@@ -84,7 +85,7 @@ export class TermsService {
|
|
|
84
85
|
continue;
|
|
85
86
|
}
|
|
86
87
|
const consent = consentsMap.get(term.id);
|
|
87
|
-
if (!consent) {
|
|
88
|
+
if (!consent?.agreed) {
|
|
88
89
|
pending.push(term.id);
|
|
89
90
|
continue;
|
|
90
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terms.service.js","sourceRoot":"","sources":["../../src/services/terms.service.ts"],"names":[],"mappings":"AAiDA,MAAM,OAAO,YAAY;IACN,KAAK,CAAe;IACrC,YAAmB,KAAmB;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,mBAAmB,CACxB,IAAiB,EACjB,IAAY;QAEZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,yBAAyB,CACpC,MAAqB,EACrB,IAAY;QAEZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,IAAI,WAAW,GAAG,IAAI,GAAG,EAAkC,CAAC;QAC5D,IAAI,MAAM,EAAE,CAAC;YACX,WAAW;gBACT,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEzC,IAAI,WAAW,GAA4B,IAAI,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,GAAG;oBACZ,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,aAAa,EAAE,OAAO,CAAC,YAAY;oBACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,cAAc,EAAE,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,OAAO;iBACtD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE;gBAChC,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,MAAM;gBAC7B,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC/B,WAAW;aACZ,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,4BAA4B,CAAC,KAA0B;QAC5D,OAAO,KAAK;aACT,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"terms.service.js","sourceRoot":"","sources":["../../src/services/terms.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,7 @@ export declare class TotpService {
|
|
|
35
35
|
* Verify a TOTP token against a secret
|
|
36
36
|
*/
|
|
37
37
|
verifyToken(token: string, secret: string): boolean;
|
|
38
|
+
private consumeToken;
|
|
38
39
|
/**
|
|
39
40
|
* Generate a TOTP token for a secret (used for testing)
|
|
40
41
|
*/
|
|
@@ -43,7 +44,8 @@ export declare class TotpService {
|
|
|
43
44
|
* Start TOTP setup for a user
|
|
44
45
|
* Creates or updates unverified TOTP record
|
|
45
46
|
*/
|
|
46
|
-
|
|
47
|
+
prepareSetup(user: UserEntity): Promise<TotpSetupData>;
|
|
48
|
+
startSetup(user: UserEntity, prepared?: TotpSetupData): Promise<TotpSetupData>;
|
|
47
49
|
/**
|
|
48
50
|
* Verify and complete TOTP setup.
|
|
49
51
|
* Also generates recovery codes upon successful verification.
|
|
@@ -60,10 +62,7 @@ export declare class TotpService {
|
|
|
60
62
|
* Disable TOTP for a user
|
|
61
63
|
* Also deletes all recovery codes
|
|
62
64
|
*/
|
|
63
|
-
disable(userId: string, token: string
|
|
64
|
-
secondFactorRequired: boolean;
|
|
65
|
-
hasOtherSecondFactor: boolean;
|
|
66
|
-
}): Promise<void>;
|
|
65
|
+
disable(userId: string, token: string): Promise<void>;
|
|
67
66
|
verifyForAuth(userId: string, token: string): Promise<void>;
|
|
68
67
|
/**
|
|
69
68
|
* Generate a single recovery code in the format XXXX-XXXX-XXXX-XXXX.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"totp.service.d.ts","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,YACE,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,eAAe,EAAE,eAAe,EAKjC;IAED;;OAEG;IACI,cAAc,IAAI,MAAM,CAE9B;IAED;;OAEG;IACI,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ/D;IAED;;OAEG;IACU,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;IAED;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUzD;YAEa,YAAY;IAyB1B;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3C;IAED;;;OAGG;IACU,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAMlE;IAEY,UAAU,CACrB,IAAI,EAAE,UAAU,EAChB,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,aAAa,CAAC,CAoCxB;IAED;;;;;OAKG;IACU,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BzE;IAED;;;OAGG;IACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcvD;IAED;;;OAGG;IACU,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjE;IAEY,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvE;IAED;;OAEG;IACI,0BAA0B,IAAI,MAAM,CAe1C;IAED;;;;;OAKG;IACU,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BtE;IAED;;;OAGG;IACU,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E;IAEY,uBAAuB,CAClC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBnB;CACF"}
|
|
@@ -2,6 +2,7 @@ import { generateSecret, generateSync, generateURI, verifySync } from 'otplib';
|
|
|
2
2
|
import qrcode from 'qrcode';
|
|
3
3
|
import { getRandomBytes } from '../lib/crypto.js';
|
|
4
4
|
import { e } from '../schemas/error.js';
|
|
5
|
+
import { withUserSecurity } from './user-security.service.js';
|
|
5
6
|
/** Number of recovery codes to generate */
|
|
6
7
|
const RECOVERY_CODE_COUNT = 8;
|
|
7
8
|
const RECOVERY_CODE_ALPHABET = 'ABCDEFGHJKMNPQRSTVWXYZ23456789';
|
|
@@ -54,6 +55,25 @@ export class TotpService {
|
|
|
54
55
|
throw new e.InvalidTotpCode.Error();
|
|
55
56
|
}
|
|
56
57
|
}
|
|
58
|
+
async consumeToken(token, totp) {
|
|
59
|
+
const result = verifySync({
|
|
60
|
+
token,
|
|
61
|
+
secret: totp.secret,
|
|
62
|
+
epochTolerance: 1,
|
|
63
|
+
});
|
|
64
|
+
if (!result.valid || !('timeStep' in result))
|
|
65
|
+
throw new e.InvalidTotpCode.Error();
|
|
66
|
+
const changed = await this.mikro.userTotp.nativeUpdate({
|
|
67
|
+
id: totp.id,
|
|
68
|
+
secret: totp.secret,
|
|
69
|
+
$or: [
|
|
70
|
+
{ last_used_step: null },
|
|
71
|
+
{ last_used_step: { $lt: result.timeStep } },
|
|
72
|
+
],
|
|
73
|
+
}, { last_used_step: result.timeStep });
|
|
74
|
+
if (changed !== 1)
|
|
75
|
+
throw new e.InvalidTotpCode.Error();
|
|
76
|
+
}
|
|
57
77
|
/**
|
|
58
78
|
* Generate a TOTP token for a secret (used for testing)
|
|
59
79
|
*/
|
|
@@ -64,34 +84,42 @@ export class TotpService {
|
|
|
64
84
|
* Start TOTP setup for a user
|
|
65
85
|
* Creates or updates unverified TOTP record
|
|
66
86
|
*/
|
|
67
|
-
async
|
|
68
|
-
const existingTotp = await this.mikro.userTotp.findByUserSub(user.sub);
|
|
69
|
-
// Only throw if TOTP is fully registered (verified AND recovery confirmed)
|
|
70
|
-
// If user verified but didn't confirm recovery codes, allow re-setup
|
|
71
|
-
if (existingTotp?.verified && existingTotp?.recovery_confirmed) {
|
|
72
|
-
throw new e.TotpAlreadyEnabled.Error();
|
|
73
|
-
}
|
|
87
|
+
async prepareSetup(user) {
|
|
74
88
|
const secret = this.generateSecret();
|
|
75
89
|
const otpauthUrl = this.generateOtpAuthUrl(user.email, secret);
|
|
76
90
|
const qrCodeDataUrl = await this.generateQrCode(otpauthUrl);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
user
|
|
86
|
-
|
|
91
|
+
return { secret, otpauthUrl, qrCodeDataUrl };
|
|
92
|
+
}
|
|
93
|
+
async startSetup(user, prepared) {
|
|
94
|
+
const { secret, otpauthUrl, qrCodeDataUrl } = prepared ?? (await this.prepareSetup(user));
|
|
95
|
+
return withUserSecurity(this.mikro, user.sub, async (freshUser) => {
|
|
96
|
+
user = freshUser;
|
|
97
|
+
const existingTotp = await this.mikro.userTotp.findByUserSub(user.sub);
|
|
98
|
+
// Only throw if TOTP is fully registered (verified AND recovery confirmed)
|
|
99
|
+
// If user verified but didn't confirm recovery codes, allow re-setup
|
|
100
|
+
if (existingTotp?.verified && existingTotp?.recovery_confirmed) {
|
|
101
|
+
throw new e.TotpAlreadyEnabled.Error();
|
|
102
|
+
}
|
|
103
|
+
// If there's an existing unverified TOTP, delete it first to avoid
|
|
104
|
+
// unique constraint violation (handles race conditions and retries)
|
|
105
|
+
if (existingTotp) {
|
|
106
|
+
await this.mikro.userTotp.nativeDelete({ user: { sub: user.sub } });
|
|
107
|
+
this.mikro.em.clear();
|
|
108
|
+
}
|
|
109
|
+
await this.mikro.userTotpRecoveryCode.deleteByUserSub(user.sub);
|
|
110
|
+
// Create new TOTP record
|
|
111
|
+
const totp = this.mikro.userTotp.create({
|
|
112
|
+
user: user.sub,
|
|
113
|
+
secret: secret,
|
|
114
|
+
});
|
|
115
|
+
this.mikro.em.persist(totp);
|
|
116
|
+
await this.mikro.em.flush();
|
|
117
|
+
return {
|
|
118
|
+
secret,
|
|
119
|
+
otpauthUrl,
|
|
120
|
+
qrCodeDataUrl,
|
|
121
|
+
};
|
|
87
122
|
});
|
|
88
|
-
this.mikro.em.persist(totp);
|
|
89
|
-
await this.mikro.em.flush();
|
|
90
|
-
return {
|
|
91
|
-
secret,
|
|
92
|
-
otpauthUrl,
|
|
93
|
-
qrCodeDataUrl,
|
|
94
|
-
};
|
|
95
123
|
}
|
|
96
124
|
/**
|
|
97
125
|
* Verify and complete TOTP setup.
|
|
@@ -100,70 +128,74 @@ export class TotpService {
|
|
|
100
128
|
* @returns Array of plain-text recovery codes (shown only once)
|
|
101
129
|
*/
|
|
102
130
|
async verifySetup(userId, token) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
131
|
+
return withUserSecurity(this.mikro, userId, async () => {
|
|
132
|
+
const totp = await this.mikro.userTotp.findByUserSub(userId);
|
|
133
|
+
if (!totp) {
|
|
134
|
+
throw new e.TotpNotSetup.Error();
|
|
135
|
+
}
|
|
136
|
+
// Only throw if TOTP is fully registered (verified AND recovery confirmed)
|
|
137
|
+
// If user verified but didn't confirm recovery codes, allow re-verification
|
|
138
|
+
if (totp.verified && totp.recovery_confirmed) {
|
|
139
|
+
throw new e.TotpAlreadyEnabled.Error();
|
|
140
|
+
}
|
|
141
|
+
await this.consumeToken(token, totp);
|
|
142
|
+
// Flush verified status before generating recovery codes,
|
|
143
|
+
// because generateRecoveryCodes calls em.clear() which
|
|
144
|
+
// would discard the pending verified change.
|
|
145
|
+
totp.verified = true;
|
|
146
|
+
await this.mikro.em.flush();
|
|
147
|
+
// Generate recovery codes on TOTP setup completion
|
|
148
|
+
const user = await this.mikro.user.findOneOrFail({
|
|
149
|
+
sub: userId,
|
|
150
|
+
});
|
|
151
|
+
const recoveryCodes = await this.generateRecoveryCodes(user);
|
|
152
|
+
return recoveryCodes;
|
|
123
153
|
});
|
|
124
|
-
const recoveryCodes = await this.generateRecoveryCodes(user);
|
|
125
|
-
return recoveryCodes;
|
|
126
154
|
}
|
|
127
155
|
/**
|
|
128
156
|
* Confirm TOTP setup by acknowledging recovery codes.
|
|
129
157
|
* This marks the TOTP setup as fully complete.
|
|
130
158
|
*/
|
|
131
159
|
async confirmSetup(userId) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
160
|
+
return withUserSecurity(this.mikro, userId, async () => {
|
|
161
|
+
const totp = await this.mikro.userTotp.findVerifiedByUserSub(userId);
|
|
162
|
+
if (!totp) {
|
|
163
|
+
throw new e.TotpNotSetup.Error();
|
|
164
|
+
}
|
|
165
|
+
if (totp.recovery_confirmed) {
|
|
166
|
+
throw new e.TotpAlreadyEnabled.Error();
|
|
167
|
+
}
|
|
168
|
+
totp.recovery_confirmed = true;
|
|
169
|
+
await this.mikro.em.flush();
|
|
170
|
+
});
|
|
141
171
|
}
|
|
142
172
|
/**
|
|
143
173
|
* Disable TOTP for a user
|
|
144
174
|
* Also deletes all recovery codes
|
|
145
175
|
*/
|
|
146
|
-
async disable(userId, token
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
176
|
+
async disable(userId, token) {
|
|
177
|
+
return withUserSecurity(this.mikro, userId, async () => {
|
|
178
|
+
const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
|
|
179
|
+
if (!totp) {
|
|
180
|
+
throw new e.TotpNotEnabled.Error();
|
|
181
|
+
}
|
|
182
|
+
await this.consumeToken(token, totp);
|
|
183
|
+
// Prevent disabling TOTP when 2FA is required and no other 2FA method exists
|
|
184
|
+
if (this.config.auth.password.two_factor.enrollment_required &&
|
|
185
|
+
!(this.config.auth.passkey.enabled &&
|
|
186
|
+
(await this.mikro.userPasskey.countByUserSub(userId)) > 0)) {
|
|
187
|
+
throw new e.CannotRemoveLastSecondFactor.Error();
|
|
188
|
+
}
|
|
189
|
+
await this.mikro.userTotp.deleteByUserSub(userId);
|
|
190
|
+
await this.mikro.userTotpRecoveryCode.deleteByUserSub(userId);
|
|
191
|
+
});
|
|
160
192
|
}
|
|
161
193
|
async verifyForAuth(userId, token) {
|
|
162
194
|
const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
|
|
163
195
|
if (!totp) {
|
|
164
196
|
throw new e.TotpNotEnabled.Error();
|
|
165
197
|
}
|
|
166
|
-
this.
|
|
198
|
+
await this.consumeToken(token, totp);
|
|
167
199
|
}
|
|
168
200
|
/**
|
|
169
201
|
* Generate a single recovery code in the format XXXX-XXXX-XXXX-XXXX.
|
|
@@ -219,26 +251,24 @@ export class TotpService {
|
|
|
219
251
|
throw new e.NoRecoveryCodesAvailable.Error();
|
|
220
252
|
}
|
|
221
253
|
const codeHash = await this.securityService.hashOpaqueToken('totp-recovery', normalizedCode);
|
|
222
|
-
const
|
|
223
|
-
if (
|
|
254
|
+
const consumed = await this.mikro.userTotpRecoveryCode.nativeUpdate({ user: userId, code_hash: codeHash, used: false }, { used: true, used_at: new Date() });
|
|
255
|
+
if (consumed !== 1)
|
|
224
256
|
throw new e.InvalidRecoveryCode.Error();
|
|
225
|
-
}
|
|
226
|
-
recoveryCode.used = true;
|
|
227
|
-
recoveryCode.used_at = new Date();
|
|
228
|
-
await this.mikro.em.flush();
|
|
229
257
|
}
|
|
230
258
|
async regenerateRecoveryCodes(userId, token) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
259
|
+
return withUserSecurity(this.mikro, userId, async () => {
|
|
260
|
+
const totp = await this.mikro.userTotp.findFullyRegisteredByUserSub(userId);
|
|
261
|
+
if (!totp) {
|
|
262
|
+
throw new e.TotpNotEnabled.Error();
|
|
263
|
+
}
|
|
264
|
+
await this.consumeToken(token, totp);
|
|
265
|
+
const user = await this.mikro.user.findOneOrFail({
|
|
266
|
+
sub: userId,
|
|
267
|
+
}, {
|
|
268
|
+
failHandler: () => new e.UserNotFound.Error(),
|
|
269
|
+
});
|
|
270
|
+
return this.generateRecoveryCodes(user);
|
|
240
271
|
});
|
|
241
|
-
return this.generateRecoveryCodes(user);
|
|
242
272
|
}
|
|
243
273
|
}
|
|
244
274
|
//# sourceMappingURL=totp.service.js.map
|