@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 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';
@@ -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"}
@@ -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 { type SinkDenylist } from './sinks.js';
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;
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAqC,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAExF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,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;AAqHD,wBAAgB,eAAe,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,CAuS1G"}
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 { messageOf } from './errors.js';
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 config = buildConfig(policy);
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 pageOrigin = () => {
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
- const verdict = checkUrl(a.original, policy.urls, pageBase());
262
- if (!verdict.ok) {
263
- // Nothing parseable to show, so a refused image gets no placeholder.
264
- a.drop(subject, verdict.code, verdict.reason);
265
- return;
266
- }
267
- const target = { tag: a.tag, attribute: a.name, original: a.original, subject, isImage, parsed: verdict.parsed, value: a.original };
268
- for (const step of urlSteps) {
269
- const problem = step(target, s);
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 (target.value !== a.original)
279
- a.data.attrValue = target.value;
146
+ if (result.value !== a.original)
147
+ a.data.attrValue = result.value;
280
148
  },
281
149
  },
282
150
  ];
@@ -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.4",
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",