@sochdb/sochdb 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -14
- package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
- package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
- package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
- package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
- package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
- package/dist/cjs/embedded/database.js +98 -4
- package/dist/cjs/embedded/ffi/bindings.js +46 -8
- package/dist/cjs/index.js +28 -6
- package/dist/cjs/mcp/client.js +115 -0
- package/dist/cjs/mcp/index.js +28 -0
- package/dist/cjs/mcp/server.js +242 -0
- package/dist/cjs/mcp/types.js +32 -0
- package/dist/cjs/namespace.js +147 -19
- package/dist/cjs/policy/index.js +26 -0
- package/dist/cjs/policy/service.js +394 -0
- package/dist/cjs/policy/types.js +8 -0
- package/dist/esm/embedded/database.js +98 -4
- package/dist/esm/embedded/ffi/bindings.js +48 -8
- package/dist/esm/index.js +28 -6
- package/dist/esm/mcp/client.js +116 -0
- package/dist/esm/mcp/index.js +28 -0
- package/dist/esm/mcp/server.js +244 -0
- package/dist/esm/mcp/types.js +34 -0
- package/dist/esm/namespace.js +150 -19
- package/dist/esm/policy/index.js +26 -0
- package/dist/esm/policy/service.js +396 -0
- package/dist/esm/policy/types.js +8 -0
- package/dist/types/embedded/database.d.ts +66 -1
- package/dist/types/embedded/database.d.ts.map +1 -1
- package/dist/types/embedded/ffi/bindings.d.ts +7 -0
- package/dist/types/embedded/ffi/bindings.d.ts.map +1 -1
- package/dist/types/index.d.ts +23 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/mcp/client.d.ts +69 -0
- package/dist/types/mcp/client.d.ts.map +1 -0
- package/dist/types/mcp/index.d.ts +9 -0
- package/dist/types/mcp/index.d.ts.map +1 -0
- package/dist/types/mcp/server.d.ts +87 -0
- package/dist/types/mcp/server.d.ts.map +1 -0
- package/dist/types/mcp/types.d.ts +124 -0
- package/dist/types/mcp/types.d.ts.map +1 -0
- package/dist/types/namespace.d.ts +13 -0
- package/dist/types/namespace.d.ts.map +1 -1
- package/dist/types/policy/index.d.ts +8 -0
- package/dist/types/policy/index.d.ts.map +1 -0
- package/dist/types/policy/service.d.ts +115 -0
- package/dist/types/policy/service.d.ts.map +1 -0
- package/dist/types/policy/types.d.ts +102 -0
- package/dist/types/policy/types.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Policy Service Module
|
|
4
|
+
*
|
|
5
|
+
* Policy-based access control and namespace governance for SochDB.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.PolicyService = void 0;
|
|
23
|
+
__exportStar(require("./types"), exports);
|
|
24
|
+
var service_1 = require("./service");
|
|
25
|
+
Object.defineProperty(exports, "PolicyService", { enumerable: true, get: function () { return service_1.PolicyService; } });
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9saWN5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOzs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBDQUF3QjtBQUN4QixxQ0FBMEM7QUFBakMsd0dBQUEsYUFBYSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBNb2R1bGVcbiAqIFxuICogUG9saWN5LWJhc2VkIGFjY2VzcyBjb250cm9sIGFuZCBuYW1lc3BhY2UgZ292ZXJuYW5jZSBmb3IgU29jaERCLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgUG9saWN5U2VydmljZSB9IGZyb20gJy4vc2VydmljZSc7XG4iXX0=
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Policy Service Implementation
|
|
4
|
+
*
|
|
5
|
+
* Policy-based access control and namespace governance for SochDB.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PolicyService = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Policy Service for access control and governance
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { EmbeddedDatabase, PolicyService } from '@sochdb/sochdb';
|
|
15
|
+
*
|
|
16
|
+
* const db = EmbeddedDatabase.open('./mydb');
|
|
17
|
+
* const policy = new PolicyService(db);
|
|
18
|
+
*
|
|
19
|
+
* // Create a namespace policy
|
|
20
|
+
* await policy.createNamespacePolicy({
|
|
21
|
+
* namespace: 'tenant_123',
|
|
22
|
+
* rules: [{
|
|
23
|
+
* id: 'read_only',
|
|
24
|
+
* name: 'Read Only Access',
|
|
25
|
+
* effect: 'allow',
|
|
26
|
+
* principals: ['user:*'],
|
|
27
|
+
* resources: ['collection:*'],
|
|
28
|
+
* actions: ['read', 'search']
|
|
29
|
+
* }],
|
|
30
|
+
* defaultEffect: 'deny'
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Evaluate access
|
|
34
|
+
* const result = await policy.evaluate({
|
|
35
|
+
* principal: 'user:alice',
|
|
36
|
+
* action: 'read',
|
|
37
|
+
* resource: 'collection:documents'
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
class PolicyService {
|
|
42
|
+
constructor(db, options) {
|
|
43
|
+
this.cache = new Map();
|
|
44
|
+
this.auditEnabled = true;
|
|
45
|
+
this.db = db;
|
|
46
|
+
this.prefix = Buffer.from('_policy:');
|
|
47
|
+
this.auditEnabled = options?.enableAudit ?? true;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a namespace policy
|
|
51
|
+
*/
|
|
52
|
+
async createNamespacePolicy(policy) {
|
|
53
|
+
const key = this.policyKey(policy.namespace);
|
|
54
|
+
const data = {
|
|
55
|
+
...policy,
|
|
56
|
+
createdAt: Date.now(),
|
|
57
|
+
updatedAt: Date.now(),
|
|
58
|
+
};
|
|
59
|
+
await this.db.put(key, Buffer.from(JSON.stringify(data)));
|
|
60
|
+
this.cache.set(policy.namespace, policy);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get a namespace policy
|
|
64
|
+
*/
|
|
65
|
+
async getNamespacePolicy(namespace) {
|
|
66
|
+
// Check cache first
|
|
67
|
+
if (this.cache.has(namespace)) {
|
|
68
|
+
return this.cache.get(namespace);
|
|
69
|
+
}
|
|
70
|
+
const key = this.policyKey(namespace);
|
|
71
|
+
const value = await this.db.get(key);
|
|
72
|
+
if (!value) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const policy = JSON.parse(value.toString());
|
|
76
|
+
this.cache.set(namespace, policy);
|
|
77
|
+
return policy;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Update a namespace policy
|
|
81
|
+
*/
|
|
82
|
+
async updateNamespacePolicy(namespace, updates) {
|
|
83
|
+
const existing = await this.getNamespacePolicy(namespace);
|
|
84
|
+
if (!existing) {
|
|
85
|
+
throw new Error(`Policy not found for namespace: ${namespace}`);
|
|
86
|
+
}
|
|
87
|
+
const updated = {
|
|
88
|
+
...existing,
|
|
89
|
+
...updates,
|
|
90
|
+
namespace, // Ensure namespace doesn't change
|
|
91
|
+
updatedAt: Date.now(),
|
|
92
|
+
};
|
|
93
|
+
const key = this.policyKey(namespace);
|
|
94
|
+
await this.db.put(key, Buffer.from(JSON.stringify(updated)));
|
|
95
|
+
this.cache.set(namespace, updated);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete a namespace policy
|
|
99
|
+
*/
|
|
100
|
+
async deleteNamespacePolicy(namespace) {
|
|
101
|
+
const key = this.policyKey(namespace);
|
|
102
|
+
await this.db.delete(key);
|
|
103
|
+
this.cache.delete(namespace);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Add a rule to a namespace policy
|
|
108
|
+
*/
|
|
109
|
+
async addRule(namespace, rule) {
|
|
110
|
+
const policy = await this.getNamespacePolicy(namespace);
|
|
111
|
+
if (!policy) {
|
|
112
|
+
throw new Error(`Policy not found for namespace: ${namespace}`);
|
|
113
|
+
}
|
|
114
|
+
// Check for duplicate rule ID
|
|
115
|
+
if (policy.rules.some(r => r.id === rule.id)) {
|
|
116
|
+
throw new Error(`Rule with id '${rule.id}' already exists`);
|
|
117
|
+
}
|
|
118
|
+
policy.rules.push(rule);
|
|
119
|
+
await this.updateNamespacePolicy(namespace, { rules: policy.rules });
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Remove a rule from a namespace policy
|
|
123
|
+
*/
|
|
124
|
+
async removeRule(namespace, ruleId) {
|
|
125
|
+
const policy = await this.getNamespacePolicy(namespace);
|
|
126
|
+
if (!policy) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const index = policy.rules.findIndex(r => r.id === ruleId);
|
|
130
|
+
if (index === -1) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
policy.rules.splice(index, 1);
|
|
134
|
+
await this.updateNamespacePolicy(namespace, { rules: policy.rules });
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Evaluate a policy request
|
|
139
|
+
*/
|
|
140
|
+
async evaluate(request) {
|
|
141
|
+
const startTime = Date.now();
|
|
142
|
+
// Extract namespace from resource
|
|
143
|
+
const namespace = this.extractNamespace(request.resource);
|
|
144
|
+
const policy = namespace ? await this.getNamespacePolicy(namespace) : null;
|
|
145
|
+
let result;
|
|
146
|
+
if (!policy) {
|
|
147
|
+
// No policy = allow by default
|
|
148
|
+
result = {
|
|
149
|
+
allowed: true,
|
|
150
|
+
reason: 'No policy defined',
|
|
151
|
+
evaluationTime: Date.now() - startTime,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Evaluate rules in priority order
|
|
156
|
+
const sortedRules = [...policy.rules].sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
157
|
+
let matchedRule;
|
|
158
|
+
for (const rule of sortedRules) {
|
|
159
|
+
if (this.matchesRule(request, rule)) {
|
|
160
|
+
matchedRule = rule;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (matchedRule) {
|
|
165
|
+
result = {
|
|
166
|
+
allowed: matchedRule.effect === 'allow',
|
|
167
|
+
matchedRule,
|
|
168
|
+
reason: `Matched rule: ${matchedRule.name}`,
|
|
169
|
+
evaluationTime: Date.now() - startTime,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
result = {
|
|
174
|
+
allowed: policy.defaultEffect === 'allow',
|
|
175
|
+
reason: `Default effect: ${policy.defaultEffect}`,
|
|
176
|
+
evaluationTime: Date.now() - startTime,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Log audit entry
|
|
181
|
+
if (this.auditEnabled) {
|
|
182
|
+
await this.logAudit(request, result);
|
|
183
|
+
}
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Grant namespace access to a principal
|
|
188
|
+
*/
|
|
189
|
+
async grantAccess(grant) {
|
|
190
|
+
const key = this.grantKey(grant.namespace, grant.principal);
|
|
191
|
+
const data = {
|
|
192
|
+
...grant,
|
|
193
|
+
grantedAt: Date.now(),
|
|
194
|
+
};
|
|
195
|
+
await this.db.put(key, Buffer.from(JSON.stringify(data)));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Revoke namespace access from a principal
|
|
199
|
+
*/
|
|
200
|
+
async revokeAccess(namespace, principal) {
|
|
201
|
+
const key = this.grantKey(namespace, principal);
|
|
202
|
+
await this.db.delete(key);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if principal has permission
|
|
207
|
+
*/
|
|
208
|
+
async hasPermission(namespace, principal, permission) {
|
|
209
|
+
const key = this.grantKey(namespace, principal);
|
|
210
|
+
const value = await this.db.get(key);
|
|
211
|
+
if (!value) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
const grant = JSON.parse(value.toString());
|
|
215
|
+
// Check expiration
|
|
216
|
+
if (grant.expiresAt && Date.now() > grant.expiresAt) {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
// Admin has all permissions
|
|
220
|
+
if (grant.permissions.includes('admin')) {
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
return grant.permissions.includes(permission);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* List all grants for a namespace
|
|
227
|
+
*/
|
|
228
|
+
async listGrants(namespace) {
|
|
229
|
+
const grants = [];
|
|
230
|
+
const prefix = Buffer.from(`_grant:${namespace}:`);
|
|
231
|
+
try {
|
|
232
|
+
for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
|
|
233
|
+
const grant = JSON.parse(valueBuffer.toString());
|
|
234
|
+
grants.push(grant);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
// Ignore scan errors
|
|
239
|
+
}
|
|
240
|
+
return grants;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get audit log entries
|
|
244
|
+
*/
|
|
245
|
+
async getAuditLog(options) {
|
|
246
|
+
const entries = [];
|
|
247
|
+
const prefix = Buffer.from('_audit:');
|
|
248
|
+
const limit = options?.limit || 100;
|
|
249
|
+
try {
|
|
250
|
+
for await (const [_, valueBuffer] of this.db.scanPrefix(prefix)) {
|
|
251
|
+
const entry = JSON.parse(valueBuffer.toString());
|
|
252
|
+
// Apply filters
|
|
253
|
+
if (options?.namespace && !entry.resource.includes(options.namespace)) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (options?.principal && entry.principal !== options.principal) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (options?.action && entry.action !== options.action) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
if (options?.since && entry.timestamp < options.since) {
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
entries.push(entry);
|
|
266
|
+
if (entries.length >= limit) {
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
// Ignore scan errors
|
|
273
|
+
}
|
|
274
|
+
// Sort by timestamp descending
|
|
275
|
+
return entries.sort((a, b) => b.timestamp - a.timestamp);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Clear policy cache
|
|
279
|
+
*/
|
|
280
|
+
clearCache() {
|
|
281
|
+
this.cache.clear();
|
|
282
|
+
}
|
|
283
|
+
// Private methods
|
|
284
|
+
policyKey(namespace) {
|
|
285
|
+
return Buffer.concat([this.prefix, Buffer.from(`namespace:${namespace}`)]);
|
|
286
|
+
}
|
|
287
|
+
grantKey(namespace, principal) {
|
|
288
|
+
return Buffer.from(`_grant:${namespace}:${principal}`);
|
|
289
|
+
}
|
|
290
|
+
extractNamespace(resource) {
|
|
291
|
+
// Extract namespace from resource like "namespace:tenant_123:collection:docs"
|
|
292
|
+
const parts = resource.split(':');
|
|
293
|
+
if (parts.length >= 2 && parts[0] === 'namespace') {
|
|
294
|
+
return parts[1];
|
|
295
|
+
}
|
|
296
|
+
// Try to extract from collection format "collection:tenant_123:docs"
|
|
297
|
+
if (parts.length >= 2 && parts[0] === 'collection') {
|
|
298
|
+
return parts[1];
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
matchesRule(request, rule) {
|
|
303
|
+
// Check principals
|
|
304
|
+
if (!this.matchesPatterns(request.principal, rule.principals)) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
// Check resources
|
|
308
|
+
if (!this.matchesPatterns(request.resource, rule.resources)) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
// Check actions
|
|
312
|
+
if (!this.matchesPatterns(request.action, rule.actions)) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
// Check conditions
|
|
316
|
+
if (rule.conditions && rule.conditions.length > 0) {
|
|
317
|
+
for (const condition of rule.conditions) {
|
|
318
|
+
if (!this.evaluateCondition(condition, request.context)) {
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
matchesPatterns(value, patterns) {
|
|
326
|
+
for (const pattern of patterns) {
|
|
327
|
+
if (this.matchesPattern(value, pattern)) {
|
|
328
|
+
return true;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
matchesPattern(value, pattern) {
|
|
334
|
+
if (pattern === '*') {
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
if (pattern.endsWith('*')) {
|
|
338
|
+
return value.startsWith(pattern.slice(0, -1));
|
|
339
|
+
}
|
|
340
|
+
if (pattern.startsWith('*')) {
|
|
341
|
+
return value.endsWith(pattern.slice(1));
|
|
342
|
+
}
|
|
343
|
+
return value === pattern;
|
|
344
|
+
}
|
|
345
|
+
evaluateCondition(condition, context) {
|
|
346
|
+
if (!context) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
349
|
+
const value = context[condition.key];
|
|
350
|
+
if (value === undefined) {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
switch (condition.operator) {
|
|
354
|
+
case 'equals':
|
|
355
|
+
return value === condition.value;
|
|
356
|
+
case 'not_equals':
|
|
357
|
+
return value !== condition.value;
|
|
358
|
+
case 'contains':
|
|
359
|
+
return String(value).includes(String(condition.value));
|
|
360
|
+
case 'starts_with':
|
|
361
|
+
return String(value).startsWith(String(condition.value));
|
|
362
|
+
case 'ends_with':
|
|
363
|
+
return String(value).endsWith(String(condition.value));
|
|
364
|
+
case 'in':
|
|
365
|
+
return Array.isArray(condition.value) && condition.value.includes(value);
|
|
366
|
+
case 'not_in':
|
|
367
|
+
return Array.isArray(condition.value) && !condition.value.includes(value);
|
|
368
|
+
case 'between':
|
|
369
|
+
if (Array.isArray(condition.value) && condition.value.length === 2) {
|
|
370
|
+
return value >= condition.value[0] && value <= condition.value[1];
|
|
371
|
+
}
|
|
372
|
+
return false;
|
|
373
|
+
default:
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async logAudit(request, result) {
|
|
378
|
+
const entry = {
|
|
379
|
+
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
380
|
+
timestamp: Date.now(),
|
|
381
|
+
principal: request.principal,
|
|
382
|
+
action: request.action,
|
|
383
|
+
resource: request.resource,
|
|
384
|
+
decision: result.allowed ? 'allow' : 'deny',
|
|
385
|
+
matchedRule: result.matchedRule?.id,
|
|
386
|
+
reason: result.reason,
|
|
387
|
+
context: request.context,
|
|
388
|
+
};
|
|
389
|
+
const key = Buffer.from(`_audit:${entry.timestamp}:${entry.id}`);
|
|
390
|
+
await this.db.put(key, Buffer.from(JSON.stringify(entry)));
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
exports.PolicyService = PolicyService;
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wb2xpY3kvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBZUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFhLGFBQWE7SUFNeEIsWUFBWSxFQUFvQixFQUFFLE9BQW1DO1FBSDdELFVBQUssR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUcxQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUF1QjtRQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsTUFBTTtZQUNULFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3RCLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGtCQUFr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QUNyRSxNQUFNLEtBQUssR0FBcUI7WUFDOUIsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM5RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzNDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUF6YUQsc0NBeWFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBJbXBsZW1lbnRhdGlvblxuICogXG4gKiBQb2xpY3ktYmFzZWQgYWNjZXNzIGNvbnRyb2wgYW5kIG5hbWVzcGFjZSBnb3Zlcm5hbmNlIGZvciBTb2NoREIuXG4gKi9cblxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJy4uL2VtYmVkZGVkJztcbmltcG9ydCB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5UmVxdWVzdCxcbiAgUG9saWN5U2V0LFxuICBQb2xpY3lBdWRpdEVudHJ5LFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBQb2xpY3kgU2VydmljZSBmb3IgYWNjZXNzIGNvbnRyb2wgYW5kIGdvdmVybmFuY2VcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIFBvbGljeVNlcnZpY2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIGNvbnN0IGRiID0gRW1iZWRkZWREYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGNvbnN0IHBvbGljeSA9IG5ldyBQb2xpY3lTZXJ2aWNlKGRiKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgbmFtZXNwYWNlIHBvbGljeVxuICogYXdhaXQgcG9saWN5LmNyZWF0ZU5hbWVzcGFjZVBvbGljeSh7XG4gKiAgIG5hbWVzcGFjZTogJ3RlbmFudF8xMjMnLFxuICogICBydWxlczogW3tcbiAqICAgICBpZDogJ3JlYWRfb25seScsXG4gKiAgICAgbmFtZTogJ1JlYWQgT25seSBBY2Nlc3MnLFxuICogICAgIGVmZmVjdDogJ2FsbG93JyxcbiAqICAgICBwcmluY2lwYWxzOiBbJ3VzZXI6KiddLFxuICogICAgIHJlc291cmNlczogWydjb2xsZWN0aW9uOionXSxcbiAqICAgICBhY3Rpb25zOiBbJ3JlYWQnLCAnc2VhcmNoJ11cbiAqICAgfV0sXG4gKiAgIGRlZmF1bHRFZmZlY3Q6ICdkZW55J1xuICogfSk7XG4gKiBcbiAqIC8vIEV2YWx1YXRlIGFjY2Vzc1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9saWN5LmV2YWx1YXRlKHtcbiAqICAgcHJpbmNpcGFsOiAndXNlcjphbGljZScsXG4gKiAgIGFjdGlvbjogJ3JlYWQnLFxuICogICByZXNvdXJjZTogJ2NvbGxlY3Rpb246ZG9jdW1lbnRzJ1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFBvbGljeVNlcnZpY2Uge1xuICBwcml2YXRlIGRiOiBFbWJlZGRlZERhdGFiYXNlO1xuICBwcml2YXRlIHByZWZpeDogQnVmZmVyO1xuICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCBOYW1lc3BhY2VQb2xpY3k+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGF1ZGl0RW5hYmxlZCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoZGI6IEVtYmVkZGVkRGF0YWJhc2UsIG9wdGlvbnM/OiB7IGVuYWJsZUF1ZGl0PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5kYiA9IGRiO1xuICAgIHRoaXMucHJlZml4ID0gQnVmZmVyLmZyb20oJ19wb2xpY3k6Jyk7XG4gICAgdGhpcy5hdWRpdEVuYWJsZWQgPSBvcHRpb25zPy5lbmFibGVBdWRpdCA/PyB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5hbWVzcGFjZSBwb2xpY3lcbiAgICovXG4gIGFzeW5jIGNyZWF0ZU5hbWVzcGFjZVBvbGljeShwb2xpY3k6IE5hbWVzcGFjZVBvbGljeSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMucG9saWN5S2V5KHBvbGljeS5uYW1lc3BhY2UpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAuLi5wb2xpY3ksXG4gICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XG4gICAgdGhpcy5jYWNoZS5zZXQocG9saWN5Lm5hbWVzcGFjZSwgcG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuYW1lc3BhY2UgcG9saWN5XG4gICAqL1xuICBhc3luYyBnZXROYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVzcGFjZVBvbGljeSB8IG51bGw+IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQobmFtZXNwYWNlKSE7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5wb2xpY3lLZXkobmFtZXNwYWNlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcG9saWN5ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSBhcyBOYW1lc3BhY2VQb2xpY3k7XG4gICAgdGhpcy5jYWNoZS5zZXQobmFtZXNwYWNlLCBwb2xpY3kpO1xuICAgIHJldHVybiBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlTmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZTogc3RyaW5nLCB1cGRhdGVzOiBQYXJ0aWFsPE5hbWVzcGFjZVBvbGljeT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0TmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSk7XG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb2xpY3kgbm90IGZvdW5kIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgICAuLi5leGlzdGluZyxcbiAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICBuYW1lc3BhY2UsIC8vIEVuc3VyZSBuYW1lc3BhY2UgZG9lc24ndCBjaGFuZ2VcbiAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5wb2xpY3lLZXkobmFtZXNwYWNlKTtcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKSk7XG4gICAgdGhpcy5jYWNoZS5zZXQobmFtZXNwYWNlLCB1cGRhdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBuYW1lc3BhY2UgcG9saWN5XG4gICAqL1xuICBhc3luYyBkZWxldGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLnBvbGljeUtleShuYW1lc3BhY2UpO1xuICAgIGF3YWl0IHRoaXMuZGIuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5jYWNoZS5kZWxldGUobmFtZXNwYWNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBydWxlIHRvIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgYWRkUnVsZShuYW1lc3BhY2U6IHN0cmluZywgcnVsZTogUG9saWN5UnVsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvbGljeSA9IGF3YWl0IHRoaXMuZ2V0TmFtZXNwYWNlUG9saWN5KG5hbWVzcGFjZSk7XG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUG9saWN5IG5vdCBmb3VuZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIHJ1bGUgSURcbiAgICBpZiAocG9saWN5LnJ1bGVzLnNvbWUociA9PiByLmlkID09PSBydWxlLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlIHdpdGggaWQgJyR7cnVsZS5pZH0nIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgcG9saWN5LnJ1bGVzLnB1c2gocnVsZSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlLCB7IHJ1bGVzOiBwb2xpY3kucnVsZXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcnVsZSBmcm9tIGEgbmFtZXNwYWNlIHBvbGljeVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUnVsZShuYW1lc3BhY2U6IHN0cmluZywgcnVsZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpO1xuICAgIGlmICghcG9saWN5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSBwb2xpY3kucnVsZXMuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gcnVsZUlkKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcG9saWN5LnJ1bGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVOYW1lc3BhY2VQb2xpY3kobmFtZXNwYWNlLCB7IHJ1bGVzOiBwb2xpY3kucnVsZXMgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGUgYSBwb2xpY3kgcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGUocmVxdWVzdDogUG9saWN5UmVxdWVzdCk6IFByb21pc2U8UG9saWN5RXZhbHVhdGlvbj4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgXG4gICAgLy8gRXh0cmFjdCBuYW1lc3BhY2UgZnJvbSByZXNvdXJjZVxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IHRoaXMuZXh0cmFjdE5hbWVzcGFjZShyZXF1ZXN0LnJlc291cmNlKTtcbiAgICBjb25zdCBwb2xpY3kgPSBuYW1lc3BhY2UgPyBhd2FpdCB0aGlzLmdldE5hbWVzcGFjZVBvbGljeShuYW1lc3BhY2UpIDogbnVsbDtcblxuICAgIGxldCByZXN1bHQ6IFBvbGljeUV2YWx1YXRpb247XG5cbiAgICBpZiAoIXBvbGljeSkge1xuICAgICAgLy8gTm8gcG9saWN5ID0gYWxsb3cgYnkgZGVmYXVsdFxuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICBhbGxvd2VkOiB0cnVlLFxuICAgICAgICByZWFzb246ICdObyBwb2xpY3kgZGVmaW5lZCcsXG4gICAgICAgIGV2YWx1YXRpb25UaW1lOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRXZhbHVhdGUgcnVsZXMgaW4gcHJpb3JpdHkgb3JkZXJcbiAgICAgIGNvbnN0IHNvcnRlZFJ1bGVzID0gWy4uLnBvbGljeS5ydWxlc10uc29ydCgoYSwgYikgPT4gXG4gICAgICAgIChhLnByaW9yaXR5IHx8IDApIC0gKGIucHJpb3JpdHkgfHwgMClcbiAgICAgICk7XG5cbiAgICAgIGxldCBtYXRjaGVkUnVsZTogUG9saWN5UnVsZSB8IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBydWxlIG9mIHNvcnRlZFJ1bGVzKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoZXNSdWxlKHJlcXVlc3QsIHJ1bGUpKSB7XG4gICAgICAgICAgbWF0Y2hlZFJ1bGUgPSBydWxlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaGVkUnVsZSkge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgYWxsb3dlZDogbWF0Y2hlZFJ1bGUuZWZmZWN0ID09PSAnYWxsb3cnLFxuICAgICAgICAgIG1hdGNoZWRSdWxlLFxuICAgICAgICAgIHJlYXNvbjogYE1hdGNoZWQgcnVsZTogJHttYXRjaGVkUnVsZS5uYW1lfWAsXG4gICAgICAgICAgZXZhbHVhdGlvblRpbWU6IERhdGUubm93KCkgLSBzdGFydFRpbWUsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgYWxsb3dlZDogcG9saWN5LmRlZmF1bHRFZmZlY3QgPT09ICdhbGxvdycsXG4gICAgICAgICAgcmVhc29uOiBgRGVmYXVsdCBlZmZlY3Q6ICR7cG9saWN5LmRlZmF1bHRFZmZlY3R9YCxcbiAgICAgICAgICBldmFsdWF0aW9uVGltZTogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2cgYXVkaXQgZW50cnlcbiAgICBpZiAodGhpcy5hdWRpdEVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9nQXVkaXQocmVxdWVzdCwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IG5hbWVzcGFjZSBhY2Nlc3MgdG8gYSBwcmluY2lwYWxcbiAgICovXG4gIGFzeW5jIGdyYW50QWNjZXNzKGdyYW50OiBOYW1lc3BhY2VHcmFudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ3JhbnRLZXkoZ3JhbnQubmFtZXNwYWNlLCBncmFudC5wcmluY2lwYWwpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAuLi5ncmFudCxcbiAgICAgIGdyYW50ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIFxuICAgIGF3YWl0IHRoaXMuZGIucHV0KGtleSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZGF0YSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZva2UgbmFtZXNwYWNlIGFjY2VzcyBmcm9tIGEgcHJpbmNpcGFsXG4gICAqL1xuICBhc3luYyByZXZva2VBY2Nlc3MobmFtZXNwYWNlOiBzdHJpbmcsIHByaW5jaXBhbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ncmFudEtleShuYW1lc3BhY2UsIHByaW5jaXBhbCk7XG4gICAgYXdhaXQgdGhpcy5kYi5kZWxldGUoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwcmluY2lwYWwgaGFzIHBlcm1pc3Npb25cbiAgICovXG4gIGFzeW5jIGhhc1Blcm1pc3Npb24oXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbjogTmFtZXNwYWNlUGVybWlzc2lvblxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmdyYW50S2V5KG5hbWVzcGFjZSwgcHJpbmNpcGFsKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYW50ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSBhcyBOYW1lc3BhY2VHcmFudDtcblxuICAgIC8vIENoZWNrIGV4cGlyYXRpb25cbiAgICBpZiAoZ3JhbnQuZXhwaXJlc0F0ICYmIERhdGUubm93KCkgPiBncmFudC5leHBpcmVzQXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBZG1pbiBoYXMgYWxsIHBlcm1pc3Npb25zXG4gICAgaWYgKGdyYW50LnBlcm1pc3Npb25zLmluY2x1ZGVzKCdhZG1pbicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhbnQucGVybWlzc2lvbnMuaW5jbHVkZXMocGVybWlzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgZ3JhbnRzIGZvciBhIG5hbWVzcGFjZVxuICAgKi9cbiAgYXN5bmMgbGlzdEdyYW50cyhuYW1lc3BhY2U6IHN0cmluZyk6IFByb21pc2U8TmFtZXNwYWNlR3JhbnRbXT4ge1xuICAgIGNvbnN0IGdyYW50czogTmFtZXNwYWNlR3JhbnRbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfZ3JhbnQ6JHtuYW1lc3BhY2V9OmApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgW18sIHZhbHVlQnVmZmVyXSBvZiB0aGlzLmRiLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICBjb25zdCBncmFudCA9IEpTT04ucGFyc2UodmFsdWVCdWZmZXIudG9TdHJpbmcoKSkgYXMgTmFtZXNwYWNlR3JhbnQ7XG4gICAgICAgIGdyYW50cy5wdXNoKGdyYW50KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWdub3JlIHNjYW4gZXJyb3JzXG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXVkaXQgbG9nIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGdldEF1ZGl0TG9nKG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHByaW5jaXBhbD86IHN0cmluZztcbiAgICBhY3Rpb24/OiBzdHJpbmc7XG4gICAgc2luY2U/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPFBvbGljeUF1ZGl0RW50cnlbXT4ge1xuICAgIGNvbnN0IGVudHJpZXM6IFBvbGljeUF1ZGl0RW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKCdfYXVkaXQ6Jyk7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCB8fCAxMDA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVCdWZmZXJdIG9mIHRoaXMuZGIuc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gSlNPTi5wYXJzZSh2YWx1ZUJ1ZmZlci50b1N0cmluZygpKSBhcyBQb2xpY3lBdWRpdEVudHJ5O1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwbHkgZmlsdGVyc1xuICAgICAgICBpZiAob3B0aW9ucz8ubmFtZXNwYWNlICYmICFlbnRyeS5yZXNvdXJjZS5pbmNsdWRlcyhvcHRpb25zLm5hbWVzcGFjZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbmNpcGFsICYmIGVudHJ5LnByaW5jaXBhbCAhPT0gb3B0aW9ucy5wcmluY2lwYWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uYWN0aW9uICYmIGVudHJ5LmFjdGlvbiAhPT0gb3B0aW9ucy5hY3Rpb24pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8uc2luY2UgJiYgZW50cnkudGltZXN0YW1wIDwgb3B0aW9ucy5zaW5jZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+PSBsaW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBzY2FuIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNvcnQgYnkgdGltZXN0YW1wIGRlc2NlbmRpbmdcbiAgICByZXR1cm4gZW50cmllcy5zb3J0KChhLCBiKSA9PiBiLnRpbWVzdGFtcCAtIGEudGltZXN0YW1wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBwb2xpY3kgY2FjaGVcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBtZXRob2RzXG5cbiAgcHJpdmF0ZSBwb2xpY3lLZXkobmFtZXNwYWNlOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oYG5hbWVzcGFjZToke25hbWVzcGFjZX1gKV0pO1xuICB9XG5cbiAgcHJpdmF0ZSBncmFudEtleShuYW1lc3BhY2U6IHN0cmluZywgcHJpbmNpcGFsOiBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShgX2dyYW50OiR7bmFtZXNwYWNlfToke3ByaW5jaXBhbH1gKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE5hbWVzcGFjZShyZXNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gRXh0cmFjdCBuYW1lc3BhY2UgZnJvbSByZXNvdXJjZSBsaWtlIFwibmFtZXNwYWNlOnRlbmFudF8xMjM6Y29sbGVjdGlvbjpkb2NzXCJcbiAgICBjb25zdCBwYXJ0cyA9IHJlc291cmNlLnNwbGl0KCc6Jyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyICYmIHBhcnRzWzBdID09PSAnbmFtZXNwYWNlJykge1xuICAgICAgcmV0dXJuIHBhcnRzWzFdO1xuICAgIH1cbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBmcm9tIGNvbGxlY3Rpb24gZm9ybWF0IFwiY29sbGVjdGlvbjp0ZW5hbnRfMTIzOmRvY3NcIlxuICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMiAmJiBwYXJ0c1swXSA9PT0gJ2NvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcGFydHNbMV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaGVzUnVsZShyZXF1ZXN0OiBQb2xpY3lSZXF1ZXN0LCBydWxlOiBQb2xpY3lSdWxlKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgcHJpbmNpcGFsc1xuICAgIGlmICghdGhpcy5tYXRjaGVzUGF0dGVybnMocmVxdWVzdC5wcmluY2lwYWwsIHJ1bGUucHJpbmNpcGFscykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayByZXNvdXJjZXNcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1BhdHRlcm5zKHJlcXVlc3QucmVzb3VyY2UsIHJ1bGUucmVzb3VyY2VzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFjdGlvbnNcbiAgICBpZiAoIXRoaXMubWF0Y2hlc1BhdHRlcm5zKHJlcXVlc3QuYWN0aW9uLCBydWxlLmFjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgY29uZGl0aW9uc1xuICAgIGlmIChydWxlLmNvbmRpdGlvbnMgJiYgcnVsZS5jb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIHJ1bGUuY29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuZXZhbHVhdGVDb25kaXRpb24oY29uZGl0aW9uLCByZXF1ZXN0LmNvbnRleHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIG1hdGNoZXNQYXR0ZXJucyh2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGlmICh0aGlzLm1hdGNoZXNQYXR0ZXJuKHZhbHVlLCBwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXRjaGVzUGF0dGVybih2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAocGF0dGVybiA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHBhdHRlcm4uZW5kc1dpdGgoJyonKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnN0YXJ0c1dpdGgocGF0dGVybi5zbGljZSgwLCAtMSkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAocGF0dGVybi5zdGFydHNXaXRoKCcqJykpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5lbmRzV2l0aChwYXR0ZXJuLnNsaWNlKDEpKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHZhbHVlID09PSBwYXR0ZXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbmRpdGlvbihjb25kaXRpb246IFBvbGljeUNvbmRpdGlvbiwgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IGNvbnRleHRbY29uZGl0aW9uLmtleV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbmRpdGlvbi5vcGVyYXRvcikge1xuICAgICAgY2FzZSAnZXF1YWxzJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBjb25kaXRpb24udmFsdWU7XG4gICAgICBjYXNlICdub3RfZXF1YWxzJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBjb25kaXRpb24udmFsdWU7XG4gICAgICBjYXNlICdjb250YWlucyc6XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpLmluY2x1ZGVzKFN0cmluZyhjb25kaXRpb24udmFsdWUpKTtcbiAgICAgIGNhc2UgJ3N0YXJ0c193aXRoJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkuc3RhcnRzV2l0aChTdHJpbmcoY29uZGl0aW9uLnZhbHVlKSk7XG4gICAgICBjYXNlICdlbmRzX3dpdGgnOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5lbmRzV2l0aChTdHJpbmcoY29uZGl0aW9uLnZhbHVlKSk7XG4gICAgICBjYXNlICdpbic6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi52YWx1ZSkgJiYgY29uZGl0aW9uLnZhbHVlLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgIGNhc2UgJ25vdF9pbic6XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbmRpdGlvbi52YWx1ZSkgJiYgIWNvbmRpdGlvbi52YWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICBjYXNlICdiZXR3ZWVuJzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uLnZhbHVlKSAmJiBjb25kaXRpb24udmFsdWUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IGNvbmRpdGlvbi52YWx1ZVswXSAmJiB2YWx1ZSA8PSBjb25kaXRpb24udmFsdWVbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9nQXVkaXQocmVxdWVzdDogUG9saWN5UmVxdWVzdCwgcmVzdWx0OiBQb2xpY3lFdmFsdWF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnk6IFBvbGljeUF1ZGl0RW50cnkgPSB7XG4gICAgICBpZDogYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHByaW5jaXBhbDogcmVxdWVzdC5wcmluY2lwYWwsXG4gICAgICBhY3Rpb246IHJlcXVlc3QuYWN0aW9uLFxuICAgICAgcmVzb3VyY2U6IHJlcXVlc3QucmVzb3VyY2UsXG4gICAgICBkZWNpc2lvbjogcmVzdWx0LmFsbG93ZWQgPyAnYWxsb3cnIDogJ2RlbnknLFxuICAgICAgbWF0Y2hlZFJ1bGU6IHJlc3VsdC5tYXRjaGVkUnVsZT8uaWQsXG4gICAgICByZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICBjb250ZXh0OiByZXF1ZXN0LmNvbnRleHQsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5mcm9tKGBfYXVkaXQ6JHtlbnRyeS50aW1lc3RhbXB9OiR7ZW50cnkuaWR9YCk7XG4gICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShlbnRyeSkpKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Policy Service Types
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for policy-based access control and namespace governance.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcG9saWN5L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb2xpY3kgU2VydmljZSBUeXBlc1xuICogXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBwb2xpY3ktYmFzZWQgYWNjZXNzIGNvbnRyb2wgYW5kIG5hbWVzcGFjZSBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKlxuICogUG9saWN5IHJ1bGUgZm9yIGFjY2VzcyBjb250cm9sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UnVsZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGVmZmVjdDogJ2FsbG93JyB8ICdkZW55JztcbiAgcHJpbmNpcGFsczogc3RyaW5nW107XG4gIHJlc291cmNlczogc3RyaW5nW107XG4gIGFjdGlvbnM6IHN0cmluZ1tdO1xuICBjb25kaXRpb25zPzogUG9saWN5Q29uZGl0aW9uW107XG4gIHByaW9yaXR5PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBvbGljeSBjb25kaXRpb24gZm9yIGNvbnRleHR1YWwgYWNjZXNzIGNvbnRyb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lDb25kaXRpb24ge1xuICB0eXBlOiAndGltZScgfCAnaXAnIHwgJ21ldGFkYXRhJyB8ICdjdXN0b20nO1xuICBvcGVyYXRvcjogJ2VxdWFscycgfCAnbm90X2VxdWFscycgfCAnY29udGFpbnMnIHwgJ3N0YXJ0c193aXRoJyB8ICdlbmRzX3dpdGgnIHwgJ2luJyB8ICdub3RfaW4nIHwgJ2JldHdlZW4nO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZXZhbHVhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lFdmFsdWF0aW9uIHtcbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgbWF0Y2hlZFJ1bGU/OiBQb2xpY3lSdWxlO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGV2YWx1YXRpb25UaW1lOiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBvbGljeSBmb3IgbXVsdGktdGVuYW50IGlzb2xhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVzcGFjZVBvbGljeSB7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBydWxlczogUG9saWN5UnVsZVtdO1xuICBkZWZhdWx0RWZmZWN0OiAnYWxsb3cnIHwgJ2RlbnknO1xuICBpbmhlcml0RnJvbT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIEFjY2VzcyBncmFudCBmb3IgbmFtZXNwYWNlLWxldmVsIHBlcm1pc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZXNwYWNlR3JhbnQge1xuICBuYW1lc3BhY2U6IHN0cmluZztcbiAgcHJpbmNpcGFsOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBOYW1lc3BhY2VQZXJtaXNzaW9uW107XG4gIGV4cGlyZXNBdD86IG51bWJlcjtcbiAgZ3JhbnRlZEJ5Pzogc3RyaW5nO1xuICBncmFudGVkQXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIHBlcm1pc3Npb24gbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIE5hbWVzcGFjZVBlcm1pc3Npb24gPSBcbiAgfCAncmVhZCdcbiAgfCAnd3JpdGUnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAnYWRtaW4nXG4gIHwgJ2NyZWF0ZV9jb2xsZWN0aW9uJ1xuICB8ICdkZWxldGVfY29sbGVjdGlvbidcbiAgfCAnc2VhcmNoJ1xuICB8ICdtYW5hZ2VfcG9saWN5JztcblxuLyoqXG4gKiBQb2xpY3kgYWN0aW9uIHR5cGVzXG4gKi9cbmV4cG9ydCB0eXBlIFBvbGljeUFjdGlvbiA9XG4gIHwgJ2RiOnJlYWQnXG4gIHwgJ2RiOndyaXRlJ1xuICB8ICdkYjpkZWxldGUnXG4gIHwgJ2RiOnNjYW4nXG4gIHwgJ25hbWVzcGFjZTpjcmVhdGUnXG4gIHwgJ25hbWVzcGFjZTpkZWxldGUnXG4gIHwgJ25hbWVzcGFjZTpsaXN0J1xuICB8ICdjb2xsZWN0aW9uOmNyZWF0ZSdcbiAgfCAnY29sbGVjdGlvbjpkZWxldGUnXG4gIHwgJ2NvbGxlY3Rpb246aW5zZXJ0J1xuICB8ICdjb2xsZWN0aW9uOnNlYXJjaCdcbiAgfCAnY29sbGVjdGlvbjp1cGRhdGUnXG4gIHwgJ3BvbGljeTpyZWFkJ1xuICB8ICdwb2xpY3k6d3JpdGUnXG4gIHwgJ2FkbWluOionO1xuXG4vKipcbiAqIFBvbGljeSByZXF1ZXN0IGZvciBldmFsdWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5UmVxdWVzdCB7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbi8qKlxuICogUG9saWN5IHNldCBjb250YWluaW5nIG11bHRpcGxlIHBvbGljaWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9saWN5U2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcG9saWNpZXM6IE5hbWVzcGFjZVBvbGljeVtdO1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogbnVtYmVyO1xuICB1cGRhdGVkQXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBdWRpdCBsb2cgZW50cnkgZm9yIHBvbGljeSBkZWNpc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lBdWRpdEVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHByaW5jaXBhbDogc3RyaW5nO1xuICBhY3Rpb246IHN0cmluZztcbiAgcmVzb3VyY2U6IHN0cmluZztcbiAgZGVjaXNpb246ICdhbGxvdycgfCAnZGVueSc7XG4gIG1hdGNoZWRSdWxlPzogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuIl19
|