@peac/policy-kit 0.10.8 → 0.10.10
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 +1 -1
- package/dist/index.cjs +1356 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +1270 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +19 -6
- package/dist/compiler.js +0 -304
- package/dist/compiler.js.map +0 -1
- package/dist/enforce.js +0 -309
- package/dist/enforce.js.map +0 -1
- package/dist/enforcement-profiles.js +0 -293
- package/dist/enforcement-profiles.js.map +0 -1
- package/dist/evaluate.js +0 -258
- package/dist/evaluate.js.map +0 -1
- package/dist/generated/profiles.js +0 -212
- package/dist/generated/profiles.js.map +0 -1
- package/dist/index.js +0 -120
- package/dist/index.js.map +0 -1
- package/dist/loader.js +0 -245
- package/dist/loader.js.map +0 -1
- package/dist/profiles.js +0 -368
- package/dist/profiles.js.map +0 -1
- package/dist/types.js +0 -348
- package/dist/types.js.map +0 -1
package/dist/compiler.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../src/compiler.ts"],"names":[],"mappings":"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"}
|
package/dist/enforce.js
DELETED
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Decision Enforcement
|
|
4
|
-
*
|
|
5
|
-
* Helpers for enforcing policy decisions with explicit semantics.
|
|
6
|
-
*
|
|
7
|
-
* The `review` decision means "challenge unless requirement is satisfied".
|
|
8
|
-
* By default, this means a valid receipt is required.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { evaluate, enforceDecision } from '@peac/policy-kit';
|
|
13
|
-
*
|
|
14
|
-
* const result = evaluate(policy, context);
|
|
15
|
-
* const enforcement = enforceDecision(result.decision, {
|
|
16
|
-
* receiptVerified: hasValidReceipt,
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* if (enforcement.allowed) {
|
|
20
|
-
* // proceed
|
|
21
|
-
* } else {
|
|
22
|
-
* // return enforcement.statusCode (402 or 403)
|
|
23
|
-
* }
|
|
24
|
-
* ```
|
|
25
|
-
*
|
|
26
|
-
* @packageDocumentation
|
|
27
|
-
*/
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.enforceDecision = enforceDecision;
|
|
30
|
-
exports.requiresChallenge = requiresChallenge;
|
|
31
|
-
exports.getChallengeHeader = getChallengeHeader;
|
|
32
|
-
exports.enforceForHttp = enforceForHttp;
|
|
33
|
-
exports.enforcePurposeDecision = enforcePurposeDecision;
|
|
34
|
-
exports.getPurposeDecisionStatusCode = getPurposeDecisionStatusCode;
|
|
35
|
-
/**
|
|
36
|
-
* Enforce a policy decision with explicit semantics.
|
|
37
|
-
*
|
|
38
|
-
* Decision meanings:
|
|
39
|
-
* - `allow`: Access is permitted (200)
|
|
40
|
-
* - `deny`: Access is forbidden (403)
|
|
41
|
-
* - `review`: Challenge unless requirement is satisfied (default: receipt required)
|
|
42
|
-
*
|
|
43
|
-
* The `review` decision is a "soft deny" that becomes "allow" when the
|
|
44
|
-
* requirement (typically a valid receipt) is satisfied.
|
|
45
|
-
*
|
|
46
|
-
* @param decision - The policy decision to enforce
|
|
47
|
-
* @param context - Enforcement context with requirement flags
|
|
48
|
-
* @returns Enforcement result with allowed status and HTTP code
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* // Allow decision
|
|
53
|
-
* enforceDecision('allow', {});
|
|
54
|
-
* // { allowed: true, statusCode: 200, challenge: false }
|
|
55
|
-
*
|
|
56
|
-
* // Deny decision
|
|
57
|
-
* enforceDecision('deny', {});
|
|
58
|
-
* // { allowed: false, statusCode: 403, challenge: false }
|
|
59
|
-
*
|
|
60
|
-
* // Review without receipt
|
|
61
|
-
* enforceDecision('review', { receiptVerified: false });
|
|
62
|
-
* // { allowed: false, statusCode: 402, challenge: true }
|
|
63
|
-
*
|
|
64
|
-
* // Review with valid receipt
|
|
65
|
-
* enforceDecision('review', { receiptVerified: true });
|
|
66
|
-
* // { allowed: true, statusCode: 200, challenge: false }
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
function enforceDecision(decision, context = {}) {
|
|
70
|
-
switch (decision) {
|
|
71
|
-
case 'allow':
|
|
72
|
-
return {
|
|
73
|
-
allowed: true,
|
|
74
|
-
statusCode: 200,
|
|
75
|
-
reason: 'Access allowed by policy',
|
|
76
|
-
challenge: false,
|
|
77
|
-
decision,
|
|
78
|
-
};
|
|
79
|
-
case 'deny':
|
|
80
|
-
return {
|
|
81
|
-
allowed: false,
|
|
82
|
-
statusCode: 403,
|
|
83
|
-
reason: 'Access denied by policy',
|
|
84
|
-
challenge: false,
|
|
85
|
-
decision,
|
|
86
|
-
};
|
|
87
|
-
case 'review': {
|
|
88
|
-
// review = "challenge unless receiptVerified === true"
|
|
89
|
-
// This is the only requirement in v0.9.23
|
|
90
|
-
if (context.receiptVerified === true) {
|
|
91
|
-
return {
|
|
92
|
-
allowed: true,
|
|
93
|
-
statusCode: 200,
|
|
94
|
-
reason: 'Access allowed - receipt verified',
|
|
95
|
-
challenge: false,
|
|
96
|
-
decision,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
// No valid receipt - return 402 Payment Required with challenge
|
|
100
|
-
return {
|
|
101
|
-
allowed: false,
|
|
102
|
-
statusCode: 402,
|
|
103
|
-
reason: 'Access requires verification - present valid receipt',
|
|
104
|
-
challenge: true,
|
|
105
|
-
decision,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
default: {
|
|
109
|
-
// Exhaustive check - should never reach here
|
|
110
|
-
const _exhaustive = decision;
|
|
111
|
-
return {
|
|
112
|
-
allowed: false,
|
|
113
|
-
statusCode: 403,
|
|
114
|
-
reason: `Unknown decision: ${_exhaustive}`,
|
|
115
|
-
challenge: false,
|
|
116
|
-
decision,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* Check if an enforcement result requires a challenge response
|
|
123
|
-
*
|
|
124
|
-
* @param result - Enforcement result
|
|
125
|
-
* @returns true if a challenge should be issued
|
|
126
|
-
*/
|
|
127
|
-
function requiresChallenge(result) {
|
|
128
|
-
return result.challenge;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Get the WWW-Authenticate header value for a challenge
|
|
132
|
-
*
|
|
133
|
-
* @param result - Enforcement result requiring challenge
|
|
134
|
-
* @returns WWW-Authenticate header value or undefined if no challenge needed
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* ```typescript
|
|
138
|
-
* const result = enforceDecision('review', { receiptVerified: false });
|
|
139
|
-
* const header = getChallengeHeader(result);
|
|
140
|
-
* // 'PEAC realm="receipt", error="receipt_required"'
|
|
141
|
-
* ```
|
|
142
|
-
*/
|
|
143
|
-
function getChallengeHeader(result) {
|
|
144
|
-
if (!result.challenge) {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
return 'PEAC realm="receipt", error="receipt_required"';
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Convenience function to enforce and get HTTP response details
|
|
151
|
-
*
|
|
152
|
-
* @param decision - Policy decision
|
|
153
|
-
* @param context - Enforcement context
|
|
154
|
-
* @returns Object with status code and headers for HTTP response
|
|
155
|
-
*
|
|
156
|
-
* @example
|
|
157
|
-
* ```typescript
|
|
158
|
-
* const { status, headers, allowed } = enforceForHttp('review', {
|
|
159
|
-
* receiptVerified: false,
|
|
160
|
-
* });
|
|
161
|
-
* // { status: 402, headers: { 'WWW-Authenticate': '...' }, allowed: false }
|
|
162
|
-
* ```
|
|
163
|
-
*/
|
|
164
|
-
function enforceForHttp(decision, context = {}) {
|
|
165
|
-
const result = enforceDecision(decision, context);
|
|
166
|
-
const headers = {};
|
|
167
|
-
if (result.challenge) {
|
|
168
|
-
const challengeHeader = getChallengeHeader(result);
|
|
169
|
-
if (challengeHeader) {
|
|
170
|
-
headers['WWW-Authenticate'] = challengeHeader;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
return {
|
|
174
|
-
status: result.statusCode,
|
|
175
|
-
headers,
|
|
176
|
-
allowed: result.allowed,
|
|
177
|
-
reason: result.reason,
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Enforce a policy decision for purpose-based access control.
|
|
182
|
-
*
|
|
183
|
-
* This function is specifically for purpose enforcement and NEVER returns 402.
|
|
184
|
-
* 402 is reserved for payment/receipt challenges (use `enforceDecision` for that).
|
|
185
|
-
*
|
|
186
|
-
* Status code semantics:
|
|
187
|
-
* - 200: Purpose allowed
|
|
188
|
-
* - 400: Invalid purpose token (grammar violation or explicit "undeclared")
|
|
189
|
-
* - 403: Purpose denied by policy
|
|
190
|
-
*
|
|
191
|
-
* @param decision - The policy decision to enforce
|
|
192
|
-
* @param context - Purpose enforcement context
|
|
193
|
-
* @returns Purpose enforcement result with HTTP status code
|
|
194
|
-
*
|
|
195
|
-
* @example
|
|
196
|
-
* ```typescript
|
|
197
|
-
* import { enforcePurposeDecision } from '@peac/policy-kit';
|
|
198
|
-
*
|
|
199
|
-
* // Valid purpose, allowed
|
|
200
|
-
* enforcePurposeDecision('allow', { purposeValid: true });
|
|
201
|
-
* // { allowed: true, statusCode: 200, decision: 'allow' }
|
|
202
|
-
*
|
|
203
|
-
* // Valid purpose, denied by policy
|
|
204
|
-
* enforcePurposeDecision('deny', { purposeValid: true });
|
|
205
|
-
* // { allowed: false, statusCode: 403, decision: 'deny' }
|
|
206
|
-
*
|
|
207
|
-
* // Invalid purpose token
|
|
208
|
-
* enforcePurposeDecision('allow', { purposeValid: false, invalidTokens: ['train-'] });
|
|
209
|
-
* // { allowed: false, statusCode: 400, reason: 'Invalid purpose token(s): train-' }
|
|
210
|
-
*
|
|
211
|
-
* // Explicit "undeclared" in request (forbidden)
|
|
212
|
-
* enforcePurposeDecision('allow', { purposeValid: true, explicitUndeclared: true });
|
|
213
|
-
* // { allowed: false, statusCode: 400, reason: '"undeclared" is not a valid purpose token' }
|
|
214
|
-
* ```
|
|
215
|
-
*/
|
|
216
|
-
function enforcePurposeDecision(decision, context) {
|
|
217
|
-
// Check for explicit "undeclared" first (always 400)
|
|
218
|
-
if (context.explicitUndeclared) {
|
|
219
|
-
return {
|
|
220
|
-
allowed: false,
|
|
221
|
-
statusCode: 400,
|
|
222
|
-
reason: '"undeclared" is not a valid purpose token - it is internal-only',
|
|
223
|
-
decision,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
// Check for invalid purpose tokens (400)
|
|
227
|
-
if (!context.purposeValid) {
|
|
228
|
-
const tokenList = context.invalidTokens?.join(', ') || 'unknown';
|
|
229
|
-
return {
|
|
230
|
-
allowed: false,
|
|
231
|
-
statusCode: 400,
|
|
232
|
-
reason: `Invalid purpose token(s): ${tokenList}`,
|
|
233
|
-
decision,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
// Valid purpose - apply policy decision
|
|
237
|
-
switch (decision) {
|
|
238
|
-
case 'allow':
|
|
239
|
-
return {
|
|
240
|
-
allowed: true,
|
|
241
|
-
statusCode: 200,
|
|
242
|
-
reason: 'Purpose allowed by policy',
|
|
243
|
-
decision,
|
|
244
|
-
};
|
|
245
|
-
case 'deny':
|
|
246
|
-
return {
|
|
247
|
-
allowed: false,
|
|
248
|
-
statusCode: 403,
|
|
249
|
-
reason: 'Purpose denied by policy',
|
|
250
|
-
decision,
|
|
251
|
-
};
|
|
252
|
-
case 'review':
|
|
253
|
-
// For purpose enforcement, 'review' is treated as 'deny' (403)
|
|
254
|
-
// 402 is reserved for payment/receipt challenges
|
|
255
|
-
return {
|
|
256
|
-
allowed: false,
|
|
257
|
-
statusCode: 403,
|
|
258
|
-
reason: 'Purpose requires review - treated as denied for purpose enforcement',
|
|
259
|
-
decision,
|
|
260
|
-
};
|
|
261
|
-
default: {
|
|
262
|
-
const _exhaustive = decision;
|
|
263
|
-
return {
|
|
264
|
-
allowed: false,
|
|
265
|
-
statusCode: 403,
|
|
266
|
-
reason: `Unknown decision: ${_exhaustive}`,
|
|
267
|
-
decision,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Get HTTP status code for a purpose decision (low-level helper).
|
|
274
|
-
*
|
|
275
|
-
* This helper maps policy decisions to HTTP status codes for purpose enforcement.
|
|
276
|
-
* It NEVER returns 402 - that is reserved for payment/receipt challenges.
|
|
277
|
-
*
|
|
278
|
-
* For evaluating purpose with profiles, use getPurposeStatusCode from enforcement-profiles
|
|
279
|
-
* which takes a PurposeEvaluationResult directly.
|
|
280
|
-
*
|
|
281
|
-
* @param decision - Policy decision
|
|
282
|
-
* @param purposeValid - Whether the purpose token(s) passed validation
|
|
283
|
-
* @returns HTTP status code (200, 400, or 403)
|
|
284
|
-
*
|
|
285
|
-
* @example
|
|
286
|
-
* ```typescript
|
|
287
|
-
* getPurposeDecisionStatusCode('allow', true); // 200
|
|
288
|
-
* getPurposeDecisionStatusCode('deny', true); // 403
|
|
289
|
-
* getPurposeDecisionStatusCode('review', true); // 403 (NOT 402!)
|
|
290
|
-
* getPurposeDecisionStatusCode('allow', false); // 400 (invalid token)
|
|
291
|
-
* ```
|
|
292
|
-
*/
|
|
293
|
-
function getPurposeDecisionStatusCode(decision, purposeValid) {
|
|
294
|
-
// Invalid purpose always returns 400
|
|
295
|
-
if (!purposeValid) {
|
|
296
|
-
return 400;
|
|
297
|
-
}
|
|
298
|
-
// Map decision to status code (never 402)
|
|
299
|
-
switch (decision) {
|
|
300
|
-
case 'allow':
|
|
301
|
-
return 200;
|
|
302
|
-
case 'deny':
|
|
303
|
-
case 'review':
|
|
304
|
-
return 403;
|
|
305
|
-
default:
|
|
306
|
-
return 403;
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=enforce.js.map
|
package/dist/enforce.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce.js","sourceRoot":"","sources":["../src/enforce.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Enforcement Profiles (v0.9.24+)
|
|
4
|
-
*
|
|
5
|
-
* Pre-defined profiles for handling undeclared and unknown purposes.
|
|
6
|
-
* These are distinct from use-case profiles (api-provider, news-media, etc.).
|
|
7
|
-
*
|
|
8
|
-
* Three canonical profiles:
|
|
9
|
-
* - `strict`: Deny undeclared purposes (regulated data, private APIs)
|
|
10
|
-
* - `balanced`: Review + constraints for undeclared (general web, DEFAULT)
|
|
11
|
-
* - `open`: Allow undeclared purposes with recording (public content, research)
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* import {
|
|
16
|
-
* getEnforcementProfile,
|
|
17
|
-
* evaluateWithProfile,
|
|
18
|
-
* ENFORCEMENT_PROFILES,
|
|
19
|
-
* } from '@peac/policy-kit';
|
|
20
|
-
*
|
|
21
|
-
* // Get the balanced profile (default)
|
|
22
|
-
* const profile = getEnforcementProfile('balanced');
|
|
23
|
-
*
|
|
24
|
-
* // Evaluate with enforcement profile
|
|
25
|
-
* const result = evaluateWithProfile(policy, context, 'balanced');
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* @packageDocumentation
|
|
29
|
-
*/
|
|
30
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.ENFORCEMENT_PROFILE_IDS = exports.DEFAULT_ENFORCEMENT_PROFILE = exports.ENFORCEMENT_PROFILES = exports.OPEN_PROFILE = exports.BALANCED_PROFILE = exports.STRICT_PROFILE = void 0;
|
|
32
|
-
exports.getEnforcementProfile = getEnforcementProfile;
|
|
33
|
-
exports.isEnforcementProfileId = isEnforcementProfileId;
|
|
34
|
-
exports.getDefaultEnforcementProfile = getDefaultEnforcementProfile;
|
|
35
|
-
exports.evaluatePurpose = evaluatePurpose;
|
|
36
|
-
exports.getPurposeStatusCode = getPurposeStatusCode;
|
|
37
|
-
exports.getRetryAfter = getRetryAfter;
|
|
38
|
-
// -----------------------------------------------------------------------------
|
|
39
|
-
// Canonical Enforcement Profiles
|
|
40
|
-
// -----------------------------------------------------------------------------
|
|
41
|
-
/**
|
|
42
|
-
* Strict enforcement profile.
|
|
43
|
-
*
|
|
44
|
-
* Use for: Regulated data, private APIs, compliance-critical resources.
|
|
45
|
-
* - Undeclared purposes: DENY
|
|
46
|
-
* - Unknown purpose tokens: DENY
|
|
47
|
-
* - Receipts: Required
|
|
48
|
-
*/
|
|
49
|
-
exports.STRICT_PROFILE = {
|
|
50
|
-
id: 'strict',
|
|
51
|
-
name: 'Strict',
|
|
52
|
-
description: 'Deny undeclared purposes. Use for regulated data, private APIs, or compliance-critical resources.',
|
|
53
|
-
undeclared_decision: 'deny',
|
|
54
|
-
unknown_decision: 'deny',
|
|
55
|
-
purpose_reason: 'denied',
|
|
56
|
-
receipts: 'required',
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Balanced enforcement profile (DEFAULT).
|
|
60
|
-
*
|
|
61
|
-
* Use for: General web, gradual compliance, typical publisher use case.
|
|
62
|
-
* - Undeclared purposes: REVIEW + constraints
|
|
63
|
-
* - Unknown purpose tokens: REVIEW + preserve
|
|
64
|
-
* - Receipts: Optional (encouraged)
|
|
65
|
-
*/
|
|
66
|
-
exports.BALANCED_PROFILE = {
|
|
67
|
-
id: 'balanced',
|
|
68
|
-
name: 'Balanced',
|
|
69
|
-
description: 'Review undeclared purposes with rate limits. Default for general web publishers.',
|
|
70
|
-
undeclared_decision: 'review',
|
|
71
|
-
unknown_decision: 'review',
|
|
72
|
-
purpose_reason: 'undeclared_default',
|
|
73
|
-
default_constraints: {
|
|
74
|
-
rate_limit: {
|
|
75
|
-
window_s: 3600, // 1 hour
|
|
76
|
-
max: 100,
|
|
77
|
-
retry_after_s: 60,
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
receipts: 'optional',
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Open enforcement profile.
|
|
84
|
-
*
|
|
85
|
-
* Use for: Public content, research data, open access resources.
|
|
86
|
-
* - Undeclared purposes: ALLOW (recorded)
|
|
87
|
-
* - Unknown purpose tokens: ALLOW (preserved)
|
|
88
|
-
* - Receipts: Optional (for attribution)
|
|
89
|
-
*/
|
|
90
|
-
exports.OPEN_PROFILE = {
|
|
91
|
-
id: 'open',
|
|
92
|
-
name: 'Open',
|
|
93
|
-
description: 'Allow undeclared purposes with recording. Use for public content and research data.',
|
|
94
|
-
undeclared_decision: 'allow',
|
|
95
|
-
unknown_decision: 'allow',
|
|
96
|
-
purpose_reason: 'allowed',
|
|
97
|
-
receipts: 'optional',
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* All canonical enforcement profiles indexed by ID.
|
|
101
|
-
*/
|
|
102
|
-
exports.ENFORCEMENT_PROFILES = {
|
|
103
|
-
strict: exports.STRICT_PROFILE,
|
|
104
|
-
balanced: exports.BALANCED_PROFILE,
|
|
105
|
-
open: exports.OPEN_PROFILE,
|
|
106
|
-
};
|
|
107
|
-
/**
|
|
108
|
-
* Default enforcement profile ID.
|
|
109
|
-
*
|
|
110
|
-
* `balanced` is the default to encourage adoption while maintaining some protection.
|
|
111
|
-
*/
|
|
112
|
-
exports.DEFAULT_ENFORCEMENT_PROFILE = 'balanced';
|
|
113
|
-
/**
|
|
114
|
-
* All enforcement profile IDs.
|
|
115
|
-
*/
|
|
116
|
-
exports.ENFORCEMENT_PROFILE_IDS = [
|
|
117
|
-
'strict',
|
|
118
|
-
'balanced',
|
|
119
|
-
'open',
|
|
120
|
-
];
|
|
121
|
-
// -----------------------------------------------------------------------------
|
|
122
|
-
// Profile Lookup Functions
|
|
123
|
-
// -----------------------------------------------------------------------------
|
|
124
|
-
/**
|
|
125
|
-
* Get an enforcement profile by ID.
|
|
126
|
-
*
|
|
127
|
-
* @param id - Profile ID
|
|
128
|
-
* @returns Enforcement profile
|
|
129
|
-
* @throws Error if profile ID is invalid
|
|
130
|
-
*
|
|
131
|
-
* @example
|
|
132
|
-
* ```typescript
|
|
133
|
-
* const profile = getEnforcementProfile('balanced');
|
|
134
|
-
* console.log(profile.undeclared_decision); // 'review'
|
|
135
|
-
* ```
|
|
136
|
-
*/
|
|
137
|
-
function getEnforcementProfile(id) {
|
|
138
|
-
const profile = exports.ENFORCEMENT_PROFILES[id];
|
|
139
|
-
if (!profile) {
|
|
140
|
-
throw new Error(`Invalid enforcement profile ID: ${id}`);
|
|
141
|
-
}
|
|
142
|
-
return profile;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Check if a string is a valid enforcement profile ID.
|
|
146
|
-
*
|
|
147
|
-
* @param id - String to check
|
|
148
|
-
* @returns true if valid profile ID
|
|
149
|
-
*/
|
|
150
|
-
function isEnforcementProfileId(id) {
|
|
151
|
-
return exports.ENFORCEMENT_PROFILE_IDS.includes(id);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Get the default enforcement profile.
|
|
155
|
-
*
|
|
156
|
-
* @returns The balanced profile (default)
|
|
157
|
-
*/
|
|
158
|
-
function getDefaultEnforcementProfile() {
|
|
159
|
-
return exports.ENFORCEMENT_PROFILES[exports.DEFAULT_ENFORCEMENT_PROFILE];
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Canonical purpose tokens that PEAC defines semantics for.
|
|
163
|
-
*/
|
|
164
|
-
const CANONICAL_PURPOSES = new Set(['train', 'search', 'user_action', 'inference', 'index']);
|
|
165
|
-
/**
|
|
166
|
-
* Legacy purpose tokens that map to canonical purposes.
|
|
167
|
-
*/
|
|
168
|
-
const LEGACY_PURPOSE_MAP = {
|
|
169
|
-
crawl: 'index',
|
|
170
|
-
ai_input: 'inference',
|
|
171
|
-
ai_index: 'index',
|
|
172
|
-
};
|
|
173
|
-
/**
|
|
174
|
-
* Check if a purpose token is canonical.
|
|
175
|
-
*/
|
|
176
|
-
function isCanonicalPurpose(token) {
|
|
177
|
-
return CANONICAL_PURPOSES.has(token);
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Check if a purpose token is a known legacy token.
|
|
181
|
-
*/
|
|
182
|
-
function isLegacyPurpose(token) {
|
|
183
|
-
return token in LEGACY_PURPOSE_MAP;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Evaluate declared purposes against an enforcement profile.
|
|
187
|
-
*
|
|
188
|
-
* This determines what decision to make based on the declared purposes
|
|
189
|
-
* and the enforcement profile's rules for undeclared/unknown purposes.
|
|
190
|
-
*
|
|
191
|
-
* @param declaredPurposes - Array of purpose tokens from PEAC-Purpose header
|
|
192
|
-
* @param profileId - Enforcement profile ID (default: 'balanced')
|
|
193
|
-
* @returns Purpose evaluation result
|
|
194
|
-
*
|
|
195
|
-
* @example
|
|
196
|
-
* ```typescript
|
|
197
|
-
* // No purposes declared - uses undeclared_decision from profile
|
|
198
|
-
* const result1 = evaluatePurpose([], 'strict');
|
|
199
|
-
* // { decision: 'deny', purpose_reason: 'denied', ... }
|
|
200
|
-
*
|
|
201
|
-
* // Known purpose declared
|
|
202
|
-
* const result2 = evaluatePurpose(['train'], 'balanced');
|
|
203
|
-
* // { decision: 'allow', purpose_enforced: 'train', ... }
|
|
204
|
-
*
|
|
205
|
-
* // Unknown purpose token
|
|
206
|
-
* const result3 = evaluatePurpose(['vendor:custom'], 'balanced');
|
|
207
|
-
* // { decision: 'review', has_unknown_tokens: true, unknown_tokens: ['vendor:custom'], ... }
|
|
208
|
-
* ```
|
|
209
|
-
*/
|
|
210
|
-
function evaluatePurpose(declaredPurposes, profileId = exports.DEFAULT_ENFORCEMENT_PROFILE) {
|
|
211
|
-
const profile = getEnforcementProfile(profileId);
|
|
212
|
-
// No purposes declared - apply undeclared handling
|
|
213
|
-
if (declaredPurposes.length === 0) {
|
|
214
|
-
return {
|
|
215
|
-
decision: profile.undeclared_decision,
|
|
216
|
-
purpose_reason: 'undeclared_default',
|
|
217
|
-
constraints: profile.undeclared_decision === 'review' ? profile.default_constraints : undefined,
|
|
218
|
-
purpose_declared: false,
|
|
219
|
-
has_unknown_tokens: false,
|
|
220
|
-
unknown_tokens: [],
|
|
221
|
-
profile_id: profileId,
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
// Categorize declared purposes
|
|
225
|
-
const canonicalTokens = [];
|
|
226
|
-
const legacyTokens = [];
|
|
227
|
-
const unknownTokens = [];
|
|
228
|
-
for (const token of declaredPurposes) {
|
|
229
|
-
if (isCanonicalPurpose(token)) {
|
|
230
|
-
canonicalTokens.push(token);
|
|
231
|
-
}
|
|
232
|
-
else if (isLegacyPurpose(token)) {
|
|
233
|
-
legacyTokens.push(token);
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
unknownTokens.push(token);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
// If we have unknown tokens, apply unknown_decision
|
|
240
|
-
if (unknownTokens.length > 0 && canonicalTokens.length === 0 && legacyTokens.length === 0) {
|
|
241
|
-
// Only unknown tokens - apply unknown handling
|
|
242
|
-
return {
|
|
243
|
-
decision: profile.unknown_decision,
|
|
244
|
-
purpose_reason: 'unknown_preserved',
|
|
245
|
-
constraints: profile.unknown_decision === 'review' ? profile.default_constraints : undefined,
|
|
246
|
-
purpose_declared: true,
|
|
247
|
-
has_unknown_tokens: true,
|
|
248
|
-
unknown_tokens: unknownTokens,
|
|
249
|
-
profile_id: profileId,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
// We have at least some known tokens - allow with the first canonical/legacy purpose
|
|
253
|
-
const enforcedPurpose = canonicalTokens[0] ?? LEGACY_PURPOSE_MAP[legacyTokens[0]];
|
|
254
|
-
return {
|
|
255
|
-
decision: 'allow',
|
|
256
|
-
purpose_enforced: enforcedPurpose,
|
|
257
|
-
purpose_reason: unknownTokens.length > 0 ? 'unknown_preserved' : 'allowed',
|
|
258
|
-
purpose_declared: true,
|
|
259
|
-
has_unknown_tokens: unknownTokens.length > 0,
|
|
260
|
-
unknown_tokens: unknownTokens,
|
|
261
|
-
profile_id: profileId,
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Get the HTTP status code for a purpose evaluation result.
|
|
266
|
-
*
|
|
267
|
-
* NOTE: 402 is RESERVED for payment - purpose decisions never return 402.
|
|
268
|
-
* - allow -> 200
|
|
269
|
-
* - review -> 403 (NOT 402)
|
|
270
|
-
* - deny -> 403
|
|
271
|
-
*
|
|
272
|
-
* @param result - Purpose evaluation result
|
|
273
|
-
* @returns HTTP status code (200 or 403)
|
|
274
|
-
*/
|
|
275
|
-
function getPurposeStatusCode(result) {
|
|
276
|
-
switch (result.decision) {
|
|
277
|
-
case 'allow':
|
|
278
|
-
return 200;
|
|
279
|
-
case 'review':
|
|
280
|
-
case 'deny':
|
|
281
|
-
return 403;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Get the Retry-After header value from constraints.
|
|
286
|
-
*
|
|
287
|
-
* @param constraints - Policy constraints
|
|
288
|
-
* @returns Retry-After seconds or undefined
|
|
289
|
-
*/
|
|
290
|
-
function getRetryAfter(constraints) {
|
|
291
|
-
return constraints?.rate_limit?.retry_after_s;
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=enforcement-profiles.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-profiles.js","sourceRoot":"","sources":["../src/enforcement-profiles.ts"],"names":[],"mappings":"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"}
|