@blokjs/runner 0.6.20 → 0.7.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/dist/Blok.d.ts +2 -0
- package/dist/Blok.js +42 -110
- package/dist/Blok.js.map +1 -1
- package/dist/DefaultLogger.d.ts +13 -0
- package/dist/DefaultLogger.js +25 -0
- package/dist/DefaultLogger.js.map +1 -1
- package/dist/RunnerSteps.d.ts +23 -0
- package/dist/RunnerSteps.js +128 -87
- package/dist/RunnerSteps.js.map +1 -1
- package/dist/SubworkflowNode.js +19 -0
- package/dist/SubworkflowNode.js.map +1 -1
- package/dist/TriggerBase.d.ts +12 -0
- package/dist/TriggerBase.js +216 -181
- package/dist/TriggerBase.js.map +1 -1
- package/dist/adapters/grpc/GrpcRuntimeAdapter.d.ts +9 -0
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js +76 -6
- package/dist/adapters/grpc/GrpcRuntimeAdapter.js.map +1 -1
- package/dist/index.d.ts +4 -39
- package/dist/index.js +7 -32
- package/dist/index.js.map +1 -1
- package/dist/monitoring/JanitorMetrics.d.ts +3 -0
- package/dist/monitoring/JanitorMetrics.js +11 -0
- package/dist/monitoring/JanitorMetrics.js.map +1 -1
- package/dist/monitoring/ProcessErrorMetrics.d.ts +32 -0
- package/dist/monitoring/ProcessErrorMetrics.js +43 -0
- package/dist/monitoring/ProcessErrorMetrics.js.map +1 -0
- package/dist/monitoring/PrometheusMetricsBridge.d.ts +7 -0
- package/dist/monitoring/PrometheusMetricsBridge.js +8 -2
- package/dist/monitoring/PrometheusMetricsBridge.js.map +1 -1
- package/dist/monitoring/SubworkflowMetrics.d.ts +25 -0
- package/dist/monitoring/SubworkflowMetrics.js +38 -0
- package/dist/monitoring/SubworkflowMetrics.js.map +1 -0
- package/dist/observability/ErrorSink.d.ts +23 -0
- package/dist/observability/ErrorSink.js +32 -0
- package/dist/observability/ErrorSink.js.map +1 -0
- package/dist/observability/SentryIntegration.d.ts +9 -0
- package/dist/observability/SentryIntegration.js +31 -0
- package/dist/observability/SentryIntegration.js.map +1 -0
- package/dist/scheduling/DebounceCoordinator.d.ts +7 -53
- package/dist/scheduling/DebounceCoordinator.js +8 -207
- package/dist/scheduling/DebounceCoordinator.js.map +1 -1
- package/dist/tracing/InMemoryRunStore.d.ts +5 -1
- package/dist/tracing/InMemoryRunStore.js +14 -0
- package/dist/tracing/InMemoryRunStore.js.map +1 -1
- package/dist/tracing/Janitor.js +3 -0
- package/dist/tracing/Janitor.js.map +1 -1
- package/dist/tracing/PostgresRunStore.d.ts +4 -1
- package/dist/tracing/PostgresRunStore.js +73 -3
- package/dist/tracing/PostgresRunStore.js.map +1 -1
- package/dist/tracing/RunStore.d.ts +17 -1
- package/dist/tracing/RunTracker.d.ts +13 -34
- package/dist/tracing/RunTracker.js +62 -32
- package/dist/tracing/RunTracker.js.map +1 -1
- package/dist/tracing/SqliteRunStore.d.ts +4 -1
- package/dist/tracing/SqliteRunStore.js +60 -0
- package/dist/tracing/SqliteRunStore.js.map +1 -1
- package/dist/tracing/TraceRouter.d.ts +13 -0
- package/dist/tracing/TraceRouter.js +43 -11
- package/dist/tracing/TraceRouter.js.map +1 -1
- package/dist/tracing/TracingLogger.js +22 -0
- package/dist/tracing/TracingLogger.js.map +1 -1
- package/dist/tracing/createStore.js +51 -22
- package/dist/tracing/createStore.js.map +1 -1
- package/dist/tracing/types.d.ts +22 -0
- package/dist/types/GlobalOptions.d.ts +5 -7
- package/dist/workflow/WorkflowNormalizer.js +63 -0
- package/dist/workflow/WorkflowNormalizer.js.map +1 -1
- package/package.json +7 -4
- package/dist/cache/NodeResultCache.d.ts +0 -286
- package/dist/cache/NodeResultCache.js +0 -506
- package/dist/cache/NodeResultCache.js.map +0 -1
- package/dist/cache/index.d.ts +0 -1
- package/dist/cache/index.js +0 -2
- package/dist/cache/index.js.map +0 -1
- package/dist/concurrency/ConcurrencyBackend.d.ts +0 -61
- package/dist/concurrency/ConcurrencyBackend.js +0 -20
- package/dist/concurrency/ConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/NatsKvConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/NatsKvConcurrencyBackend.js +0 -310
- package/dist/concurrency/NatsKvConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/RedisConcurrencyBackend.d.ts +0 -64
- package/dist/concurrency/RedisConcurrencyBackend.js +0 -374
- package/dist/concurrency/RedisConcurrencyBackend.js.map +0 -1
- package/dist/concurrency/createConcurrencyBackend.d.ts +0 -24
- package/dist/concurrency/createConcurrencyBackend.js +0 -38
- package/dist/concurrency/createConcurrencyBackend.js.map +0 -1
- package/dist/graphql/GraphQLSchemaGenerator.d.ts +0 -129
- package/dist/graphql/GraphQLSchemaGenerator.js +0 -425
- package/dist/graphql/GraphQLSchemaGenerator.js.map +0 -1
- package/dist/integrations/APMIntegration.d.ts +0 -141
- package/dist/integrations/APMIntegration.js +0 -212
- package/dist/integrations/APMIntegration.js.map +0 -1
- package/dist/integrations/AzureMonitorIntegration.d.ts +0 -118
- package/dist/integrations/AzureMonitorIntegration.js +0 -254
- package/dist/integrations/AzureMonitorIntegration.js.map +0 -1
- package/dist/integrations/CloudWatchIntegration.d.ts +0 -135
- package/dist/integrations/CloudWatchIntegration.js +0 -293
- package/dist/integrations/CloudWatchIntegration.js.map +0 -1
- package/dist/integrations/SentryIntegration.d.ts +0 -153
- package/dist/integrations/SentryIntegration.js +0 -200
- package/dist/integrations/SentryIntegration.js.map +0 -1
- package/dist/integrations/index.d.ts +0 -19
- package/dist/integrations/index.js +0 -16
- package/dist/integrations/index.js.map +0 -1
- package/dist/marketplace/RuntimeAutoScaler.d.ts +0 -148
- package/dist/marketplace/RuntimeAutoScaler.js +0 -366
- package/dist/marketplace/RuntimeAutoScaler.js.map +0 -1
- package/dist/marketplace/RuntimeCatalog.d.ts +0 -180
- package/dist/marketplace/RuntimeCatalog.js +0 -339
- package/dist/marketplace/RuntimeCatalog.js.map +0 -1
- package/dist/marketplace/RuntimeDiscovery.d.ts +0 -86
- package/dist/marketplace/RuntimeDiscovery.js +0 -231
- package/dist/marketplace/RuntimeDiscovery.js.map +0 -1
- package/dist/marketplace/RuntimeHealthMonitor.d.ts +0 -100
- package/dist/marketplace/RuntimeHealthMonitor.js +0 -241
- package/dist/marketplace/RuntimeHealthMonitor.js.map +0 -1
- package/dist/marketplace/RuntimeMetricsDashboard.d.ts +0 -113
- package/dist/marketplace/RuntimeMetricsDashboard.js +0 -293
- package/dist/marketplace/RuntimeMetricsDashboard.js.map +0 -1
- package/dist/openapi/OpenAPIGenerator.d.ts +0 -192
- package/dist/openapi/OpenAPIGenerator.js +0 -378
- package/dist/openapi/OpenAPIGenerator.js.map +0 -1
- package/dist/openapi/index.d.ts +0 -20
- package/dist/openapi/index.js +0 -20
- package/dist/openapi/index.js.map +0 -1
- package/dist/scheduling/DebounceBackend.d.ts +0 -108
- package/dist/scheduling/DebounceBackend.js +0 -23
- package/dist/scheduling/DebounceBackend.js.map +0 -1
- package/dist/scheduling/NatsKvDebounceBackend.d.ts +0 -53
- package/dist/scheduling/NatsKvDebounceBackend.js +0 -334
- package/dist/scheduling/NatsKvDebounceBackend.js.map +0 -1
- package/dist/scheduling/RedisDebounceBackend.d.ts +0 -49
- package/dist/scheduling/RedisDebounceBackend.js +0 -356
- package/dist/scheduling/RedisDebounceBackend.js.map +0 -1
- package/dist/scheduling/createDebounceBackend.d.ts +0 -25
- package/dist/scheduling/createDebounceBackend.js +0 -39
- package/dist/scheduling/createDebounceBackend.js.map +0 -1
- package/dist/security/ABAC.d.ts +0 -224
- package/dist/security/ABAC.js +0 -380
- package/dist/security/ABAC.js.map +0 -1
- package/dist/security/AuditLogger.d.ts +0 -242
- package/dist/security/AuditLogger.js +0 -317
- package/dist/security/AuditLogger.js.map +0 -1
- package/dist/security/AuthMiddleware.d.ts +0 -162
- package/dist/security/AuthMiddleware.js +0 -289
- package/dist/security/AuthMiddleware.js.map +0 -1
- package/dist/security/EncryptionAtRest.d.ts +0 -206
- package/dist/security/EncryptionAtRest.js +0 -236
- package/dist/security/EncryptionAtRest.js.map +0 -1
- package/dist/security/OAuthProvider.d.ts +0 -334
- package/dist/security/OAuthProvider.js +0 -719
- package/dist/security/OAuthProvider.js.map +0 -1
- package/dist/security/PIIDetector.d.ts +0 -233
- package/dist/security/PIIDetector.js +0 -354
- package/dist/security/PIIDetector.js.map +0 -1
- package/dist/security/RBAC.d.ts +0 -143
- package/dist/security/RBAC.js +0 -285
- package/dist/security/RBAC.js.map +0 -1
- package/dist/security/SecretManager.d.ts +0 -652
- package/dist/security/SecretManager.js +0 -1147
- package/dist/security/SecretManager.js.map +0 -1
- package/dist/security/TLSConfig.d.ts +0 -305
- package/dist/security/TLSConfig.js +0 -550
- package/dist/security/TLSConfig.js.map +0 -1
- package/dist/security/index.d.ts +0 -81
- package/dist/security/index.js +0 -82
- package/dist/security/index.js.map +0 -1
package/dist/security/ABAC.js
DELETED
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Attribute-Based Access Control (ABAC) for Blok
|
|
3
|
-
*
|
|
4
|
-
* Provides fine-grained, attribute-driven access control that complements RBAC:
|
|
5
|
-
* - Policies evaluate attributes of subject, resource, action, and environment
|
|
6
|
-
* - Supports logical operators (AND, OR, NOT) for complex conditions
|
|
7
|
-
* - Supports comparison operators (equals, not_equals, in, not_in, contains, matches, gt, lt, gte, lte, between)
|
|
8
|
-
* - Supports attribute-to-attribute comparison via `valueRef` (e.g., resource.owner == subject.sub)
|
|
9
|
-
* - Integrates with AuthIdentity claims and RBAC roles
|
|
10
|
-
* - JSON-serializable policies for persistence and external management
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const engine = new ABACEngine();
|
|
15
|
-
*
|
|
16
|
-
* engine.addPolicy({
|
|
17
|
-
* id: "work-hours-only",
|
|
18
|
-
* description: "Allow workflow execution only during business hours",
|
|
19
|
-
* effect: "allow",
|
|
20
|
-
* target: {
|
|
21
|
-
* resource: "workflow",
|
|
22
|
-
* actions: ["execute"],
|
|
23
|
-
* },
|
|
24
|
-
* conditions: {
|
|
25
|
-
* all: [
|
|
26
|
-
* { attribute: "environment.hour", operator: "gte", value: 9 },
|
|
27
|
-
* { attribute: "environment.hour", operator: "lt", value: 17 },
|
|
28
|
-
* { attribute: "subject.department", operator: "equals", value: "engineering" },
|
|
29
|
-
* ],
|
|
30
|
-
* },
|
|
31
|
-
* });
|
|
32
|
-
*
|
|
33
|
-
* const result = engine.evaluate({
|
|
34
|
-
* subject: { sub: "user-1", roles: ["developer"], department: "engineering" },
|
|
35
|
-
* resource: { type: "workflow", id: "/api/users" },
|
|
36
|
-
* action: "execute",
|
|
37
|
-
* environment: { hour: 14, ip: "10.0.0.1" },
|
|
38
|
-
* });
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
// ────────────────────────────── Engine ──────────────────────────────
|
|
42
|
-
export class ABACEngine {
|
|
43
|
-
policies = new Map();
|
|
44
|
-
defaultEffect = "deny";
|
|
45
|
-
constructor(options) {
|
|
46
|
-
if (options?.defaultEffect) {
|
|
47
|
-
this.defaultEffect = options.defaultEffect;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Add or update a policy.
|
|
52
|
-
*/
|
|
53
|
-
addPolicy(policy) {
|
|
54
|
-
this.policies.set(policy.id, policy);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Remove a policy by ID.
|
|
58
|
-
*/
|
|
59
|
-
removePolicy(id) {
|
|
60
|
-
this.policies.delete(id);
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Get a policy by ID.
|
|
64
|
-
*/
|
|
65
|
-
getPolicy(id) {
|
|
66
|
-
return this.policies.get(id);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Get all policies, sorted by priority (highest first).
|
|
70
|
-
*/
|
|
71
|
-
getPolicies() {
|
|
72
|
-
return Array.from(this.policies.values()).sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Evaluate an access request against all policies.
|
|
76
|
-
*
|
|
77
|
-
* Policy evaluation order:
|
|
78
|
-
* 1. Policies are sorted by priority (highest first)
|
|
79
|
-
* 2. Only enabled policies are considered
|
|
80
|
-
* 3. Only policies whose target matches the request are considered
|
|
81
|
-
* 4. The first matching "deny" policy short-circuits with denial
|
|
82
|
-
* 5. Otherwise, at least one matching "allow" policy is required
|
|
83
|
-
* 6. If no policy matches, the default effect applies
|
|
84
|
-
*/
|
|
85
|
-
evaluate(request) {
|
|
86
|
-
const sortedPolicies = this.getPolicies();
|
|
87
|
-
const evaluatedPolicies = [];
|
|
88
|
-
let hasAllow = false;
|
|
89
|
-
let allowPolicy;
|
|
90
|
-
for (const policy of sortedPolicies) {
|
|
91
|
-
// Skip disabled policies
|
|
92
|
-
if (policy.enabled === false)
|
|
93
|
-
continue;
|
|
94
|
-
// Check if policy target matches the request
|
|
95
|
-
if (!this.matchesTarget(policy.target, request)) {
|
|
96
|
-
evaluatedPolicies.push({ policyId: policy.id, effect: policy.effect, matched: false });
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
// Evaluate conditions
|
|
100
|
-
const conditionsMet = this.evaluateConditionGroup(policy.conditions, request);
|
|
101
|
-
evaluatedPolicies.push({ policyId: policy.id, effect: policy.effect, matched: conditionsMet });
|
|
102
|
-
if (conditionsMet) {
|
|
103
|
-
// Deny takes precedence — short-circuit
|
|
104
|
-
if (policy.effect === "deny") {
|
|
105
|
-
return {
|
|
106
|
-
allowed: false,
|
|
107
|
-
matchedPolicy: policy,
|
|
108
|
-
evaluatedPolicies,
|
|
109
|
-
reason: `Denied by policy '${policy.id}'${policy.description ? `: ${policy.description}` : ""}`,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
// Track the first matching allow
|
|
113
|
-
if (!hasAllow) {
|
|
114
|
-
hasAllow = true;
|
|
115
|
-
allowPolicy = policy;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (hasAllow && allowPolicy) {
|
|
120
|
-
return {
|
|
121
|
-
allowed: true,
|
|
122
|
-
matchedPolicy: allowPolicy,
|
|
123
|
-
evaluatedPolicies,
|
|
124
|
-
reason: `Allowed by policy '${allowPolicy.id}'${allowPolicy.description ? `: ${allowPolicy.description}` : ""}`,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
// No matching policy — use default
|
|
128
|
-
const allowed = this.defaultEffect === "allow";
|
|
129
|
-
return {
|
|
130
|
-
allowed,
|
|
131
|
-
evaluatedPolicies,
|
|
132
|
-
reason: allowed ? "No matching policy; default effect is allow" : "No matching policy; default effect is deny",
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Export all policies as JSON.
|
|
137
|
-
*/
|
|
138
|
-
toJSON() {
|
|
139
|
-
return {
|
|
140
|
-
policies: Array.from(this.policies.values()),
|
|
141
|
-
defaultEffect: this.defaultEffect,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Load policies from JSON (replaces all existing policies).
|
|
146
|
-
*/
|
|
147
|
-
fromJSON(config) {
|
|
148
|
-
this.policies.clear();
|
|
149
|
-
for (const policy of config.policies) {
|
|
150
|
-
this.policies.set(policy.id, policy);
|
|
151
|
-
}
|
|
152
|
-
if (config.defaultEffect) {
|
|
153
|
-
this.defaultEffect = config.defaultEffect;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// ──────────────────── Target Matching ────────────────────
|
|
157
|
-
matchesTarget(target, request) {
|
|
158
|
-
if (!target)
|
|
159
|
-
return true;
|
|
160
|
-
// Check resource type
|
|
161
|
-
if (target.resource && target.resource !== "*") {
|
|
162
|
-
if (target.resource !== request.resource.type)
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
// Check resource pattern
|
|
166
|
-
if (target.resourcePattern) {
|
|
167
|
-
if (!this.matchesPattern(request.resource.id, target.resourcePattern))
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
// Check action
|
|
171
|
-
if (target.actions && target.actions.length > 0) {
|
|
172
|
-
if (!target.actions.includes(request.action) && !target.actions.includes("*"))
|
|
173
|
-
return false;
|
|
174
|
-
}
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
// ──────────────────── Condition Evaluation ────────────────────
|
|
178
|
-
evaluateConditionGroup(group, request) {
|
|
179
|
-
// A group with no clauses is treated as "always true"
|
|
180
|
-
const hasAny = group.all || group.any || group.none;
|
|
181
|
-
if (!hasAny)
|
|
182
|
-
return true;
|
|
183
|
-
// ALL: every item must be true
|
|
184
|
-
if (group.all) {
|
|
185
|
-
for (const item of group.all) {
|
|
186
|
-
if (!this.evaluateItem(item, request))
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// ANY: at least one must be true
|
|
191
|
-
if (group.any) {
|
|
192
|
-
let anyTrue = false;
|
|
193
|
-
for (const item of group.any) {
|
|
194
|
-
if (this.evaluateItem(item, request)) {
|
|
195
|
-
anyTrue = true;
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (!anyTrue)
|
|
200
|
-
return false;
|
|
201
|
-
}
|
|
202
|
-
// NONE: no item may be true
|
|
203
|
-
if (group.none) {
|
|
204
|
-
for (const item of group.none) {
|
|
205
|
-
if (this.evaluateItem(item, request))
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
211
|
-
evaluateItem(item, request) {
|
|
212
|
-
// Distinguish condition from group: conditions have "attribute"
|
|
213
|
-
if ("attribute" in item) {
|
|
214
|
-
return this.evaluateCondition(item, request);
|
|
215
|
-
}
|
|
216
|
-
return this.evaluateConditionGroup(item, request);
|
|
217
|
-
}
|
|
218
|
-
evaluateCondition(condition, request) {
|
|
219
|
-
const attributeValue = this.resolveAttribute(condition.attribute, request);
|
|
220
|
-
// If valueRef is set, resolve the comparison value from another attribute
|
|
221
|
-
const comparisonValue = condition.valueRef ? this.resolveAttribute(condition.valueRef, request) : condition.value;
|
|
222
|
-
return this.compare(attributeValue, condition.operator, comparisonValue);
|
|
223
|
-
}
|
|
224
|
-
// ──────────────────── Attribute Resolution ────────────────────
|
|
225
|
-
resolveAttribute(path, request) {
|
|
226
|
-
const segments = path.split(".");
|
|
227
|
-
if (segments.length === 0)
|
|
228
|
-
return undefined;
|
|
229
|
-
const root = segments[0];
|
|
230
|
-
const rest = segments.slice(1);
|
|
231
|
-
let obj;
|
|
232
|
-
switch (root) {
|
|
233
|
-
case "subject":
|
|
234
|
-
obj = request.subject;
|
|
235
|
-
break;
|
|
236
|
-
case "resource":
|
|
237
|
-
obj = request.resource;
|
|
238
|
-
break;
|
|
239
|
-
case "action":
|
|
240
|
-
// "action" with no sub-path resolves to the action string itself
|
|
241
|
-
return rest.length === 0 ? request.action : undefined;
|
|
242
|
-
case "environment":
|
|
243
|
-
obj = request.environment;
|
|
244
|
-
break;
|
|
245
|
-
default:
|
|
246
|
-
return undefined;
|
|
247
|
-
}
|
|
248
|
-
// Traverse the rest of the path
|
|
249
|
-
for (const segment of rest) {
|
|
250
|
-
if (obj === null || obj === undefined)
|
|
251
|
-
return undefined;
|
|
252
|
-
if (typeof obj === "object") {
|
|
253
|
-
obj = obj[segment];
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
return undefined;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return obj;
|
|
260
|
-
}
|
|
261
|
-
// ──────────────────── Comparison Operators ────────────────────
|
|
262
|
-
compare(actual, operator, expected) {
|
|
263
|
-
switch (operator) {
|
|
264
|
-
case "equals":
|
|
265
|
-
return actual === expected;
|
|
266
|
-
case "not_equals":
|
|
267
|
-
return actual !== expected;
|
|
268
|
-
case "in":
|
|
269
|
-
return Array.isArray(expected) && expected.includes(actual);
|
|
270
|
-
case "not_in":
|
|
271
|
-
return Array.isArray(expected) && !expected.includes(actual);
|
|
272
|
-
case "contains":
|
|
273
|
-
if (Array.isArray(actual))
|
|
274
|
-
return actual.includes(expected);
|
|
275
|
-
if (typeof actual === "string" && typeof expected === "string")
|
|
276
|
-
return actual.includes(expected);
|
|
277
|
-
return false;
|
|
278
|
-
case "not_contains":
|
|
279
|
-
if (Array.isArray(actual))
|
|
280
|
-
return !actual.includes(expected);
|
|
281
|
-
if (typeof actual === "string" && typeof expected === "string")
|
|
282
|
-
return !actual.includes(expected);
|
|
283
|
-
return true;
|
|
284
|
-
case "matches":
|
|
285
|
-
if (typeof actual !== "string" || typeof expected !== "string")
|
|
286
|
-
return false;
|
|
287
|
-
try {
|
|
288
|
-
return new RegExp(expected).test(actual);
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
case "gt":
|
|
294
|
-
return typeof actual === "number" && typeof expected === "number" && actual > expected;
|
|
295
|
-
case "lt":
|
|
296
|
-
return typeof actual === "number" && typeof expected === "number" && actual < expected;
|
|
297
|
-
case "gte":
|
|
298
|
-
return typeof actual === "number" && typeof expected === "number" && actual >= expected;
|
|
299
|
-
case "lte":
|
|
300
|
-
return typeof actual === "number" && typeof expected === "number" && actual <= expected;
|
|
301
|
-
case "between": {
|
|
302
|
-
if (typeof actual !== "number")
|
|
303
|
-
return false;
|
|
304
|
-
if (!Array.isArray(expected) || expected.length !== 2)
|
|
305
|
-
return false;
|
|
306
|
-
const [low, high] = expected;
|
|
307
|
-
return typeof low === "number" && typeof high === "number" && actual >= low && actual <= high;
|
|
308
|
-
}
|
|
309
|
-
case "exists":
|
|
310
|
-
return actual !== undefined && actual !== null;
|
|
311
|
-
case "not_exists":
|
|
312
|
-
return actual === undefined || actual === null;
|
|
313
|
-
default:
|
|
314
|
-
return false;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
// ──────────────────── Utility ────────────────────
|
|
318
|
-
matchesPattern(value, pattern) {
|
|
319
|
-
if (pattern === "*")
|
|
320
|
-
return true;
|
|
321
|
-
const regexStr = pattern.replace(/\*/g, ".*").replace(/\?/g, ".");
|
|
322
|
-
const regex = new RegExp(`^${regexStr}$`);
|
|
323
|
-
return regex.test(value);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Create a preconfigured ABAC engine with common policies.
|
|
328
|
-
*/
|
|
329
|
-
export function createDefaultABAC() {
|
|
330
|
-
const engine = new ABACEngine();
|
|
331
|
-
// Policy: Admin override — admins always get access
|
|
332
|
-
engine.addPolicy({
|
|
333
|
-
id: "admin-override",
|
|
334
|
-
description: "Admin role bypasses all attribute checks",
|
|
335
|
-
effect: "allow",
|
|
336
|
-
priority: 1000,
|
|
337
|
-
conditions: {
|
|
338
|
-
any: [{ attribute: "subject.roles", operator: "contains", value: "admin" }],
|
|
339
|
-
},
|
|
340
|
-
});
|
|
341
|
-
// Policy: Deny access from blocked IPs
|
|
342
|
-
engine.addPolicy({
|
|
343
|
-
id: "block-denied-ips",
|
|
344
|
-
description: "Deny access from blocked IP ranges",
|
|
345
|
-
effect: "deny",
|
|
346
|
-
priority: 900,
|
|
347
|
-
conditions: {
|
|
348
|
-
any: [{ attribute: "environment.blocked", operator: "equals", value: true }],
|
|
349
|
-
},
|
|
350
|
-
});
|
|
351
|
-
// Policy: Allow service accounts to execute workflows
|
|
352
|
-
engine.addPolicy({
|
|
353
|
-
id: "service-execute",
|
|
354
|
-
description: "Service accounts can execute workflows",
|
|
355
|
-
effect: "allow",
|
|
356
|
-
priority: 100,
|
|
357
|
-
target: {
|
|
358
|
-
resource: "workflow",
|
|
359
|
-
actions: ["execute"],
|
|
360
|
-
},
|
|
361
|
-
conditions: {
|
|
362
|
-
all: [{ attribute: "subject.roles", operator: "contains", value: "service" }],
|
|
363
|
-
},
|
|
364
|
-
});
|
|
365
|
-
// Policy: Resource owner full access (attribute-to-attribute comparison)
|
|
366
|
-
engine.addPolicy({
|
|
367
|
-
id: "resource-owner-access",
|
|
368
|
-
description: "Resource owners have full access to their resources",
|
|
369
|
-
effect: "allow",
|
|
370
|
-
priority: 500,
|
|
371
|
-
conditions: {
|
|
372
|
-
all: [
|
|
373
|
-
{ attribute: "resource.owner", operator: "exists" },
|
|
374
|
-
{ attribute: "resource.owner", operator: "equals", valueRef: "subject.sub" },
|
|
375
|
-
],
|
|
376
|
-
},
|
|
377
|
-
});
|
|
378
|
-
return engine;
|
|
379
|
-
}
|
|
380
|
-
//# sourceMappingURL=ABAC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ABAC.js","sourceRoot":"","sources":["../../src/security/ABAC.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Audit Logger for Blok Framework
|
|
3
|
-
*
|
|
4
|
-
* Provides comprehensive audit logging for security and compliance:
|
|
5
|
-
* - All authentication attempts (success and failure)
|
|
6
|
-
* - Authorization decisions
|
|
7
|
-
* - Workflow executions
|
|
8
|
-
* - Node executions
|
|
9
|
-
* - Configuration changes
|
|
10
|
-
* - System events
|
|
11
|
-
*
|
|
12
|
-
* Supports multiple output destinations via AuditSink interface.
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* const audit = new AuditLogger({
|
|
17
|
-
* sinks: [
|
|
18
|
-
* new ConsoleAuditSink(),
|
|
19
|
-
* new FileAuditSink({ path: "./audit.log" }),
|
|
20
|
-
* ],
|
|
21
|
-
* includeTimestamp: true,
|
|
22
|
-
* includeRequestId: true,
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* audit.logAuth({
|
|
26
|
-
* action: "login",
|
|
27
|
-
* success: true,
|
|
28
|
-
* identity: { sub: "user-123", provider: "jwt" },
|
|
29
|
-
* ip: "192.168.1.1",
|
|
30
|
-
* });
|
|
31
|
-
* ```
|
|
32
|
-
*/
|
|
33
|
-
export type AuditCategory = "auth" | "authz" | "workflow" | "node" | "trigger" | "config" | "system" | "security";
|
|
34
|
-
export type AuditSeverity = "info" | "warn" | "error" | "critical";
|
|
35
|
-
export interface AuditEntry {
|
|
36
|
-
/** Unique entry ID */
|
|
37
|
-
id: string;
|
|
38
|
-
/** ISO 8601 timestamp */
|
|
39
|
-
timestamp: string;
|
|
40
|
-
/** Audit category */
|
|
41
|
-
category: AuditCategory;
|
|
42
|
-
/** Severity level */
|
|
43
|
-
severity: AuditSeverity;
|
|
44
|
-
/** Action performed */
|
|
45
|
-
action: string;
|
|
46
|
-
/** Whether the action succeeded */
|
|
47
|
-
success: boolean;
|
|
48
|
-
/** Actor who performed the action */
|
|
49
|
-
actor?: {
|
|
50
|
-
sub: string;
|
|
51
|
-
name?: string;
|
|
52
|
-
ip?: string;
|
|
53
|
-
userAgent?: string;
|
|
54
|
-
provider?: string;
|
|
55
|
-
};
|
|
56
|
-
/** Target resource */
|
|
57
|
-
resource?: {
|
|
58
|
-
type: string;
|
|
59
|
-
id: string;
|
|
60
|
-
name?: string;
|
|
61
|
-
};
|
|
62
|
-
/** Additional details */
|
|
63
|
-
details?: Record<string, unknown>;
|
|
64
|
-
/** Request ID for correlation */
|
|
65
|
-
requestId?: string;
|
|
66
|
-
/** Duration in ms (for execution events) */
|
|
67
|
-
durationMs?: number;
|
|
68
|
-
/** Error information if action failed */
|
|
69
|
-
error?: {
|
|
70
|
-
message: string;
|
|
71
|
-
code?: string | number;
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Interface for audit log output destinations
|
|
76
|
-
*/
|
|
77
|
-
export interface AuditSink {
|
|
78
|
-
/** Unique name for this sink */
|
|
79
|
-
readonly name: string;
|
|
80
|
-
/** Write an audit entry */
|
|
81
|
-
write(entry: AuditEntry): Promise<void> | void;
|
|
82
|
-
/** Flush any buffered entries */
|
|
83
|
-
flush?(): Promise<void>;
|
|
84
|
-
/** Close the sink */
|
|
85
|
-
close?(): Promise<void>;
|
|
86
|
-
}
|
|
87
|
-
export interface AuditLoggerConfig {
|
|
88
|
-
/** Output sinks for audit entries */
|
|
89
|
-
sinks: AuditSink[];
|
|
90
|
-
/** Include request ID in entries (default: true) */
|
|
91
|
-
includeRequestId?: boolean;
|
|
92
|
-
/** Minimum severity to log (default: "info") */
|
|
93
|
-
minSeverity?: AuditSeverity;
|
|
94
|
-
/** Buffer size before flushing (default: 100) */
|
|
95
|
-
bufferSize?: number;
|
|
96
|
-
/** Auto-flush interval in ms (default: 5000) */
|
|
97
|
-
flushIntervalMs?: number;
|
|
98
|
-
/** Service name for identification */
|
|
99
|
-
serviceName?: string;
|
|
100
|
-
}
|
|
101
|
-
export declare class AuditLogger {
|
|
102
|
-
private config;
|
|
103
|
-
private buffer;
|
|
104
|
-
private flushTimer;
|
|
105
|
-
private entryCounter;
|
|
106
|
-
private pendingFlush;
|
|
107
|
-
constructor(config: AuditLoggerConfig);
|
|
108
|
-
/**
|
|
109
|
-
* Log an authentication event
|
|
110
|
-
*/
|
|
111
|
-
logAuth(params: {
|
|
112
|
-
action: "login" | "logout" | "token_refresh" | "api_key_verify";
|
|
113
|
-
success: boolean;
|
|
114
|
-
identity?: {
|
|
115
|
-
sub: string;
|
|
116
|
-
provider?: string;
|
|
117
|
-
name?: string;
|
|
118
|
-
};
|
|
119
|
-
ip?: string;
|
|
120
|
-
userAgent?: string;
|
|
121
|
-
error?: string;
|
|
122
|
-
requestId?: string;
|
|
123
|
-
}): void;
|
|
124
|
-
/**
|
|
125
|
-
* Log an authorization event
|
|
126
|
-
*/
|
|
127
|
-
logAuthz(params: {
|
|
128
|
-
action: string;
|
|
129
|
-
resource: {
|
|
130
|
-
type: string;
|
|
131
|
-
id: string;
|
|
132
|
-
name?: string;
|
|
133
|
-
};
|
|
134
|
-
roles: string[];
|
|
135
|
-
allowed: boolean;
|
|
136
|
-
actor: {
|
|
137
|
-
sub: string;
|
|
138
|
-
name?: string;
|
|
139
|
-
ip?: string;
|
|
140
|
-
};
|
|
141
|
-
requestId?: string;
|
|
142
|
-
}): void;
|
|
143
|
-
/**
|
|
144
|
-
* Log a workflow execution event
|
|
145
|
-
*/
|
|
146
|
-
logWorkflowExecution(params: {
|
|
147
|
-
workflowName: string;
|
|
148
|
-
workflowPath: string;
|
|
149
|
-
success: boolean;
|
|
150
|
-
durationMs: number;
|
|
151
|
-
actor?: {
|
|
152
|
-
sub: string;
|
|
153
|
-
ip?: string;
|
|
154
|
-
};
|
|
155
|
-
error?: string;
|
|
156
|
-
requestId?: string;
|
|
157
|
-
}): void;
|
|
158
|
-
/**
|
|
159
|
-
* Log a configuration change event
|
|
160
|
-
*/
|
|
161
|
-
logConfigChange(params: {
|
|
162
|
-
action: "create" | "update" | "delete";
|
|
163
|
-
resourceType: string;
|
|
164
|
-
resourceId: string;
|
|
165
|
-
actor: {
|
|
166
|
-
sub: string;
|
|
167
|
-
name?: string;
|
|
168
|
-
};
|
|
169
|
-
details?: Record<string, unknown>;
|
|
170
|
-
}): void;
|
|
171
|
-
/**
|
|
172
|
-
* Log a security event
|
|
173
|
-
*/
|
|
174
|
-
logSecurityEvent(params: {
|
|
175
|
-
action: string;
|
|
176
|
-
severity: AuditSeverity;
|
|
177
|
-
details: Record<string, unknown>;
|
|
178
|
-
actor?: {
|
|
179
|
-
sub: string;
|
|
180
|
-
ip?: string;
|
|
181
|
-
};
|
|
182
|
-
requestId?: string;
|
|
183
|
-
}): void;
|
|
184
|
-
/**
|
|
185
|
-
* Core logging method
|
|
186
|
-
*/
|
|
187
|
-
log(params: Omit<AuditEntry, "id" | "timestamp">): void;
|
|
188
|
-
/**
|
|
189
|
-
* Flush buffered entries to all sinks
|
|
190
|
-
*/
|
|
191
|
-
flush(): Promise<void>;
|
|
192
|
-
/**
|
|
193
|
-
* Close the audit logger and flush remaining entries
|
|
194
|
-
*/
|
|
195
|
-
close(): Promise<void>;
|
|
196
|
-
/**
|
|
197
|
-
* Get entry count since creation
|
|
198
|
-
*/
|
|
199
|
-
getEntryCount(): number;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Console audit sink - outputs audit entries to stdout as JSON
|
|
203
|
-
*/
|
|
204
|
-
export declare class ConsoleAuditSink implements AuditSink {
|
|
205
|
-
readonly name = "console";
|
|
206
|
-
write(entry: AuditEntry): void;
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* File audit sink - appends audit entries as JSONL to a file
|
|
210
|
-
*/
|
|
211
|
-
export declare class FileAuditSink implements AuditSink {
|
|
212
|
-
readonly name = "file";
|
|
213
|
-
private filePath;
|
|
214
|
-
private buffer;
|
|
215
|
-
private initialized;
|
|
216
|
-
constructor(config: {
|
|
217
|
-
path: string;
|
|
218
|
-
});
|
|
219
|
-
write(entry: AuditEntry): Promise<void>;
|
|
220
|
-
flush(): Promise<void>;
|
|
221
|
-
close(): Promise<void>;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* In-memory audit sink - stores entries in memory (useful for testing)
|
|
225
|
-
*/
|
|
226
|
-
export declare class InMemoryAuditSink implements AuditSink {
|
|
227
|
-
readonly name = "memory";
|
|
228
|
-
private entries;
|
|
229
|
-
private maxEntries;
|
|
230
|
-
constructor(maxEntries?: number);
|
|
231
|
-
write(entry: AuditEntry): void;
|
|
232
|
-
getEntries(): AuditEntry[];
|
|
233
|
-
query(filter: {
|
|
234
|
-
category?: AuditCategory;
|
|
235
|
-
severity?: AuditSeverity;
|
|
236
|
-
actorSub?: string;
|
|
237
|
-
action?: string;
|
|
238
|
-
since?: string;
|
|
239
|
-
limit?: number;
|
|
240
|
-
}): AuditEntry[];
|
|
241
|
-
clear(): void;
|
|
242
|
-
}
|