@revealui/auth 0.4.9 → 0.4.10
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/react/csrf.d.ts +5 -12
- package/dist/react/csrf.d.ts.map +1 -1
- package/dist/react/csrf.js +5 -32
- package/dist/server/audit-bridge.d.ts.map +1 -1
- package/dist/server/audit-bridge.js +12 -10
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +4 -3
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/mfa-enforcement.d.ts +29 -0
- package/dist/server/mfa-enforcement.d.ts.map +1 -1
- package/dist/server/mfa-enforcement.js +27 -1
- package/dist/server/security-alerts.d.ts +17 -0
- package/dist/server/security-alerts.d.ts.map +1 -0
- package/dist/server/security-alerts.js +55 -0
- package/dist/server/session.d.ts +2 -0
- package/dist/server/session.d.ts.map +1 -1
- package/dist/server/session.js +1 -0
- package/package.json +10 -7
package/dist/react/csrf.d.ts
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CSRF Double-Submit Token Helper
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Re-exports the canonical browser cookie reader from
|
|
5
|
+
* `@revealui/core/admin/utils/csrf` (fleet-redundancy P2-C). Shared by the
|
|
6
|
+
* react auth hooks (`usePasskey`, `useMFA`, `useSignOut`) whose POSTs target
|
|
7
|
+
* the RevealUI admin proxy's CSRF-gated endpoints.
|
|
6
8
|
*/
|
|
7
|
-
|
|
8
|
-
* Read the JS-readable `revealui-csrf` cookie. The RevealUI admin proxy
|
|
9
|
-
* (`apps/admin/src/proxy.ts`) requires it as an `X-CSRF-Token` header on any
|
|
10
|
-
* session-cookie-bearing unsafe request, and may re-issue the cookie on any
|
|
11
|
-
* response — so call this immediately before each fetch rather than once per
|
|
12
|
-
* flow. Returns undefined outside the browser or when the cookie is
|
|
13
|
-
* absent/empty. Mirrors the cookie-read in `@revealui/core`'s admin APIClient
|
|
14
|
-
* (`request()`) and `@revealui/ai`'s `useAgentStream`.
|
|
15
|
-
*/
|
|
16
|
-
export declare function readCsrfToken(): string | undefined;
|
|
9
|
+
export { readCsrfToken } from '@revealui/core/admin/utils/csrf';
|
|
17
10
|
//# sourceMappingURL=csrf.d.ts.map
|
package/dist/react/csrf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/react/csrf.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/react/csrf.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/react/csrf.js
CHANGED
|
@@ -1,36 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CSRF Double-Submit Token Helper
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Re-exports the canonical browser cookie reader from
|
|
5
|
+
* `@revealui/core/admin/utils/csrf` (fleet-redundancy P2-C). Shared by the
|
|
6
|
+
* react auth hooks (`usePasskey`, `useMFA`, `useSignOut`) whose POSTs target
|
|
7
|
+
* the RevealUI admin proxy's CSRF-gated endpoints.
|
|
6
8
|
*/
|
|
7
|
-
|
|
8
|
-
* Read the JS-readable `revealui-csrf` cookie. The RevealUI admin proxy
|
|
9
|
-
* (`apps/admin/src/proxy.ts`) requires it as an `X-CSRF-Token` header on any
|
|
10
|
-
* session-cookie-bearing unsafe request, and may re-issue the cookie on any
|
|
11
|
-
* response — so call this immediately before each fetch rather than once per
|
|
12
|
-
* flow. Returns undefined outside the browser or when the cookie is
|
|
13
|
-
* absent/empty. Mirrors the cookie-read in `@revealui/core`'s admin APIClient
|
|
14
|
-
* (`request()`) and `@revealui/ai`'s `useAgentStream`.
|
|
15
|
-
*/
|
|
16
|
-
export function readCsrfToken() {
|
|
17
|
-
if (typeof document === 'undefined')
|
|
18
|
-
return undefined;
|
|
19
|
-
for (const part of document.cookie.split(';')) {
|
|
20
|
-
const eqIdx = part.indexOf('=');
|
|
21
|
-
if (eqIdx === -1)
|
|
22
|
-
continue;
|
|
23
|
-
if (part.slice(0, eqIdx).trim() === 'revealui-csrf') {
|
|
24
|
-
const raw = part.slice(eqIdx + 1).trim();
|
|
25
|
-
if (!raw)
|
|
26
|
-
return undefined;
|
|
27
|
-
try {
|
|
28
|
-
return decodeURIComponent(raw);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return raw;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
9
|
+
export { readCsrfToken } from '@revealui/core/admin/utils/csrf';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-bridge.d.ts","sourceRoot":"","sources":["../../src/server/audit-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"audit-bridge.d.ts","sourceRoot":"","sources":["../../src/server/audit-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2CH;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASnF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUjF;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/E;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAShF;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* avoid circular dependency issues at module load time.
|
|
7
7
|
*/
|
|
8
8
|
import { logger } from '@revealui/core/observability/logger';
|
|
9
|
+
import { evaluateSecurityAlert } from './security-alerts.js';
|
|
9
10
|
/**
|
|
10
11
|
* Lazily resolve the global audit system from @revealui/security/server.
|
|
11
12
|
* Returns null if the module cannot be loaded (e.g. in test environments
|
|
@@ -28,17 +29,18 @@ async function getAudit() {
|
|
|
28
29
|
*/
|
|
29
30
|
async function logAuditEvent(event) {
|
|
30
31
|
const auditSystem = await getAudit();
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
});
|
|
32
|
+
if (auditSystem) {
|
|
33
|
+
try {
|
|
34
|
+
await auditSystem.log(event);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger.error('Failed to write audit event', error instanceof Error ? error : undefined, {
|
|
38
|
+
type: event.type,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
41
|
}
|
|
42
|
+
// Threshold alerts (failed logins, MFA disable, lockouts, …) — C11 WIRE
|
|
43
|
+
await evaluateSecurityAlert(event);
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
46
|
* Record a successful login to the audit trail.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAQ,MAAM,aAAa,CAAC;AAUpE;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,YAAY,CAAC,CAyLvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAoBtD;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAQ,MAAM,aAAa,CAAC;AAUpE;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,YAAY,CAAC,CAyLvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAoBtD;AAED;;;;;;;;GAQG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,YAAY,CAAC,CAqOvB"}
|
package/dist/server/auth.js
CHANGED
|
@@ -398,9 +398,10 @@ export async function signUp(email, password, name, options) {
|
|
|
398
398
|
// exists from signup. Best-effort: the Stripe billing webhook
|
|
399
399
|
// (ensureHostedAccount) is idempotent on an active membership and backfills
|
|
400
400
|
// this if it fails here, so a transient error never blocks signup. Skipped on
|
|
401
|
-
// self-hosted (Forge) deployments — single-tenant, no per-user accounts
|
|
402
|
-
//
|
|
403
|
-
|
|
401
|
+
// self-hosted (Forge) deployments — single-tenant, no per-user accounts
|
|
402
|
+
// (GAP-260 P4-1: REVEALUI_DEPLOYMENT_MODE, fallback private-key presence).
|
|
403
|
+
const { isHostedDeployment } = await import('@revealui/core/deployment-mode');
|
|
404
|
+
if (isHostedDeployment(process.env)) {
|
|
404
405
|
try {
|
|
405
406
|
const accountId = crypto.randomUUID();
|
|
406
407
|
const now = new Date();
|
package/dist/server/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export { configureMagicLink, createMagicLink, resetMagicLinkConfig, verifyMagicL
|
|
|
14
14
|
export type { MFAConfig, MFADisableProof, MFASetupResult } from './mfa.js';
|
|
15
15
|
export { configureMFA, disableMFA, initiateMFASetup, isMFAEnabled, regenerateBackupCodes, resetMFAConfig, verifyBackupCode, verifyMFACode, verifyMFASetup, } from './mfa.js';
|
|
16
16
|
export type { MfaCheckResult, MfaEnforcementOptions, MfaErrorResponse, MfaRequest, MfaSession, MfaSessionUser, } from './mfa-enforcement.js';
|
|
17
|
-
export { requireMfa } from './mfa-enforcement.js';
|
|
17
|
+
export { checkSessionMfa, requireMfa, toMfaSession } from './mfa-enforcement.js';
|
|
18
18
|
export { buildAuthUrl, exchangeCode, fetchProviderUser, generateOAuthState, getLinkedProviders, linkOAuthAccount, type ProviderUser, type UpsertOAuthOptions, unlinkOAuthAccount, upsertOAuthUser, verifyOAuthState, } from './oauth.js';
|
|
19
19
|
export type { PasskeyConfig } from './passkey.js';
|
|
20
20
|
export { configurePasskey, countUserCredentials, deletePasskey, generateAuthenticationChallenge, generateRegistrationChallenge, listPasskeys, renamePasskey, resetPasskeyConfig, storePasskey, verifyAuthentication, verifyRegistration, } from './passkey.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,YAAY,EACZ,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { clearFailedAttempts, configureBruteForce, getFailedAttemptCount, isAcco
|
|
|
11
11
|
export { AuthError, AuthenticationError, DatabaseError, OAuthAccountConflictError, SessionError, TokenError, } from './errors.js';
|
|
12
12
|
export { configureMagicLink, createMagicLink, resetMagicLinkConfig, verifyMagicLink, } from './magic-link.js';
|
|
13
13
|
export { configureMFA, disableMFA, initiateMFASetup, isMFAEnabled, regenerateBackupCodes, resetMFAConfig, verifyBackupCode, verifyMFACode, verifyMFASetup, } from './mfa.js';
|
|
14
|
-
export { requireMfa } from './mfa-enforcement.js';
|
|
14
|
+
export { checkSessionMfa, requireMfa, toMfaSession } from './mfa-enforcement.js';
|
|
15
15
|
export { buildAuthUrl, exchangeCode, fetchProviderUser, generateOAuthState, getLinkedProviders, linkOAuthAccount, unlinkOAuthAccount, upsertOAuthUser, verifyOAuthState, } from './oauth.js';
|
|
16
16
|
export { configurePasskey, countUserCredentials, deletePasskey, generateAuthenticationChallenge, generateRegistrationChallenge, listPasskeys, renamePasskey, resetPasskeyConfig, storePasskey, verifyAuthentication, verifyRegistration, } from './passkey.js';
|
|
17
17
|
export { changePassword, generatePasswordResetToken, invalidatePasswordResetToken, resetPasswordWithToken, validatePasswordResetToken, } from './password-reset.js';
|
|
@@ -73,4 +73,33 @@ export interface MfaCheckResult {
|
|
|
73
73
|
* ```
|
|
74
74
|
*/
|
|
75
75
|
export declare function requireMfa(options?: MfaEnforcementOptions): (request: MfaRequest) => MfaCheckResult;
|
|
76
|
+
/**
|
|
77
|
+
* Build MFA session shape from getSession / rotateSession results.
|
|
78
|
+
* `mfaVerified` comes from session.metadata set after MFA login (verify/backup).
|
|
79
|
+
*/
|
|
80
|
+
export declare function toMfaSession(sessionData: {
|
|
81
|
+
user: {
|
|
82
|
+
id: string;
|
|
83
|
+
role: string;
|
|
84
|
+
mfaEnabled?: boolean | null;
|
|
85
|
+
};
|
|
86
|
+
session: {
|
|
87
|
+
metadata?: Record<string, unknown> | null;
|
|
88
|
+
};
|
|
89
|
+
}): MfaSession;
|
|
90
|
+
/**
|
|
91
|
+
* One-shot MFA check for a SessionData-like object (Next.js / Hono handlers).
|
|
92
|
+
*/
|
|
93
|
+
export declare function checkSessionMfa(sessionData: {
|
|
94
|
+
user: {
|
|
95
|
+
id: string;
|
|
96
|
+
role: string;
|
|
97
|
+
mfaEnabled?: boolean | null;
|
|
98
|
+
};
|
|
99
|
+
session: {
|
|
100
|
+
metadata?: Record<string, unknown> | null;
|
|
101
|
+
};
|
|
102
|
+
}, options?: MfaEnforcementOptions & {
|
|
103
|
+
operation?: string;
|
|
104
|
+
}): MfaCheckResult;
|
|
76
105
|
//# sourceMappingURL=mfa-enforcement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mfa-enforcement.d.ts","sourceRoot":"","sources":["../../src/server/mfa-enforcement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,GAAG,qBAAqB,CAAC;CAC9C;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"mfa-enforcement.d.ts","sourceRoot":"","sources":["../../src/server/mfa-enforcement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,kDAAkD;AAClD,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,cAAc,GAAG,qBAAqB,CAAC;CAC9C;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AASD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE,qBAA0B,GAClC,CAAC,OAAO,EAAE,UAAU,KAAK,cAAc,CAgDzC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE;IACxC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CACxD,GAAG,UAAU,CAUb;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE;IACX,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IAChE,OAAO,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAC;CACxD,EACD,OAAO,CAAC,EAAE,qBAAqB,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACvD,cAAc,CAMhB"}
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
// =============================================================================
|
|
8
8
|
// Middleware
|
|
9
9
|
// =============================================================================
|
|
10
|
-
|
|
10
|
+
/** Admin-level DB roles that require MFA for sensitive operations (C11). */
|
|
11
|
+
const DEFAULT_ROLES = ['admin', 'owner'];
|
|
11
12
|
/**
|
|
12
13
|
* Create an MFA enforcement checker.
|
|
13
14
|
*
|
|
@@ -74,3 +75,28 @@ export function requireMfa(options = {}) {
|
|
|
74
75
|
return { allowed: true };
|
|
75
76
|
};
|
|
76
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Build MFA session shape from getSession / rotateSession results.
|
|
80
|
+
* `mfaVerified` comes from session.metadata set after MFA login (verify/backup).
|
|
81
|
+
*/
|
|
82
|
+
export function toMfaSession(sessionData) {
|
|
83
|
+
const meta = sessionData.session.metadata ?? null;
|
|
84
|
+
return {
|
|
85
|
+
user: {
|
|
86
|
+
id: sessionData.user.id,
|
|
87
|
+
role: sessionData.user.role,
|
|
88
|
+
mfaEnabled: sessionData.user.mfaEnabled === true,
|
|
89
|
+
mfaVerified: meta?.mfaVerified === true,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* One-shot MFA check for a SessionData-like object (Next.js / Hono handlers).
|
|
95
|
+
*/
|
|
96
|
+
export function checkSessionMfa(sessionData, options) {
|
|
97
|
+
const check = requireMfa(options);
|
|
98
|
+
return check({
|
|
99
|
+
session: toMfaSession(sessionData),
|
|
100
|
+
operation: options?.operation,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SecurityAlertService bridge (fleet-redundancy C11).
|
|
3
|
+
*
|
|
4
|
+
* Lazy singleton: evaluates auth/security audit events against DEFAULT_THRESHOLDS
|
|
5
|
+
* and logs via LogAlertHandler. Best-effort — never throws into the login path.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuditEvent } from '@revealui/security/server';
|
|
8
|
+
type AuditEventInput = Omit<AuditEvent, 'id' | 'timestamp'>;
|
|
9
|
+
/** Reset singleton (tests only). */
|
|
10
|
+
export declare function resetSecurityAlertService(): void;
|
|
11
|
+
/**
|
|
12
|
+
* Feed an audit-shaped event into SecurityAlertService.evaluateEvent.
|
|
13
|
+
* Never throws; failures are logged and swallowed.
|
|
14
|
+
*/
|
|
15
|
+
export declare function evaluateSecurityAlert(event: AuditEventInput): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=security-alerts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-alerts.d.ts","sourceRoot":"","sources":["../../src/server/security-alerts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,KAAK,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;AA6B5D,oCAAoC;AACpC,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAejF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SecurityAlertService bridge (fleet-redundancy C11).
|
|
3
|
+
*
|
|
4
|
+
* Lazy singleton: evaluates auth/security audit events against DEFAULT_THRESHOLDS
|
|
5
|
+
* and logs via LogAlertHandler. Best-effort — never throws into the login path.
|
|
6
|
+
*/
|
|
7
|
+
import { logger } from '@revealui/core/observability/logger';
|
|
8
|
+
let service;
|
|
9
|
+
/**
|
|
10
|
+
* Lazily construct the process-wide SecurityAlertService, or null if the
|
|
11
|
+
* security package cannot be loaded (e.g. partial test mocks).
|
|
12
|
+
*/
|
|
13
|
+
async function getAlertService() {
|
|
14
|
+
if (service !== undefined) {
|
|
15
|
+
return service;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const { SecurityAlertService: AlertService, DEFAULT_THRESHOLDS, LogAlertHandler, } = await import('@revealui/security');
|
|
19
|
+
service = new AlertService({
|
|
20
|
+
thresholds: DEFAULT_THRESHOLDS,
|
|
21
|
+
handlers: [new LogAlertHandler()],
|
|
22
|
+
});
|
|
23
|
+
return service;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
service = null;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Reset singleton (tests only). */
|
|
31
|
+
export function resetSecurityAlertService() {
|
|
32
|
+
service = undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Feed an audit-shaped event into SecurityAlertService.evaluateEvent.
|
|
36
|
+
* Never throws; failures are logged and swallowed.
|
|
37
|
+
*/
|
|
38
|
+
export async function evaluateSecurityAlert(event) {
|
|
39
|
+
try {
|
|
40
|
+
const alerts = await getAlertService();
|
|
41
|
+
if (!alerts)
|
|
42
|
+
return;
|
|
43
|
+
const full = {
|
|
44
|
+
id: crypto.randomUUID(),
|
|
45
|
+
timestamp: new Date().toISOString(),
|
|
46
|
+
...event,
|
|
47
|
+
};
|
|
48
|
+
await alerts.evaluateEvent(full);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.error('Failed to evaluate security alert', error instanceof Error ? error : undefined, {
|
|
52
|
+
type: event.type,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
package/dist/server/session.d.ts
CHANGED
|
@@ -86,6 +86,8 @@ export declare function rotateSession(userId: string, options?: {
|
|
|
86
86
|
persistent?: boolean;
|
|
87
87
|
userAgent?: string;
|
|
88
88
|
ipAddress?: string;
|
|
89
|
+
/** Session metadata (e.g. `{ mfaVerified: true }` after MFA login). */
|
|
90
|
+
metadata?: Record<string, unknown>;
|
|
89
91
|
}): Promise<{
|
|
90
92
|
token: string;
|
|
91
93
|
session: Session;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAQjD,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,cAAc,EAAE,OAAO,CAAC;CACzB;AAaD,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAEtF;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAMD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CA0B3F;AAMD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAI1E;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgI7B;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAmE9C;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/server/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAQjD,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,cAAc,EAAE,OAAO,CAAC;CACzB;AAaD,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAEtF;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAMD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CA0B3F;AAMD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAI1E;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAgI7B;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAmE9C;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACA,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqC9C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BtE;AAED;;;;GAIG;AACH;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzE"}
|
package/dist/server/session.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revealui/auth",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.10",
|
|
4
4
|
"description": "Database-backed session auth for Hono and Next.js — bcrypt, OAuth, brute-force protection, rate limiting, password reset. Ships with RevealUI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"auth",
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"drizzle-orm": "^0.45.2",
|
|
16
16
|
"zod": "^4.4.3",
|
|
17
17
|
"@revealui/config": "0.6.0",
|
|
18
|
-
"@revealui/contracts": "0.8.
|
|
19
|
-
"@revealui/core": "0.12.
|
|
18
|
+
"@revealui/contracts": "0.8.1",
|
|
19
|
+
"@revealui/core": "0.12.1",
|
|
20
20
|
"@revealui/db": "0.9.0",
|
|
21
|
-
"@revealui/security": "0.5.
|
|
21
|
+
"@revealui/security": "0.5.1"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@simplewebauthn/browser": "^13.3.0",
|
|
@@ -38,15 +38,18 @@
|
|
|
38
38
|
"exports": {
|
|
39
39
|
".": {
|
|
40
40
|
"types": "./dist/index.d.ts",
|
|
41
|
-
"import": "./dist/index.js"
|
|
41
|
+
"import": "./dist/index.js",
|
|
42
|
+
"default": "./dist/index.js"
|
|
42
43
|
},
|
|
43
44
|
"./server": {
|
|
44
45
|
"types": "./dist/server/index.d.ts",
|
|
45
|
-
"import": "./dist/server/index.js"
|
|
46
|
+
"import": "./dist/server/index.js",
|
|
47
|
+
"default": "./dist/server/index.js"
|
|
46
48
|
},
|
|
47
49
|
"./react": {
|
|
48
50
|
"types": "./dist/react/index.d.ts",
|
|
49
|
-
"import": "./dist/react/index.js"
|
|
51
|
+
"import": "./dist/react/index.js",
|
|
52
|
+
"default": "./dist/react/index.js"
|
|
50
53
|
}
|
|
51
54
|
},
|
|
52
55
|
"files": [
|