@jmruthers/pace-core 0.5.111 → 0.5.113
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/{DataTable-5W2HVLLV.js → DataTable-YNEB5WDK.js} +8 -8
- package/dist/{UnifiedAuthProvider-LUM3QLS5.js → UnifiedAuthProvider-KZZUO27W.js} +3 -3
- package/dist/{api-SIZPFBFX.js → api-PKU4PUBO.js} +3 -3
- package/dist/{audit-5JI5T3SL.js → audit-H4YJJF7R.js} +2 -2
- package/dist/{chunk-IWJYNWXN.js → chunk-3OGQLOJM.js} +11 -3
- package/dist/chunk-3OGQLOJM.js.map +1 -0
- package/dist/{chunk-TDFBX7KJ.js → chunk-7H75SHXZ.js} +2 -2
- package/dist/{chunk-EFVQBYFN.js → chunk-BUN7NMV7.js} +2 -2
- package/dist/{chunk-X7SPKHYZ.js → chunk-F6QB26OS.js} +4 -4
- package/dist/{chunk-ZL45MG76.js → chunk-HKWQN44G.js} +15 -15
- package/dist/{chunk-TD4BXGPE.js → chunk-KISJX3XZ.js} +8 -4
- package/dist/{chunk-TD4BXGPE.js.map → chunk-KISJX3XZ.js.map} +1 -1
- package/dist/{chunk-ACYQNYHB.js → chunk-KTHLNIMA.js} +7 -7
- package/dist/{chunk-I5YM5BGS.js → chunk-L36JW4KV.js} +2 -2
- package/dist/{chunk-JE2GFA3O.js → chunk-NEONKMTU.js} +3 -3
- package/dist/{chunk-MW73E7SP.js → chunk-OO3V7W4H.js} +2 -2
- package/dist/chunk-OO3V7W4H.js.map +1 -0
- package/dist/{chunk-PXXS26G5.js → chunk-QKIVSZ2O.js} +5 -4
- package/dist/{chunk-PXXS26G5.js.map → chunk-QKIVSZ2O.js.map} +1 -1
- package/dist/{chunk-2BIDKXQU.js → chunk-YUKG6PXE.js} +82 -23
- package/dist/chunk-YUKG6PXE.js.map +1 -0
- package/dist/{chunk-UGVU7L7N.js → chunk-ZPXWJA4H.js} +6 -6
- package/dist/chunk-ZPXWJA4H.js.map +1 -0
- package/dist/components.js +10 -10
- package/dist/hooks.js +7 -7
- package/dist/index.js +13 -13
- package/dist/providers.js +2 -2
- package/dist/rbac/index.js +9 -9
- package/dist/utils.js +1 -1
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +8 -8
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +3 -3
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +13 -13
- package/package.json +1 -1
- package/src/components/DataTable/DataTable.test.tsx +405 -154
- package/src/components/DataTable/components/DataTableCore.tsx +6 -1
- package/src/components/EventSelector/EventSelector.tsx +32 -2
- package/src/components/NavigationMenu/NavigationMenu.test.tsx +56 -8
- package/src/components/NavigationMenu/NavigationMenu.tsx +75 -12
- package/src/rbac/audit-enhanced.ts +14 -2
- package/src/rbac/audit.test.ts +16 -6
- package/src/rbac/audit.ts +11 -1
- package/src/rbac/engine.ts +4 -2
- package/src/rbac/hooks/usePermissions.ts +18 -2
- package/src/services/EventService.ts +3 -2
- package/dist/chunk-2BIDKXQU.js.map +0 -1
- package/dist/chunk-IWJYNWXN.js.map +0 -1
- package/dist/chunk-MW73E7SP.js.map +0 -1
- package/dist/chunk-UGVU7L7N.js.map +0 -1
- /package/dist/{DataTable-5W2HVLLV.js.map → DataTable-YNEB5WDK.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-LUM3QLS5.js.map → UnifiedAuthProvider-KZZUO27W.js.map} +0 -0
- /package/dist/{api-SIZPFBFX.js.map → api-PKU4PUBO.js.map} +0 -0
- /package/dist/{audit-5JI5T3SL.js.map → audit-H4YJJF7R.js.map} +0 -0
- /package/dist/{chunk-TDFBX7KJ.js.map → chunk-7H75SHXZ.js.map} +0 -0
- /package/dist/{chunk-EFVQBYFN.js.map → chunk-BUN7NMV7.js.map} +0 -0
- /package/dist/{chunk-X7SPKHYZ.js.map → chunk-F6QB26OS.js.map} +0 -0
- /package/dist/{chunk-ZL45MG76.js.map → chunk-HKWQN44G.js.map} +0 -0
- /package/dist/{chunk-ACYQNYHB.js.map → chunk-KTHLNIMA.js.map} +0 -0
- /package/dist/{chunk-I5YM5BGS.js.map → chunk-L36JW4KV.js.map} +0 -0
- /package/dist/{chunk-JE2GFA3O.js.map → chunk-NEONKMTU.js.map} +0 -0
|
@@ -54,10 +54,10 @@ import {
|
|
|
54
54
|
sortHierarchicalDataWithSorting,
|
|
55
55
|
validateHierarchicalData,
|
|
56
56
|
validatePaginationConfig
|
|
57
|
-
} from "./chunk-
|
|
58
|
-
import "./chunk-
|
|
59
|
-
import "./chunk-
|
|
60
|
-
import "./chunk-
|
|
57
|
+
} from "./chunk-KISJX3XZ.js";
|
|
58
|
+
import "./chunk-ZPXWJA4H.js";
|
|
59
|
+
import "./chunk-QKIVSZ2O.js";
|
|
60
|
+
import "./chunk-3OGQLOJM.js";
|
|
61
61
|
import {
|
|
62
62
|
CircuitBreaker,
|
|
63
63
|
DEFAULT_FALLBACK_CONFIG,
|
|
@@ -76,9 +76,9 @@ import {
|
|
|
76
76
|
throttle,
|
|
77
77
|
useDataTablePerformance
|
|
78
78
|
} from "./chunk-4OX5PXHX.js";
|
|
79
|
-
import "./chunk-
|
|
80
|
-
import "./chunk-
|
|
81
|
-
import "./chunk-
|
|
79
|
+
import "./chunk-L36JW4KV.js";
|
|
80
|
+
import "./chunk-7H75SHXZ.js";
|
|
81
|
+
import "./chunk-OO3V7W4H.js";
|
|
82
82
|
import "./chunk-PYUXFQJ3.js";
|
|
83
83
|
import "./chunk-JCQZ6LA7.js";
|
|
84
84
|
import "./chunk-BDZUMRBD.js";
|
|
@@ -157,4 +157,4 @@ export {
|
|
|
157
157
|
validateHierarchicalData,
|
|
158
158
|
validatePaginationConfig
|
|
159
159
|
};
|
|
160
|
-
//# sourceMappingURL=DataTable-
|
|
160
|
+
//# sourceMappingURL=DataTable-YNEB5WDK.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
init_UnifiedAuthProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7H75SHXZ.js";
|
|
4
4
|
import {
|
|
5
5
|
UnifiedAuthProvider,
|
|
6
6
|
useUnifiedAuth
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-OO3V7W4H.js";
|
|
8
8
|
import "./chunk-BDZUMRBD.js";
|
|
9
9
|
import "./chunk-SMJZMKYN.js";
|
|
10
10
|
import "./chunk-PLDDJCW6.js";
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
UnifiedAuthProvider,
|
|
14
14
|
useUnifiedAuth
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=UnifiedAuthProvider-
|
|
16
|
+
//# sourceMappingURL=UnifiedAuthProvider-KZZUO27W.js.map
|
|
@@ -20,8 +20,8 @@ import {
|
|
|
20
20
|
isSuperAdmin,
|
|
21
21
|
resolveAppContext,
|
|
22
22
|
setupRBAC
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-QKIVSZ2O.js";
|
|
24
|
+
import "./chunk-3OGQLOJM.js";
|
|
25
25
|
import "./chunk-PLDDJCW6.js";
|
|
26
26
|
export {
|
|
27
27
|
OrganisationContextRequiredError,
|
|
@@ -46,4 +46,4 @@ export {
|
|
|
46
46
|
resolveAppContext,
|
|
47
47
|
setupRBAC
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=api-
|
|
49
|
+
//# sourceMappingURL=api-PKU4PUBO.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
emitAuditEvent,
|
|
5
5
|
getGlobalAuditManager,
|
|
6
6
|
setGlobalAuditManager
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3OGQLOJM.js";
|
|
8
8
|
import "./chunk-PLDDJCW6.js";
|
|
9
9
|
export {
|
|
10
10
|
RBACAuditManager,
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
getGlobalAuditManager,
|
|
14
14
|
setGlobalAuditManager
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=audit-
|
|
16
|
+
//# sourceMappingURL=audit-H4YJJF7R.js.map
|
|
@@ -52,6 +52,11 @@ var RBACAuditManager = class {
|
|
|
52
52
|
note: "Organisation context is required for RBAC operations. This may indicate a security issue or missing context derivation."
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
|
+
const rawPageId = "pageId" in event ? event.pageId : void 0;
|
|
56
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
57
|
+
const isValidPageIdUuid = rawPageId && uuidRegex.test(rawPageId);
|
|
58
|
+
const pageIdUuid = isValidPageIdUuid ? rawPageId : void 0;
|
|
59
|
+
const pageIdName = rawPageId && !isValidPageIdUuid ? rawPageId : void 0;
|
|
55
60
|
const auditEvent = {
|
|
56
61
|
event_type: event.type,
|
|
57
62
|
user_id: event.userId,
|
|
@@ -61,7 +66,8 @@ var RBACAuditManager = class {
|
|
|
61
66
|
// Explicitly null if missing
|
|
62
67
|
event_id: "eventId" in event ? event.eventId : void 0,
|
|
63
68
|
app_id: "appId" in event ? event.appId : void 0,
|
|
64
|
-
page_id:
|
|
69
|
+
page_id: pageIdUuid,
|
|
70
|
+
// Only set if it's a valid UUID
|
|
65
71
|
permission: "permission" in event ? event.permission : void 0,
|
|
66
72
|
decision: "decision" in event ? event.decision : void 0,
|
|
67
73
|
source: "source" in event ? event.source : "api",
|
|
@@ -73,7 +79,9 @@ var RBACAuditManager = class {
|
|
|
73
79
|
cache_hit: "cache_hit" in event ? event.cache_hit : void 0,
|
|
74
80
|
cache_source: "cache_source" in event ? event.cache_source : void 0,
|
|
75
81
|
// Explicit flag indicating this event had no organisation context
|
|
76
|
-
no_organisation_context: !event.organisationId
|
|
82
|
+
no_organisation_context: !event.organisationId,
|
|
83
|
+
// Store page name/identifier in metadata if it's not a UUID
|
|
84
|
+
page_name: pageIdName
|
|
77
85
|
}
|
|
78
86
|
};
|
|
79
87
|
const { error } = await this.supabase.from("rbac_audit_events").insert([auditEvent]);
|
|
@@ -197,4 +205,4 @@ export {
|
|
|
197
205
|
getGlobalAuditManager,
|
|
198
206
|
emitAuditEvent
|
|
199
207
|
};
|
|
200
|
-
//# sourceMappingURL=chunk-
|
|
208
|
+
//# sourceMappingURL=chunk-3OGQLOJM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rbac/audit.ts"],"sourcesContent":["/**\n * RBAC Audit Events System\n * @package @jmruthers/pace-core\n * @module RBAC/Audit\n * @since 1.0.0\n * \n * This module provides structured audit event emission for all RBAC operations.\n */\n\nimport { SupabaseClient } from '@supabase/supabase-js';\nimport { Database } from '../types/database';\nimport { \n UUID, \n AuditEventSource, \n RBACAuditEvent \n} from './types';\n\n/**\n * Audit event payload for permission checks\n */\nexport interface PermissionCheckAuditEvent {\n type: 'permission_check';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n pageId?: UUID;\n permission: string;\n decision: boolean;\n source: AuditEventSource;\n bypass?: boolean;\n duration_ms: number;\n cache_hit?: boolean;\n cache_source?: 'memory' | 'database' | 'rpc';\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for permission denied\n */\nexport interface PermissionDeniedAuditEvent {\n type: 'permission_denied';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n pageId?: UUID;\n permission: string;\n source: AuditEventSource;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for role granted\n */\nexport interface RoleGrantedAuditEvent {\n type: 'role_granted';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n role: string;\n grantedBy: UUID;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for role revoked\n */\nexport interface RoleRevokedAuditEvent {\n type: 'role_denied';\n userId: UUID;\n organisationId: UUID;\n eventId?: string;\n appId?: UUID;\n role: string;\n revokedBy: UUID;\n metadata?: Record<string, any>;\n}\n\n/**\n * Audit event payload for RLS denied\n */\nexport interface RLSDeniedAuditEvent {\n type: 'rls_denied';\n userId: UUID;\n organisationId: UUID;\n table: string;\n operation: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Union type for all audit events\n */\nexport type AuditEventPayload = \n | PermissionCheckAuditEvent\n | PermissionDeniedAuditEvent\n | RoleGrantedAuditEvent\n | RoleRevokedAuditEvent\n | RLSDeniedAuditEvent;\n\n/**\n * RBAC Audit Manager\n * \n * Handles emission of structured audit events for all RBAC operations.\n */\nexport class RBACAuditManager {\n private supabase: SupabaseClient<Database>;\n private enabled: boolean = true;\n\n constructor(supabase: SupabaseClient<Database>) {\n this.supabase = supabase;\n }\n\n /**\n * Enable or disable audit logging\n * \n * @param enabled - Whether to enable audit logging\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n /**\n * Check if audit logging is enabled\n * \n * @returns True if audit logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Emit an audit event\n * \n * @param event - Audit event payload\n * @returns Promise that resolves when event is logged\n */\n async emitEvent(event: AuditEventPayload): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n // Validate required fields before attempting to insert\n // MANDATORY: All audit events must have userId\n if (!event.userId) {\n console.error('[RBAC Audit] CRITICAL: Cannot log audit event without userId:', {\n eventType: event.type,\n organisationId: event.organisationId\n });\n return;\n }\n\n // WARNING: Some audit events may not have organisationId (e.g., global admin operations)\n // Log these for security monitoring even if organisationId is missing\n if (!event.organisationId) {\n console.warn('[RBAC Audit] Audit event without organisation context:', {\n userId: event.userId,\n eventType: event.type,\n note: 'This should be investigated for security compliance'\n });\n }\n\n try {\n // Since organisationId is now required in SecurityContext, this should rarely happen\n // But we still handle the edge case properly without masking it\n if (!event.organisationId) {\n console.warn('[RBAC Audit] Audit event without organisation context - this should be investigated:', {\n userId: event.userId,\n eventType: event.type,\n note: 'Organisation context is required for RBAC operations. This may indicate a security issue or missing context derivation.'\n });\n }\n\n // Validate pageId: only include in page_id column if it's a valid UUID\n // Otherwise, store it in metadata to avoid database errors\n const rawPageId = 'pageId' in event ? event.pageId : undefined;\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n const isValidPageIdUuid = rawPageId && uuidRegex.test(rawPageId);\n const pageIdUuid: UUID | undefined = isValidPageIdUuid ? (rawPageId as UUID) : undefined;\n const pageIdName: string | undefined = rawPageId && !isValidPageIdUuid ? rawPageId : undefined;\n\n const auditEvent: Omit<RBACAuditEvent, 'id' | 'created_at'> = {\n event_type: event.type,\n user_id: event.userId,\n // Store organisationId - nullable to properly track missing context cases\n // Do NOT use fallback UUID as it masks security issues\n organisation_id: event.organisationId || null, // Explicitly null if missing\n event_id: 'eventId' in event ? event.eventId : undefined,\n app_id: 'appId' in event ? event.appId : undefined,\n page_id: pageIdUuid, // Only set if it's a valid UUID\n permission: 'permission' in event ? event.permission : undefined,\n decision: 'decision' in event ? event.decision : undefined,\n source: 'source' in event ? event.source : 'api', // Default to 'api' if not provided\n bypass: 'bypass' in event ? event.bypass : undefined,\n duration_ms: 'duration_ms' in event ? event.duration_ms : undefined,\n metadata: {\n ...event.metadata,\n cache_hit: 'cache_hit' in event ? event.cache_hit : undefined,\n cache_source: 'cache_source' in event ? event.cache_source : undefined,\n // Explicit flag indicating this event had no organisation context\n no_organisation_context: !event.organisationId,\n // Store page name/identifier in metadata if it's not a UUID\n page_name: pageIdName,\n },\n };\n\n const { error } = await (this.supabase as any)\n .from('rbac_audit_events')\n .insert([auditEvent]);\n\n if (error) {\n // Log the error for debugging but don't throw\n console.warn('[RBAC Audit] Failed to insert audit event:', {\n error: error.message,\n code: error.code,\n details: error.details,\n hint: error.hint,\n event: auditEvent\n });\n }\n } catch (error) {\n // Log unexpected errors but don't throw\n console.error('[RBAC Audit] Unexpected error during audit logging:', error);\n }\n }\n\n /**\n * Emit a permission check audit event\n * \n * @param event - Permission check event data\n */\n async emitPermissionCheck(event: Omit<PermissionCheckAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'permission_check',\n ...event,\n });\n }\n\n /**\n * Emit a permission denied audit event\n * \n * @param event - Permission denied event data\n */\n async emitPermissionDenied(event: Omit<PermissionDeniedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'permission_denied',\n ...event,\n });\n }\n\n /**\n * Emit a role granted audit event\n * \n * @param event - Role granted event data\n */\n async emitRoleGranted(event: Omit<RoleGrantedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'role_granted',\n ...event,\n });\n }\n\n /**\n * Emit a role revoked audit event\n * \n * @param event - Role revoked event data\n */\n async emitRoleRevoked(event: Omit<RoleRevokedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'role_denied',\n ...event,\n });\n }\n\n /**\n * Emit an RLS denied audit event\n * \n * @param event - RLS denied event data\n */\n async emitRLSDenied(event: Omit<RLSDeniedAuditEvent, 'type'>): Promise<void> {\n await this.emitEvent({\n type: 'rls_denied',\n ...event,\n });\n }\n\n /**\n * Get audit events for a user\n * \n * @param userId - User ID\n * @param limit - Maximum number of events to return\n * @returns Promise resolving to audit events\n */\n async getUserAuditEvents(userId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {\n const { data, error } = await this.supabase\n .from('rbac_audit_events')\n .select('*')\n .eq('user_id', userId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (error) {\n throw new Error(`Failed to get audit events: ${error.message}`);\n }\n\n return data || [];\n }\n\n /**\n * Get audit events for an organisation\n * \n * @param organisationId - Organisation ID\n * @param limit - Maximum number of events to return\n * @returns Promise resolving to audit events\n */\n async getOrganisationAuditEvents(organisationId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {\n const { data, error } = await this.supabase\n .from('rbac_audit_events')\n .select('*')\n .eq('organisation_id', organisationId)\n .order('created_at', { ascending: false })\n .limit(limit);\n\n if (error) {\n throw new Error(`Failed to get audit events: ${error.message}`);\n }\n\n return data || [];\n }\n}\n\n/**\n * Create an audit manager instance\n * \n * @param supabase - Supabase client\n * @returns RBACAuditManager instance\n */\nexport function createAuditManager(supabase: SupabaseClient<Database>): RBACAuditManager {\n return new RBACAuditManager(supabase);\n}\n\n/**\n * Global audit manager instance\n * \n * This is set by the RBAC engine when it initializes.\n */\nlet globalAuditManager: RBACAuditManager | null = null;\n\n/**\n * Set the global audit manager\n * \n * @param manager - Audit manager instance\n */\nexport function setGlobalAuditManager(manager: RBACAuditManager): void {\n globalAuditManager = manager;\n}\n\n/**\n * Get the global audit manager\n * \n * @returns Global audit manager or null if not set\n */\nexport function getGlobalAuditManager(): RBACAuditManager | null {\n return globalAuditManager;\n}\n\n/**\n * Emit an audit event using the global audit manager\n * \n * @param event - Audit event payload\n */\nexport async function emitAuditEvent(event: AuditEventPayload): Promise<void> {\n if (globalAuditManager) {\n await globalAuditManager.emitEvent(event);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
UnifiedAuthProvider,
|
|
3
3
|
init_UnifiedAuthProvider,
|
|
4
4
|
useUnifiedAuth
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-OO3V7W4H.js";
|
|
6
6
|
import {
|
|
7
7
|
__esm,
|
|
8
8
|
__export
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
UnifiedAuthProvider_exports,
|
|
25
25
|
init_UnifiedAuthProvider2 as init_UnifiedAuthProvider
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-7H75SHXZ.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
init_InactivityServiceProvider,
|
|
5
5
|
init_OrganisationServiceProvider,
|
|
6
6
|
init_UnifiedAuthProvider
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-OO3V7W4H.js";
|
|
8
8
|
|
|
9
9
|
// src/providers/index.ts
|
|
10
10
|
init_UnifiedAuthProvider();
|
|
@@ -12,4 +12,4 @@ init_EventServiceProvider();
|
|
|
12
12
|
init_OrganisationServiceProvider();
|
|
13
13
|
init_InactivityServiceProvider();
|
|
14
14
|
init_AuthServiceProvider();
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-BUN7NMV7.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
init_useOrganisations,
|
|
3
3
|
useOrganisations
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-L36JW4KV.js";
|
|
5
5
|
import {
|
|
6
6
|
init_UnifiedAuthProvider
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7H75SHXZ.js";
|
|
8
8
|
import {
|
|
9
9
|
OrganisationServiceContext,
|
|
10
10
|
OrganisationServiceProvider,
|
|
11
11
|
init_OrganisationServiceProvider,
|
|
12
12
|
useOrganisationService,
|
|
13
13
|
useUnifiedAuth
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OO3V7W4H.js";
|
|
15
15
|
import {
|
|
16
16
|
init_organisationContext,
|
|
17
17
|
setOrganisationContext
|
|
@@ -1572,4 +1572,4 @@ export {
|
|
|
1572
1572
|
clearPublicFileDisplayCache,
|
|
1573
1573
|
getPublicFileDisplayCacheStats
|
|
1574
1574
|
};
|
|
1575
|
-
//# sourceMappingURL=chunk-
|
|
1575
|
+
//# sourceMappingURL=chunk-F6QB26OS.js.map
|
|
@@ -3,22 +3,22 @@ import {
|
|
|
3
3
|
useAccessLevel,
|
|
4
4
|
useCan,
|
|
5
5
|
useMultiplePermissions
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ZPXWJA4H.js";
|
|
7
7
|
import {
|
|
8
8
|
OrganisationContextRequiredError,
|
|
9
9
|
RBACCache,
|
|
10
10
|
getRBACLogger,
|
|
11
11
|
rbacCache
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-QKIVSZ2O.js";
|
|
13
13
|
import {
|
|
14
14
|
useSecureDataAccess
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-NEONKMTU.js";
|
|
16
16
|
import {
|
|
17
17
|
init_UnifiedAuthProvider
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-7H75SHXZ.js";
|
|
19
19
|
import {
|
|
20
20
|
useUnifiedAuth
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-OO3V7W4H.js";
|
|
22
22
|
import {
|
|
23
23
|
getCurrentAppName
|
|
24
24
|
} from "./chunk-JCQZ6LA7.js";
|
|
@@ -1539,7 +1539,7 @@ function withPermissionGuard(config, handler) {
|
|
|
1539
1539
|
if (!userId || !organisationId) {
|
|
1540
1540
|
throw new Error("User context required for permission check");
|
|
1541
1541
|
}
|
|
1542
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1542
|
+
const { isPermitted: isPermitted2 } = await import("./api-PKU4PUBO.js");
|
|
1543
1543
|
const hasPermission2 = await isPermitted2({
|
|
1544
1544
|
userId,
|
|
1545
1545
|
scope: { organisationId, eventId, appId },
|
|
@@ -1562,7 +1562,7 @@ function withAccessLevelGuard(minLevel, handler) {
|
|
|
1562
1562
|
if (!userId || !organisationId) {
|
|
1563
1563
|
throw new Error("User context required for access level check");
|
|
1564
1564
|
}
|
|
1565
|
-
const { getAccessLevel: getAccessLevel2 } = await import("./api-
|
|
1565
|
+
const { getAccessLevel: getAccessLevel2 } = await import("./api-PKU4PUBO.js");
|
|
1566
1566
|
const accessLevel = await getAccessLevel2({
|
|
1567
1567
|
userId,
|
|
1568
1568
|
scope: { organisationId, eventId, appId }
|
|
@@ -1587,11 +1587,11 @@ function withRoleGuard(config, handler) {
|
|
|
1587
1587
|
throw new Error("User context required for role check");
|
|
1588
1588
|
}
|
|
1589
1589
|
if (config.globalRoles && config.globalRoles.length > 0) {
|
|
1590
|
-
const { isSuperAdmin } = await import("./api-
|
|
1590
|
+
const { isSuperAdmin } = await import("./api-PKU4PUBO.js");
|
|
1591
1591
|
const isSuper = await isSuperAdmin(userId);
|
|
1592
1592
|
if (isSuper) {
|
|
1593
1593
|
if (organisationId) {
|
|
1594
|
-
const { emitAuditEvent: emitAuditEvent2 } = await import("./audit-
|
|
1594
|
+
const { emitAuditEvent: emitAuditEvent2 } = await import("./audit-H4YJJF7R.js");
|
|
1595
1595
|
await emitAuditEvent2({
|
|
1596
1596
|
type: "permission_check",
|
|
1597
1597
|
userId,
|
|
@@ -1613,21 +1613,21 @@ function withRoleGuard(config, handler) {
|
|
|
1613
1613
|
}
|
|
1614
1614
|
}
|
|
1615
1615
|
if (config.organisationRoles && config.organisationRoles.length > 0) {
|
|
1616
|
-
const { isOrganisationAdmin } = await import("./api-
|
|
1616
|
+
const { isOrganisationAdmin } = await import("./api-PKU4PUBO.js");
|
|
1617
1617
|
const isOrgAdmin = await isOrganisationAdmin(userId, organisationId);
|
|
1618
1618
|
if (!isOrgAdmin && config.requireAll !== false) {
|
|
1619
1619
|
throw new Error(`Organisation admin role required`);
|
|
1620
1620
|
}
|
|
1621
1621
|
}
|
|
1622
1622
|
if (config.eventAppRoles && config.eventAppRoles.length > 0 && eventId && appId) {
|
|
1623
|
-
const { isEventAdmin } = await import("./api-
|
|
1623
|
+
const { isEventAdmin } = await import("./api-PKU4PUBO.js");
|
|
1624
1624
|
const isEventAdminUser = await isEventAdmin(userId, { organisationId, eventId, appId });
|
|
1625
1625
|
if (!isEventAdminUser && config.requireAll !== false) {
|
|
1626
1626
|
throw new Error(`Event admin role required`);
|
|
1627
1627
|
}
|
|
1628
1628
|
}
|
|
1629
1629
|
if (organisationId) {
|
|
1630
|
-
const { emitAuditEvent: emitAuditEvent2 } = await import("./audit-
|
|
1630
|
+
const { emitAuditEvent: emitAuditEvent2 } = await import("./audit-H4YJJF7R.js");
|
|
1631
1631
|
await emitAuditEvent2({
|
|
1632
1632
|
type: "permission_check",
|
|
1633
1633
|
userId,
|
|
@@ -1660,7 +1660,7 @@ function createRBACMiddleware(config) {
|
|
|
1660
1660
|
);
|
|
1661
1661
|
if (protectedRoute) {
|
|
1662
1662
|
try {
|
|
1663
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1663
|
+
const { isPermitted: isPermitted2 } = await import("./api-PKU4PUBO.js");
|
|
1664
1664
|
const hasPermission2 = await isPermitted2({
|
|
1665
1665
|
userId,
|
|
1666
1666
|
scope: { organisationId },
|
|
@@ -1687,7 +1687,7 @@ function createRBACExpressMiddleware(config) {
|
|
|
1687
1687
|
return res.status(401).json({ error: "User context required" });
|
|
1688
1688
|
}
|
|
1689
1689
|
try {
|
|
1690
|
-
const { isPermitted: isPermitted2 } = await import("./api-
|
|
1690
|
+
const { isPermitted: isPermitted2 } = await import("./api-PKU4PUBO.js");
|
|
1691
1691
|
const hasPermission2 = await isPermitted2({
|
|
1692
1692
|
userId,
|
|
1693
1693
|
scope: { organisationId, eventId, appId },
|
|
@@ -1860,4 +1860,4 @@ export {
|
|
|
1860
1860
|
getPermissionsForRole,
|
|
1861
1861
|
ALL_PERMISSIONS
|
|
1862
1862
|
};
|
|
1863
|
-
//# sourceMappingURL=chunk-
|
|
1863
|
+
//# sourceMappingURL=chunk-HKWQN44G.js.map
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCan,
|
|
3
3
|
useResolvedScope
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZPXWJA4H.js";
|
|
5
5
|
import {
|
|
6
6
|
toast,
|
|
7
7
|
useDataTablePerformance
|
|
8
8
|
} from "./chunk-4OX5PXHX.js";
|
|
9
9
|
import {
|
|
10
10
|
init_UnifiedAuthProvider
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-7H75SHXZ.js";
|
|
12
12
|
import {
|
|
13
13
|
useUnifiedAuth
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OO3V7W4H.js";
|
|
15
15
|
import {
|
|
16
16
|
cn
|
|
17
17
|
} from "./chunk-PYUXFQJ3.js";
|
|
@@ -12093,6 +12093,10 @@ function DataTableInternal({
|
|
|
12093
12093
|
if (!user) {
|
|
12094
12094
|
throw new Error("DataTable requires authenticated user for RBAC");
|
|
12095
12095
|
}
|
|
12096
|
+
if (permissions.canRead.isLoading) {
|
|
12097
|
+
console.log("[DataTable] \u23F3 Permission check in progress - showing loading state");
|
|
12098
|
+
return /* @__PURE__ */ jsx24(LoadingComponent, {});
|
|
12099
|
+
}
|
|
12096
12100
|
if (!permissions.canRead.can) {
|
|
12097
12101
|
console.warn("[DataTable] \u{1F6AB} Access denied - no read permission:", {
|
|
12098
12102
|
canRead: permissions.canRead,
|
|
@@ -12703,4 +12707,4 @@ lodash/lodash.js:
|
|
|
12703
12707
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
12704
12708
|
*)
|
|
12705
12709
|
*/
|
|
12706
|
-
//# sourceMappingURL=chunk-
|
|
12710
|
+
//# sourceMappingURL=chunk-KISJX3XZ.js.map
|