@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"totp.service.js","sourceRoot":"","sources":["../../src/services/totp.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,18 @@ export declare class UserConsentService {
|
|
|
9
9
|
* Check if user has already consented to the requested scopes for a client.
|
|
10
10
|
*/
|
|
11
11
|
hasConsent(userSub: string, clientId: string, requestedScopes: string[]): Promise<boolean>;
|
|
12
|
+
/** Resolve grants before displaying, storing, or issuing requested scopes.
|
|
13
|
+
* OIDC Core §11: offline access needs explicit or preconfigured approval.
|
|
14
|
+
* An active, explicitly saved offline grant remains valid until revoked.
|
|
15
|
+
*/
|
|
16
|
+
resolveScopes(params: {
|
|
17
|
+
userSub: string;
|
|
18
|
+
clientId: string;
|
|
19
|
+
requestedScopes: string[];
|
|
20
|
+
responseType: string;
|
|
21
|
+
prompt?: string | undefined;
|
|
22
|
+
skipConsent?: boolean | undefined;
|
|
23
|
+
}): Promise<string[]>;
|
|
12
24
|
/**
|
|
13
25
|
* Determine if consent screen is required based on:
|
|
14
26
|
* - User's existing consent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-consent.service.d.ts","sourceRoot":"","sources":["../../src/services/user-consent.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,YAAmB,KAAK,EAAE,YAAY,EAErC;IAED;;OAEG;IACU,UAAU,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,OAAO,CAAC,CAMlB;IAED;;;;;;OAMG;IACU,eAAe,CAAC,MAAM,EAAE;QACnC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QAC9C,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACnC,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;IAED;;OAEG;IACU,YAAY,CAAC,MAAM,EAAE;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQ7B;CACF"}
|
|
1
|
+
{"version":3,"file":"user-consent.service.d.ts","sourceRoot":"","sources":["../../src/services/user-consent.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,YAAmB,KAAK,EAAE,YAAY,EAErC;IAED;;OAEG;IACU,UAAU,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,OAAO,CAAC,CAMlB;IAED;;;OAGG;IACU,aAAa,CAAC,MAAM,EAAE;QACjC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACnC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAcpB;IAED;;;;;;OAMG;IACU,eAAe,CAAC,MAAM,EAAE;QACnC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;QAC9C,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACnC,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBnB;IAED;;OAEG;IACU,YAAY,CAAC,MAAM,EAAE;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQ7B;CACF"}
|
|
@@ -9,6 +9,24 @@ export class UserConsentService {
|
|
|
9
9
|
async hasConsent(userSub, clientId, requestedScopes) {
|
|
10
10
|
return this.mikro.userConsent.hasConsent(userSub, clientId, requestedScopes);
|
|
11
11
|
}
|
|
12
|
+
/** Resolve grants before displaying, storing, or issuing requested scopes.
|
|
13
|
+
* OIDC Core §11: offline access needs explicit or preconfigured approval.
|
|
14
|
+
* An active, explicitly saved offline grant remains valid until revoked.
|
|
15
|
+
*/
|
|
16
|
+
async resolveScopes(params) {
|
|
17
|
+
const scopes = [...new Set(params.requestedScopes)];
|
|
18
|
+
if (!scopes.includes('offline_access'))
|
|
19
|
+
return scopes;
|
|
20
|
+
const permitsOffline = params.responseType === 'code' &&
|
|
21
|
+
(params.skipConsent ||
|
|
22
|
+
params.prompt?.split(' ').includes('consent') ||
|
|
23
|
+
(await this.hasConsent(params.userSub, params.clientId, [
|
|
24
|
+
'offline_access',
|
|
25
|
+
])));
|
|
26
|
+
return permitsOffline
|
|
27
|
+
? scopes
|
|
28
|
+
: scopes.filter((scope) => scope !== 'offline_access');
|
|
29
|
+
}
|
|
12
30
|
/**
|
|
13
31
|
* Determine if consent screen is required based on:
|
|
14
32
|
* - User's existing consent
|
|
@@ -19,7 +37,7 @@ export class UserConsentService {
|
|
|
19
37
|
async requiresConsent(params) {
|
|
20
38
|
const { userSub, clientId, requestedScopes, prompt, skipConsent } = params;
|
|
21
39
|
// If prompt=consent, always show consent screen
|
|
22
|
-
if (prompt
|
|
40
|
+
if (prompt?.split(' ').includes('consent')) {
|
|
23
41
|
return true;
|
|
24
42
|
}
|
|
25
43
|
if (skipConsent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-consent.service.js","sourceRoot":"","sources":["../../src/services/user-consent.service.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,kBAAkB;IACZ,KAAK,CAAe;IACrC,YAAmB,KAAmB;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CACrB,OAAe,EACf,QAAgB,EAChB,eAAyB;QAEzB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CACtC,OAAO,EACP,QAAQ,EACR,eAAe,CAChB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,eAAe,CAAC,MAM5B;QACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE3E,gDAAgD;QAChD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"user-consent.service.js","sourceRoot":"","sources":["../../src/services/user-consent.service.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,kBAAkB;IACZ,KAAK,CAAe;IACrC,YAAmB,KAAmB;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CACrB,OAAe,EACf,QAAgB,EAChB,eAAyB;QAEzB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CACtC,OAAO,EACP,QAAQ,EACR,eAAe,CAChB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,aAAa,CAAC,MAO1B;QACC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,OAAO,MAAM,CAAC;QAEtD,MAAM,cAAc,GAClB,MAAM,CAAC,YAAY,KAAK,MAAM;YAC9B,CAAC,MAAM,CAAC,WAAW;gBACjB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC7C,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE;oBACtD,gBAAgB;iBACjB,CAAC,CAAC,CAAC,CAAC;QACT,OAAO,cAAc;YACnB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,gBAAgB,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,eAAe,CAAC,MAM5B;QACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE3E,gDAAgD;QAChD,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,8DAA8D;QAC9D,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,UAAU,CAC9C,OAAO,EACP,QAAQ,EACR,eAAe,CAChB,CAAC;QAEF,8EAA8E;QAC9E,OAAO,CAAC,kBAAkB,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,YAAY,CAAC,MAIzB;QACC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE7C,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC;YACzC,OAAO;YACP,QAAQ;YACR,MAAM;SACP,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UserEntity } from '../entities/user.entity.js';
|
|
2
|
+
import type { IssuaryRuntimeConfig } from '../lib/config/index.js';
|
|
3
|
+
import type { MikroService } from './mikro.service.js';
|
|
4
|
+
export declare function isSecurityConflict(error: unknown): boolean;
|
|
5
|
+
/** The write precedes every policy read, including on SQLite's deferred transactions. */
|
|
6
|
+
export declare function withUserSecurity<T>(mikro: MikroService, sub: string, operation: (user: UserEntity) => Promise<T>, options?: {
|
|
7
|
+
includeDeleted?: boolean;
|
|
8
|
+
}): Promise<T>;
|
|
9
|
+
export declare function authenticationMethods(mikro: MikroService, config: IssuaryRuntimeConfig, user: UserEntity): Promise<{
|
|
10
|
+
oauth: number;
|
|
11
|
+
passkeys: number;
|
|
12
|
+
totp: boolean;
|
|
13
|
+
password: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=user-security.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-security.service.d.ts","sourceRoot":"","sources":["../../src/services/user-security.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgB1D;AAED,yFAAyF;AACzF,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,EAC3C,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACzC,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,UAAU;;;;;GAuBjB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { raw } from '@mikro-orm/core';
|
|
2
|
+
import { UserEntity } from '../entities/user.entity.js';
|
|
3
|
+
import { e } from '../schemas/error.js';
|
|
4
|
+
export function isSecurityConflict(error) {
|
|
5
|
+
if (!(error instanceof Error))
|
|
6
|
+
return false;
|
|
7
|
+
const code = Reflect.get(error, 'code');
|
|
8
|
+
return ([
|
|
9
|
+
'SQLITE_BUSY',
|
|
10
|
+
'SQLITE_BUSY_SNAPSHOT',
|
|
11
|
+
'SQLITE_LOCKED',
|
|
12
|
+
'40001',
|
|
13
|
+
'40P01',
|
|
14
|
+
'55P03',
|
|
15
|
+
].includes(String(code)) ||
|
|
16
|
+
/database (?:is )?locked|serialization failure|deadlock detected/i.test(error.message));
|
|
17
|
+
}
|
|
18
|
+
/** The write precedes every policy read, including on SQLite's deferred transactions. */
|
|
19
|
+
export async function withUserSecurity(mikro, sub, operation, options = {}) {
|
|
20
|
+
try {
|
|
21
|
+
return await mikro.em.transactional(async (em) => {
|
|
22
|
+
const changed = await em.nativeUpdate(UserEntity, { sub, ...(options.includeDeleted ? {} : { deleted_at: null }) }, { security_revision: raw('security_revision + 1') });
|
|
23
|
+
if (changed !== 1)
|
|
24
|
+
throw new e.UserNotFound.Error();
|
|
25
|
+
const user = await em.findOneOrFail(UserEntity, { sub }, { populate: ['password_hash'], refresh: true });
|
|
26
|
+
return operation(user);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (isSecurityConflict(error))
|
|
31
|
+
throw new e.ConcurrentSecurityChange.Error();
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function authenticationMethods(mikro, config, user) {
|
|
36
|
+
const providers = config.identity_providers
|
|
37
|
+
.filter((provider) => provider.enabled)
|
|
38
|
+
.map((provider) => provider.id);
|
|
39
|
+
const oauth = providers.length
|
|
40
|
+
? await mikro.userOAuth.count({
|
|
41
|
+
user: user.sub,
|
|
42
|
+
provider_name: { $in: providers },
|
|
43
|
+
})
|
|
44
|
+
: 0;
|
|
45
|
+
const passkeys = config.auth.passkey.enabled
|
|
46
|
+
? await mikro.userPasskey.countByUserSub(user.sub)
|
|
47
|
+
: 0;
|
|
48
|
+
const totp = config.auth.password.totp.enabled &&
|
|
49
|
+
(await mikro.userTotp.isRegistered(user.sub));
|
|
50
|
+
return {
|
|
51
|
+
oauth,
|
|
52
|
+
passkeys,
|
|
53
|
+
totp,
|
|
54
|
+
password: config.auth.password.enabled && user.hasPassword(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=user-security.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-security.service.js","sourceRoot":"","sources":["../../src/services/user-security.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,17 +4,17 @@ import type { UserEntity } from '../entities/user.entity.ts';
|
|
|
4
4
|
import type { IssuaryRuntimeConfig } from '../lib/config/index.ts';
|
|
5
5
|
import type { Locale } from '../lib/locale.ts';
|
|
6
6
|
import type { r } from '../schemas/response.ts';
|
|
7
|
-
import type {
|
|
7
|
+
import type { MailQueueService } from './mail-queue.service.js';
|
|
8
8
|
import type { MikroService } from './mikro.service.ts';
|
|
9
9
|
import type { PasswordAuthService } from './password-auth.service.ts';
|
|
10
10
|
import type { TermsService } from './terms.service.ts';
|
|
11
11
|
export declare class UserService {
|
|
12
12
|
private readonly mikro;
|
|
13
13
|
private readonly config;
|
|
14
|
-
private readonly
|
|
14
|
+
private readonly mailQueue;
|
|
15
15
|
private readonly passwordAuthService;
|
|
16
16
|
private readonly termsService?;
|
|
17
|
-
constructor(mikro: MikroService, config: IssuaryRuntimeConfig,
|
|
17
|
+
constructor(mikro: MikroService, config: IssuaryRuntimeConfig, mailQueue: MailQueueService, passwordAuthService: PasswordAuthService, termsService?: TermsService);
|
|
18
18
|
userEntityToSessionUser(user: Loaded<UserEntity, 'password_hash' | 'passkeys' | 'totps', '*', never>): Promise<z.infer<typeof r.UserSession>>;
|
|
19
19
|
getSessionUserBySub(userSub: string): Promise<z.infer<typeof r.UserSession>>;
|
|
20
20
|
buildSessionUser(params: {
|
|
@@ -80,7 +80,9 @@ export declare class UserService {
|
|
|
80
80
|
agreed: boolean;
|
|
81
81
|
}>;
|
|
82
82
|
locale?: Locale | undefined;
|
|
83
|
-
}): Promise<z.infer<typeof r.UserSession
|
|
83
|
+
}): Promise<z.infer<typeof r.UserSession> & {
|
|
84
|
+
token_epoch: string;
|
|
85
|
+
}>;
|
|
84
86
|
/**
|
|
85
87
|
* @description
|
|
86
88
|
* Request account deletion (soft delete).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { e } from '../schemas/error.js';
|
|
2
|
+
import { invalidateUserAuthentication } from './authentication-epoch.js';
|
|
3
|
+
import { lockTermsPolicy } from './terms-policy.service.js';
|
|
4
|
+
import { withUserSecurity } from './user-security.service.js';
|
|
2
5
|
export class UserService {
|
|
3
6
|
mikro;
|
|
4
7
|
config;
|
|
5
|
-
|
|
8
|
+
mailQueue;
|
|
6
9
|
passwordAuthService;
|
|
7
10
|
termsService;
|
|
8
|
-
constructor(mikro, config,
|
|
11
|
+
constructor(mikro, config, mailQueue, passwordAuthService, termsService) {
|
|
9
12
|
this.mikro = mikro;
|
|
10
13
|
this.config = config;
|
|
11
|
-
this.
|
|
14
|
+
this.mailQueue = mailQueue;
|
|
12
15
|
this.passwordAuthService = passwordAuthService;
|
|
13
16
|
this.termsService = termsService;
|
|
14
17
|
}
|
|
@@ -115,59 +118,74 @@ export class UserService {
|
|
|
115
118
|
return this.getAdminUser(user.sub);
|
|
116
119
|
}
|
|
117
120
|
async updateAdminUser(params) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (user.managed_by === 'config') {
|
|
123
|
-
throw new e.UserNotEditable.Error();
|
|
124
|
-
}
|
|
125
|
-
if (user.deleted_at) {
|
|
126
|
-
throw new e.UserNotFound.Error();
|
|
127
|
-
}
|
|
128
|
-
if (params.email !== undefined && params.email !== user.email) {
|
|
129
|
-
const existing = await this.mikro.user.findOne({
|
|
130
|
-
email: params.email,
|
|
131
|
-
sub: { $ne: params.sub },
|
|
132
|
-
});
|
|
133
|
-
if (existing) {
|
|
134
|
-
throw new e.EmailAlreadyExists.Error();
|
|
121
|
+
return withUserSecurity(this.mikro, params.sub, async (user) => {
|
|
122
|
+
const emailChanged = params.email !== undefined && params.email !== user.email;
|
|
123
|
+
if (params.sub === params.actorSub && params.role === 'user') {
|
|
124
|
+
throw new e.Forbidden.Error();
|
|
135
125
|
}
|
|
136
|
-
user.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
user.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
126
|
+
if (user.managed_by === 'config') {
|
|
127
|
+
throw new e.UserNotEditable.Error();
|
|
128
|
+
}
|
|
129
|
+
if (user.deleted_at) {
|
|
130
|
+
throw new e.UserNotFound.Error();
|
|
131
|
+
}
|
|
132
|
+
if (params.email !== undefined && params.email !== user.email) {
|
|
133
|
+
const existing = await this.mikro.user.findOne({
|
|
134
|
+
email: params.email,
|
|
135
|
+
sub: { $ne: params.sub },
|
|
136
|
+
});
|
|
137
|
+
if (existing) {
|
|
138
|
+
throw new e.EmailAlreadyExists.Error();
|
|
139
|
+
}
|
|
140
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
141
|
+
user.email = params.email;
|
|
142
|
+
user.email_verified = false;
|
|
143
|
+
}
|
|
144
|
+
if (params.role !== undefined) {
|
|
145
|
+
if (user.role !== params.role) {
|
|
146
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
147
|
+
}
|
|
148
|
+
user.role = params.role;
|
|
149
|
+
}
|
|
150
|
+
if (params.emailVerified !== undefined) {
|
|
151
|
+
user.email_verified = params.emailVerified;
|
|
152
|
+
}
|
|
153
|
+
await this.mikro.em.flush();
|
|
154
|
+
if (emailChanged && !user.email_verified && this.config.email)
|
|
155
|
+
await this.mailQueue.enqueue('verification', user.email, undefined, user.sub);
|
|
156
|
+
return this.getAdminUser(user.sub);
|
|
157
|
+
});
|
|
146
158
|
}
|
|
147
159
|
async deleteAdminUser(params) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
user.deleted_at
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
return withUserSecurity(this.mikro, params.sub, async () => {
|
|
161
|
+
if (params.sub === params.actorSub) {
|
|
162
|
+
throw new e.Forbidden.Error();
|
|
163
|
+
}
|
|
164
|
+
const user = await this.mikro.user.verifyBySub(params.sub);
|
|
165
|
+
if (user.managed_by === 'config') {
|
|
166
|
+
throw new e.UserNotEditable.Error();
|
|
167
|
+
}
|
|
168
|
+
if (!user.deleted_at) {
|
|
169
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
170
|
+
user.deleted_at = new Date();
|
|
171
|
+
await this.mikro.em.flush();
|
|
172
|
+
}
|
|
173
|
+
return this.adminUserEntityToResponse(user);
|
|
174
|
+
});
|
|
160
175
|
}
|
|
161
176
|
async restoreAdminUser(sub) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
user.deleted_at
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
177
|
+
return withUserSecurity(this.mikro, sub, async () => {
|
|
178
|
+
const user = await this.mikro.user.verifyBySubIncludingDeleted(sub);
|
|
179
|
+
if (user.managed_by === 'config') {
|
|
180
|
+
throw new e.UserNotEditable.Error();
|
|
181
|
+
}
|
|
182
|
+
if (user.deleted_at) {
|
|
183
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
184
|
+
user.deleted_at = null;
|
|
185
|
+
await this.mikro.em.flush();
|
|
186
|
+
}
|
|
187
|
+
return this.adminUserEntityToResponse(user);
|
|
188
|
+
}, { includeDeleted: true });
|
|
171
189
|
}
|
|
172
190
|
async bulkSetAdminUserDeleted(params) {
|
|
173
191
|
const where = params.ids
|
|
@@ -191,7 +209,10 @@ export class UserService {
|
|
|
191
209
|
];
|
|
192
210
|
}
|
|
193
211
|
}
|
|
194
|
-
const users = await this.mikro.user.find(where
|
|
212
|
+
const users = await this.mikro.user.find(where, {
|
|
213
|
+
refresh: true,
|
|
214
|
+
orderBy: { sub: 'ASC' },
|
|
215
|
+
});
|
|
195
216
|
const skipped = {};
|
|
196
217
|
let changed = 0;
|
|
197
218
|
for (const user of users) {
|
|
@@ -206,6 +227,7 @@ export class UserService {
|
|
|
206
227
|
skipped[reason] = (skipped[reason] ?? 0) + 1;
|
|
207
228
|
continue;
|
|
208
229
|
}
|
|
230
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
209
231
|
user.deleted_at = params.deleted ? new Date() : null;
|
|
210
232
|
changed += 1;
|
|
211
233
|
}
|
|
@@ -213,71 +235,68 @@ export class UserService {
|
|
|
213
235
|
return { matched: users.length, changed, skipped };
|
|
214
236
|
}
|
|
215
237
|
async register(params) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
if (
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
238
|
+
const passwordHash = await this.passwordAuthService.prepareDatabasePassword(params.password);
|
|
239
|
+
return this.mikro.em.transactional(async () => {
|
|
240
|
+
await lockTermsPolicy(this.mikro.em, 'read');
|
|
241
|
+
// 1. Validate explicit terms consent before user creation
|
|
242
|
+
// Load terms once and reuse across validation and recording
|
|
243
|
+
const terms = this.termsService
|
|
244
|
+
? await this.termsService.getGlobalTerms()
|
|
245
|
+
: undefined;
|
|
246
|
+
if (this.termsService && terms) {
|
|
247
|
+
const explicitTerms = await this.termsService.getExplicitTerms(terms);
|
|
248
|
+
const hasRequiredExplicitTerms = explicitTerms.some((t) => t.required);
|
|
249
|
+
if (hasRequiredExplicitTerms) {
|
|
250
|
+
if (!params.consents || params.consents.length === 0) {
|
|
251
|
+
throw new e.ValidationError.Error('Terms consent is required for registration');
|
|
252
|
+
}
|
|
253
|
+
const validation = await this.termsService.validateExplicitConsents(params.consents, terms);
|
|
254
|
+
if (!validation.valid) {
|
|
255
|
+
throw new e.ValidationError.Error(`Missing required terms: ${validation.missingTerms.join(', ')}`);
|
|
256
|
+
}
|
|
231
257
|
}
|
|
232
258
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
password: params.password,
|
|
238
|
-
});
|
|
239
|
-
// 3. Generate email verification token and send email
|
|
240
|
-
if (this.config.email) {
|
|
241
|
-
const verification = await this.emailService.generateToken({
|
|
242
|
-
userSub: user.sub,
|
|
243
|
-
});
|
|
244
|
-
await this.mikro.em.flush();
|
|
245
|
-
this.emailService.sendVerificationEmailAsync({
|
|
246
|
-
email: user.email,
|
|
247
|
-
token: verification.token,
|
|
248
|
-
locale: params.locale,
|
|
259
|
+
// 2. Register the user
|
|
260
|
+
const user = await this.mikro.user.register({
|
|
261
|
+
email: params.email,
|
|
262
|
+
passwordHash,
|
|
249
263
|
});
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
264
|
+
// 3. Generate email verification token and send email
|
|
265
|
+
if (this.config.email) {
|
|
266
|
+
await this.mailQueue.enqueue('verification', user.email, params.locale, user.sub);
|
|
267
|
+
}
|
|
268
|
+
// 4. Record terms consent after successful registration
|
|
269
|
+
if (this.termsService && terms) {
|
|
270
|
+
// Record explicit consents provided by user
|
|
271
|
+
if (params.consents && params.consents.length > 0) {
|
|
272
|
+
await this.termsService.recordConsents({
|
|
273
|
+
userSub: user.sub,
|
|
274
|
+
consents: params.consents,
|
|
275
|
+
terms,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Record implicit consents for terms with implicit consent mode
|
|
279
|
+
await this.termsService.recordImplicitConsents({
|
|
256
280
|
userSub: user.sub,
|
|
257
|
-
consents: params.consents,
|
|
258
281
|
terms,
|
|
259
282
|
});
|
|
260
283
|
}
|
|
261
|
-
//
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
totp_recovery_codes_missing: false,
|
|
278
|
-
second_factor_required: this.user2FASetupRequired(user),
|
|
279
|
-
passkey_count: 0,
|
|
280
|
-
};
|
|
284
|
+
// 5. Return session info
|
|
285
|
+
return {
|
|
286
|
+
sub: user.sub,
|
|
287
|
+
token_epoch: user.token_epoch,
|
|
288
|
+
managed_by: 'database',
|
|
289
|
+
email: user.email,
|
|
290
|
+
role: user.role,
|
|
291
|
+
email_verified: user.email_verified,
|
|
292
|
+
email_verification_required: this.userEmailVerificationRequired(user),
|
|
293
|
+
has_password: user.hasPassword(),
|
|
294
|
+
totp_registered: false,
|
|
295
|
+
totp_recovery_codes_missing: false,
|
|
296
|
+
second_factor_required: this.user2FASetupRequired(user),
|
|
297
|
+
passkey_count: 0,
|
|
298
|
+
};
|
|
299
|
+
});
|
|
281
300
|
}
|
|
282
301
|
/**
|
|
283
302
|
* @description
|
|
@@ -285,17 +304,20 @@ export class UserService {
|
|
|
285
304
|
* Config-managed users cannot be deleted.
|
|
286
305
|
*/
|
|
287
306
|
async requestDeletion(userSub) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
307
|
+
return withUserSecurity(this.mikro, userSub, async () => {
|
|
308
|
+
// Check if user exists and is not config-managed
|
|
309
|
+
const user = await this.mikro.user.findOneOrFail({ sub: userSub, deleted_at: null }, { failHandler: () => new e.UserNotFound.Error() });
|
|
310
|
+
if (user.managed_by === 'config') {
|
|
311
|
+
throw new e.UserNotEditable.Error();
|
|
312
|
+
}
|
|
313
|
+
// Soft delete the user
|
|
314
|
+
await invalidateUserAuthentication(this.mikro.em, user);
|
|
315
|
+
user.deleted_at = new Date();
|
|
316
|
+
await this.mikro.em.flush();
|
|
317
|
+
return {
|
|
318
|
+
deleted_at: user.deleted_at,
|
|
319
|
+
};
|
|
320
|
+
});
|
|
299
321
|
}
|
|
300
322
|
userEmailVerificationRequired(userLike) {
|
|
301
323
|
return (userLike.managed_by !== 'config' &&
|