@open-mercato/enterprise 0.6.4-develop.4382.1.6b4f656b77 → 0.6.4
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/.turbo/turbo-build.log +1 -1
- package/dist/modules/record_locks/widgets/injection/record-locking/widget.client.js +1 -1
- package/dist/modules/record_locks/widgets/injection/record-locking/widget.client.js.map +2 -2
- package/dist/modules/security/api/enforcement/[id]/route.js +35 -1
- package/dist/modules/security/api/enforcement/[id]/route.js.map +2 -2
- package/dist/modules/security/api/enforcement/_shared.js +63 -1
- package/dist/modules/security/api/enforcement/_shared.js.map +3 -3
- package/dist/modules/security/api/enforcement/compliance/route.js +12 -3
- package/dist/modules/security/api/enforcement/compliance/route.js.map +2 -2
- package/dist/modules/security/api/enforcement/route.js +25 -2
- package/dist/modules/security/api/enforcement/route.js.map +2 -2
- package/dist/modules/security/api/mfa/prepare/route.js +1 -1
- package/dist/modules/security/api/mfa/prepare/route.js.map +2 -2
- package/dist/modules/security/api/mfa/recovery/route.js +1 -1
- package/dist/modules/security/api/mfa/recovery/route.js.map +2 -2
- package/dist/modules/security/api/mfa/verify/route.js +1 -1
- package/dist/modules/security/api/mfa/verify/route.js.map +2 -2
- package/dist/modules/security/api/users/[id]/mfa/reset/route.js +6 -1
- package/dist/modules/security/api/users/[id]/mfa/reset/route.js.map +2 -2
- package/dist/modules/security/api/users/[id]/mfa/status/route.js +13 -2
- package/dist/modules/security/api/users/[id]/mfa/status/route.js.map +2 -2
- package/dist/modules/security/api/users/_shared.js +56 -1
- package/dist/modules/security/api/users/_shared.js.map +2 -2
- package/dist/modules/security/api/users/mfa/compliance/route.js +17 -7
- package/dist/modules/security/api/users/mfa/compliance/route.js.map +2 -2
- package/dist/modules/security/commands/createEnforcementPolicy.js +6 -1
- package/dist/modules/security/commands/createEnforcementPolicy.js.map +2 -2
- package/dist/modules/security/commands/deleteEnforcementPolicy.js +6 -1
- package/dist/modules/security/commands/deleteEnforcementPolicy.js.map +2 -2
- package/dist/modules/security/commands/resetUserMfa.js +6 -1
- package/dist/modules/security/commands/resetUserMfa.js.map +2 -2
- package/dist/modules/security/commands/updateEnforcementPolicy.js +6 -1
- package/dist/modules/security/commands/updateEnforcementPolicy.js.map +2 -2
- package/dist/modules/security/services/MfaAdminService.js +22 -5
- package/dist/modules/security/services/MfaAdminService.js.map +2 -2
- package/dist/modules/security/services/MfaEnforcementService.js +28 -6
- package/dist/modules/security/services/MfaEnforcementService.js.map +2 -2
- package/dist/modules/security/services/MfaVerificationService.js +30 -10
- package/dist/modules/security/services/MfaVerificationService.js.map +2 -2
- package/dist/modules/security/services/SudoChallengeService.js +14 -3
- package/dist/modules/security/services/SudoChallengeService.js.map +2 -2
- package/dist/modules/sso/api/callback/oidc/route.js +2 -2
- package/dist/modules/sso/api/callback/oidc/route.js.map +2 -2
- package/dist/modules/sso/i18n/de.json +2 -0
- package/dist/modules/sso/i18n/en.json +2 -0
- package/dist/modules/sso/i18n/es.json +2 -0
- package/dist/modules/sso/i18n/pl.json +2 -0
- package/dist/modules/sso/lib/errors.js +21 -0
- package/dist/modules/sso/lib/errors.js.map +7 -0
- package/dist/modules/sso/services/accountLinkingService.js +2 -1
- package/dist/modules/sso/services/accountLinkingService.js.map +2 -2
- package/package.json +7 -8
- package/src/modules/record_locks/widgets/injection/record-locking/widget.client.tsx +1 -1
- package/src/modules/security/api/enforcement/[id]/route.ts +50 -1
- package/src/modules/security/api/enforcement/_shared.ts +83 -2
- package/src/modules/security/api/enforcement/compliance/route.ts +10 -1
- package/src/modules/security/api/enforcement/route.ts +30 -2
- package/src/modules/security/api/mfa/prepare/route.ts +1 -1
- package/src/modules/security/api/mfa/recovery/route.ts +1 -1
- package/src/modules/security/api/mfa/verify/route.ts +1 -1
- package/src/modules/security/api/users/[id]/mfa/reset/route.ts +6 -1
- package/src/modules/security/api/users/[id]/mfa/status/route.ts +13 -2
- package/src/modules/security/api/users/_shared.ts +69 -1
- package/src/modules/security/api/users/mfa/compliance/route.ts +16 -7
- package/src/modules/security/commands/createEnforcementPolicy.ts +6 -1
- package/src/modules/security/commands/deleteEnforcementPolicy.ts +6 -1
- package/src/modules/security/commands/resetUserMfa.ts +6 -1
- package/src/modules/security/commands/updateEnforcementPolicy.ts +6 -1
- package/src/modules/security/services/MfaAdminService.ts +29 -6
- package/src/modules/security/services/MfaEnforcementService.ts +42 -2
- package/src/modules/security/services/MfaVerificationService.ts +33 -10
- package/src/modules/security/services/SudoChallengeService.ts +16 -11
- package/src/modules/sso/api/callback/oidc/route.ts +2 -2
- package/src/modules/sso/i18n/de.json +2 -0
- package/src/modules/sso/i18n/en.json +2 -0
- package/src/modules/sso/i18n/es.json +2 -0
- package/src/modules/sso/i18n/pl.json +2 -0
- package/src/modules/sso/lib/errors.ts +35 -0
- package/src/modules/sso/services/accountLinkingService.ts +2 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Use Symbol.for so the marker survives module duplication across bundle
|
|
2
|
+
// boundaries: the OIDC callback route and the account-linking service can be
|
|
3
|
+
// bundled into separate chunks where `instanceof` silently returns false
|
|
4
|
+
// (same rationale as isCrudHttpError in @open-mercato/shared).
|
|
5
|
+
const EMAIL_NOT_VERIFIED_ERROR_MARKER = Symbol.for('@open-mercato/sso/EmailNotVerifiedError')
|
|
6
|
+
|
|
7
|
+
export class EmailNotVerifiedError extends Error {
|
|
8
|
+
readonly [EMAIL_NOT_VERIFIED_ERROR_MARKER] = true
|
|
9
|
+
|
|
10
|
+
constructor(message: string, options?: { cause?: unknown }) {
|
|
11
|
+
super(message, options)
|
|
12
|
+
this.name = 'EmailNotVerifiedError'
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Type-safe check that works across module/bundle boundaries. Prefer this over
|
|
18
|
+
* `instanceof EmailNotVerifiedError` because the SSO callback route may be
|
|
19
|
+
* bundled separately from the service that throws the error.
|
|
20
|
+
*/
|
|
21
|
+
export function isEmailNotVerifiedError(err: unknown): err is EmailNotVerifiedError {
|
|
22
|
+
return !!err && typeof err === 'object' && (err as Record<symbol, unknown>)[EMAIL_NOT_VERIFIED_ERROR_MARKER] === true
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type SsoCallbackErrorCode = 'sso_email_not_verified' | 'sso_failed'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Maps an error thrown during the OIDC callback to the login-page UX error code.
|
|
29
|
+
* Keyed off the error type rather than a substring of the human-readable message,
|
|
30
|
+
* which previously drifted out of sync and left `sso_email_not_verified`
|
|
31
|
+
* unreachable (#2741).
|
|
32
|
+
*/
|
|
33
|
+
export function resolveSsoCallbackErrorCode(err: unknown): SsoCallbackErrorCode {
|
|
34
|
+
return isEmailNotVerifiedError(err) ? 'sso_email_not_verified' : 'sso_failed'
|
|
35
|
+
}
|
|
@@ -4,6 +4,7 @@ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
|
4
4
|
import { computeEmailHash } from '@open-mercato/core/modules/auth/lib/emailHash'
|
|
5
5
|
import { SsoConfig, SsoIdentity, SsoRoleGrant, ScimToken } from '../data/entities'
|
|
6
6
|
import { emitSsoEvent } from '../events'
|
|
7
|
+
import { EmailNotVerifiedError } from '../lib/errors'
|
|
7
8
|
import type { SsoIdentityPayload } from '../lib/types'
|
|
8
9
|
|
|
9
10
|
export class AccountLinkingService {
|
|
@@ -21,7 +22,7 @@ export class AccountLinkingService {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
if (idpPayload.emailVerified === false) {
|
|
24
|
-
throw new
|
|
25
|
+
throw new EmailNotVerifiedError('IdP explicitly reported email as unverified — cannot link or provision account')
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
const emailDomain = idpPayload.email.split('@')[1]?.toLowerCase()
|