@sapl/nestjs 1.0.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/LICENSE +190 -0
- package/README.md +539 -0
- package/dist/EnforceDropWhileDenied.d.ts +4 -0
- package/dist/EnforceDropWhileDenied.d.ts.map +1 -0
- package/dist/EnforceDropWhileDenied.js +8 -0
- package/dist/EnforceDropWhileDenied.js.map +1 -0
- package/dist/EnforceDropWhileDeniedAspect.d.ts +15 -0
- package/dist/EnforceDropWhileDeniedAspect.d.ts.map +1 -0
- package/dist/EnforceDropWhileDeniedAspect.js +108 -0
- package/dist/EnforceDropWhileDeniedAspect.js.map +1 -0
- package/dist/EnforceOptions.d.ts +42 -0
- package/dist/EnforceOptions.d.ts.map +1 -0
- package/dist/EnforceOptions.js +3 -0
- package/dist/EnforceOptions.js.map +1 -0
- package/dist/EnforceRecoverableIfDenied.d.ts +4 -0
- package/dist/EnforceRecoverableIfDenied.d.ts.map +1 -0
- package/dist/EnforceRecoverableIfDenied.js +8 -0
- package/dist/EnforceRecoverableIfDenied.js.map +1 -0
- package/dist/EnforceRecoverableIfDeniedAspect.d.ts +15 -0
- package/dist/EnforceRecoverableIfDeniedAspect.d.ts.map +1 -0
- package/dist/EnforceRecoverableIfDeniedAspect.js +134 -0
- package/dist/EnforceRecoverableIfDeniedAspect.js.map +1 -0
- package/dist/EnforceTillDenied.d.ts +4 -0
- package/dist/EnforceTillDenied.d.ts.map +1 -0
- package/dist/EnforceTillDenied.js +8 -0
- package/dist/EnforceTillDenied.js.map +1 -0
- package/dist/EnforceTillDeniedAspect.d.ts +15 -0
- package/dist/EnforceTillDeniedAspect.d.ts.map +1 -0
- package/dist/EnforceTillDeniedAspect.js +119 -0
- package/dist/EnforceTillDeniedAspect.js.map +1 -0
- package/dist/MethodInvocationContext.d.ts +8 -0
- package/dist/MethodInvocationContext.d.ts.map +1 -0
- package/dist/MethodInvocationContext.js +3 -0
- package/dist/MethodInvocationContext.js.map +1 -0
- package/dist/PostEnforce.d.ts +23 -0
- package/dist/PostEnforce.d.ts.map +1 -0
- package/dist/PostEnforce.js +27 -0
- package/dist/PostEnforce.js.map +1 -0
- package/dist/PostEnforceAspect.d.ts +15 -0
- package/dist/PostEnforceAspect.d.ts.map +1 -0
- package/dist/PostEnforceAspect.js +81 -0
- package/dist/PostEnforceAspect.js.map +1 -0
- package/dist/PreEnforce.d.ts +21 -0
- package/dist/PreEnforce.d.ts.map +1 -0
- package/dist/PreEnforce.js +25 -0
- package/dist/PreEnforce.js.map +1 -0
- package/dist/PreEnforceAspect.d.ts +15 -0
- package/dist/PreEnforceAspect.d.ts.map +1 -0
- package/dist/PreEnforceAspect.js +107 -0
- package/dist/PreEnforceAspect.js.map +1 -0
- package/dist/StreamingEnforceOptions.d.ts +22 -0
- package/dist/StreamingEnforceOptions.d.ts.map +1 -0
- package/dist/StreamingEnforceOptions.js +3 -0
- package/dist/StreamingEnforceOptions.js.map +1 -0
- package/dist/SubscriptionBuilder.d.ts +17 -0
- package/dist/SubscriptionBuilder.d.ts.map +1 -0
- package/dist/SubscriptionBuilder.js +86 -0
- package/dist/SubscriptionBuilder.js.map +1 -0
- package/dist/SubscriptionContext.d.ts +48 -0
- package/dist/SubscriptionContext.d.ts.map +1 -0
- package/dist/SubscriptionContext.js +3 -0
- package/dist/SubscriptionContext.js.map +1 -0
- package/dist/constraints/ConstraintEnforcementService.d.ts +22 -0
- package/dist/constraints/ConstraintEnforcementService.d.ts.map +1 -0
- package/dist/constraints/ConstraintEnforcementService.js +209 -0
- package/dist/constraints/ConstraintEnforcementService.js.map +1 -0
- package/dist/constraints/ConstraintHandlerBundle.d.ts +19 -0
- package/dist/constraints/ConstraintHandlerBundle.d.ts.map +1 -0
- package/dist/constraints/ConstraintHandlerBundle.js +47 -0
- package/dist/constraints/ConstraintHandlerBundle.js.map +1 -0
- package/dist/constraints/SaplConstraintHandler.d.ts +3 -0
- package/dist/constraints/SaplConstraintHandler.d.ts.map +1 -0
- package/dist/constraints/SaplConstraintHandler.js +6 -0
- package/dist/constraints/SaplConstraintHandler.js.map +1 -0
- package/dist/constraints/StreamingConstraintHandlerBundle.d.ts +18 -0
- package/dist/constraints/StreamingConstraintHandlerBundle.d.ts.map +1 -0
- package/dist/constraints/StreamingConstraintHandlerBundle.js +34 -0
- package/dist/constraints/StreamingConstraintHandlerBundle.js.map +1 -0
- package/dist/constraints/api/index.d.ts +35 -0
- package/dist/constraints/api/index.d.ts.map +1 -0
- package/dist/constraints/api/index.js +11 -0
- package/dist/constraints/api/index.js.map +1 -0
- package/dist/constraints/providers/ContentFilter.d.ts +3 -0
- package/dist/constraints/providers/ContentFilter.d.ts.map +1 -0
- package/dist/constraints/providers/ContentFilter.js +224 -0
- package/dist/constraints/providers/ContentFilter.js.map +1 -0
- package/dist/constraints/providers/ContentFilterPredicateProvider.d.ts +6 -0
- package/dist/constraints/providers/ContentFilterPredicateProvider.d.ts.map +1 -0
- package/dist/constraints/providers/ContentFilterPredicateProvider.js +26 -0
- package/dist/constraints/providers/ContentFilterPredicateProvider.js.map +1 -0
- package/dist/constraints/providers/ContentFilteringProvider.d.ts +7 -0
- package/dist/constraints/providers/ContentFilteringProvider.d.ts.map +1 -0
- package/dist/constraints/providers/ContentFilteringProvider.js +29 -0
- package/dist/constraints/providers/ContentFilteringProvider.js.map +1 -0
- package/dist/enforcement-utils.d.ts +7 -0
- package/dist/enforcement-utils.d.ts.map +1 -0
- package/dist/enforcement-utils.js +28 -0
- package/dist/enforcement-utils.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/pdp.service.d.ts +17 -0
- package/dist/pdp.service.d.ts.map +1 -0
- package/dist/pdp.service.js +296 -0
- package/dist/pdp.service.js.map +1 -0
- package/dist/sapl.constants.d.ts +2 -0
- package/dist/sapl.constants.d.ts.map +1 -0
- package/dist/sapl.constants.js +5 -0
- package/dist/sapl.constants.js.map +1 -0
- package/dist/sapl.interfaces.d.ts +25 -0
- package/dist/sapl.interfaces.d.ts.map +1 -0
- package/dist/sapl.interfaces.js +3 -0
- package/dist/sapl.interfaces.js.map +1 -0
- package/dist/sapl.module.d.ts +7 -0
- package/dist/sapl.module.d.ts.map +1 -0
- package/dist/sapl.module.js +91 -0
- package/dist/sapl.module.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var PdpService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.PdpService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const rxjs_1 = require("rxjs");
|
|
19
|
+
const sapl_constants_1 = require("./sapl.constants");
|
|
20
|
+
const DEEP_EQUAL_MAX_DEPTH = 20;
|
|
21
|
+
function deepEqual(a, b, depth = 0) {
|
|
22
|
+
if (depth > DEEP_EQUAL_MAX_DEPTH)
|
|
23
|
+
return false;
|
|
24
|
+
if (a === b)
|
|
25
|
+
return true;
|
|
26
|
+
if (a == null || b == null)
|
|
27
|
+
return a === b;
|
|
28
|
+
if (typeof a !== typeof b)
|
|
29
|
+
return false;
|
|
30
|
+
if (typeof a !== 'object')
|
|
31
|
+
return false;
|
|
32
|
+
if (Array.isArray(a)) {
|
|
33
|
+
return Array.isArray(b) && a.length === b.length && a.every((v, i) => deepEqual(v, b[i], depth + 1));
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(b))
|
|
36
|
+
return false;
|
|
37
|
+
const keysA = Object.keys(a);
|
|
38
|
+
const keysB = Object.keys(b);
|
|
39
|
+
if (keysA.length !== keysB.length)
|
|
40
|
+
return false;
|
|
41
|
+
return keysA.every((k) => Object.prototype.hasOwnProperty.call(b, k) && deepEqual(a[k], b[k], depth + 1));
|
|
42
|
+
}
|
|
43
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
44
|
+
const MAX_BUFFER_SIZE = 1_048_576; // 1 MB
|
|
45
|
+
const MAX_LOG_BODY_LENGTH = 500;
|
|
46
|
+
const DEFAULT_RETRY_BASE_DELAY_MS = 1000;
|
|
47
|
+
const DEFAULT_RETRY_MAX_DELAY_MS = 30000;
|
|
48
|
+
const RETRY_ESCALATION_THRESHOLD = 5;
|
|
49
|
+
const VALID_DECISIONS = new Set(['PERMIT', 'DENY', 'INDETERMINATE', 'NOT_APPLICABLE']);
|
|
50
|
+
function validateDecision(raw, logger) {
|
|
51
|
+
if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
52
|
+
logger.warn('PDP response is not an object, returning INDETERMINATE');
|
|
53
|
+
return { decision: 'INDETERMINATE' };
|
|
54
|
+
}
|
|
55
|
+
const obj = raw;
|
|
56
|
+
if (typeof obj.decision !== 'string' || !VALID_DECISIONS.has(obj.decision)) {
|
|
57
|
+
logger.warn(`PDP response has invalid decision field: ${JSON.stringify(obj.decision)}, returning INDETERMINATE`);
|
|
58
|
+
return { decision: 'INDETERMINATE' };
|
|
59
|
+
}
|
|
60
|
+
const result = { decision: obj.decision };
|
|
61
|
+
if (Array.isArray(obj.obligations))
|
|
62
|
+
result.obligations = obj.obligations;
|
|
63
|
+
if (Array.isArray(obj.advice))
|
|
64
|
+
result.advice = obj.advice;
|
|
65
|
+
if (obj.resource !== undefined)
|
|
66
|
+
result.resource = obj.resource;
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
let PdpService = PdpService_1 = class PdpService {
|
|
70
|
+
constructor(options) {
|
|
71
|
+
this.options = options;
|
|
72
|
+
this.logger = new common_1.Logger(PdpService_1.name);
|
|
73
|
+
const parsedUrl = new URL(this.options.baseUrl);
|
|
74
|
+
if (parsedUrl.protocol === 'http:') {
|
|
75
|
+
if (!this.options.allowInsecureConnections) {
|
|
76
|
+
throw new Error(`PDP base URL uses HTTP (${this.options.baseUrl}). ` +
|
|
77
|
+
'SAPL PDP communication carries authorization decisions and potentially sensitive information. ' +
|
|
78
|
+
'Use HTTPS or set allowInsecureConnections: true to accept the risk.');
|
|
79
|
+
}
|
|
80
|
+
this.logger.warn('PDP connection uses unencrypted HTTP. Authorization decisions and potentially sensitive ' +
|
|
81
|
+
'information are transmitted in plaintext. Do not use HTTP in production.');
|
|
82
|
+
}
|
|
83
|
+
this.decideOnceUrl = new URL('/api/pdp/decide-once', this.options.baseUrl).toString();
|
|
84
|
+
this.decideUrl = new URL('/api/pdp/decide', this.options.baseUrl).toString();
|
|
85
|
+
this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
86
|
+
this.retryBaseDelay = options.streamingRetryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY_MS;
|
|
87
|
+
this.retryMaxDelay = options.streamingRetryMaxDelay ?? DEFAULT_RETRY_MAX_DELAY_MS;
|
|
88
|
+
this.maxRetries = options.streamingMaxRetries ?? Infinity;
|
|
89
|
+
this.logger.log(`PDP configured at ${this.options.baseUrl}`);
|
|
90
|
+
}
|
|
91
|
+
async decideOnce(subscription) {
|
|
92
|
+
const { secrets, ...safeForLog } = subscription;
|
|
93
|
+
const body = JSON.stringify(subscription);
|
|
94
|
+
this.logger.debug(`Requesting decision: ${JSON.stringify(safeForLog)}`);
|
|
95
|
+
const controller = new AbortController();
|
|
96
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
97
|
+
try {
|
|
98
|
+
const headers = {
|
|
99
|
+
'Content-Type': 'application/json',
|
|
100
|
+
};
|
|
101
|
+
if (this.options.token) {
|
|
102
|
+
headers['Authorization'] = `Bearer ${this.options.token}`;
|
|
103
|
+
}
|
|
104
|
+
const response = await fetch(this.decideOnceUrl, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
headers,
|
|
107
|
+
body,
|
|
108
|
+
signal: controller.signal,
|
|
109
|
+
});
|
|
110
|
+
if (!response.ok) {
|
|
111
|
+
let responseBody = '';
|
|
112
|
+
try {
|
|
113
|
+
responseBody = await response.text();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
/* ignore unreadable body */
|
|
117
|
+
}
|
|
118
|
+
this.logger.error(`PDP returned HTTP ${response.status} (${response.statusText}) ` +
|
|
119
|
+
`for ${this.decideOnceUrl}` +
|
|
120
|
+
(responseBody
|
|
121
|
+
? ` -- body: ${responseBody.length > MAX_LOG_BODY_LENGTH ? responseBody.substring(0, MAX_LOG_BODY_LENGTH) + '...' : responseBody}`
|
|
122
|
+
: ''));
|
|
123
|
+
return { decision: 'INDETERMINATE' };
|
|
124
|
+
}
|
|
125
|
+
const decision = await response.json();
|
|
126
|
+
this.logger.debug(`Decision: ${JSON.stringify(decision)}`);
|
|
127
|
+
return validateDecision(decision, this.logger);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
131
|
+
this.logger.error(`PDP request to ${this.decideOnceUrl} timed out after ${this.timeoutMs}ms`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
135
|
+
this.logger.error(`PDP request to ${this.decideOnceUrl} failed: ${msg}`);
|
|
136
|
+
}
|
|
137
|
+
return { decision: 'INDETERMINATE' };
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
clearTimeout(timeout);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
decide(subscription) {
|
|
144
|
+
const { secrets, ...safeForLog } = subscription;
|
|
145
|
+
const body = JSON.stringify(subscription);
|
|
146
|
+
this.logger.debug(`Streaming subscription: ${JSON.stringify(safeForLog)}`);
|
|
147
|
+
const singleAttempt$ = new rxjs_1.Observable((subscriber) => {
|
|
148
|
+
const controller = new AbortController();
|
|
149
|
+
let reader = null;
|
|
150
|
+
const connectTimeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
151
|
+
const headers = {
|
|
152
|
+
'Content-Type': 'application/json',
|
|
153
|
+
'Accept': 'application/x-ndjson',
|
|
154
|
+
};
|
|
155
|
+
if (this.options.token) {
|
|
156
|
+
headers['Authorization'] = `Bearer ${this.options.token}`;
|
|
157
|
+
}
|
|
158
|
+
fetch(this.decideUrl, {
|
|
159
|
+
method: 'POST',
|
|
160
|
+
headers,
|
|
161
|
+
body,
|
|
162
|
+
signal: controller.signal,
|
|
163
|
+
}).then(async (response) => {
|
|
164
|
+
clearTimeout(connectTimeout);
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
let responseBody = '';
|
|
167
|
+
try {
|
|
168
|
+
responseBody = await response.text();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* ignore unreadable body */
|
|
172
|
+
}
|
|
173
|
+
this.logger.error(`PDP returned HTTP ${response.status} (${response.statusText}) ` +
|
|
174
|
+
`for ${this.decideUrl}` +
|
|
175
|
+
(responseBody
|
|
176
|
+
? ` -- body: ${responseBody.length > MAX_LOG_BODY_LENGTH ? responseBody.substring(0, MAX_LOG_BODY_LENGTH) + '...' : responseBody}`
|
|
177
|
+
: ''));
|
|
178
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
179
|
+
subscriber.error(new Error(`PDP returned HTTP ${response.status}`));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (!response.body) {
|
|
183
|
+
this.logger.error('PDP streaming response has no body');
|
|
184
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
185
|
+
subscriber.error(new Error('PDP streaming response has no body'));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
reader = response.body.getReader();
|
|
189
|
+
const decoder = new TextDecoder();
|
|
190
|
+
let buffer = '';
|
|
191
|
+
try {
|
|
192
|
+
while (true) {
|
|
193
|
+
const { done, value } = await reader.read();
|
|
194
|
+
if (done)
|
|
195
|
+
break;
|
|
196
|
+
buffer += decoder.decode(value, { stream: true });
|
|
197
|
+
if (buffer.length > MAX_BUFFER_SIZE) {
|
|
198
|
+
this.logger.error(`PDP streaming buffer exceeded ${MAX_BUFFER_SIZE} bytes. ` +
|
|
199
|
+
'Aborting connection to prevent memory exhaustion.');
|
|
200
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
201
|
+
subscriber.error(new Error('PDP streaming buffer overflow'));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const lines = buffer.split('\n');
|
|
205
|
+
buffer = lines.pop() ?? '';
|
|
206
|
+
for (const line of lines) {
|
|
207
|
+
const trimmed = line.trim();
|
|
208
|
+
if (trimmed.startsWith(':') || trimmed === '')
|
|
209
|
+
continue;
|
|
210
|
+
const data = trimmed.startsWith('data:')
|
|
211
|
+
? trimmed.slice(5).trim()
|
|
212
|
+
: trimmed;
|
|
213
|
+
if (data === '')
|
|
214
|
+
continue;
|
|
215
|
+
try {
|
|
216
|
+
const decision = JSON.parse(data);
|
|
217
|
+
this.logger.debug(`Streaming decision: ${JSON.stringify(decision)}`);
|
|
218
|
+
subscriber.next(validateDecision(decision, this.logger));
|
|
219
|
+
}
|
|
220
|
+
catch (parseError) {
|
|
221
|
+
this.logger.warn(`Failed to parse streaming data: ${data}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
const trailing = buffer.trim();
|
|
226
|
+
if (trailing !== '') {
|
|
227
|
+
const data = trailing.startsWith('data:')
|
|
228
|
+
? trailing.slice(5).trim()
|
|
229
|
+
: trailing;
|
|
230
|
+
if (data !== '') {
|
|
231
|
+
try {
|
|
232
|
+
const decision = JSON.parse(data);
|
|
233
|
+
subscriber.next(validateDecision(decision, this.logger));
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
/* ignore trailing partial data */
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// PDP closed the stream -- fail closed and let retry reconnect
|
|
241
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
242
|
+
subscriber.error(new Error('PDP decision stream ended unexpectedly'));
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (controller.signal.aborted)
|
|
246
|
+
return;
|
|
247
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
248
|
+
this.logger.error(`PDP streaming read failed: ${msg}`);
|
|
249
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
250
|
+
subscriber.error(error);
|
|
251
|
+
}
|
|
252
|
+
}).catch((error) => {
|
|
253
|
+
clearTimeout(connectTimeout);
|
|
254
|
+
if (controller.signal.aborted)
|
|
255
|
+
return;
|
|
256
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
257
|
+
this.logger.error(`PDP streaming connection to ${this.decideUrl} timed out after ${this.timeoutMs}ms`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
261
|
+
this.logger.error(`PDP streaming request to ${this.decideUrl} failed: ${msg}`);
|
|
262
|
+
}
|
|
263
|
+
subscriber.next({ decision: 'INDETERMINATE' });
|
|
264
|
+
subscriber.error(error);
|
|
265
|
+
});
|
|
266
|
+
return () => {
|
|
267
|
+
clearTimeout(connectTimeout);
|
|
268
|
+
reader?.cancel().catch(() => { });
|
|
269
|
+
controller.abort();
|
|
270
|
+
};
|
|
271
|
+
});
|
|
272
|
+
return singleAttempt$.pipe((0, rxjs_1.retry)({
|
|
273
|
+
count: this.maxRetries,
|
|
274
|
+
delay: (_error, retryCount) => {
|
|
275
|
+
const baseDelay = Math.min(this.retryBaseDelay * Math.pow(2, retryCount - 1), this.retryMaxDelay);
|
|
276
|
+
const delay = Math.round(baseDelay * (0.5 + Math.random() * 0.5));
|
|
277
|
+
const message = `PDP streaming connection lost, reconnecting in ${delay}ms` +
|
|
278
|
+
` (attempt ${retryCount}${this.maxRetries === Infinity ? '' : `/${this.maxRetries}`})`;
|
|
279
|
+
if (retryCount >= RETRY_ESCALATION_THRESHOLD) {
|
|
280
|
+
this.logger.error(message);
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
this.logger.warn(message);
|
|
284
|
+
}
|
|
285
|
+
return (0, rxjs_1.timer)(delay);
|
|
286
|
+
},
|
|
287
|
+
}), (0, rxjs_1.distinctUntilChanged)(deepEqual));
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
exports.PdpService = PdpService;
|
|
291
|
+
exports.PdpService = PdpService = PdpService_1 = __decorate([
|
|
292
|
+
(0, common_1.Injectable)(),
|
|
293
|
+
__param(0, (0, common_1.Inject)(sapl_constants_1.SAPL_MODULE_OPTIONS)),
|
|
294
|
+
__metadata("design:paramtypes", [Object])
|
|
295
|
+
], PdpService);
|
|
296
|
+
//# sourceMappingURL=pdp.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdp.service.js","sourceRoot":"","sources":["../lib/pdp.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.constants.d.ts","sourceRoot":"","sources":["../lib/sapl.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.constants.js","sourceRoot":"","sources":["../lib/sapl.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ModuleMetadata } from '@nestjs/common';
|
|
2
|
+
import { ClsModuleOptions } from 'nestjs-cls';
|
|
3
|
+
export interface SaplModuleOptions {
|
|
4
|
+
/** Base URL of the SAPL PDP server (e.g., 'https://localhost:8443') */
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** Bearer token for PDP REST API authentication (optional for noauth mode) */
|
|
7
|
+
token?: string;
|
|
8
|
+
/** Timeout in milliseconds for PDP HTTP requests (default: 5000) */
|
|
9
|
+
timeout?: number;
|
|
10
|
+
/** Maximum reconnection attempts for streaming subscriptions (default: unlimited) */
|
|
11
|
+
streamingMaxRetries?: number;
|
|
12
|
+
/** Initial delay in ms before first streaming reconnection (default: 1000) */
|
|
13
|
+
streamingRetryBaseDelay?: number;
|
|
14
|
+
/** Maximum backoff delay in ms for streaming reconnection (default: 30000) */
|
|
15
|
+
streamingRetryMaxDelay?: number;
|
|
16
|
+
/** Set to true to allow unencrypted HTTP connections to the PDP. NOT RECOMMENDED for production. */
|
|
17
|
+
allowInsecureConnections?: boolean;
|
|
18
|
+
/** Options merged into ClsModule.forRoot(). Default: { global: true, middleware: { mount: true } } */
|
|
19
|
+
cls?: Partial<ClsModuleOptions>;
|
|
20
|
+
}
|
|
21
|
+
export interface SaplModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
22
|
+
useFactory: (...args: any[]) => Promise<SaplModuleOptions> | SaplModuleOptions;
|
|
23
|
+
inject?: any[];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=sapl.interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.interfaces.d.ts","sourceRoot":"","sources":["../lib/sapl.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,8EAA8E;IAC9E,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oGAAoG;IACpG,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,sGAAsG;IACtG,GAAG,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IACvC,UAAU,EAAE,CACV,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IACpD,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.interfaces.js","sourceRoot":"","sources":["../lib/sapl.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { SaplModuleOptions, SaplModuleAsyncOptions } from './sapl.interfaces';
|
|
3
|
+
export declare class SaplModule {
|
|
4
|
+
static forRoot(options: SaplModuleOptions): DynamicModule;
|
|
5
|
+
static forRootAsync(asyncOptions: SaplModuleAsyncOptions): DynamicModule;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=sapl.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.module.d.ts","sourceRoot":"","sources":["../lib/sapl.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAuB9E,qBACa,UAAU;IACrB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa;IA0BzD,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,sBAAsB,GAAG,aAAa;CAwBzE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var SaplModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SaplModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const core_1 = require("@nestjs/core");
|
|
13
|
+
const nestjs_aop_1 = require("@toss/nestjs-aop");
|
|
14
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
15
|
+
const sapl_constants_1 = require("./sapl.constants");
|
|
16
|
+
const pdp_service_1 = require("./pdp.service");
|
|
17
|
+
const PreEnforceAspect_1 = require("./PreEnforceAspect");
|
|
18
|
+
const PostEnforceAspect_1 = require("./PostEnforceAspect");
|
|
19
|
+
const EnforceTillDeniedAspect_1 = require("./EnforceTillDeniedAspect");
|
|
20
|
+
const EnforceDropWhileDeniedAspect_1 = require("./EnforceDropWhileDeniedAspect");
|
|
21
|
+
const EnforceRecoverableIfDeniedAspect_1 = require("./EnforceRecoverableIfDeniedAspect");
|
|
22
|
+
const ConstraintEnforcementService_1 = require("./constraints/ConstraintEnforcementService");
|
|
23
|
+
const ContentFilteringProvider_1 = require("./constraints/providers/ContentFilteringProvider");
|
|
24
|
+
const ContentFilterPredicateProvider_1 = require("./constraints/providers/ContentFilterPredicateProvider");
|
|
25
|
+
const SHARED_PROVIDERS = [
|
|
26
|
+
pdp_service_1.PdpService,
|
|
27
|
+
ConstraintEnforcementService_1.ConstraintEnforcementService,
|
|
28
|
+
ContentFilteringProvider_1.ContentFilteringProvider,
|
|
29
|
+
ContentFilterPredicateProvider_1.ContentFilterPredicateProvider,
|
|
30
|
+
PreEnforceAspect_1.PreEnforceAspect,
|
|
31
|
+
PostEnforceAspect_1.PostEnforceAspect,
|
|
32
|
+
EnforceTillDeniedAspect_1.EnforceTillDeniedAspect,
|
|
33
|
+
EnforceDropWhileDeniedAspect_1.EnforceDropWhileDeniedAspect,
|
|
34
|
+
EnforceRecoverableIfDeniedAspect_1.EnforceRecoverableIfDeniedAspect,
|
|
35
|
+
];
|
|
36
|
+
let SaplModule = SaplModule_1 = class SaplModule {
|
|
37
|
+
static forRoot(options) {
|
|
38
|
+
return {
|
|
39
|
+
module: SaplModule_1,
|
|
40
|
+
imports: [
|
|
41
|
+
core_1.DiscoveryModule,
|
|
42
|
+
nestjs_aop_1.AopModule,
|
|
43
|
+
nestjs_cls_1.ClsModule.forRoot({
|
|
44
|
+
global: true,
|
|
45
|
+
middleware: { mount: true },
|
|
46
|
+
...options.cls,
|
|
47
|
+
}),
|
|
48
|
+
],
|
|
49
|
+
providers: [
|
|
50
|
+
{ provide: sapl_constants_1.SAPL_MODULE_OPTIONS, useValue: options },
|
|
51
|
+
...SHARED_PROVIDERS,
|
|
52
|
+
],
|
|
53
|
+
exports: [pdp_service_1.PdpService, ConstraintEnforcementService_1.ConstraintEnforcementService],
|
|
54
|
+
global: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Custom CLS options (like forRoot's `cls` field) are not supported here
|
|
58
|
+
// because module imports are resolved before the async factory runs. The
|
|
59
|
+
// factory result (SaplModuleOptions) is not available at import time, so
|
|
60
|
+
// ClsModule always gets the defaults. Users who need custom CLS setup can
|
|
61
|
+
// inject ClsService in a guard or interceptor instead.
|
|
62
|
+
static forRootAsync(asyncOptions) {
|
|
63
|
+
return {
|
|
64
|
+
module: SaplModule_1,
|
|
65
|
+
imports: [
|
|
66
|
+
core_1.DiscoveryModule,
|
|
67
|
+
nestjs_aop_1.AopModule,
|
|
68
|
+
nestjs_cls_1.ClsModule.forRoot({
|
|
69
|
+
global: true,
|
|
70
|
+
middleware: { mount: true },
|
|
71
|
+
}),
|
|
72
|
+
...(asyncOptions.imports ?? []),
|
|
73
|
+
],
|
|
74
|
+
providers: [
|
|
75
|
+
{
|
|
76
|
+
provide: sapl_constants_1.SAPL_MODULE_OPTIONS,
|
|
77
|
+
useFactory: asyncOptions.useFactory,
|
|
78
|
+
inject: asyncOptions.inject ?? [],
|
|
79
|
+
},
|
|
80
|
+
...SHARED_PROVIDERS,
|
|
81
|
+
],
|
|
82
|
+
exports: [pdp_service_1.PdpService, ConstraintEnforcementService_1.ConstraintEnforcementService],
|
|
83
|
+
global: true,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
exports.SaplModule = SaplModule;
|
|
88
|
+
exports.SaplModule = SaplModule = SaplModule_1 = __decorate([
|
|
89
|
+
(0, common_1.Module)({})
|
|
90
|
+
], SaplModule);
|
|
91
|
+
//# sourceMappingURL=sapl.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sapl.module.js","sourceRoot":"","sources":["../lib/sapl.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,uCAA+C;AAC/C,iDAA6C;AAC7C,2CAAuC;AACvC,qDAAuD;AAEvD,+CAA2C;AAC3C,yDAAsD;AACtD,2DAAwD;AACxD,uEAAoE;AACpE,iFAA8E;AAC9E,yFAAsF;AACtF,6FAA0F;AAC1F,+FAA4F;AAC5F,2GAAwG;AAExG,MAAM,gBAAgB,GAAG;IACvB,wBAAU;IACV,2DAA4B;IAC5B,mDAAwB;IACxB,+DAA8B;IAC9B,mCAAgB;IAChB,qCAAiB;IACjB,iDAAuB;IACvB,2DAA4B;IAC5B,mEAAgC;CACjC,CAAC;AAGK,IAAM,UAAU,kBAAhB,MAAM,UAAU;IACrB,MAAM,CAAC,OAAO,CAAC,OAA0B;QACvC,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE;gBACP,sBAAe;gBACf,sBAAS;gBACT,sBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;oBAC3B,GAAG,OAAO,CAAC,GAAG;iBACf,CAAC;aACH;YACD,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,oCAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBACnD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,CAAC,wBAAU,EAAE,2DAA4B,CAAC;YACnD,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,0EAA0E;IAC1E,uDAAuD;IACvD,MAAM,CAAC,YAAY,CAAC,YAAoC;QACtD,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE;gBACP,sBAAe;gBACf,sBAAS;gBACT,sBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,IAAI;oBACZ,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBAC5B,CAAC;gBACF,GAAG,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;aAChC;YACD,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,oCAAmB;oBAC5B,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE;iBAClC;gBACD,GAAG,gBAAgB;aACpB;YACD,OAAO,EAAE,CAAC,wBAAU,EAAE,2DAA4B,CAAC;YACnD,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF,CAAA;AAnDY,gCAAU;qBAAV,UAAU;IADtB,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,UAAU,CAmDtB"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type Decision = 'PERMIT' | 'DENY' | 'INDETERMINATE' | 'NOT_APPLICABLE';
|
|
2
|
+
/**
|
|
3
|
+
* A PDP authorization decision with optional constraints.
|
|
4
|
+
*
|
|
5
|
+
* The `decision` field contains the access control verdict.
|
|
6
|
+
* `obligations` must be handled (unhandled obligations deny access).
|
|
7
|
+
* `advice` should be handled but failures are non-fatal.
|
|
8
|
+
* `resource` replaces the handler's return value when present.
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthorizationDecision {
|
|
11
|
+
decision: Decision;
|
|
12
|
+
obligations?: unknown[];
|
|
13
|
+
advice?: unknown[];
|
|
14
|
+
resource?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* An authorization subscription sent to the PDP.
|
|
18
|
+
*
|
|
19
|
+
* All fields are optional at the type level because sensible defaults
|
|
20
|
+
* are derived at runtime from the HTTP request context.
|
|
21
|
+
*/
|
|
22
|
+
export interface AuthorizationSubscription {
|
|
23
|
+
subject?: unknown;
|
|
24
|
+
action?: unknown;
|
|
25
|
+
resource?: unknown;
|
|
26
|
+
environment?: unknown;
|
|
27
|
+
secrets?: unknown;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sapl/nestjs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "SAPL authorization for NestJS - ABAC with constraint handling",
|
|
5
|
+
"author": "Dominic Heutelbeck",
|
|
6
|
+
"keywords": ["sapl", "nestjs", "abac", "authorization", "policy", "access-control", "streaming"],
|
|
7
|
+
"homepage": "https://github.com/heutelbeck/sapl-nestjs#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/heutelbeck/sapl-nestjs/issues"
|
|
10
|
+
},
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc -p tsconfig.build.json",
|
|
26
|
+
"test": "jest",
|
|
27
|
+
"test:cov": "jest --coverage",
|
|
28
|
+
"prepublishOnly": "npm run build"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@nestjs/common": "^11.0.0",
|
|
32
|
+
"@nestjs/core": "^11.0.0",
|
|
33
|
+
"@toss/nestjs-aop": "^2.1.0",
|
|
34
|
+
"nestjs-cls": "^6.0.0",
|
|
35
|
+
"reflect-metadata": "^0.2.0",
|
|
36
|
+
"rxjs": "^7.0.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@nestjs/common": "^11.0.0",
|
|
40
|
+
"@nestjs/core": "^11.0.0",
|
|
41
|
+
"@nestjs/testing": "^11.0.0",
|
|
42
|
+
"@toss/nestjs-aop": "^2.1.7",
|
|
43
|
+
"@types/jest": "^29.0.0",
|
|
44
|
+
"@types/node": "^22.0.0",
|
|
45
|
+
"jest": "^29.0.0",
|
|
46
|
+
"nestjs-cls": "^6.2.0",
|
|
47
|
+
"reflect-metadata": "^0.2.0",
|
|
48
|
+
"rxjs": "^7.8.0",
|
|
49
|
+
"ts-jest": "^29.2.5",
|
|
50
|
+
"ts-node": "^10.9.2",
|
|
51
|
+
"typescript": "^5.7.0"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=20.0.0"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"license": "Apache-2.0",
|
|
60
|
+
"repository": {
|
|
61
|
+
"type": "git",
|
|
62
|
+
"url": "https://github.com/heutelbeck/sapl-nestjs"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"safe-regex2": "^5.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|