@render-policy/core 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/sanitize.d.ts +1 -1
- package/dist/sanitize.d.ts.map +1 -1
- package/dist/sanitize.js +35 -167
- package/dist/sanitize.js.map +1 -1
- package/dist/url-guard.d.ts +58 -0
- package/dist/url-guard.d.ts.map +1 -0
- package/dist/url-guard.js +205 -0
- package/dist/url-guard.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export { createMarkdownRenderer } from './markdown.js';
|
|
|
9
9
|
export type { MarkdownOptions, MarkdownRenderer } from './markdown.js';
|
|
10
10
|
export { completeFences, defaultScheduler, frameScheduler, holdIncompleteHtml, holdIncompleteMarkdown } from './stream.js';
|
|
11
11
|
export type { RenderStream, Scheduler, StreamOptions } from './stream.js';
|
|
12
|
+
export { createUrlGuard } from './url-guard.js';
|
|
13
|
+
export type { UrlGuard, UrlGuardOptions, UrlGuardResult, UrlRequest } from './url-guard.js';
|
|
12
14
|
export { checkUrl, hostMatches } from './url.js';
|
|
13
15
|
export type { ParsedUrl, UrlProblem, UrlVerdict } from './url.js';
|
|
14
16
|
export { matchSink, mergeSinkDenylists } from './sinks.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5K,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChG,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnN,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3H,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE5K,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChG,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnN,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC3H,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export { createContentBinding } from './binding.js';
|
|
|
3
3
|
export { DEFAULT_MODE, DEFAULT_URL_HEURISTICS, MODE_PRESETS, resolvePolicy } from './policy.js';
|
|
4
4
|
export { createMarkdownRenderer } from './markdown.js';
|
|
5
5
|
export { completeFences, defaultScheduler, frameScheduler, holdIncompleteHtml, holdIncompleteMarkdown } from './stream.js';
|
|
6
|
+
export { createUrlGuard } from './url-guard.js';
|
|
6
7
|
export { checkUrl, hostMatches } from './url.js';
|
|
7
8
|
export { matchSink, mergeSinkDenylists } from './sinks.js';
|
|
8
9
|
export { SINK_DENYLIST } from './data/sink-domains.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG3H,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG3H,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGjD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/sanitize.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { TrustedHTML } from 'trusted-types/lib/index.js';
|
|
2
2
|
import type { RenderDecision } from './decisions.js';
|
|
3
3
|
import type { RenderPolicy } from './policy.js';
|
|
4
|
-
import {
|
|
4
|
+
import type { SinkDenylist } from './sinks.js';
|
|
5
5
|
import type { RenderWindow } from './window.js';
|
|
6
6
|
export interface SanitizeOutcome<T> {
|
|
7
7
|
readonly output: T;
|
package/dist/sanitize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,4BAA4B,CAAC;AACjF,OAAO,KAAK,EAAqC,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,wFAAwF;IACxF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC5D,sFAAsF;IACtF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;CACpE;AAgHD,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,CA8J1G"}
|
package/dist/sanitize.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import createDOMPurify, {} from 'dompurify';
|
|
2
|
-
import {
|
|
3
|
-
import { matchSink } from './sinks.js';
|
|
4
|
-
import { checkUrl, checkUrlHeuristics, hostMatches, usableBase } from './url.js';
|
|
2
|
+
import { createUrlPipeline } from './url-guard.js';
|
|
5
3
|
/**
|
|
6
4
|
* Attributes whose value is fetched or navigated to. Some are also on the always-forbidden
|
|
7
5
|
* list below and are dropped before the URL check runs; they stay here on purpose, so that
|
|
@@ -61,162 +59,37 @@ function buildConfig(policy) {
|
|
|
61
59
|
FORCE_BODY: false,
|
|
62
60
|
};
|
|
63
61
|
}
|
|
62
|
+
const trustedTypesPolicies = new WeakMap();
|
|
63
|
+
function sharedTrustedTypesPolicy(win) {
|
|
64
|
+
const factory = win.trustedTypes;
|
|
65
|
+
if (!factory || typeof factory.createPolicy !== 'function')
|
|
66
|
+
return undefined;
|
|
67
|
+
if (!trustedTypesPolicies.has(win)) {
|
|
68
|
+
let created = null;
|
|
69
|
+
try {
|
|
70
|
+
created = factory.createPolicy('dompurify', { createHTML: (html) => html, createScriptURL: (url) => url });
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// The CSP does not admit the name, or the page created it already: as DOMPurify itself does, warn and go on without.
|
|
74
|
+
console.warn('@render-policy/core: the Trusted Types policy "dompurify" could not be created; list it in the trusted-types directive.');
|
|
75
|
+
}
|
|
76
|
+
trustedTypesPolicies.set(win, created);
|
|
77
|
+
}
|
|
78
|
+
return trustedTypesPolicies.get(win);
|
|
79
|
+
}
|
|
64
80
|
export function createSanitizer(win, policy, denylist) {
|
|
65
81
|
const purify = createDOMPurify(win);
|
|
66
|
-
const
|
|
82
|
+
const trustedTypesPolicy = sharedTrustedTypesPolicy(win);
|
|
83
|
+
// DOMPurify's type asks for a whole policy; it calls only createHTML and createScriptURL, and checks both are there.
|
|
84
|
+
const config = trustedTypesPolicy === undefined ? buildConfig(policy) : { ...buildConfig(policy), TRUSTED_TYPES_POLICY: trustedTypesPolicy };
|
|
67
85
|
let state = null;
|
|
68
|
-
const
|
|
69
|
-
const origin = win.document.location?.origin;
|
|
70
|
-
return origin && origin !== 'null' ? origin : null;
|
|
71
|
-
};
|
|
72
|
-
const pageBase = () => usableBase(win.document.location?.href);
|
|
86
|
+
const guardUrl = createUrlPipeline(win, policy, denylist);
|
|
73
87
|
const record = (s, decision) => {
|
|
74
88
|
s.decisions.push(decision);
|
|
75
89
|
if (decision.attribute !== undefined) {
|
|
76
90
|
s.recorded.add(`${decision.tag ?? ''}|${decision.attribute}|${decision.value ?? ''}`);
|
|
77
91
|
}
|
|
78
92
|
};
|
|
79
|
-
// Host, query and heuristic checks on an image URL. `url` is null when the URL is local
|
|
80
|
-
// (relative or same-origin) and needs no checks; otherwise it is the URL after query handling.
|
|
81
|
-
const screenImage = (parsed) => {
|
|
82
|
-
if (parsed.relative) {
|
|
83
|
-
// Resolves within the host page's own origin.
|
|
84
|
-
return { ok: true, url: null, stripped: null };
|
|
85
|
-
}
|
|
86
|
-
const origin = pageOrigin();
|
|
87
|
-
const url = new URL(parsed.url.href);
|
|
88
|
-
if (origin !== null && url.origin === origin) {
|
|
89
|
-
return { ok: true, url: null, stripped: null };
|
|
90
|
-
}
|
|
91
|
-
const images = policy.images;
|
|
92
|
-
if (images.hosts === 'none') {
|
|
93
|
-
return { ok: false, code: 'remote-images-disabled', reason: 'remote images are disabled by the policy' };
|
|
94
|
-
}
|
|
95
|
-
if (images.hosts !== 'any' && !hostMatches(url.host, images.hosts, images.allowWildcardHosts)) {
|
|
96
|
-
return { ok: false, code: 'image-host-not-allowed', reason: `image host "${url.host}" is not in the allowlist` };
|
|
97
|
-
}
|
|
98
|
-
let stripped = null;
|
|
99
|
-
const hasQuery = url.search !== '' || url.hash !== '';
|
|
100
|
-
if (hasQuery && images.query === 'deny') {
|
|
101
|
-
return { ok: false, code: 'image-query-denied', reason: 'image URL carries a query string or fragment' };
|
|
102
|
-
}
|
|
103
|
-
if (hasQuery && images.query === 'strip') {
|
|
104
|
-
url.search = '';
|
|
105
|
-
url.hash = '';
|
|
106
|
-
stripped = { code: 'image-query-stripped', reason: 'query string removed' };
|
|
107
|
-
}
|
|
108
|
-
if (policy.urls.heuristics) {
|
|
109
|
-
const problem = checkUrlHeuristics(url, policy.urls.heuristics);
|
|
110
|
-
if (problem)
|
|
111
|
-
return { ok: false, ...problem };
|
|
112
|
-
}
|
|
113
|
-
return { ok: true, url, stripped };
|
|
114
|
-
};
|
|
115
|
-
const applyImagePolicy = (parsed) => {
|
|
116
|
-
const screen = screenImage(parsed);
|
|
117
|
-
if (!screen.ok)
|
|
118
|
-
return screen;
|
|
119
|
-
if (screen.url === null)
|
|
120
|
-
return { ok: true, value: parsed.normalized, rewritten: null };
|
|
121
|
-
const { url } = screen;
|
|
122
|
-
const images = policy.images;
|
|
123
|
-
let rewritten = screen.stripped;
|
|
124
|
-
let value = rewritten ? url.href : parsed.normalized;
|
|
125
|
-
if (images.rewriteUrl) {
|
|
126
|
-
let out;
|
|
127
|
-
try {
|
|
128
|
-
out = images.rewriteUrl(url);
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
// Application code failed: the image is blocked and the render goes on.
|
|
132
|
-
return { ok: false, code: 'image-rewrite-failed', reason: `images.rewriteUrl threw: ${messageOf(error)}` };
|
|
133
|
-
}
|
|
134
|
-
if (out === null)
|
|
135
|
-
return { ok: false, code: 'image-rewrite-rejected', reason: 'rejected by images.rewriteUrl' };
|
|
136
|
-
const check = checkUrl(out, policy.urls, pageBase());
|
|
137
|
-
if (!check.ok)
|
|
138
|
-
return { ok: false, code: 'image-rewrite-invalid', reason: `images.rewriteUrl returned an invalid URL: ${check.reason}` };
|
|
139
|
-
value = out;
|
|
140
|
-
rewritten = { code: 'image-rewritten', reason: 'rewritten by images.rewriteUrl' };
|
|
141
|
-
}
|
|
142
|
-
return { ok: true, value, rewritten };
|
|
143
|
-
};
|
|
144
|
-
// URL steps, in order. Each one may block the URL, change it (`target.parsed` and `target.value`),
|
|
145
|
-
// or pass it on; the first block ends the chain. The order is the security argument: the scheme
|
|
146
|
-
// check runs before anything sees the URL (in the hook below), the sink denylist before
|
|
147
|
-
// application code, and the image policy last, so that a `urls.decide` rewrite is checked too.
|
|
148
|
-
const urlSteps = [
|
|
149
|
-
// Known exfiltration sinks. `log` mode flags the URL and lets it through.
|
|
150
|
-
(target, s) => {
|
|
151
|
-
if (target.parsed.relative || policy.urls.sinkDenylist === 'off')
|
|
152
|
-
return null;
|
|
153
|
-
const { isImage, parsed } = target;
|
|
154
|
-
const explicitlyAllowed = isImage && Array.isArray(policy.images.hosts) && hostMatches(parsed.url.host, policy.images.hosts, policy.images.allowWildcardHosts);
|
|
155
|
-
const hit = explicitlyAllowed ? null : matchSink(parsed.url, denylist);
|
|
156
|
-
if (!hit)
|
|
157
|
-
return null;
|
|
158
|
-
const reason = `host matches the sink denylist (${hit.category}: ${hit.pattern}, list ${denylist.version})`;
|
|
159
|
-
if (policy.urls.sinkDenylist === 'block')
|
|
160
|
-
return { code: 'sink-host', reason };
|
|
161
|
-
record(s, { kind: 'flagged', subject: target.subject, code: 'sink-host', reason, tag: target.tag, attribute: target.attribute, value: parsed.normalized });
|
|
162
|
-
return null;
|
|
163
|
-
},
|
|
164
|
-
// Application URL hook: the place a link policy lives (deny or redirect off-site links). If it
|
|
165
|
-
// throws, that one URL is dropped. An image is screened as the content wrote it before the hook
|
|
166
|
-
// sees it, and the hook gets the URL after query handling: a rewrite to a same-origin proxy must
|
|
167
|
-
// not carry through a host, query or payload the image policy would have blocked.
|
|
168
|
-
(target, s) => {
|
|
169
|
-
if (!policy.urls.decide)
|
|
170
|
-
return null;
|
|
171
|
-
const { subject, tag, attribute, original } = target;
|
|
172
|
-
let screened = null;
|
|
173
|
-
let stripped = null;
|
|
174
|
-
if (target.isImage) {
|
|
175
|
-
const screen = screenImage(target.parsed);
|
|
176
|
-
if (!screen.ok)
|
|
177
|
-
return screen;
|
|
178
|
-
screened = screen.url;
|
|
179
|
-
stripped = screen.stripped;
|
|
180
|
-
}
|
|
181
|
-
let decision;
|
|
182
|
-
try {
|
|
183
|
-
decision = policy.urls.decide(new URL((screened ?? target.parsed.url).href), { subject: subject, tag, attribute, relative: target.parsed.relative });
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
return { code: 'url-decider-failed', reason: `urls.decide threw: ${messageOf(error)}` };
|
|
187
|
-
}
|
|
188
|
-
if (!decision)
|
|
189
|
-
return null;
|
|
190
|
-
if (decision.allow === false)
|
|
191
|
-
return { code: 'url-denied', reason: decision.reason ?? 'denied by urls.decide' };
|
|
192
|
-
if (typeof decision.rewrite === 'string' && decision.rewrite !== target.parsed.normalized) {
|
|
193
|
-
const check = checkUrl(decision.rewrite, policy.urls, pageBase());
|
|
194
|
-
if (!check.ok)
|
|
195
|
-
return { code: 'url-rewrite-invalid', reason: `urls.decide returned an invalid URL: ${check.reason}` };
|
|
196
|
-
target.parsed = check.parsed;
|
|
197
|
-
target.value = decision.rewrite;
|
|
198
|
-
if (stripped)
|
|
199
|
-
record(s, { kind: 'rewritten', subject: 'image', code: stripped.code, reason: stripped.reason, tag, attribute, value: original });
|
|
200
|
-
record(s, { kind: 'rewritten', subject, code: 'url-rewritten', reason: decision.reason ?? 'rewritten by urls.decide', tag, attribute, value: original });
|
|
201
|
-
}
|
|
202
|
-
return null;
|
|
203
|
-
},
|
|
204
|
-
// Image hosts, query handling, heuristics and `images.rewriteUrl`, on the URL as it now stands.
|
|
205
|
-
(target, s) => {
|
|
206
|
-
if (!target.isImage)
|
|
207
|
-
return null;
|
|
208
|
-
const outcome = applyImagePolicy(target.parsed);
|
|
209
|
-
if (!outcome.ok)
|
|
210
|
-
return outcome;
|
|
211
|
-
if (outcome.value !== target.original) {
|
|
212
|
-
target.value = outcome.value;
|
|
213
|
-
if (outcome.rewritten) {
|
|
214
|
-
record(s, { kind: 'rewritten', subject: 'image', code: outcome.rewritten.code, reason: outcome.rewritten.reason, tag: target.tag, attribute: target.attribute, value: target.original });
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return null;
|
|
218
|
-
},
|
|
219
|
-
];
|
|
220
93
|
// Attribute rules: the first rule whose `name` test holds owns the attribute; attributes no rule
|
|
221
94
|
// claims are left to DOMPurify's allowlist.
|
|
222
95
|
const attributeRules = [
|
|
@@ -258,25 +131,20 @@ export function createSanitizer(win, policy, denylist) {
|
|
|
258
131
|
apply: (a, s) => {
|
|
259
132
|
const isImage = a.tag === 'img' && a.name === 'src';
|
|
260
133
|
const subject = isImage ? 'image' : a.name === 'href' ? 'link' : 'url';
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (problem) {
|
|
271
|
-
a.drop(subject, problem.code, problem.reason);
|
|
272
|
-
if (isImage && policy.images.blocked === 'placeholder') {
|
|
273
|
-
s.blockedImages.set(a.node, { src: target.parsed.url.href, reason: problem.reason });
|
|
274
|
-
}
|
|
275
|
-
return;
|
|
134
|
+
// The URL steps (scheme, sink denylist, `urls.decide`, image policy) live in url-guard.ts.
|
|
135
|
+
const result = guardUrl(a.original, { subject, tag: a.tag, attribute: a.name });
|
|
136
|
+
for (const decision of result.decisions)
|
|
137
|
+
record(s, decision);
|
|
138
|
+
if (!result.allowed) {
|
|
139
|
+
a.data.keepAttr = false;
|
|
140
|
+
record(s, result.decision);
|
|
141
|
+
if (isImage && result.href !== undefined && policy.images.blocked === 'placeholder') {
|
|
142
|
+
s.blockedImages.set(a.node, { src: result.href, reason: result.decision.reason });
|
|
276
143
|
}
|
|
144
|
+
return;
|
|
277
145
|
}
|
|
278
|
-
if (
|
|
279
|
-
a.data.attrValue =
|
|
146
|
+
if (result.value !== a.original)
|
|
147
|
+
a.data.attrValue = result.value;
|
|
280
148
|
},
|
|
281
149
|
},
|
|
282
150
|
];
|
package/dist/sanitize.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { RenderDecision } from './decisions.js';
|
|
2
|
+
import { type RenderMode, type RenderPolicy, type RenderPolicyOverrides, type UrlSubject } from './policy.js';
|
|
3
|
+
import { type SinkDenylist } from './sinks.js';
|
|
4
|
+
import { type RenderWindow } from './window.js';
|
|
5
|
+
/** Where a URL is about to be used: what it is for, and the element and attribute (or property) it goes into. */
|
|
6
|
+
export interface UrlRequest {
|
|
7
|
+
/** `image` URLs go through the image policy (they are fetched without a click); `link` and `url` do not. */
|
|
8
|
+
readonly subject: UrlSubject;
|
|
9
|
+
/** The element's tag, lower-case. A caller outside HTML names the element it will create (`img`, `video`, `a`). */
|
|
10
|
+
readonly tag: string;
|
|
11
|
+
/** The attribute or property the URL goes into, lower-case. */
|
|
12
|
+
readonly attribute: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The outcome of one URL check. `decisions` is what the check journaled along the way (a sink
|
|
16
|
+
* logged under `sinkDenylist: 'log'`, a query string stripped, a rewrite); a refused URL also
|
|
17
|
+
* carries the `decision` that refused it, which is not in `decisions`.
|
|
18
|
+
*/
|
|
19
|
+
export type UrlGuardResult = {
|
|
20
|
+
readonly allowed: true;
|
|
21
|
+
readonly value: string;
|
|
22
|
+
readonly decisions: readonly RenderDecision[];
|
|
23
|
+
} | {
|
|
24
|
+
readonly allowed: false;
|
|
25
|
+
readonly decision: RenderDecision;
|
|
26
|
+
readonly decisions: readonly RenderDecision[];
|
|
27
|
+
/** The URL as it stood when it was refused, for a "click to open" placeholder. Absent when it never parsed or its scheme was refused. */
|
|
28
|
+
readonly href?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Checks one URL against a policy. Never throws: application hooks that throw refuse the URL with a journal entry. */
|
|
31
|
+
export type UrlGuard = (raw: string, request: UrlRequest) => UrlGuardResult;
|
|
32
|
+
export interface UrlGuardOptions {
|
|
33
|
+
/** The window whose location relative URLs resolve against. Defaults to the global window. */
|
|
34
|
+
readonly window?: RenderWindow;
|
|
35
|
+
/** Policy preset. Default 'balanced'. */
|
|
36
|
+
readonly mode?: RenderMode;
|
|
37
|
+
/** Overrides applied on top of the preset. Only the `urls` and `images` groups matter here. */
|
|
38
|
+
readonly policy?: RenderPolicyOverrides;
|
|
39
|
+
/** Replace the bundled sink denylist. */
|
|
40
|
+
readonly sinkDenylist?: SinkDenylist;
|
|
41
|
+
/** Receive every decision as it is made, the refusing one included. */
|
|
42
|
+
readonly onDecision?: (decision: RenderDecision) => void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The URL policy of a resolved {@link RenderPolicy}, as a function. The sanitizer runs every URL
|
|
46
|
+
* attribute through it; {@link createUrlGuard} exposes it for URLs that never pass through HTML
|
|
47
|
+
* (structured agent UI, where a component property holds the URL).
|
|
48
|
+
*/
|
|
49
|
+
export declare function createUrlPipeline(win: RenderWindow, policy: RenderPolicy, denylist: SinkDenylist): UrlGuard;
|
|
50
|
+
/**
|
|
51
|
+
* Check URLs that never pass through HTML against the same policy the renderer applies to URL
|
|
52
|
+
* attributes: scheme allowlist, sink denylist, `urls.decide`, and for `image` URLs the host
|
|
53
|
+
* allowlist, query handling, heuristics and `images.rewriteUrl`. Use it where agent output carries
|
|
54
|
+
* a URL as data (a component property, a function argument) and your code is about to fetch it or
|
|
55
|
+
* navigate to it; use the value it returns, not the one you passed in.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createUrlGuard(options?: UrlGuardOptions): UrlGuard;
|
|
58
|
+
//# sourceMappingURL=url-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-guard.d.ts","sourceRoot":"","sources":["../src/url-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7H,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,iHAAiH;AACjH,MAAM,WAAW,UAAU;IACzB,4GAA4G;IAC5G,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,mHAAmH;IACnH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACjG;IACE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,yIAAyI;IACzI,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEN,uHAAuH;AACvH,MAAM,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,KAAK,cAAc,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,yCAAyC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,+FAA+F;IAC/F,QAAQ,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IACxC,yCAAyC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,uEAAuE;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CAC1D;AA8BD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,QAAQ,CAgK3G;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAUtE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { SINK_DENYLIST } from './data/sink-domains.js';
|
|
2
|
+
import { messageOf } from './errors.js';
|
|
3
|
+
import { resolvePolicy } from './policy.js';
|
|
4
|
+
import { matchSink } from './sinks.js';
|
|
5
|
+
import { checkUrl, checkUrlHeuristics, hostMatches, usableBase } from './url.js';
|
|
6
|
+
import { resolveWindow } from './window.js';
|
|
7
|
+
/**
|
|
8
|
+
* The URL policy of a resolved {@link RenderPolicy}, as a function. The sanitizer runs every URL
|
|
9
|
+
* attribute through it; {@link createUrlGuard} exposes it for URLs that never pass through HTML
|
|
10
|
+
* (structured agent UI, where a component property holds the URL).
|
|
11
|
+
*/
|
|
12
|
+
export function createUrlPipeline(win, policy, denylist) {
|
|
13
|
+
const pageOrigin = () => {
|
|
14
|
+
const origin = win.document.location?.origin;
|
|
15
|
+
return origin && origin !== 'null' ? origin : null;
|
|
16
|
+
};
|
|
17
|
+
const pageBase = () => usableBase(win.document.location?.href);
|
|
18
|
+
const entry = (target, kind, subject, problem) => ({
|
|
19
|
+
kind,
|
|
20
|
+
subject,
|
|
21
|
+
code: problem.code,
|
|
22
|
+
reason: problem.reason,
|
|
23
|
+
tag: target.request.tag,
|
|
24
|
+
attribute: target.request.attribute,
|
|
25
|
+
value: target.original,
|
|
26
|
+
});
|
|
27
|
+
// Host, query and heuristic checks on an image URL. `url` is null when the URL is local
|
|
28
|
+
// (relative or same-origin) and needs no checks; otherwise it is the URL after query handling.
|
|
29
|
+
const screenImage = (parsed) => {
|
|
30
|
+
if (parsed.relative) {
|
|
31
|
+
// Resolves within the host page's own origin.
|
|
32
|
+
return { ok: true, url: null, stripped: null };
|
|
33
|
+
}
|
|
34
|
+
const origin = pageOrigin();
|
|
35
|
+
const url = new URL(parsed.url.href);
|
|
36
|
+
if (origin !== null && url.origin === origin) {
|
|
37
|
+
return { ok: true, url: null, stripped: null };
|
|
38
|
+
}
|
|
39
|
+
const images = policy.images;
|
|
40
|
+
if (images.hosts === 'none') {
|
|
41
|
+
return { ok: false, code: 'remote-images-disabled', reason: 'remote images are disabled by the policy' };
|
|
42
|
+
}
|
|
43
|
+
if (images.hosts !== 'any' && !hostMatches(url.host, images.hosts, images.allowWildcardHosts)) {
|
|
44
|
+
return { ok: false, code: 'image-host-not-allowed', reason: `image host "${url.host}" is not in the allowlist` };
|
|
45
|
+
}
|
|
46
|
+
let stripped = null;
|
|
47
|
+
const hasQuery = url.search !== '' || url.hash !== '';
|
|
48
|
+
if (hasQuery && images.query === 'deny') {
|
|
49
|
+
return { ok: false, code: 'image-query-denied', reason: 'image URL carries a query string or fragment' };
|
|
50
|
+
}
|
|
51
|
+
if (hasQuery && images.query === 'strip') {
|
|
52
|
+
url.search = '';
|
|
53
|
+
url.hash = '';
|
|
54
|
+
stripped = { code: 'image-query-stripped', reason: 'query string removed' };
|
|
55
|
+
}
|
|
56
|
+
if (policy.urls.heuristics) {
|
|
57
|
+
const problem = checkUrlHeuristics(url, policy.urls.heuristics);
|
|
58
|
+
if (problem)
|
|
59
|
+
return { ok: false, ...problem };
|
|
60
|
+
}
|
|
61
|
+
return { ok: true, url, stripped };
|
|
62
|
+
};
|
|
63
|
+
const applyImagePolicy = (parsed) => {
|
|
64
|
+
const screen = screenImage(parsed);
|
|
65
|
+
if (!screen.ok)
|
|
66
|
+
return screen;
|
|
67
|
+
if (screen.url === null)
|
|
68
|
+
return { ok: true, value: parsed.normalized, rewritten: null };
|
|
69
|
+
const { url } = screen;
|
|
70
|
+
const images = policy.images;
|
|
71
|
+
let rewritten = screen.stripped;
|
|
72
|
+
let value = rewritten ? url.href : parsed.normalized;
|
|
73
|
+
if (images.rewriteUrl) {
|
|
74
|
+
let out;
|
|
75
|
+
try {
|
|
76
|
+
out = images.rewriteUrl(url);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
// Application code failed: the image is blocked and the render goes on.
|
|
80
|
+
return { ok: false, code: 'image-rewrite-failed', reason: `images.rewriteUrl threw: ${messageOf(error)}` };
|
|
81
|
+
}
|
|
82
|
+
if (out === null)
|
|
83
|
+
return { ok: false, code: 'image-rewrite-rejected', reason: 'rejected by images.rewriteUrl' };
|
|
84
|
+
const check = checkUrl(out, policy.urls, pageBase());
|
|
85
|
+
if (!check.ok)
|
|
86
|
+
return { ok: false, code: 'image-rewrite-invalid', reason: `images.rewriteUrl returned an invalid URL: ${check.reason}` };
|
|
87
|
+
value = out;
|
|
88
|
+
rewritten = { code: 'image-rewritten', reason: 'rewritten by images.rewriteUrl' };
|
|
89
|
+
}
|
|
90
|
+
return { ok: true, value, rewritten };
|
|
91
|
+
};
|
|
92
|
+
// URL steps, in order. Each one may block the URL, change it (`target.parsed` and `target.value`),
|
|
93
|
+
// or pass it on; the first block ends the chain. The order is the security argument: the scheme
|
|
94
|
+
// check runs before anything sees the URL (in the guard below), the sink denylist before
|
|
95
|
+
// application code, and the image policy last, so that a `urls.decide` rewrite is checked too.
|
|
96
|
+
const urlSteps = [
|
|
97
|
+
// Known exfiltration sinks. `log` mode flags the URL and lets it through.
|
|
98
|
+
(target) => {
|
|
99
|
+
if (target.parsed.relative || policy.urls.sinkDenylist === 'off')
|
|
100
|
+
return null;
|
|
101
|
+
const { isImage, parsed } = target;
|
|
102
|
+
const explicitlyAllowed = isImage && Array.isArray(policy.images.hosts) && hostMatches(parsed.url.host, policy.images.hosts, policy.images.allowWildcardHosts);
|
|
103
|
+
const hit = explicitlyAllowed ? null : matchSink(parsed.url, denylist);
|
|
104
|
+
if (!hit)
|
|
105
|
+
return null;
|
|
106
|
+
const reason = `host matches the sink denylist (${hit.category}: ${hit.pattern}, list ${denylist.version})`;
|
|
107
|
+
if (policy.urls.sinkDenylist === 'block')
|
|
108
|
+
return { code: 'sink-host', reason };
|
|
109
|
+
target.decisions.push({ ...entry(target, 'flagged', target.request.subject, { code: 'sink-host', reason }), value: parsed.normalized });
|
|
110
|
+
return null;
|
|
111
|
+
},
|
|
112
|
+
// Application URL hook: the place a link policy lives (deny or redirect off-site links). If it
|
|
113
|
+
// throws, that one URL is dropped. An image is screened as the content wrote it before the hook
|
|
114
|
+
// sees it, and the hook gets the URL after query handling: a rewrite to a same-origin proxy must
|
|
115
|
+
// not carry through a host, query or payload the image policy would have blocked.
|
|
116
|
+
(target) => {
|
|
117
|
+
if (!policy.urls.decide)
|
|
118
|
+
return null;
|
|
119
|
+
const { subject, tag, attribute } = target.request;
|
|
120
|
+
let screened = null;
|
|
121
|
+
let stripped = null;
|
|
122
|
+
if (target.isImage) {
|
|
123
|
+
const screen = screenImage(target.parsed);
|
|
124
|
+
if (!screen.ok)
|
|
125
|
+
return screen;
|
|
126
|
+
screened = screen.url;
|
|
127
|
+
stripped = screen.stripped;
|
|
128
|
+
}
|
|
129
|
+
let decision;
|
|
130
|
+
try {
|
|
131
|
+
decision = policy.urls.decide(new URL((screened ?? target.parsed.url).href), { subject, tag, attribute, relative: target.parsed.relative });
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return { code: 'url-decider-failed', reason: `urls.decide threw: ${messageOf(error)}` };
|
|
135
|
+
}
|
|
136
|
+
if (!decision)
|
|
137
|
+
return null;
|
|
138
|
+
if (decision.allow === false)
|
|
139
|
+
return { code: 'url-denied', reason: decision.reason ?? 'denied by urls.decide' };
|
|
140
|
+
if (typeof decision.rewrite === 'string' && decision.rewrite !== target.parsed.normalized) {
|
|
141
|
+
const check = checkUrl(decision.rewrite, policy.urls, pageBase());
|
|
142
|
+
if (!check.ok)
|
|
143
|
+
return { code: 'url-rewrite-invalid', reason: `urls.decide returned an invalid URL: ${check.reason}` };
|
|
144
|
+
target.parsed = check.parsed;
|
|
145
|
+
target.value = decision.rewrite;
|
|
146
|
+
if (stripped)
|
|
147
|
+
target.decisions.push(entry(target, 'rewritten', 'image', stripped));
|
|
148
|
+
target.decisions.push(entry(target, 'rewritten', subject, { code: 'url-rewritten', reason: decision.reason ?? 'rewritten by urls.decide' }));
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
},
|
|
152
|
+
// Image hosts, query handling, heuristics and `images.rewriteUrl`, on the URL as it now stands.
|
|
153
|
+
(target) => {
|
|
154
|
+
if (!target.isImage)
|
|
155
|
+
return null;
|
|
156
|
+
const outcome = applyImagePolicy(target.parsed);
|
|
157
|
+
if (!outcome.ok)
|
|
158
|
+
return outcome;
|
|
159
|
+
if (outcome.value !== target.original) {
|
|
160
|
+
target.value = outcome.value;
|
|
161
|
+
if (outcome.rewritten)
|
|
162
|
+
target.decisions.push(entry(target, 'rewritten', 'image', outcome.rewritten));
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
},
|
|
166
|
+
];
|
|
167
|
+
return (raw, request) => {
|
|
168
|
+
const decisions = [];
|
|
169
|
+
const verdict = checkUrl(raw, policy.urls, pageBase());
|
|
170
|
+
if (!verdict.ok) {
|
|
171
|
+
// Nothing parseable to show, so a refused URL gets no placeholder href.
|
|
172
|
+
return { allowed: false, decisions, decision: { kind: 'blocked', subject: request.subject, code: verdict.code, reason: verdict.reason, tag: request.tag, attribute: request.attribute, value: raw } };
|
|
173
|
+
}
|
|
174
|
+
const target = { request, original: raw, isImage: request.subject === 'image', parsed: verdict.parsed, value: raw, decisions };
|
|
175
|
+
for (const step of urlSteps) {
|
|
176
|
+
const problem = step(target);
|
|
177
|
+
if (problem) {
|
|
178
|
+
return { allowed: false, decisions, decision: entry(target, 'blocked', request.subject, problem), href: target.parsed.url.href };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return { allowed: true, value: target.value, decisions };
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check URLs that never pass through HTML against the same policy the renderer applies to URL
|
|
186
|
+
* attributes: scheme allowlist, sink denylist, `urls.decide`, and for `image` URLs the host
|
|
187
|
+
* allowlist, query handling, heuristics and `images.rewriteUrl`. Use it where agent output carries
|
|
188
|
+
* a URL as data (a component property, a function argument) and your code is about to fetch it or
|
|
189
|
+
* navigate to it; use the value it returns, not the one you passed in.
|
|
190
|
+
*/
|
|
191
|
+
export function createUrlGuard(options = {}) {
|
|
192
|
+
const pipeline = createUrlPipeline(resolveWindow(options.window), resolvePolicy(options.mode, options.policy), options.sinkDenylist ?? SINK_DENYLIST);
|
|
193
|
+
const onDecision = options.onDecision;
|
|
194
|
+
if (!onDecision)
|
|
195
|
+
return pipeline;
|
|
196
|
+
return (raw, request) => {
|
|
197
|
+
const result = pipeline(raw, request);
|
|
198
|
+
for (const decision of result.decisions)
|
|
199
|
+
onDecision(decision);
|
|
200
|
+
if (!result.allowed)
|
|
201
|
+
onDecision(result.decision);
|
|
202
|
+
return result;
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=url-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-guard.js","sourceRoot":"","sources":["../src/url-guard.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@render-policy/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Render agent-generated Markdown/HTML safely: sanitize into a DocumentFragment, insert with replaceChildren (never innerHTML), enforce a URL/host policy, stay Trusted Types compatible, handle streaming.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|