@revealui/core 0.2.0 → 0.3.0
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/README.md +137 -30
- package/dist/api/compression.d.ts.map +1 -1
- package/dist/api/payload-optimization.d.ts.map +1 -1
- package/dist/api/rate-limit.d.ts +30 -29
- package/dist/api/rate-limit.d.ts.map +1 -1
- package/dist/api/rate-limit.js +79 -4
- package/dist/api/response-cache.d.ts.map +1 -1
- package/dist/api/response-cache.js +1 -1
- package/dist/api/rest.d.ts.map +1 -1
- package/dist/api/rest.js +5 -4
- package/dist/auth/access.d.ts.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/cache/query-cache.d.ts +12 -10
- package/dist/cache/query-cache.d.ts.map +1 -1
- package/dist/cache/query-cache.js +38 -42
- package/dist/caching/app-cache.d.ts +5 -0
- package/dist/caching/app-cache.d.ts.map +1 -1
- package/dist/caching/app-cache.js +9 -1
- package/dist/caching/cdn-config.d.ts +2 -2
- package/dist/caching/cdn-config.d.ts.map +1 -1
- package/dist/caching/cdn-config.js +5 -15
- package/dist/caching/edge-cache.d.ts +1 -1
- package/dist/caching/edge-cache.d.ts.map +1 -1
- package/dist/caching/edge-cache.js +44 -11
- package/dist/caching/index.d.ts +6 -0
- package/dist/caching/index.d.ts.map +1 -0
- package/dist/caching/index.js +5 -0
- package/dist/caching/service-worker.d.ts +10 -18
- package/dist/caching/service-worker.d.ts.map +1 -1
- package/dist/caching/service-worker.js +5 -4
- package/dist/client/admin/RichText.d.ts +1 -1
- package/dist/client/admin/RichText.d.ts.map +1 -1
- package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -1
- package/dist/client/admin/components/AdminDashboard.js +178 -205
- package/dist/client/admin/components/CollectionList.d.ts.map +1 -1
- package/dist/client/admin/components/DocumentForm.d.ts.map +1 -1
- package/dist/client/admin/components/DocumentForm.js +130 -6
- package/dist/client/admin/components/GlobalForm.d.ts.map +1 -1
- package/dist/client/admin/context/ServerFunctionContext.d.ts +8 -0
- package/dist/client/admin/context/ServerFunctionContext.d.ts.map +1 -0
- package/dist/client/admin/context/ServerFunctionContext.js +15 -0
- package/dist/client/admin/i18n/en.d.ts.map +1 -1
- package/dist/client/admin/index.d.ts +1 -0
- package/dist/client/admin/index.d.ts.map +1 -1
- package/dist/client/admin/index.js +1 -0
- package/dist/client/admin/layout.d.ts +1 -1
- package/dist/client/admin/layout.d.ts.map +1 -1
- package/dist/client/admin/layout.js +3 -2
- package/dist/client/admin/page.d.ts.map +1 -1
- package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
- package/dist/client/admin/utils/apiClient.js +0 -4
- package/dist/client/admin/utils/auth.d.ts +0 -4
- package/dist/client/admin/utils/auth.d.ts.map +1 -1
- package/dist/client/admin/utils/auth.js +0 -6
- package/dist/client/admin/utils/index.d.ts +0 -1
- package/dist/client/admin/utils/index.d.ts.map +1 -1
- package/dist/client/admin/utils/index.js +0 -1
- package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -1
- package/dist/client/hooks.d.ts.map +1 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -2
- package/dist/client/richtext/RichTextEditor.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageNodeComponent.js +0 -1
- package/dist/client/richtext/components/ImageUploadButton.d.ts +2 -0
- package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -1
- package/dist/client/richtext/components/ImageUploadButton.js +30 -15
- package/dist/client/richtext/index.d.ts.map +1 -1
- package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -1
- package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -1
- package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -1
- package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -1
- package/dist/client/ui/index.d.ts.map +1 -1
- package/dist/client/ui/index.js +1 -1
- package/dist/collections/CollectionOperations.d.ts +7 -7
- package/dist/collections/CollectionOperations.d.ts.map +1 -1
- package/dist/collections/CollectionOperations.js +15 -1
- package/dist/collections/hooks.d.ts.map +1 -1
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/operations/create.d.ts +2 -4
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +9 -7
- package/dist/collections/operations/createMany.d.ts +12 -0
- package/dist/collections/operations/createMany.d.ts.map +1 -0
- package/dist/collections/operations/createMany.js +43 -0
- package/dist/collections/operations/delete.d.ts +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +31 -2
- package/dist/collections/operations/deleteMany.d.ts +11 -0
- package/dist/collections/operations/deleteMany.d.ts.map +1 -0
- package/dist/collections/operations/deleteMany.js +50 -0
- package/dist/collections/operations/fieldHooks.d.ts +2 -2
- package/dist/collections/operations/fieldHooks.d.ts.map +1 -1
- package/dist/collections/operations/fieldHooks.js +4 -4
- package/dist/collections/operations/find.d.ts +2 -4
- package/dist/collections/operations/find.d.ts.map +1 -1
- package/dist/collections/operations/find.js +115 -8
- package/dist/collections/operations/findById.d.ts +3 -4
- package/dist/collections/operations/findById.d.ts.map +1 -1
- package/dist/collections/operations/findById.js +53 -1
- package/dist/collections/operations/sqlAdapter.d.ts +23 -0
- package/dist/collections/operations/sqlAdapter.d.ts.map +1 -0
- package/dist/collections/operations/sqlAdapter.js +76 -0
- package/dist/collections/operations/update.d.ts +3 -5
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +103 -11
- package/dist/collections/operations/updateMany.d.ts +11 -0
- package/dist/collections/operations/updateMany.d.ts.map +1 -0
- package/dist/collections/operations/updateMany.js +52 -0
- package/dist/collections/registry.d.ts +12 -0
- package/dist/collections/registry.d.ts.map +1 -0
- package/dist/collections/registry.js +38 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/runtime.d.ts.map +1 -1
- package/dist/config/utils.d.ts +0 -10
- package/dist/config/utils.d.ts.map +1 -1
- package/dist/config/utils.js +18 -17
- package/dist/database/index.d.ts +3 -0
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +1 -5
- package/dist/database/safe-parse.d.ts +26 -0
- package/dist/database/safe-parse.d.ts.map +1 -0
- package/dist/database/safe-parse.js +42 -0
- package/dist/database/ssl-config.d.ts.map +1 -1
- package/dist/database/type-adapter.d.ts.map +1 -1
- package/dist/database/universal-postgres.d.ts.map +1 -1
- package/dist/database/universal-postgres.js +18 -13
- package/dist/dataloader.d.ts.map +1 -1
- package/dist/dataloader.js +16 -2
- package/dist/error-handling/circuit-breaker.d.ts +1 -1
- package/dist/error-handling/circuit-breaker.d.ts.map +1 -1
- package/dist/error-handling/circuit-breaker.js +11 -3
- package/dist/error-handling/error-boundary.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.d.ts +6 -5
- package/dist/error-handling/error-reporter.d.ts.map +1 -1
- package/dist/error-handling/error-reporter.js +26 -41
- package/dist/error-handling/fallback-components.d.ts.map +1 -1
- package/dist/error-handling/fallback-components.js +1 -1
- package/dist/error-handling/index.d.ts +3 -5
- package/dist/error-handling/index.d.ts.map +1 -1
- package/dist/error-handling/index.js +2 -5
- package/dist/error-handling/retry.d.ts.map +1 -1
- package/dist/error-handling/retry.js +13 -8
- package/dist/factories/builders.d.ts.map +1 -1
- package/dist/factories/index.d.ts.map +1 -1
- package/dist/features.d.ts +5 -5
- package/dist/features.d.ts.map +1 -1
- package/dist/features.js +6 -5
- package/dist/fieldTraversal.d.ts.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/getDefaultValue.d.ts.map +1 -1
- package/dist/fields/getFieldPaths.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/generated/types/cms.d.ts.map +1 -1
- package/dist/generated/types/cms.js +0 -1
- package/dist/generated/types/index.d.ts +0 -3
- package/dist/generated/types/index.d.ts.map +1 -1
- package/dist/generated/types/index.js +0 -7
- package/dist/generated/types/neon.d.ts.map +1 -1
- package/dist/generated/types/neon.js +4 -2
- package/dist/globals/GlobalOperations.d.ts.map +1 -1
- package/dist/globals/GlobalOperations.js +4 -2
- package/dist/globals/index.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -6
- package/dist/instance/RevealUIInstance.d.ts.map +1 -1
- package/dist/instance/RevealUIInstance.js +50 -69
- package/dist/instance/index.d.ts.map +1 -1
- package/dist/instance/logger.d.ts.map +1 -1
- package/dist/instance/methods/create.d.ts.map +1 -1
- package/dist/instance/methods/create.js +4 -4
- package/dist/instance/methods/delete.d.ts.map +1 -1
- package/dist/instance/methods/delete.js +5 -5
- package/dist/instance/methods/find.d.ts.map +1 -1
- package/dist/instance/methods/find.js +0 -3
- package/dist/instance/methods/findById.d.ts.map +1 -1
- package/dist/instance/methods/findById.js +0 -3
- package/dist/instance/methods/hooks.d.ts.map +1 -1
- package/dist/instance/methods/hooks.js +3 -1
- package/dist/instance/methods/update.d.ts.map +1 -1
- package/dist/instance/methods/update.js +4 -4
- package/dist/jobs/index.d.ts +16 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +14 -0
- package/dist/jobs/queue.d.ts +57 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +134 -0
- package/dist/license-encryption.d.ts +21 -0
- package/dist/license-encryption.d.ts.map +1 -0
- package/dist/license-encryption.js +74 -0
- package/dist/license.d.ts +33 -7
- package/dist/license.d.ts.map +1 -1
- package/dist/license.js +119 -16
- package/dist/monitoring/alerts.d.ts.map +1 -1
- package/dist/monitoring/cleanup-manager.d.ts.map +1 -1
- package/dist/monitoring/health-monitor.d.ts.map +1 -1
- package/dist/monitoring/index.d.ts.map +1 -1
- package/dist/monitoring/process-registry.d.ts.map +1 -1
- package/dist/monitoring/query-monitor.d.ts.map +1 -1
- package/dist/monitoring/types.d.ts.map +1 -1
- package/dist/monitoring/zombie-detector.d.ts.map +1 -1
- package/dist/monitoring/zombie-detector.js +5 -0
- package/dist/nextjs/index.d.ts.map +1 -1
- package/dist/nextjs/utilities.d.ts.map +1 -1
- package/dist/nextjs/withRevealUI.d.ts.map +1 -1
- package/dist/observability/alerts.d.ts.map +1 -1
- package/dist/observability/alerts.js +1 -2
- package/dist/observability/health-check.d.ts +1 -5
- package/dist/observability/health-check.d.ts.map +1 -1
- package/dist/observability/health-check.js +37 -43
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +1 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/tracing.d.ts.map +1 -1
- package/dist/observability/tracing.js +0 -1
- package/dist/optimization/asset-optimizer.d.ts +6 -2
- package/dist/optimization/asset-optimizer.d.ts.map +1 -1
- package/dist/optimization/asset-optimizer.js +31 -7
- package/dist/optimization/bundle-analyzer.d.ts +1 -1
- package/dist/optimization/bundle-analyzer.d.ts.map +1 -1
- package/dist/optimization/bundle-analyzer.js +29 -5
- package/dist/optimization/code-splitting.d.ts +0 -23
- package/dist/optimization/code-splitting.d.ts.map +1 -1
- package/dist/optimization/code-splitting.js +0 -29
- package/dist/plugins/form-builder.d.ts.map +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/nested-docs.d.ts +4 -0
- package/dist/plugins/nested-docs.d.ts.map +1 -1
- package/dist/plugins/nested-docs.js +50 -5
- package/dist/plugins/redirects.d.ts.map +1 -1
- package/dist/queries/index.d.ts.map +1 -1
- package/dist/queries/queryBuilder.d.ts.map +1 -1
- package/dist/queries/queryBuilder.js +15 -5
- package/dist/relationships/analyzer.d.ts.map +1 -1
- package/dist/relationships/analyzer.js +8 -0
- package/dist/relationships/index.d.ts.map +1 -1
- package/dist/relationships/populate-core.d.ts +57 -0
- package/dist/relationships/populate-core.d.ts.map +1 -0
- package/dist/relationships/populate-core.js +116 -0
- package/dist/relationships/populate-helpers.d.ts +5 -51
- package/dist/relationships/populate-helpers.d.ts.map +1 -1
- package/dist/relationships/populate-helpers.js +4 -109
- package/dist/relationships/population.d.ts +1 -9
- package/dist/relationships/population.d.ts.map +1 -1
- package/dist/relationships/population.js +8 -3
- package/dist/revealui.d.ts.map +1 -1
- package/dist/richtext/exports/client/rcc.d.ts.map +1 -1
- package/dist/richtext/exports/client/rcc.js +1 -1
- package/dist/richtext/exports/server/rsc.d.ts +17 -0
- package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
- package/dist/richtext/exports/server/rsc.js +61 -5
- package/dist/richtext/index.d.ts.map +1 -1
- package/dist/richtext/lexical.d.ts.map +1 -1
- package/dist/security/audit.d.ts +1 -1
- package/dist/security/audit.d.ts.map +1 -1
- package/dist/security/audit.js +4 -2
- package/dist/security/auth.d.ts +29 -160
- package/dist/security/auth.d.ts.map +1 -1
- package/dist/security/auth.js +150 -367
- package/dist/security/authorization.d.ts +7 -31
- package/dist/security/authorization.d.ts.map +1 -1
- package/dist/security/authorization.js +72 -14
- package/dist/security/encryption.d.ts +56 -44
- package/dist/security/encryption.d.ts.map +1 -1
- package/dist/security/encryption.js +128 -100
- package/dist/security/gdpr-storage.d.ts +102 -0
- package/dist/security/gdpr-storage.d.ts.map +1 -0
- package/dist/security/gdpr-storage.js +65 -0
- package/dist/security/gdpr.d.ts +57 -37
- package/dist/security/gdpr.d.ts.map +1 -1
- package/dist/security/gdpr.js +155 -94
- package/dist/security/headers.d.ts +4 -2
- package/dist/security/headers.d.ts.map +1 -1
- package/dist/security/headers.js +35 -17
- package/dist/security/index.d.ts +3 -16
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +3 -16
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/renderPage.d.ts.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -4
- package/dist/storage/vercel-blob.d.ts.map +1 -1
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/types/access.d.ts.map +1 -1
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/cms.d.ts.map +1 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/extensions.d.ts.map +1 -1
- package/dist/types/frontend.d.ts.map +1 -1
- package/dist/types/generated.d.ts +0 -2
- package/dist/types/generated.d.ts.map +1 -1
- package/dist/types/generated.js +0 -1
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces/app.d.ts.map +1 -1
- package/dist/types/jobs.d.ts.map +1 -1
- package/dist/types/legacy.d.ts.map +1 -1
- package/dist/types/plugins.d.ts.map +1 -1
- package/dist/types/query.d.ts.map +1 -1
- package/dist/types/request.d.ts.map +1 -1
- package/dist/types/richtext.d.ts.map +1 -1
- package/dist/types/runtime.d.ts +59 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/user.d.ts.map +1 -1
- package/dist/utils/access-conversion.d.ts.map +1 -1
- package/dist/utils/api-wrapper.d.ts.map +1 -1
- package/dist/utils/api-wrapper.js +1 -1
- package/dist/utils/block-conversion.d.ts.map +1 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/deep-clone.js +0 -1
- package/dist/utils/error-responses.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +103 -0
- package/dist/utils/field-conversion.d.ts +1 -1
- package/dist/utils/field-conversion.d.ts.map +1 -1
- package/dist/utils/flattenResult.d.ts.map +1 -1
- package/dist/utils/flattenResult.js +0 -1
- package/dist/utils/getBlockSelect.d.ts.map +1 -1
- package/dist/utils/getSelectMode.d.ts.map +1 -1
- package/dist/utils/isValidID.d.ts.map +1 -1
- package/dist/utils/json-parsing.d.ts.map +1 -1
- package/dist/utils/logger-client.d.ts.map +1 -1
- package/dist/utils/logger-server.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/request-context.d.ts.map +1 -1
- package/dist/utils/stripUnselectedFields.d.ts.map +1 -1
- package/dist/utils/type-guards.d.ts.map +1 -1
- package/package.json +39 -16
package/dist/security/auth.js
CHANGED
|
@@ -1,263 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Authentication
|
|
2
|
+
* Authentication Utilities
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* OAuth support, password hashing, and two-factor authentication.
|
|
5
|
+
* JWT-based auth was removed — session auth is handled by @revealui/auth.
|
|
5
6
|
*/
|
|
6
|
-
import { createHmac,
|
|
7
|
-
import { jwtVerify, SignJWT } from 'jose';
|
|
8
|
-
const DEFAULT_CONFIG = {
|
|
9
|
-
jwtAlgorithm: 'HS256',
|
|
10
|
-
accessTokenExpiry: 3600, // 1 hour
|
|
11
|
-
refreshTokenExpiry: 604800, // 7 days
|
|
12
|
-
issuer: 'revealui',
|
|
13
|
-
audience: 'revealui-app',
|
|
14
|
-
sessionTimeout: 1800, // 30 minutes
|
|
15
|
-
refreshThreshold: 300, // 5 minutes before expiry
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Authentication system
|
|
19
|
-
*/
|
|
20
|
-
export class AuthSystem {
|
|
21
|
-
static MAX_SESSIONS = 10_000;
|
|
22
|
-
config;
|
|
23
|
-
sessions = new Map();
|
|
24
|
-
refreshTokens = new Map(); // refreshToken -> userId
|
|
25
|
-
sessionCleanupInterval;
|
|
26
|
-
constructor(config) {
|
|
27
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
28
|
-
this.startSessionCleanup();
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Authenticate user with credentials
|
|
32
|
-
*/
|
|
33
|
-
async authenticate(_email, _password, _deviceInfo) {
|
|
34
|
-
// This would integrate with your authentication backend
|
|
35
|
-
// For now, this is a placeholder implementation
|
|
36
|
-
throw new Error('Implement authenticate() with your auth backend');
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Create JWT token
|
|
40
|
-
*/
|
|
41
|
-
async createToken(user, expiresIn = this.config.accessTokenExpiry) {
|
|
42
|
-
const now = Math.floor(Date.now() / 1000);
|
|
43
|
-
const expiresAt = now + expiresIn;
|
|
44
|
-
const payload = {
|
|
45
|
-
sub: user.id,
|
|
46
|
-
email: user.email,
|
|
47
|
-
roles: user.roles,
|
|
48
|
-
permissions: user.permissions,
|
|
49
|
-
iat: now,
|
|
50
|
-
exp: expiresAt,
|
|
51
|
-
iss: this.config.issuer,
|
|
52
|
-
aud: this.config.audience,
|
|
53
|
-
};
|
|
54
|
-
const accessToken = await this.encodeJWT(payload);
|
|
55
|
-
// Create refresh token
|
|
56
|
-
const refreshToken = this.generateRefreshToken(user.id);
|
|
57
|
-
return {
|
|
58
|
-
accessToken,
|
|
59
|
-
refreshToken,
|
|
60
|
-
expiresAt: expiresAt * 1000, // Convert to ms
|
|
61
|
-
tokenType: 'Bearer',
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Verify and decode JWT token
|
|
66
|
-
*/
|
|
67
|
-
async verifyToken(token) {
|
|
68
|
-
try {
|
|
69
|
-
const payload = await this.decodeJWT(token);
|
|
70
|
-
// Check expiration
|
|
71
|
-
const now = Math.floor(Date.now() / 1000);
|
|
72
|
-
if (payload.exp && payload.exp < now) {
|
|
73
|
-
throw new Error('Token expired');
|
|
74
|
-
}
|
|
75
|
-
// Check issuer
|
|
76
|
-
if (payload.iss !== this.config.issuer) {
|
|
77
|
-
throw new Error('Invalid token issuer');
|
|
78
|
-
}
|
|
79
|
-
// Check audience
|
|
80
|
-
if (payload.aud !== this.config.audience) {
|
|
81
|
-
throw new Error('Invalid token audience');
|
|
82
|
-
}
|
|
83
|
-
return payload;
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
throw new Error(`Token verification failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Refresh access token
|
|
91
|
-
*/
|
|
92
|
-
async refreshAccessToken(refreshToken) {
|
|
93
|
-
const userId = this.refreshTokens.get(refreshToken);
|
|
94
|
-
if (!userId) {
|
|
95
|
-
throw new Error('Invalid refresh token');
|
|
96
|
-
}
|
|
97
|
-
// Get user session
|
|
98
|
-
const session = Array.from(this.sessions.values()).find((s) => s.user.id === userId);
|
|
99
|
-
if (!session) {
|
|
100
|
-
throw new Error('Session not found');
|
|
101
|
-
}
|
|
102
|
-
// Create new access token
|
|
103
|
-
return await this.createToken(session.user);
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Create session
|
|
107
|
-
*/
|
|
108
|
-
createSession(user, token, deviceInfo) {
|
|
109
|
-
const now = Date.now();
|
|
110
|
-
// Evict oldest session if at capacity
|
|
111
|
-
if (this.sessions.size >= AuthSystem.MAX_SESSIONS) {
|
|
112
|
-
let oldestKey;
|
|
113
|
-
let oldestTime = Number.POSITIVE_INFINITY;
|
|
114
|
-
for (const [key, session] of this.sessions.entries()) {
|
|
115
|
-
if (session.lastActivity < oldestTime) {
|
|
116
|
-
oldestTime = session.lastActivity;
|
|
117
|
-
oldestKey = key;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (oldestKey) {
|
|
121
|
-
this.destroySession(oldestKey);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const session = {
|
|
125
|
-
user,
|
|
126
|
-
token,
|
|
127
|
-
createdAt: now,
|
|
128
|
-
lastActivity: now,
|
|
129
|
-
expiresAt: now + this.config.sessionTimeout * 1000,
|
|
130
|
-
deviceInfo,
|
|
131
|
-
};
|
|
132
|
-
this.sessions.set(user.id, session);
|
|
133
|
-
if (token.refreshToken) {
|
|
134
|
-
this.refreshTokens.set(token.refreshToken, user.id);
|
|
135
|
-
}
|
|
136
|
-
return session;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Get session
|
|
140
|
-
*/
|
|
141
|
-
getSession(userId) {
|
|
142
|
-
const session = this.sessions.get(userId);
|
|
143
|
-
if (!session) {
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
// Check if session expired
|
|
147
|
-
if (Date.now() > session.expiresAt) {
|
|
148
|
-
this.destroySession(userId);
|
|
149
|
-
return undefined;
|
|
150
|
-
}
|
|
151
|
-
return session;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Update session activity
|
|
155
|
-
*/
|
|
156
|
-
updateSessionActivity(userId) {
|
|
157
|
-
const session = this.sessions.get(userId);
|
|
158
|
-
if (session) {
|
|
159
|
-
session.lastActivity = Date.now();
|
|
160
|
-
session.expiresAt = Date.now() + this.config.sessionTimeout * 1000;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Destroy session
|
|
165
|
-
*/
|
|
166
|
-
destroySession(userId) {
|
|
167
|
-
const session = this.sessions.get(userId);
|
|
168
|
-
if (session?.token.refreshToken) {
|
|
169
|
-
this.refreshTokens.delete(session.token.refreshToken);
|
|
170
|
-
}
|
|
171
|
-
this.sessions.delete(userId);
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Destroy all sessions for user
|
|
175
|
-
*/
|
|
176
|
-
destroyAllSessions(userId) {
|
|
177
|
-
this.destroySession(userId);
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Check if token needs refresh
|
|
181
|
-
*/
|
|
182
|
-
shouldRefreshToken(token) {
|
|
183
|
-
const timeUntilExpiry = token.expiresAt - Date.now();
|
|
184
|
-
return timeUntilExpiry < this.config.refreshThreshold * 1000;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Get user from token
|
|
188
|
-
*/
|
|
189
|
-
async getUserFromToken(token) {
|
|
190
|
-
try {
|
|
191
|
-
const payload = await this.verifyToken(token);
|
|
192
|
-
return {
|
|
193
|
-
id: payload.sub,
|
|
194
|
-
email: payload.email,
|
|
195
|
-
roles: payload.roles,
|
|
196
|
-
permissions: payload.permissions,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
catch {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Encode JWT using jose library (Web Crypto API)
|
|
205
|
-
*/
|
|
206
|
-
async encodeJWT(payload) {
|
|
207
|
-
const secret = new TextEncoder().encode(this.config.jwtSecret);
|
|
208
|
-
const alg = this.config.jwtAlgorithm === 'RS256' ? 'RS256' : this.config.jwtAlgorithm;
|
|
209
|
-
const builder = new SignJWT({
|
|
210
|
-
email: payload.email,
|
|
211
|
-
roles: payload.roles,
|
|
212
|
-
permissions: payload.permissions,
|
|
213
|
-
})
|
|
214
|
-
.setProtectedHeader({ alg })
|
|
215
|
-
.setSubject(payload.sub)
|
|
216
|
-
.setIssuedAt(payload.iat)
|
|
217
|
-
.setExpirationTime(payload.exp);
|
|
218
|
-
if (payload.iss)
|
|
219
|
-
builder.setIssuer(payload.iss);
|
|
220
|
-
if (payload.aud)
|
|
221
|
-
builder.setAudience(payload.aud);
|
|
222
|
-
return builder.sign(secret);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Decode and verify JWT using jose library (Web Crypto API)
|
|
226
|
-
*/
|
|
227
|
-
async decodeJWT(token) {
|
|
228
|
-
const secret = new TextEncoder().encode(this.config.jwtSecret);
|
|
229
|
-
const { payload } = await jwtVerify(token, secret);
|
|
230
|
-
return payload;
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Generate cryptographically secure refresh token
|
|
234
|
-
*/
|
|
235
|
-
generateRefreshToken(userId) {
|
|
236
|
-
const token = randomBytes(32).toString('hex');
|
|
237
|
-
return `${userId}.${token}`;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* Start session cleanup interval
|
|
241
|
-
*/
|
|
242
|
-
startSessionCleanup() {
|
|
243
|
-
this.sessionCleanupInterval = setInterval(() => {
|
|
244
|
-
const now = Date.now();
|
|
245
|
-
for (const [userId, session] of this.sessions.entries()) {
|
|
246
|
-
if (now > session.expiresAt) {
|
|
247
|
-
this.destroySession(userId);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}, 60000); // Every minute
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Stop session cleanup
|
|
254
|
-
*/
|
|
255
|
-
destroy() {
|
|
256
|
-
if (this.sessionCleanupInterval) {
|
|
257
|
-
clearInterval(this.sessionCleanupInterval);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
7
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
261
8
|
/**
|
|
262
9
|
* OAuth provider configurations
|
|
263
10
|
*/
|
|
@@ -287,9 +34,10 @@ export const OAuthProviders = {
|
|
|
287
34
|
export class OAuthClient {
|
|
288
35
|
config;
|
|
289
36
|
constructor(config) {
|
|
37
|
+
// Provider defaults fill in missing fields; user-provided config takes precedence
|
|
290
38
|
this.config = {
|
|
291
|
-
...config,
|
|
292
39
|
...OAuthProviders[config.provider],
|
|
40
|
+
...config,
|
|
293
41
|
};
|
|
294
42
|
}
|
|
295
43
|
/**
|
|
@@ -311,6 +59,8 @@ export class OAuthClient {
|
|
|
311
59
|
* Exchange code for token
|
|
312
60
|
*/
|
|
313
61
|
async exchangeCodeForToken(code) {
|
|
62
|
+
if (!this.config.tokenUrl)
|
|
63
|
+
throw new Error('tokenUrl is required for OAuth');
|
|
314
64
|
const response = await fetch(this.config.tokenUrl, {
|
|
315
65
|
method: 'POST',
|
|
316
66
|
headers: {
|
|
@@ -325,7 +75,15 @@ export class OAuthClient {
|
|
|
325
75
|
}),
|
|
326
76
|
});
|
|
327
77
|
if (!response.ok) {
|
|
328
|
-
|
|
78
|
+
let detail = '';
|
|
79
|
+
try {
|
|
80
|
+
const body = await response.text();
|
|
81
|
+
detail = `: ${response.status} ${body.slice(0, 200)}`;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
detail = `: ${response.status}`;
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`Failed to exchange code for token${detail}`);
|
|
329
87
|
}
|
|
330
88
|
return response.json();
|
|
331
89
|
}
|
|
@@ -333,13 +91,24 @@ export class OAuthClient {
|
|
|
333
91
|
* Get user info
|
|
334
92
|
*/
|
|
335
93
|
async getUserInfo(accessToken) {
|
|
94
|
+
if (!this.config.userInfoUrl)
|
|
95
|
+
throw new Error('userInfoUrl is required for OAuth');
|
|
336
96
|
const response = await fetch(this.config.userInfoUrl, {
|
|
337
97
|
headers: {
|
|
98
|
+
// biome-ignore lint/style/useNamingConvention: HTTP header convention
|
|
338
99
|
Authorization: `Bearer ${accessToken}`,
|
|
339
100
|
},
|
|
340
101
|
});
|
|
341
102
|
if (!response.ok) {
|
|
342
|
-
|
|
103
|
+
let detail = '';
|
|
104
|
+
try {
|
|
105
|
+
const body = await response.text();
|
|
106
|
+
detail = `: ${response.status} ${body.slice(0, 200)}`;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
detail = `: ${response.status}`;
|
|
110
|
+
}
|
|
111
|
+
throw new Error(`Failed to fetch user info${detail}`);
|
|
343
112
|
}
|
|
344
113
|
return response.json();
|
|
345
114
|
}
|
|
@@ -348,127 +117,141 @@ export class OAuthClient {
|
|
|
348
117
|
* Password hashing utilities
|
|
349
118
|
*
|
|
350
119
|
* Uses PBKDF2 with a random salt for secure password hashing.
|
|
351
|
-
*
|
|
120
|
+
*
|
|
121
|
+
* @deprecated Use `@revealui/auth` instead — it uses bcrypt which is more
|
|
122
|
+
* resistant to GPU brute-force attacks. This PBKDF2 implementation will be
|
|
123
|
+
* removed in a future major version.
|
|
352
124
|
*/
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
resolve(`${salt}:${derivedKey.toString('hex')}`);
|
|
369
|
-
});
|
|
125
|
+
const PH_ITERATIONS = 100000;
|
|
126
|
+
const PH_KEY_LENGTH = 64;
|
|
127
|
+
const PH_DIGEST = 'sha512';
|
|
128
|
+
/**
|
|
129
|
+
* Hash password with PBKDF2 and random salt
|
|
130
|
+
*/
|
|
131
|
+
async function hashPassword(password) {
|
|
132
|
+
const { pbkdf2, randomBytes: rb } = await import('node:crypto');
|
|
133
|
+
const salt = rb(16).toString('hex');
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
pbkdf2(password, salt, PH_ITERATIONS, PH_KEY_LENGTH, PH_DIGEST, (err, derivedKey) => {
|
|
136
|
+
if (err)
|
|
137
|
+
reject(err);
|
|
138
|
+
else
|
|
139
|
+
resolve(`${salt}:${derivedKey.toString('hex')}`);
|
|
370
140
|
});
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Verify password against stored hash
|
|
145
|
+
*/
|
|
146
|
+
async function verifyPassword(password, storedHash) {
|
|
147
|
+
const { pbkdf2, timingSafeEqual: tse } = await import('node:crypto');
|
|
148
|
+
const [salt, hash] = storedHash.split(':');
|
|
149
|
+
if (!(salt && hash)) {
|
|
150
|
+
return false;
|
|
371
151
|
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
pbkdf2(password, salt, PasswordHasher.ITERATIONS, PasswordHasher.KEY_LENGTH, PasswordHasher.DIGEST, (err, derivedKey) => {
|
|
383
|
-
if (err)
|
|
384
|
-
reject(err);
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
pbkdf2(password, salt, PH_ITERATIONS, PH_KEY_LENGTH, PH_DIGEST, (err, derivedKey) => {
|
|
154
|
+
if (err)
|
|
155
|
+
reject(err);
|
|
156
|
+
else {
|
|
157
|
+
const derived = Buffer.from(derivedKey.toString('hex'), 'utf-8');
|
|
158
|
+
const expected = Buffer.from(hash, 'utf-8');
|
|
159
|
+
if (derived.length !== expected.length) {
|
|
160
|
+
resolve(false);
|
|
161
|
+
}
|
|
385
162
|
else {
|
|
386
|
-
|
|
387
|
-
const expected = Buffer.from(hash, 'utf-8');
|
|
388
|
-
if (derived.length !== expected.length) {
|
|
389
|
-
resolve(false);
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
resolve(timingSafeEqual(derived, expected));
|
|
393
|
-
}
|
|
163
|
+
resolve(tse(derived, expected));
|
|
394
164
|
}
|
|
395
|
-
}
|
|
165
|
+
}
|
|
396
166
|
});
|
|
397
|
-
}
|
|
167
|
+
});
|
|
398
168
|
}
|
|
169
|
+
export const PasswordHasher = {
|
|
170
|
+
hash: hashPassword,
|
|
171
|
+
verify: verifyPassword,
|
|
172
|
+
};
|
|
399
173
|
/**
|
|
400
174
|
* Two-factor authentication
|
|
401
175
|
*/
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
176
|
+
/**
|
|
177
|
+
* Base32 encode
|
|
178
|
+
*/
|
|
179
|
+
function base32Encode(buffer) {
|
|
180
|
+
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
|
|
181
|
+
let result = '';
|
|
182
|
+
let bits = 0;
|
|
183
|
+
let value = 0;
|
|
184
|
+
for (const byte of buffer) {
|
|
185
|
+
if (byte === undefined)
|
|
186
|
+
continue;
|
|
187
|
+
value = (value << 8) | byte;
|
|
188
|
+
bits += 8;
|
|
189
|
+
while (bits >= 5) {
|
|
190
|
+
result += alphabet[(value >>> (bits - 5)) & 31];
|
|
191
|
+
bits -= 5;
|
|
410
192
|
}
|
|
411
|
-
const buffer = new Uint8Array(20);
|
|
412
|
-
crypto.getRandomValues(buffer);
|
|
413
|
-
return TwoFactorAuth.base32Encode(buffer);
|
|
414
193
|
}
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
*/
|
|
418
|
-
static generateCode(secret, timestamp) {
|
|
419
|
-
const time = Math.floor((timestamp || Date.now()) / 30000);
|
|
420
|
-
const hmacDigest = TwoFactorAuth.hmac(secret, time.toString());
|
|
421
|
-
const offset = hmacDigest[hmacDigest.length - 1] & 0x0f;
|
|
422
|
-
const code = (((hmacDigest[offset] & 0x7f) << 24) |
|
|
423
|
-
((hmacDigest[offset + 1] & 0xff) << 16) |
|
|
424
|
-
((hmacDigest[offset + 2] & 0xff) << 8) |
|
|
425
|
-
(hmacDigest[offset + 3] & 0xff)) %
|
|
426
|
-
1000000;
|
|
427
|
-
return code.toString().padStart(6, '0');
|
|
194
|
+
if (bits > 0) {
|
|
195
|
+
result += alphabet[(value << (5 - bits)) & 31];
|
|
428
196
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* HMAC-SHA1 implementation for TOTP
|
|
201
|
+
*/
|
|
202
|
+
function totpHmac(key, message) {
|
|
203
|
+
const hmacDigest = createHmac('sha1', key).update(message).digest();
|
|
204
|
+
return new Uint8Array(hmacDigest);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Generate TOTP secret
|
|
208
|
+
*/
|
|
209
|
+
function generateSecret() {
|
|
210
|
+
const crypto = globalThis.crypto;
|
|
211
|
+
if (!crypto) {
|
|
212
|
+
throw new Error('Crypto API not available');
|
|
443
213
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
214
|
+
const buffer = new Uint8Array(20);
|
|
215
|
+
crypto.getRandomValues(buffer);
|
|
216
|
+
return base32Encode(buffer);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Generate TOTP code
|
|
220
|
+
*/
|
|
221
|
+
function generateCode(secret, timestamp) {
|
|
222
|
+
const time = Math.floor((timestamp || Date.now()) / 30000);
|
|
223
|
+
const hmacDigest = totpHmac(secret, time.toString());
|
|
224
|
+
// biome-ignore lint/style/noNonNullAssertion: HMAC-SHA1 always produces 20 bytes; buffer indices are guaranteed valid
|
|
225
|
+
const offset = hmacDigest[hmacDigest.length - 1] & 0x0f;
|
|
226
|
+
// biome-ignore lint/style/noNonNullAssertion: HMAC-SHA1 always produces 20 bytes; buffer indices are guaranteed valid
|
|
227
|
+
const b0 = hmacDigest[offset] & 0x7f;
|
|
228
|
+
// biome-ignore lint/style/noNonNullAssertion: HMAC-SHA1 always produces 20 bytes; buffer indices are guaranteed valid
|
|
229
|
+
const b1 = hmacDigest[offset + 1] & 0xff;
|
|
230
|
+
// biome-ignore lint/style/noNonNullAssertion: HMAC-SHA1 always produces 20 bytes; buffer indices are guaranteed valid
|
|
231
|
+
const b2 = hmacDigest[offset + 2] & 0xff;
|
|
232
|
+
// biome-ignore lint/style/noNonNullAssertion: HMAC-SHA1 always produces 20 bytes; buffer indices are guaranteed valid
|
|
233
|
+
const b3 = hmacDigest[offset + 3] & 0xff;
|
|
234
|
+
const code = ((b0 << 24) | (b1 << 16) | (b2 << 8) | b3) % 1000000;
|
|
235
|
+
return code.toString().padStart(6, '0');
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Verify TOTP code
|
|
239
|
+
*/
|
|
240
|
+
function verifyCode(secret, code, window = 1) {
|
|
241
|
+
const timestamp = Date.now();
|
|
242
|
+
// Check current and adjacent time windows
|
|
243
|
+
for (let i = -window; i <= window; i++) {
|
|
244
|
+
const testTime = timestamp + i * 30000;
|
|
245
|
+
const testCode = generateCode(secret, testTime);
|
|
246
|
+
if (testCode.length === code.length &&
|
|
247
|
+
timingSafeEqual(Buffer.from(testCode), Buffer.from(code))) {
|
|
248
|
+
return true;
|
|
464
249
|
}
|
|
465
|
-
return result;
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* HMAC-SHA1 implementation for TOTP
|
|
469
|
-
*/
|
|
470
|
-
static hmac(key, message) {
|
|
471
|
-
const hmacDigest = createHmac('sha1', key).update(message).digest();
|
|
472
|
-
return new Uint8Array(hmacDigest);
|
|
473
250
|
}
|
|
251
|
+
return false;
|
|
474
252
|
}
|
|
253
|
+
export const TwoFactorAuth = {
|
|
254
|
+
generateSecret,
|
|
255
|
+
generateCode,
|
|
256
|
+
verifyCode,
|
|
257
|
+
};
|
|
@@ -120,37 +120,12 @@ export declare class AuthorizationSystem {
|
|
|
120
120
|
*/
|
|
121
121
|
export declare const authorization: AuthorizationSystem;
|
|
122
122
|
/**
|
|
123
|
-
* Common roles
|
|
123
|
+
* Common roles — aligned with DB schema (`users.role` column)
|
|
124
|
+
* and `UserRoleSchema` in @revealui/contracts.
|
|
125
|
+
*
|
|
126
|
+
* Values: owner | admin | editor | viewer | agent | contributor
|
|
124
127
|
*/
|
|
125
|
-
export declare const CommonRoles:
|
|
126
|
-
admin: {
|
|
127
|
-
id: string;
|
|
128
|
-
name: string;
|
|
129
|
-
description: string;
|
|
130
|
-
permissions: {
|
|
131
|
-
resource: string;
|
|
132
|
-
action: string;
|
|
133
|
-
}[];
|
|
134
|
-
};
|
|
135
|
-
user: {
|
|
136
|
-
id: string;
|
|
137
|
-
name: string;
|
|
138
|
-
description: string;
|
|
139
|
-
permissions: {
|
|
140
|
-
resource: string;
|
|
141
|
-
action: string;
|
|
142
|
-
}[];
|
|
143
|
-
};
|
|
144
|
-
guest: {
|
|
145
|
-
id: string;
|
|
146
|
-
name: string;
|
|
147
|
-
description: string;
|
|
148
|
-
permissions: {
|
|
149
|
-
resource: string;
|
|
150
|
-
action: string;
|
|
151
|
-
}[];
|
|
152
|
-
};
|
|
153
|
-
};
|
|
128
|
+
export declare const CommonRoles: Record<string, Role>;
|
|
154
129
|
/**
|
|
155
130
|
* Permission builder
|
|
156
131
|
*/
|
|
@@ -206,7 +181,8 @@ export declare function checkAttributeAccess(context: AuthorizationContext, reso
|
|
|
206
181
|
export declare class PermissionCache {
|
|
207
182
|
private cache;
|
|
208
183
|
private ttl;
|
|
209
|
-
|
|
184
|
+
private maxEntries;
|
|
185
|
+
constructor(ttl?: number, maxEntries?: number);
|
|
210
186
|
/**
|
|
211
187
|
* Get cached permission
|
|
212
188
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/security/authorization.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../src/security/authorization.ts"],"names":[],"mappings":"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"}
|