url-sanitizer 0.10.14 → 0.10.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/url-sanitizer-wo-dompurify.js +40 -46
- package/dist/url-sanitizer-wo-dompurify.js.map +4 -4
- package/dist/url-sanitizer-wo-dompurify.min.js +1 -1
- package/dist/url-sanitizer-wo-dompurify.min.js.map +4 -4
- package/dist/url-sanitizer.js +59 -55
- package/dist/url-sanitizer.js.map +4 -4
- package/dist/url-sanitizer.min.js +3 -3
- package/dist/url-sanitizer.min.js.map +4 -4
- package/package.json +22 -22
- package/src/lib/iana/uri-schemes.json +1 -1
- package/src/mjs/common.js +2 -3
- package/src/mjs/constant.js +27 -0
- package/src/mjs/dompurify.js +1 -3
- package/src/mjs/file-reader.js +7 -13
- package/src/mjs/sanitizer.js +20 -33
- package/src/mjs/uri-util.js +9 -21
- package/types/mjs/constant.d.ts +19 -0
- package/types/{src/mjs → mjs}/dompurify.d.ts +1 -1
- package/types/{src/mjs → mjs}/sanitizer.d.ts +1 -1
- /package/types/{src/index.d.ts → index.d.ts} +0 -0
- /package/types/{src/mjs → mjs}/common.d.ts +0 -0
- /package/types/{src/mjs → mjs}/file-reader.d.ts +0 -0
- /package/types/{src/mjs → mjs}/uri-util.d.ts +0 -0
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://www.npmjs.com/package/url-sanitizer)
|
|
6
6
|
[](https://github.com/asamuzaK/urlSanitizer/releases)
|
|
7
7
|
|
|
8
|
-
URL sanitizer for Node.js
|
|
8
|
+
URL sanitizer for Node.js, browsers and web sites.
|
|
9
9
|
Sanitize not only regular URLs, but also data URLs and blob URLs.
|
|
10
10
|
It also has the ability to parse URLs and verify URIs.
|
|
11
11
|
**Experimental**
|
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
// bundle_wo_dompurify/mjs/dompurify.js
|
|
2
2
|
var { DOMPurify } = globalThis;
|
|
3
|
+
var dompurify_default = DOMPurify;
|
|
3
4
|
|
|
4
|
-
// bundle_wo_dompurify/mjs/
|
|
5
|
+
// bundle_wo_dompurify/mjs/constant.js
|
|
6
|
+
var HEX = 16;
|
|
5
7
|
var TYPE_FROM = 8;
|
|
6
8
|
var TYPE_TO = -1;
|
|
9
|
+
var REG_B64 = /^[\w+/=-]+$/;
|
|
10
|
+
var REG_DATA_URL = /data:[\w#&+./;=-]*,/;
|
|
11
|
+
var REG_DATA_URL_B64 = /data:[\w#&+./;=^]*base64,[\w+/=-]+/i;
|
|
12
|
+
var REG_DATA_URL_G = /data:[\w#&+./;=-]*,[^"]+/g;
|
|
13
|
+
var REG_NUM_REF = /&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi;
|
|
14
|
+
var REG_MIME_DOM = /^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;
|
|
15
|
+
var REG_SCHEME = /^[a-z][\da-z+.-]*$/;
|
|
16
|
+
var REG_SCHEME_EXT = /^(?:ext|web)\+[a-z]+$/;
|
|
17
|
+
var REG_SCRIPT = /(?:java|vb)script/;
|
|
18
|
+
var REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;
|
|
19
|
+
var REG_TAG_QUOT = /%(?:2[27]|3[CE])|[<>"']/;
|
|
20
|
+
var REG_TAG_QUOT_ENC_G = /%(?:2[27]|3[CE])/g;
|
|
21
|
+
var REG_TAG_QUOT_SPACE_G = /[<>"'\s]/g;
|
|
22
|
+
var REG_URL_ENC = /^%[\dA-F]{2}$/i;
|
|
23
|
+
|
|
24
|
+
// bundle_wo_dompurify/mjs/common.js
|
|
7
25
|
var getType = (o) => Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);
|
|
8
26
|
var isString = (o) => typeof o === "string" || o instanceof String;
|
|
9
27
|
|
|
@@ -11,24 +29,12 @@ var isString = (o) => typeof o === "string" || o instanceof String;
|
|
|
11
29
|
var text_chars_default = [7, 8, 9, 10, 11, 12, 13, 27, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255];
|
|
12
30
|
|
|
13
31
|
// bundle_wo_dompurify/lib/iana/uri-schemes.json
|
|
14
|
-
var uri_schemes_default = ["aaa", "aaas", "about", "acap", "acct", "acd", "acr", "adiumxtra", "adt", "afp", "afs", "aim", "amss", "android", "appdata", "apt", "ar", "ark", "at", "attachment", "aw", "barion", "beshare", "bitcoin", "bitcoincash", "blob", "bolo", "browserext", "cabal", "calculator", "callto", "cap", "cast", "casts", "chrome", "chrome-extension", "cid", "coap", "coaps", "com-eventbrite-attendee", "content", "content-type", "crid", "cstr", "cvs", "dab", "dat", "data", "dav", "dhttp", "diaspora", "dict", "did", "dis", "dlna-playcontainer", "dlna-playsingle", "dns", "dntp", "doi", "dpp", "drm", "dtmi", "dtn", "dvb", "dvx", "dweb", "ed2k", "eid", "elsi", "embedded", "ens", "ethereum", "example", "facetime", "feed", "feedready", "fido", "file", "finger", "first-run-pen-experience", "fish", "fm", "ftp", "fuchsia-pkg", "geo", "gg", "git", "gitoid", "gizmoproject", "go", "gopher", "graph", "gtalk", "h323", "ham", "hcap", "hcp", "http", "https", "hxxp", "hxxps", "hydrazone", "hyper", "iax", "icap", "icon", "im", "imap", "info", "iotdisco", "ipfs", "ipn", "ipns", "ipp", "ipps", "irc", "irc6", "ircs", "iris", "iris.beep", "iris.lwz", "iris.xpc", "iris.xpcs", "isostore", "itms", "jabber", "jar", "jms", "keyparc", "lastfm", "lbry", "ldap", "ldaps", "leaptofrogans", "lid", "lorawan", "lpa", "lvlt", "magnet", "mailto", "maps", "market", "matrix", "message", "microsoft.windows.camera", "microsoft.windows.camera.multipicker", "microsoft.windows.camera.picker", "mid", "mms", "mongodb", "moz", "moz-extension", "ms-access", "ms-appinstaller", "ms-browser-extension", "ms-calculator", "ms-drive-to", "ms-enrollment", "ms-excel", "ms-eyecontrolspeech", "ms-gamebarservices", "ms-gamingoverlay", "ms-getoffice", "ms-help", "ms-infopath", "ms-inputapp", "ms-launchremotedesktop", "ms-lockscreencomponent-config", "ms-media-stream-id", "ms-meetnow", "ms-mixedrealitycapture", "ms-mobileplans", "ms-newsandinterests", "ms-officeapp", "ms-people", "ms-powerpoint", "ms-project", "ms-publisher", "ms-remotedesktop", "ms-remotedesktop-launch", "ms-restoretabcompanion", "ms-screenclip", "ms-screensketch", "ms-search", "ms-search-repair", "ms-secondary-screen-controller", "ms-secondary-screen-setup", "ms-settings", "ms-settings-airplanemode", "ms-settings-bluetooth", "ms-settings-camera", "ms-settings-cellular", "ms-settings-cloudstorage", "ms-settings-connectabledevices", "ms-settings-displays-topology", "ms-settings-emailandaccounts", "ms-settings-language", "ms-settings-location", "ms-settings-lock", "ms-settings-nfctransactions", "ms-settings-notifications", "ms-settings-power", "ms-settings-privacy", "ms-settings-proximity", "ms-settings-screenrotation", "ms-settings-wifi", "ms-settings-workplace", "ms-spd", "ms-stickers", "ms-sttoverlay", "ms-transit-to", "ms-useractivityset", "ms-virtualtouchpad", "ms-visio", "ms-walk-to", "ms-whiteboard", "ms-whiteboard-cmd", "ms-word", "msnim", "msrp", "msrps", "mss", "mt", "mtqp", "mumble", "mupdate", "mvn", "news", "nfs", "ni", "nih", "nntp", "notes", "num", "ocf", "oid", "onenote", "onenote-cmd", "opaquelocktoken", "openid", "openpgp4fpr", "otpauth", "palm", "paparazzi", "payment", "payto", "pkcs11", "platform", "pop", "pres", "proxy", "psyc", "pttp", "pwid", "qb", "query", "quic-transport", "redis", "rediss", "reload", "res", "resource", "rmi", "rsync", "rtmfp", "rtmp", "rtsp", "rtsps", "rtspu", "sarif", "secondlife", "secret-token", "service", "session", "sftp", "sgn", "shc", "sieve", "simpleledger", "simplex", "sip", "sips", "skype", "smb", "smp", "sms", "smtp", "snmp", "soap.beep", "soap.beeps", "soldat", "spiffe", "spotify", "ssb", "ssh", "starknet", "steam", "stun", "stuns", "submit", "svn", "swh", "swid", "swidpath", "tag", "taler", "teamspeak", "tel", "teliaeid", "telnet", "tftp", "things", "thismessage", "tip", "tn3270", "tool", "turn", "turns", "tv", "udp", "unreal", "urn", "ut2004", "uuid-in-package", "v-event", "vemmi", "ventrilo", "ves", "view-source", "vnc", "vscode", "vscode-insiders", "vsls", "w3", "wcr", "web3", "webcal", "wifi", "ws", "wss", "wtai", "wyciwyg", "xcon", "xcon-userid", "xfire", "xmlrpc.beep", "xmlrpc.beeps", "xmpp", "xri", "ymsgr", "z39.50r", "z39.50s"];
|
|
32
|
+
var uri_schemes_default = ["aaa", "aaas", "about", "acap", "acct", "acd", "acr", "adiumxtra", "adt", "afp", "afs", "aim", "amss", "android", "appdata", "apt", "ar", "ark", "at", "attachment", "aw", "barion", "beshare", "bitcoin", "bitcoincash", "blob", "bolo", "brid", "browserext", "cabal", "calculator", "callto", "cap", "cast", "casts", "chrome", "chrome-extension", "cid", "coap", "coaps", "com-eventbrite-attendee", "content", "content-type", "crid", "cstr", "cvs", "dab", "dat", "data", "dav", "dhttp", "diaspora", "dict", "did", "dis", "dlna-playcontainer", "dlna-playsingle", "dns", "dntp", "doi", "dpp", "drm", "dtmi", "dtn", "dvb", "dvx", "dweb", "ed2k", "eid", "elsi", "embedded", "ens", "ethereum", "example", "facetime", "feed", "feedready", "fido", "file", "finger", "first-run-pen-experience", "fish", "fm", "ftp", "fuchsia-pkg", "geo", "gg", "git", "gitoid", "gizmoproject", "go", "gopher", "graph", "gtalk", "h323", "ham", "hcap", "hcp", "http", "https", "hxxp", "hxxps", "hydrazone", "hyper", "iax", "icap", "icon", "im", "imap", "info", "iotdisco", "ipfs", "ipn", "ipns", "ipp", "ipps", "irc", "irc6", "ircs", "iris", "iris.beep", "iris.lwz", "iris.xpc", "iris.xpcs", "isostore", "itms", "jabber", "jar", "jms", "keyparc", "lastfm", "lbry", "ldap", "ldaps", "leaptofrogans", "lid", "lorawan", "lpa", "lvlt", "magnet", "mailto", "maps", "market", "matrix", "message", "microsoft.windows.camera", "microsoft.windows.camera.multipicker", "microsoft.windows.camera.picker", "mid", "mms", "mongodb", "moz", "moz-extension", "ms-access", "ms-appinstaller", "ms-browser-extension", "ms-calculator", "ms-drive-to", "ms-enrollment", "ms-excel", "ms-eyecontrolspeech", "ms-gamebarservices", "ms-gamingoverlay", "ms-getoffice", "ms-help", "ms-infopath", "ms-inputapp", "ms-launchremotedesktop", "ms-lockscreencomponent-config", "ms-media-stream-id", "ms-meetnow", "ms-mixedrealitycapture", "ms-mobileplans", "ms-newsandinterests", "ms-officeapp", "ms-people", "ms-powerpoint", "ms-project", "ms-publisher", "ms-remotedesktop", "ms-remotedesktop-launch", "ms-restoretabcompanion", "ms-screenclip", "ms-screensketch", "ms-search", "ms-search-repair", "ms-secondary-screen-controller", "ms-secondary-screen-setup", "ms-settings", "ms-settings-airplanemode", "ms-settings-bluetooth", "ms-settings-camera", "ms-settings-cellular", "ms-settings-cloudstorage", "ms-settings-connectabledevices", "ms-settings-displays-topology", "ms-settings-emailandaccounts", "ms-settings-language", "ms-settings-location", "ms-settings-lock", "ms-settings-nfctransactions", "ms-settings-notifications", "ms-settings-power", "ms-settings-privacy", "ms-settings-proximity", "ms-settings-screenrotation", "ms-settings-wifi", "ms-settings-workplace", "ms-spd", "ms-stickers", "ms-sttoverlay", "ms-transit-to", "ms-useractivityset", "ms-virtualtouchpad", "ms-visio", "ms-walk-to", "ms-whiteboard", "ms-whiteboard-cmd", "ms-word", "msnim", "msrp", "msrps", "mss", "mt", "mtqp", "mumble", "mupdate", "mvn", "news", "nfs", "ni", "nih", "nntp", "notes", "num", "ocf", "oid", "onenote", "onenote-cmd", "opaquelocktoken", "openid", "openpgp4fpr", "otpauth", "palm", "paparazzi", "payment", "payto", "pkcs11", "platform", "pop", "pres", "proxy", "psyc", "pttp", "pwid", "qb", "query", "quic-transport", "redis", "rediss", "reload", "res", "resource", "rmi", "rsync", "rtmfp", "rtmp", "rtsp", "rtsps", "rtspu", "sarif", "secondlife", "secret-token", "service", "session", "sftp", "sgn", "shc", "sieve", "simpleledger", "simplex", "sip", "sips", "skype", "smb", "smp", "sms", "smtp", "snmp", "soap.beep", "soap.beeps", "soldat", "spiffe", "spotify", "ssb", "ssh", "starknet", "steam", "stun", "stuns", "submit", "svn", "swh", "swid", "swidpath", "tag", "taler", "teamspeak", "tel", "teliaeid", "telnet", "tftp", "things", "thismessage", "tip", "tn3270", "tool", "turn", "turns", "tv", "udp", "unreal", "urn", "ut2004", "uuid-in-package", "v-event", "vemmi", "ventrilo", "ves", "view-source", "vnc", "vscode", "vscode-insiders", "vsls", "w3", "wcr", "web3", "webcal", "wifi", "ws", "wss", "wtai", "wyciwyg", "xcon", "xcon-userid", "xfire", "xmlrpc.beep", "xmlrpc.beeps", "xmpp", "xri", "ymsgr", "z39.50r", "z39.50s"];
|
|
15
33
|
|
|
16
34
|
// bundle_wo_dompurify/mjs/file-reader.js
|
|
17
35
|
var { FileReader } = globalThis;
|
|
18
36
|
|
|
19
37
|
// bundle_wo_dompurify/mjs/uri-util.js
|
|
20
|
-
var HEX = 16;
|
|
21
|
-
var REG_BASE64 = /^[\w+/\-=]+$/;
|
|
22
|
-
var REG_END_COLON = /:$/;
|
|
23
|
-
var REG_NUM_DECI = /^\d+/;
|
|
24
|
-
var REG_NUM_HEAD = /#x?$/;
|
|
25
|
-
var REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\d)/;
|
|
26
|
-
var REG_NUM_HEX = /^x[\dA-F]+/i;
|
|
27
|
-
var REG_NUM_REF = /&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi;
|
|
28
|
-
var REG_SCHEME = /^[a-z][\da-z+\-.]*$/;
|
|
29
|
-
var REG_SCHEME_CUSTOM = /^(?:ext|web)\+[a-z]+$/;
|
|
30
|
-
var REG_SCRIPT = /(?:java|vb)script/;
|
|
31
|
-
var REG_URL_ENC = /^%[\dA-F]{2}$/i;
|
|
32
38
|
var getURLEncodedString = (str) => {
|
|
33
39
|
if (!isString(str)) {
|
|
34
40
|
throw new TypeError(`Expected String but got ${getType(str)}.`);
|
|
@@ -63,7 +69,7 @@ var escapeURLEncodedHTMLChars = (ch) => {
|
|
|
63
69
|
var parseBase64 = (data) => {
|
|
64
70
|
if (!isString(data)) {
|
|
65
71
|
throw new TypeError(`Expected String but got ${getType(data)}.`);
|
|
66
|
-
} else if (!
|
|
72
|
+
} else if (!REG_B64.test(data)) {
|
|
67
73
|
throw new Error(`Invalid base64 data: ${data}`);
|
|
68
74
|
}
|
|
69
75
|
const bin = atob(data);
|
|
@@ -93,9 +99,9 @@ var parseURLEncodedNumCharRef = (str, nest = 0) => {
|
|
|
93
99
|
for (const item of items) {
|
|
94
100
|
const [numCharRef, value] = item;
|
|
95
101
|
let num;
|
|
96
|
-
if (
|
|
102
|
+
if (/^x[\dA-F]+/i.test(value)) {
|
|
97
103
|
num = parseInt(`0${value}`, HEX);
|
|
98
|
-
} else if (
|
|
104
|
+
} else if (/^\d+/.test(value)) {
|
|
99
105
|
num = parseInt(value);
|
|
100
106
|
}
|
|
101
107
|
if (Number.isInteger(num)) {
|
|
@@ -106,7 +112,7 @@ var parseURLEncodedNumCharRef = (str, nest = 0) => {
|
|
|
106
112
|
];
|
|
107
113
|
if (textCharCodes.has(num)) {
|
|
108
114
|
res = `${preNum}${String.fromCharCode(num)}${postNum}`;
|
|
109
|
-
if (
|
|
115
|
+
if (/#x?$/.test(preNum) || /^#(?:x(?:00)?[2-7]|\d)/.test(postNum)) {
|
|
110
116
|
res = parseURLEncodedNumCharRef(res, ++nest);
|
|
111
117
|
}
|
|
112
118
|
} else if (num < HEX * HEX) {
|
|
@@ -184,9 +190,9 @@ var URISchemes = class {
|
|
|
184
190
|
if (isString(uri)) {
|
|
185
191
|
try {
|
|
186
192
|
const { protocol } = new URL(uri);
|
|
187
|
-
const scheme = protocol.replace(
|
|
193
|
+
const scheme = protocol.replace(/:$/, "");
|
|
188
194
|
const schemeParts = scheme.split("+");
|
|
189
|
-
res = !REG_SCRIPT.test(scheme) &&
|
|
195
|
+
res = !REG_SCRIPT.test(scheme) && REG_SCHEME_EXT.test(scheme) || schemeParts.every((s) => this.#schemes.has(s));
|
|
190
196
|
} catch (e) {
|
|
191
197
|
res = false;
|
|
192
198
|
}
|
|
@@ -206,19 +212,6 @@ var URISchemes = class {
|
|
|
206
212
|
};
|
|
207
213
|
|
|
208
214
|
// bundle_wo_dompurify/mjs/sanitizer.js
|
|
209
|
-
var HEX2 = 16;
|
|
210
|
-
var REG_DATA_URL = /data:[\w#&+\-./;=]*,/;
|
|
211
|
-
var REG_DATA_URL_BASE64 = /data:[\w#&+\-./;=]*base64,[\w+/\-=]+/i;
|
|
212
|
-
var REG_DATA_URL_G = /data:[\w#&+\-./;=]*,[^"]+/g;
|
|
213
|
-
var REG_END_COLON2 = /:$/;
|
|
214
|
-
var REG_END_NUM = /(?:#|%23)$/;
|
|
215
|
-
var REG_END_QUEST = /(?<!(?:#|%23).*)(?:\?|%3F)$/;
|
|
216
|
-
var REG_HTML_SP = /[<>"'\s]/g;
|
|
217
|
-
var REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;
|
|
218
|
-
var REG_MIME_DOM = /^(?:text\/(?:ht|x)ml|application\/(?:[\w#&\-.;]+\+)?xml|image\/svg\+xml)/;
|
|
219
|
-
var REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;
|
|
220
|
-
var REG_TAG_QUOT = /%(?:2(?:2|7)|3(?:C|E))|[<>"']/;
|
|
221
|
-
var REG_URL_ENC_AMP = /%26/g;
|
|
222
215
|
var URLSanitizer = class extends URISchemes {
|
|
223
216
|
/* private fields */
|
|
224
217
|
#nest;
|
|
@@ -246,8 +239,8 @@ var URLSanitizer = class extends URISchemes {
|
|
|
246
239
|
const items = [...matchedDataUrls].reverse();
|
|
247
240
|
for (const item of items) {
|
|
248
241
|
let [dataUrl] = item;
|
|
249
|
-
if (
|
|
250
|
-
[dataUrl] =
|
|
242
|
+
if (REG_DATA_URL_B64.test(dataUrl)) {
|
|
243
|
+
[dataUrl] = REG_DATA_URL_B64.exec(dataUrl);
|
|
251
244
|
}
|
|
252
245
|
this.#nest++;
|
|
253
246
|
this.#recurse.add(dataUrl);
|
|
@@ -277,11 +270,11 @@ var URLSanitizer = class extends URISchemes {
|
|
|
277
270
|
if (!isString(dom)) {
|
|
278
271
|
throw new TypeError(`Expected String but got ${getType(dom)}.`);
|
|
279
272
|
}
|
|
280
|
-
let purifiedDom =
|
|
273
|
+
let purifiedDom = dompurify_default.sanitize(decodeURIComponent(dom));
|
|
281
274
|
if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {
|
|
282
275
|
purifiedDom = this.replace(purifiedDom);
|
|
283
276
|
}
|
|
284
|
-
purifiedDom = purifiedDom.replace(
|
|
277
|
+
purifiedDom = purifiedDom.replace(/(?:#|%23)$/, "").replace(/(?<!(?:#|%23).*)(?:\?|%3F)$/, "");
|
|
285
278
|
return encodeURI(purifiedDom);
|
|
286
279
|
}
|
|
287
280
|
/**
|
|
@@ -298,7 +291,7 @@ var URLSanitizer = class extends URISchemes {
|
|
|
298
291
|
* @returns {?string} - sanitized URL
|
|
299
292
|
*/
|
|
300
293
|
sanitize(url, opt) {
|
|
301
|
-
if (this.#nest >
|
|
294
|
+
if (this.#nest > HEX) {
|
|
302
295
|
this.#nest = 0;
|
|
303
296
|
throw new Error("Data URLs nested too deeply.");
|
|
304
297
|
}
|
|
@@ -378,7 +371,7 @@ var URLSanitizer = class extends URISchemes {
|
|
|
378
371
|
let sanitizedUrl;
|
|
379
372
|
if (super.verify(url)) {
|
|
380
373
|
const { hash, href, pathname, protocol, search } = new URL(url);
|
|
381
|
-
const scheme = protocol.replace(
|
|
374
|
+
const scheme = protocol.replace(/:$/, "");
|
|
382
375
|
const schemeParts = scheme.split("+");
|
|
383
376
|
let bool;
|
|
384
377
|
if (restrictScheme) {
|
|
@@ -407,7 +400,7 @@ var URLSanitizer = class extends URISchemes {
|
|
|
407
400
|
try {
|
|
408
401
|
const decodedData = parseURLEncodedNumCharRef(parsedData).trim();
|
|
409
402
|
const { protocol: dataScheme } = new URL(decodedData);
|
|
410
|
-
const dataSchemeParts = dataScheme.replace(
|
|
403
|
+
const dataSchemeParts = dataScheme.replace(/:$/, "").split("+");
|
|
411
404
|
if (dataSchemeParts.some((s) => REG_SCRIPT_BLOB.test(s))) {
|
|
412
405
|
urlToSanitize = "";
|
|
413
406
|
}
|
|
@@ -447,10 +440,10 @@ var URLSanitizer = class extends URISchemes {
|
|
|
447
440
|
urlToSanitize = urlToSanitize.substring(0, index);
|
|
448
441
|
}
|
|
449
442
|
if (urlToSanitize) {
|
|
450
|
-
sanitizedUrl = urlToSanitize.replace(
|
|
443
|
+
sanitizedUrl = urlToSanitize.replace(REG_TAG_QUOT_SPACE_G, getURLEncodedString).replace(/%26/g, escapeURLEncodedHTMLChars);
|
|
451
444
|
if (finalize) {
|
|
452
445
|
if (!isDataUrl) {
|
|
453
|
-
sanitizedUrl = sanitizedUrl.replace(
|
|
446
|
+
sanitizedUrl = sanitizedUrl.replace(REG_TAG_QUOT_ENC_G, escapeURLEncodedHTMLChars);
|
|
454
447
|
}
|
|
455
448
|
this.#nest = 0;
|
|
456
449
|
}
|
|
@@ -497,7 +490,7 @@ var URLSanitizer = class extends URISchemes {
|
|
|
497
490
|
if (sanitizedUrl) {
|
|
498
491
|
const urlObj = new URL(sanitizedUrl);
|
|
499
492
|
const { pathname, protocol } = urlObj;
|
|
500
|
-
const schemeParts = protocol.replace(
|
|
493
|
+
const schemeParts = protocol.replace(/:$/, "").split("+");
|
|
501
494
|
const isDataUrl = schemeParts.includes("data");
|
|
502
495
|
parsedUrl.set("valid", true);
|
|
503
496
|
if (isDataUrl) {
|
|
@@ -548,7 +541,7 @@ var sanitizeURL = async (url, opt = {
|
|
|
548
541
|
let scheme;
|
|
549
542
|
try {
|
|
550
543
|
const { protocol } = new URL(url);
|
|
551
|
-
scheme = protocol.replace(
|
|
544
|
+
scheme = protocol.replace(/:$/, "");
|
|
552
545
|
} catch (e) {
|
|
553
546
|
}
|
|
554
547
|
if (scheme === "blob") {
|
|
@@ -589,7 +582,7 @@ var sanitizeURLSync = (url, opt) => {
|
|
|
589
582
|
let scheme;
|
|
590
583
|
try {
|
|
591
584
|
const { protocol } = new URL(url);
|
|
592
|
-
scheme = protocol.replace(
|
|
585
|
+
scheme = protocol.replace(/:$/, "");
|
|
593
586
|
} catch (e) {
|
|
594
587
|
}
|
|
595
588
|
if (scheme === "blob") {
|
|
@@ -610,8 +603,9 @@ var isURI = async (uri) => {
|
|
|
610
603
|
return res;
|
|
611
604
|
};
|
|
612
605
|
var isURISync = (uri) => urlSanitizer.verify(uri);
|
|
606
|
+
var sanitizer_default = urlSanitizer;
|
|
613
607
|
export {
|
|
614
|
-
|
|
608
|
+
sanitizer_default as default,
|
|
615
609
|
isURI,
|
|
616
610
|
isURISync,
|
|
617
611
|
parseURL,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * dompurify.js\n */\n\nconst { DOMPurify } = globalThis;\n\nexport {\n DOMPurify as default\n};\n", "/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ark\",\"at\",\"attachment\",\"aw\",\"barion\",\"beshare\",\"bitcoin\",\"bitcoincash\",\"blob\",\"bolo\",\"browserext\",\"cabal\",\"calculator\",\"callto\",\"cap\",\"cast\",\"casts\",\"chrome\",\"chrome-extension\",\"cid\",\"coap\",\"coaps\",\"com-eventbrite-attendee\",\"content\",\"content-type\",\"crid\",\"cstr\",\"cvs\",\"dab\",\"dat\",\"data\",\"dav\",\"dhttp\",\"diaspora\",\"dict\",\"did\",\"dis\",\"dlna-playcontainer\",\"dlna-playsingle\",\"dns\",\"dntp\",\"doi\",\"dpp\",\"drm\",\"dtmi\",\"dtn\",\"dvb\",\"dvx\",\"dweb\",\"ed2k\",\"eid\",\"elsi\",\"embedded\",\"ens\",\"ethereum\",\"example\",\"facetime\",\"feed\",\"feedready\",\"fido\",\"file\",\"finger\",\"first-run-pen-experience\",\"fish\",\"fm\",\"ftp\",\"fuchsia-pkg\",\"geo\",\"gg\",\"git\",\"gitoid\",\"gizmoproject\",\"go\",\"gopher\",\"graph\",\"gtalk\",\"h323\",\"ham\",\"hcap\",\"hcp\",\"http\",\"https\",\"hxxp\",\"hxxps\",\"hydrazone\",\"hyper\",\"iax\",\"icap\",\"icon\",\"im\",\"imap\",\"info\",\"iotdisco\",\"ipfs\",\"ipn\",\"ipns\",\"ipp\",\"ipps\",\"irc\",\"irc6\",\"ircs\",\"iris\",\"iris.beep\",\"iris.lwz\",\"iris.xpc\",\"iris.xpcs\",\"isostore\",\"itms\",\"jabber\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"lbry\",\"ldap\",\"ldaps\",\"leaptofrogans\",\"lid\",\"lorawan\",\"lpa\",\"lvlt\",\"magnet\",\"mailto\",\"maps\",\"market\",\"matrix\",\"message\",\"microsoft.windows.camera\",\"microsoft.windows.camera.multipicker\",\"microsoft.windows.camera.picker\",\"mid\",\"mms\",\"mongodb\",\"moz\",\"moz-extension\",\"ms-access\",\"ms-appinstaller\",\"ms-browser-extension\",\"ms-calculator\",\"ms-drive-to\",\"ms-enrollment\",\"ms-excel\",\"ms-eyecontrolspeech\",\"ms-gamebarservices\",\"ms-gamingoverlay\",\"ms-getoffice\",\"ms-help\",\"ms-infopath\",\"ms-inputapp\",\"ms-launchremotedesktop\",\"ms-lockscreencomponent-config\",\"ms-media-stream-id\",\"ms-meetnow\",\"ms-mixedrealitycapture\",\"ms-mobileplans\",\"ms-newsandinterests\",\"ms-officeapp\",\"ms-people\",\"ms-powerpoint\",\"ms-project\",\"ms-publisher\",\"ms-remotedesktop\",\"ms-remotedesktop-launch\",\"ms-restoretabcompanion\",\"ms-screenclip\",\"ms-screensketch\",\"ms-search\",\"ms-search-repair\",\"ms-secondary-screen-controller\",\"ms-secondary-screen-setup\",\"ms-settings\",\"ms-settings-airplanemode\",\"ms-settings-bluetooth\",\"ms-settings-camera\",\"ms-settings-cellular\",\"ms-settings-cloudstorage\",\"ms-settings-connectabledevices\",\"ms-settings-displays-topology\",\"ms-settings-emailandaccounts\",\"ms-settings-language\",\"ms-settings-location\",\"ms-settings-lock\",\"ms-settings-nfctransactions\",\"ms-settings-notifications\",\"ms-settings-power\",\"ms-settings-privacy\",\"ms-settings-proximity\",\"ms-settings-screenrotation\",\"ms-settings-wifi\",\"ms-settings-workplace\",\"ms-spd\",\"ms-stickers\",\"ms-sttoverlay\",\"ms-transit-to\",\"ms-useractivityset\",\"ms-virtualtouchpad\",\"ms-visio\",\"ms-walk-to\",\"ms-whiteboard\",\"ms-whiteboard-cmd\",\"ms-word\",\"msnim\",\"msrp\",\"msrps\",\"mss\",\"mt\",\"mtqp\",\"mumble\",\"mupdate\",\"mvn\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"notes\",\"num\",\"ocf\",\"oid\",\"onenote\",\"onenote-cmd\",\"opaquelocktoken\",\"openid\",\"openpgp4fpr\",\"otpauth\",\"palm\",\"paparazzi\",\"payment\",\"payto\",\"pkcs11\",\"platform\",\"pop\",\"pres\",\"proxy\",\"psyc\",\"pttp\",\"pwid\",\"qb\",\"query\",\"quic-transport\",\"redis\",\"rediss\",\"reload\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmfp\",\"rtmp\",\"rtsp\",\"rtsps\",\"rtspu\",\"sarif\",\"secondlife\",\"secret-token\",\"service\",\"session\",\"sftp\",\"sgn\",\"shc\",\"sieve\",\"simpleledger\",\"simplex\",\"sip\",\"sips\",\"skype\",\"smb\",\"smp\",\"sms\",\"smtp\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"soldat\",\"spiffe\",\"spotify\",\"ssb\",\"ssh\",\"starknet\",\"steam\",\"stun\",\"stuns\",\"submit\",\"svn\",\"swh\",\"swid\",\"swidpath\",\"tag\",\"taler\",\"teamspeak\",\"tel\",\"teliaeid\",\"telnet\",\"tftp\",\"things\",\"thismessage\",\"tip\",\"tn3270\",\"tool\",\"turn\",\"turns\",\"tv\",\"udp\",\"unreal\",\"urn\",\"ut2004\",\"uuid-in-package\",\"v-event\",\"vemmi\",\"ventrilo\",\"ves\",\"view-source\",\"vnc\",\"vscode\",\"vscode-insiders\",\"vsls\",\"w3\",\"wcr\",\"web3\",\"webcal\",\"wifi\",\"ws\",\"wss\",\"wtai\",\"wyciwyg\",\"xcon\",\"xcon-userid\",\"xfire\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"xri\",\"ymsgr\",\"z39.50r\",\"z39.50s\"]\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\w+/\\-=]+$/;\nconst REG_END_COLON = /:$/;\nconst REG_NUM_DECI = /^\\d+/;\nconst REG_NUM_HEAD = /#x?$/;\nconst REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\\d)/;\nconst REG_NUM_HEX = /^x[\\dA-F]+/i;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/gi;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n\n/**\n * get URL encoded string\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n if (isString(ch) && REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getURLEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getURLEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n * @param {string} str - string\n * @param {number} [nest] - nest level\n * @returns {string} - parsed string\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (REG_NUM_HEX.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (REG_NUM_DECI.test(value)) {\n num = parseInt(value);\n }\n if (Number.isInteger(num)) {\n const { index } = item;\n const [preNum, postNum] = [\n res.substring(0, index),\n res.substring(index + numCharRef.length)\n ];\n if (textCharCodes.has(num)) {\n res = `${preNum}${String.fromCharCode(num)}${postNum}`;\n if (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.test(postNum)) {\n res = parseURLEncodedNumCharRef(res, ++nest);\n }\n } else if (num < HEX * HEX) {\n res = `${preNum}${postNum}`;\n }\n }\n }\n }\n return res;\n};\n\n/**\n * create data URL from blob\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n});\n\n/**\n * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * verify URI\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\n verify(uri) {\n let res;\n if (isString(uri)) {\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n\n /**\n * reset schemes\n * @returns {void}\n */\n reset() {\n this.#schemes.clear();\n for (const scheme of uriSchemes) {\n this.#schemes.add(scheme);\n }\n }\n};\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n createDataURLFromBlob, escapeURLEncodedHTMLChars, getURLEncodedString,\n parseBase64, parseURLEncodedNumCharRef, URISchemes\n} from './uri-util.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_DATA_URL = /data:[\\w#&+\\-./;=]*,/;\nconst REG_DATA_URL_BASE64 = /data:[\\w#&+\\-./;=]*base64,[\\w+/\\-=]+/i;\nconst REG_DATA_URL_G = /data:[\\w#&+\\-./;=]*,[^\"]+/g;\nconst REG_END_COLON = /:$/;\nconst REG_END_NUM = /(?:#|%23)$/;\nconst REG_END_QUEST = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:[\\w#&\\-.;]+\\+)?xml|image\\/svg\\+xml)/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_TAG_QUOT = /%(?:2(?:2|7)|3(?:C|E))|[<>\"']/;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * @typedef {object} ParsedURL - object with additional props based on URL API\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} [data] - parsed result of data URL, `null`able\n * @property {string} [data.mime] - MIME type\n * @property {boolean} [data.base64] - is base64 encoded\n * @property {string} [data.data] - data part of the data URL\n * @property {string} [href] - sanitized URL input\n * @property {string} [origin] - scheme, domain and port of the sanitized URL\n * @property {string} [protocol] - protocol scheme of the sanitized URL\n * @property {string} [username] - username specified before the domain name\n * @property {string} [password] - password specified before the domain name\n * @property {string} [host] - domain and port of the sanitized URL\n * @property {string} [hostname] - domain of the sanitized URL\n * @property {string} [port] - port number of the sanitized URL\n * @property {string} [pathname] - path of the sanitized URL\n * @property {string} [search] - query string of the sanitized URL\n * @property {string} [hash] - fragment identifier of the sanitized URL\n */\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n * @param {string} data - data URL\n * @returns {string} - replaced data URL\n */\n replace(data) {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n let replacedData = data;\n if (REG_DATA_URL.test(replacedData)) {\n const matchedDataUrls = replacedData.matchAll(REG_DATA_URL_G);\n const items = [...matchedDataUrls].reverse();\n for (const item of items) {\n let [dataUrl] = item;\n if (REG_DATA_URL_BASE64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n replacedData.substring(0, index),\n replacedData.substring(index + dataUrl.length)\n ];\n if (parsedDataUrl) {\n replacedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n } else {\n replacedData = `${preDataUrl}${postDataUrl}`;\n }\n }\n }\n return replacedData;\n }\n\n /**\n * purify URL encoded DOM\n * @param {string} dom - DOM string\n * @returns {string} - purified DOM string\n */\n purify(dom) {\n if (!isString(dom)) {\n throw new TypeError(`Expected String but got ${getType(dom)}.`);\n }\n let purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom =\n purifiedDom.replace(REG_END_NUM, '').replace(REG_END_QUEST, '');\n return encodeURI(purifiedDom);\n };\n\n /**\n * sanitize URL\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` URLs should be converted to `data` URLs\n * `javascript` and `vbscript` schemes can not be allowed\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n const tempScheme = new Set();\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = href;\n if (isDataUrl) {\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n parsedData = parseBase64(data);\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } = new URL(decodedData);\n const dataSchemeParts =\n dataScheme.replace(REG_END_COLON, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n if (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getURLEncodedString)\n .replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n if (tempScheme.size) {\n tempScheme.forEach(item => {\n super.remove(item);\n });\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {ParsedURL} - result with additional props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const parsedUrl = new Map([\n ['input', url]\n ]);\n let sanitizedUrl;\n if (this.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n sanitizedUrl = url;\n } else {\n sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n }\n }\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(REG_END_COLON, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n\n /**\n * reset sanitizer\n * @returns {void}\n */\n reset() {\n super.reset();\n this.#nest = 0;\n this.#recurse.clear();\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * sanitize URL async\n * NOTE: `blob`, `data` and `file` schemes must be explicitly allowed\n * given a `blob` URL, returns a sanitized `data` URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(REG_END_COLON, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\n }\n if (data) {\n if (Array.isArray(only)) {\n if (!only.includes('data')) {\n only.push('data');\n }\n } else if (Array.isArray(allow)) {\n if (!allow.includes('data')) {\n allow.push('data');\n }\n if (Array.isArray(deny) && deny.includes('data')) {\n const i = deny.indexOf('data');\n deny.splice(i, 1);\n }\n }\n res = urlSanitizer.sanitize(data, opt);\n }\n }\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(REG_END_COLON, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * parse URL async\n * @param {string} url - URL\n * @returns {Promise.<ParsedURL>} - result\n */\nexport const parseURL = async url => {\n const res = urlSanitizer.parse(url);\n return res;\n};\n\n/**\n * parse URL sync\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * is URI async\n * @param {string} uri - URI\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * is URI sync\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": [
|
|
3
|
+
"sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/constant.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * dompurify.js\n */\n\nconst { DOMPurify } = globalThis;\n\nexport default DOMPurify;\n", "/**\n * constant.js\n */\n\n/* numeric */\nexport const HEX = 16;\nexport const TYPE_FROM = 8;\nexport const TYPE_TO = -1;\n\n/* regexp */\nexport const REG_B64 = /^[\\w+/=-]+$/;\nexport const REG_CHARSET = /^charset=([\\w#&.;-]+)$/;\nexport const REG_DATA_URL = /data:[\\w#&+./;=-]*,/;\nexport const REG_DATA_URL_B64 = /data:[\\w#&+./;=^]*base64,[\\w+/=-]+/i;\nexport const REG_DATA_URL_G = /data:[\\w#&+./;=-]*,[^\"]+/g;\nexport const REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/gi;\nexport const REG_MIME_DOM =\n /^(?:application\\/(?:[\\w#&.;-]+\\+)?x|image\\/svg\\+x|text\\/(?:ht|x))ml;?/;\nexport const REG_MIME_TEXT = /^text\\/[\\w#&.;-]+/;\nexport const REG_SCHEME = /^[a-z][\\da-z+.-]*$/;\nexport const REG_SCHEME_EXT = /^(?:ext|web)\\+[a-z]+$/;\nexport const REG_SCRIPT = /(?:java|vb)script/;\nexport const REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nexport const REG_TAG_QUOT = /%(?:2[27]|3[CE])|[<>\"']/;\nexport const REG_TAG_QUOT_ENC_G = /%(?:2[27]|3[CE])/g;\nexport const REG_TAG_QUOT_SPACE_G = /[<>\"'\\s]/g;\nexport const REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n", "/**\n * common.js\n */\n\n/* shared */\nimport { TYPE_FROM, TYPE_TO } from './constant.js';\n\n/**\n * get type\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ark\",\"at\",\"attachment\",\"aw\",\"barion\",\"beshare\",\"bitcoin\",\"bitcoincash\",\"blob\",\"bolo\",\"brid\",\"browserext\",\"cabal\",\"calculator\",\"callto\",\"cap\",\"cast\",\"casts\",\"chrome\",\"chrome-extension\",\"cid\",\"coap\",\"coaps\",\"com-eventbrite-attendee\",\"content\",\"content-type\",\"crid\",\"cstr\",\"cvs\",\"dab\",\"dat\",\"data\",\"dav\",\"dhttp\",\"diaspora\",\"dict\",\"did\",\"dis\",\"dlna-playcontainer\",\"dlna-playsingle\",\"dns\",\"dntp\",\"doi\",\"dpp\",\"drm\",\"dtmi\",\"dtn\",\"dvb\",\"dvx\",\"dweb\",\"ed2k\",\"eid\",\"elsi\",\"embedded\",\"ens\",\"ethereum\",\"example\",\"facetime\",\"feed\",\"feedready\",\"fido\",\"file\",\"finger\",\"first-run-pen-experience\",\"fish\",\"fm\",\"ftp\",\"fuchsia-pkg\",\"geo\",\"gg\",\"git\",\"gitoid\",\"gizmoproject\",\"go\",\"gopher\",\"graph\",\"gtalk\",\"h323\",\"ham\",\"hcap\",\"hcp\",\"http\",\"https\",\"hxxp\",\"hxxps\",\"hydrazone\",\"hyper\",\"iax\",\"icap\",\"icon\",\"im\",\"imap\",\"info\",\"iotdisco\",\"ipfs\",\"ipn\",\"ipns\",\"ipp\",\"ipps\",\"irc\",\"irc6\",\"ircs\",\"iris\",\"iris.beep\",\"iris.lwz\",\"iris.xpc\",\"iris.xpcs\",\"isostore\",\"itms\",\"jabber\",\"jar\",\"jms\",\"keyparc\",\"lastfm\",\"lbry\",\"ldap\",\"ldaps\",\"leaptofrogans\",\"lid\",\"lorawan\",\"lpa\",\"lvlt\",\"magnet\",\"mailto\",\"maps\",\"market\",\"matrix\",\"message\",\"microsoft.windows.camera\",\"microsoft.windows.camera.multipicker\",\"microsoft.windows.camera.picker\",\"mid\",\"mms\",\"mongodb\",\"moz\",\"moz-extension\",\"ms-access\",\"ms-appinstaller\",\"ms-browser-extension\",\"ms-calculator\",\"ms-drive-to\",\"ms-enrollment\",\"ms-excel\",\"ms-eyecontrolspeech\",\"ms-gamebarservices\",\"ms-gamingoverlay\",\"ms-getoffice\",\"ms-help\",\"ms-infopath\",\"ms-inputapp\",\"ms-launchremotedesktop\",\"ms-lockscreencomponent-config\",\"ms-media-stream-id\",\"ms-meetnow\",\"ms-mixedrealitycapture\",\"ms-mobileplans\",\"ms-newsandinterests\",\"ms-officeapp\",\"ms-people\",\"ms-powerpoint\",\"ms-project\",\"ms-publisher\",\"ms-remotedesktop\",\"ms-remotedesktop-launch\",\"ms-restoretabcompanion\",\"ms-screenclip\",\"ms-screensketch\",\"ms-search\",\"ms-search-repair\",\"ms-secondary-screen-controller\",\"ms-secondary-screen-setup\",\"ms-settings\",\"ms-settings-airplanemode\",\"ms-settings-bluetooth\",\"ms-settings-camera\",\"ms-settings-cellular\",\"ms-settings-cloudstorage\",\"ms-settings-connectabledevices\",\"ms-settings-displays-topology\",\"ms-settings-emailandaccounts\",\"ms-settings-language\",\"ms-settings-location\",\"ms-settings-lock\",\"ms-settings-nfctransactions\",\"ms-settings-notifications\",\"ms-settings-power\",\"ms-settings-privacy\",\"ms-settings-proximity\",\"ms-settings-screenrotation\",\"ms-settings-wifi\",\"ms-settings-workplace\",\"ms-spd\",\"ms-stickers\",\"ms-sttoverlay\",\"ms-transit-to\",\"ms-useractivityset\",\"ms-virtualtouchpad\",\"ms-visio\",\"ms-walk-to\",\"ms-whiteboard\",\"ms-whiteboard-cmd\",\"ms-word\",\"msnim\",\"msrp\",\"msrps\",\"mss\",\"mt\",\"mtqp\",\"mumble\",\"mupdate\",\"mvn\",\"news\",\"nfs\",\"ni\",\"nih\",\"nntp\",\"notes\",\"num\",\"ocf\",\"oid\",\"onenote\",\"onenote-cmd\",\"opaquelocktoken\",\"openid\",\"openpgp4fpr\",\"otpauth\",\"palm\",\"paparazzi\",\"payment\",\"payto\",\"pkcs11\",\"platform\",\"pop\",\"pres\",\"proxy\",\"psyc\",\"pttp\",\"pwid\",\"qb\",\"query\",\"quic-transport\",\"redis\",\"rediss\",\"reload\",\"res\",\"resource\",\"rmi\",\"rsync\",\"rtmfp\",\"rtmp\",\"rtsp\",\"rtsps\",\"rtspu\",\"sarif\",\"secondlife\",\"secret-token\",\"service\",\"session\",\"sftp\",\"sgn\",\"shc\",\"sieve\",\"simpleledger\",\"simplex\",\"sip\",\"sips\",\"skype\",\"smb\",\"smp\",\"sms\",\"smtp\",\"snmp\",\"soap.beep\",\"soap.beeps\",\"soldat\",\"spiffe\",\"spotify\",\"ssb\",\"ssh\",\"starknet\",\"steam\",\"stun\",\"stuns\",\"submit\",\"svn\",\"swh\",\"swid\",\"swidpath\",\"tag\",\"taler\",\"teamspeak\",\"tel\",\"teliaeid\",\"telnet\",\"tftp\",\"things\",\"thismessage\",\"tip\",\"tn3270\",\"tool\",\"turn\",\"turns\",\"tv\",\"udp\",\"unreal\",\"urn\",\"ut2004\",\"uuid-in-package\",\"v-event\",\"vemmi\",\"ventrilo\",\"ves\",\"view-source\",\"vnc\",\"vscode\",\"vscode-insiders\",\"vsls\",\"w3\",\"wcr\",\"web3\",\"webcal\",\"wifi\",\"ws\",\"wss\",\"wtai\",\"wyciwyg\",\"xcon\",\"xcon-userid\",\"xfire\",\"xmlrpc.beep\",\"xmlrpc.beeps\",\"xmpp\",\"xri\",\"ymsgr\",\"z39.50r\",\"z39.50s\"]\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\nimport {\n HEX, REG_B64, REG_NUM_REF, REG_SCHEME, REG_SCHEME_EXT, REG_SCRIPT, REG_URL_ENC\n} from './constant.js';\n\n/**\n * get URL encoded string\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n if (isString(ch) && REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getURLEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_B64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getURLEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n * @param {string} str - string\n * @param {number} [nest] - nest level\n * @returns {string} - parsed string\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^x[\\dA-F]+/i.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (/^\\d+/.test(value)) {\n num = parseInt(value);\n }\n if (Number.isInteger(num)) {\n const { index } = item;\n const [preNum, postNum] = [\n res.substring(0, index),\n res.substring(index + numCharRef.length)\n ];\n if (textCharCodes.has(num)) {\n res = `${preNum}${String.fromCharCode(num)}${postNum}`;\n if (/#x?$/.test(preNum) || /^#(?:x(?:00)?[2-7]|\\d)/.test(postNum)) {\n res = parseURLEncodedNumCharRef(res, ++nest);\n }\n } else if (num < HEX * HEX) {\n res = `${preNum}${postNum}`;\n }\n }\n }\n }\n return res;\n};\n\n/**\n * create data URL from blob\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n});\n\n/**\n * URI schemes\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * verify URI\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\n verify(uri) {\n let res;\n if (isString(uri)) {\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_EXT.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n\n /**\n * reset schemes\n * @returns {void}\n */\n reset() {\n this.#schemes.clear();\n for (const scheme of uriSchemes) {\n this.#schemes.add(scheme);\n }\n }\n};\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n createDataURLFromBlob, escapeURLEncodedHTMLChars, getURLEncodedString,\n parseBase64, parseURLEncodedNumCharRef, URISchemes\n} from './uri-util.js';\nimport {\n HEX, REG_DATA_URL, REG_DATA_URL_B64, REG_DATA_URL_G, REG_MIME_DOM,\n REG_SCRIPT_BLOB, REG_TAG_QUOT, REG_TAG_QUOT_ENC_G, REG_TAG_QUOT_SPACE_G\n} from './constant.js';\n\n/* typedef */\n/**\n * @typedef {object} ParsedURL - object with additional props based on URL API\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} [data] - parsed result of data URL, `null`able\n * @property {string} [data.mime] - MIME type\n * @property {boolean} [data.base64] - is base64 encoded\n * @property {string} [data.data] - data part of the data URL\n * @property {string} [href] - sanitized URL input\n * @property {string} [origin] - scheme, domain and port of the sanitized URL\n * @property {string} [protocol] - protocol scheme of the sanitized URL\n * @property {string} [username] - username specified before the domain name\n * @property {string} [password] - password specified before the domain name\n * @property {string} [host] - domain and port of the sanitized URL\n * @property {string} [hostname] - domain of the sanitized URL\n * @property {string} [port] - port number of the sanitized URL\n * @property {string} [pathname] - path of the sanitized URL\n * @property {string} [search] - query string of the sanitized URL\n * @property {string} [hash] - fragment identifier of the sanitized URL\n */\n\n/**\n * URL sanitizer\n */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n * @param {string} data - data URL\n * @returns {string} - replaced data URL\n */\n replace(data) {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n let replacedData = data;\n if (REG_DATA_URL.test(replacedData)) {\n const matchedDataUrls = replacedData.matchAll(REG_DATA_URL_G);\n const items = [...matchedDataUrls].reverse();\n for (const item of items) {\n let [dataUrl] = item;\n if (REG_DATA_URL_B64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_B64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n replacedData.substring(0, index),\n replacedData.substring(index + dataUrl.length)\n ];\n if (parsedDataUrl) {\n replacedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n } else {\n replacedData = `${preDataUrl}${postDataUrl}`;\n }\n }\n }\n return replacedData;\n }\n\n /**\n * purify URL encoded DOM\n * @param {string} dom - DOM string\n * @returns {string} - purified DOM string\n */\n purify(dom) {\n if (!isString(dom)) {\n throw new TypeError(`Expected String but got ${getType(dom)}.`);\n }\n let purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom = purifiedDom.replace(/(?:#|%23)$/, '')\n .replace(/(?<!(?:#|%23).*)(?:\\?|%3F)$/, '');\n return encodeURI(purifiedDom);\n };\n\n /**\n * sanitize URL\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` URLs should be converted to `data` URLs\n * `javascript` and `vbscript` schemes can not be allowed\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n const tempScheme = new Set();\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n tempScheme.add(item);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = href;\n if (isDataUrl) {\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n parsedData = parseBase64(data);\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } = new URL(decodedData);\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n if (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_TAG_QUOT_SPACE_G, getURLEncodedString)\n .replace(/%26/g, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_TAG_QUOT_ENC_G, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n if (tempScheme.size) {\n tempScheme.forEach(item => {\n super.remove(item);\n });\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {ParsedURL} - result with additional props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const parsedUrl = new Map([\n ['input', url]\n ]);\n let sanitizedUrl;\n if (this.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n sanitizedUrl = url;\n } else {\n sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n }\n }\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n\n /**\n * reset sanitizer\n * @returns {void}\n */\n reset() {\n super.reset();\n this.#nest = 0;\n this.#recurse.clear();\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * sanitize URL async\n * NOTE: `blob`, `data` and `file` schemes must be explicitly allowed\n * given a `blob` URL, returns a sanitized `data` URL\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\n }\n if (data) {\n if (Array.isArray(only)) {\n if (!only.includes('data')) {\n only.push('data');\n }\n } else if (Array.isArray(allow)) {\n if (!allow.includes('data')) {\n allow.push('data');\n }\n if (Array.isArray(deny) && deny.includes('data')) {\n const i = deny.indexOf('data');\n deny.splice(i, 1);\n }\n }\n res = urlSanitizer.sanitize(data, opt);\n }\n }\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * parse URL async\n * @param {string} url - URL\n * @returns {Promise.<ParsedURL>} - result\n */\nexport const parseURL = async url => {\n const res = urlSanitizer.parse(url);\n return res;\n};\n\n/**\n * parse URL sync\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * is URI async\n * @param {string} uri - URI\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * is URI sync\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport default urlSanitizer;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var{DOMPurify:B}=globalThis;var b=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var z=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var G=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","at","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","dhttp","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lid","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-launchremotedesktop","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openid","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var{FileReader:q}=globalThis;var U=16,te=/^[\w+/\-=]+$/,se=/:$/,re=/^\d+/,ae=/#x?$/,ie=/^#(?:x(?:00)?[2-7]|\d)/,oe=/^x[\dA-F]+/i,ne=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,ce=/^[a-z][\da-z+\-.]*$/,pe=/^(?:ext|web)\+[a-z]+$/,Y=/(?:java|vb)script/,le=/^%[\dA-F]{2}$/i,T=t=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(U).toUpperCase()}`);return e.join("")},j=t=>{d(t)&&le.test(t)&&(t=t.toUpperCase());let[e,s,r,a,o,n]=["&","#","<",">",'"',"'"].map(T),i;return t===e?i=`${e}amp;`:t===r?i=`${e}lt;`:t===a?i=`${e}gt;`:t===o?i=`${e}quot;`:t===n?i=`${e}${s}39;`:i=t,i},X=t=>{if(d(t)){if(!te.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${b(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(o=>o.charCodeAt(0))),r=new Set(z),a;return s.every(o=>r.has(o))?a=e.replace(/\s/g,T):a=t,a},M=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);if(Number.isInteger(e)){if(e>U)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${b(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let r=new Set(z),a=[...s.matchAll(ne)].reverse();for(let o of a){let[n,i]=o,p;if(oe.test(i)?p=parseInt(`0${i}`,U):re.test(i)&&(p=parseInt(i)),Number.isInteger(p)){let{index:u}=o,[l,f]=[s.substring(0,u),s.substring(u+n.length)];r.has(p)?(s=`${l}${String.fromCharCode(p)}${f}`,(ae.test(l)||ie.test(f))&&(s=M(s,++e))):p<U*U&&(s=`${l}${f}`)}}}return s},Q=t=>new Promise((e,s)=>{let r=new q;r.addEventListener("error",()=>s(r.error)),r.addEventListener("abort",()=>e(r.result)),r.addEventListener("load",()=>e(r.result)),r.readAsDataURL(t)}),A=class{#e;constructor(){this.#e=new Set(G)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(Y.test(e)||!ce.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${b(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}verify(e){let s;if(d(e))try{let{protocol:r}=new URL(e),a=r.replace(se,""),o=a.split("+");s=!Y.test(a)&&pe.test(a)||o.every(n=>this.#e.has(n))}catch{s=!1}return!!s}reset(){this.#e.clear();for(let e of G)this.#e.add(e)}};var me=16,O=/data:[\w#&+\-./;=]*,/,J=/data:[\w#&+\-./;=]*base64,[\w+/\-=]+/i,de=/data:[\w#&+\-./;=]*,[^"]+/g,v=/:$/,fe=/(?:#|%23)$/,he=/(?<!(?:#|%23).*)(?:\?|%3F)$/,ue=/[<>"'\s]/g,ge=/%(?:2(?:2|7)|3(?:C|E))/g,ye=/^(?:text\/(?:ht|x)ml|application\/(?:[\w#&\-.;]+\+)?xml|image\/svg\+xml)/,N=/(?:java|vb)script|blob/,K=/%(?:2(?:2|7)|3(?:C|E))|[<>"']/,be=/%26/g,I=class extends A{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=e;if(O.test(s)){let a=[...s.matchAll(de)].reverse();for(let o of a){let[n]=o;J.test(n)&&([n]=J.exec(n)),this.#e++,this.#t.add(n);let i=this.sanitize(n,{allow:["data"]}),{index:p}=o,[u,l]=[s.substring(0,p),s.substring(p+n.length)];i?s=`${u}${i}${l}`:s=`${u}${l}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=B.sanitize(decodeURIComponent(e));return s&&O.test(s)&&(s=this.replace(s)),s=s.replace(fe,"").replace(he,""),encodeURI(s)}sanitize(e,s){if(this.#e>me)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:r,deny:a,only:o,remove:n}=s??{},i=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=new Set,u=!1;if(Array.isArray(o)&&o.length){let f=super.get();for(let m of f)i.set(m,!1);let c=Object.values(o);for(let m of c)if(d(m)&&(m=m.trim(),!N.test(m))){if(super.has(m))i.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&(i.set(m,!0),p.add(m))}!u&&i.has(m)&&(u=i.get(m))}}else{if(Array.isArray(r)&&r.length){let f=Object.values(r);for(let c of f)if(d(c)&&(c=c.trim(),!N.test(c)))if(super.has(c))i.set(c,!0);else{try{super.add(c)}catch{}super.has(c)&&(i.set(c,!0),p.add(c))}}if(Array.isArray(a)&&a.length){let f=Object.values(a);for(let c of f)d(c)&&(c=c.trim(),c&&i.set(c,!1))}}let l;if(super.verify(e)){let{hash:f,href:c,pathname:m,protocol:E,search:_}=new URL(e),C=E.replace(v,""),k=C.split("+"),L;if(u)L=k.every(y=>i.get(y));else for(let[y,x]of i.entries())if(L=x||C!==y&&k.every(h=>h!==y),!L)break;if(L){let y=k.includes("data"),x,h=c;if(y){let[R,...D]=m.split(","),S=`${D.join(",")}${_}${f}`,$=R.split(";"),P=$[$.length-1]==="base64",g=S;P&&(g=X(S));try{let H=M(g).trim(),{protocol:V}=new URL(H);V.replace(v,"").split("+").some(W=>N.test(W))&&(h="")}catch{}let F=O.test(g);g!==S||F?F?g=this.replace(g):this.#t.has(e)?this.#t.delete(e):x=!0:this.#t.has(e)?this.#t.delete(e):x=!0,(!R||ye.test(R))&&(g=this.purify(g)),h&&g?(P&&g!==S&&$.pop(),h=`${C}:${$.join(";")},${g}`):h=""}else x=!0;if(!y&&n&&K.test(h)){let R=K.exec(h),{index:D}=R;h=h.substring(0,D)}h?(l=h.replace(ue,T).replace(be,j),x&&(y||(l=l.replace(ge,j)),this.#e=0)):this.#e=0}p.size&&p.forEach(y=>{super.remove(y)})}return l||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let r=new Map([["input",e]]),a;if(this.verify(e)){let{protocol:o}=new URL(e);o==="blob:"?a=e:a=this.sanitize(e,s??{allow:["data","file"]})}if(a){let o=new URL(a),{pathname:n,protocol:i}=o,u=i.replace(v,"").split("+").includes("data");if(r.set("valid",!0),u){let l=new Map,[f,...c]=n.split(","),m=`${c.join(",")}`,E=f.split(";"),_=E[E.length-1]==="base64";_&&E.pop(),l.set("mime",E.join(";")),l.set("base64",_),l.set("data",m),r.set("data",Object.fromEntries(l))}else r.set("data",null);for(let l in o){let f=o[l];d(f)&&r.set(l,f)}}else r.set("valid",!1);return Object.fromEntries(r)}reset(){super.reset(),this.#e=0,this.#t.clear()}},w=new I,we=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(t&&d(t)){let r;try{let{protocol:a}=new URL(t);r=a.replace(v,"")}catch{}if(r==="blob"){let{allow:a,deny:o,only:n}=e;if(Array.isArray(a)&&a.includes("blob")&&!(Array.isArray(o)&&o.includes("blob"))||Array.isArray(n)&&n.includes("blob")){let i;try{i=await fetch(t).then(p=>p.blob()).then(Q)}catch{}if(i){if(Array.isArray(n))n.includes("data")||n.push("data");else if(Array.isArray(a)&&(a.includes("data")||a.push("data"),Array.isArray(o)&&o.includes("data"))){let p=o.indexOf("data");o.splice(p,1)}s=w.sanitize(i,e)}}URL.revokeObjectURL(t)}else r&&(s=w.sanitize(t,e))}return s||null},Ee=(t,e)=>{let s;if(t&&d(t)){let r;try{let{protocol:a}=new URL(t);r=a.replace(v,"")}catch{}r==="blob"?URL.revokeObjectURL(t):r&&(s=w.sanitize(t,e))}return s||null},xe=async t=>w.parse(t),Re=t=>w.parse(t),Ue=async t=>w.verify(t),ve=t=>w.verify(t);export{w as default,Ue as isURI,ve as isURISync,xe as parseURL,Re as parseURLSync,we as sanitizeURL,Ee as sanitizeURLSync};
|
|
1
|
+
var{DOMPurify:ne}=globalThis,Q=ne;var X=/^[\w+/=-]+$/;var A=/data:[\w#&+./;=-]*,/,D=/data:[\w#&+./;=^]*base64,[\w+/=-]+/i,Y=/data:[\w#&+./;=-]*,[^"]+/g,J=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,K=/^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;var V=/^[a-z][\da-z+.-]*$/,W=/^(?:ext|web)\+[a-z]+$/,O=/(?:java|vb)script/,S=/(?:java|vb)script|blob/,j=/%(?:2[27]|3[CE])|[<>"']/,Z=/%(?:2[27]|3[CE])/g,ee=/[<>"'\s]/g,te=/^%[\dA-F]{2}$/i;var b=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var M=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var P=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","at","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","brid","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","dhttp","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lid","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-launchremotedesktop","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openid","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var{FileReader:se}=globalThis;var G=t=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(16).toUpperCase()}`);return e.join("")},I=t=>{d(t)&&te.test(t)&&(t=t.toUpperCase());let[e,s,r,i,o,n]=["&","#","<",">",'"',"'"].map(G),a;return t===e?a=`${e}amp;`:t===r?a=`${e}lt;`:t===i?a=`${e}gt;`:t===o?a=`${e}quot;`:t===n?a=`${e}${s}39;`:a=t,a},re=t=>{if(d(t)){if(!X.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${b(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(o=>o.charCodeAt(0))),r=new Set(M),i;return s.every(o=>r.has(o))?i=e.replace(/\s/g,G):i=t,i},B=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);if(Number.isInteger(e)){if(e>16)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${b(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let r=new Set(M),i=[...s.matchAll(J)].reverse();for(let o of i){let[n,a]=o,p;if(/^x[\dA-F]+/i.test(a)?p=parseInt(`0${a}`,16):/^\d+/.test(a)&&(p=parseInt(a)),Number.isInteger(p)){let{index:u}=o,[l,f]=[s.substring(0,u),s.substring(u+n.length)];r.has(p)?(s=`${l}${String.fromCharCode(p)}${f}`,(/#x?$/.test(l)||/^#(?:x(?:00)?[2-7]|\d)/.test(f))&&(s=B(s,++e))):p<16*16&&(s=`${l}${f}`)}}}return s},ie=t=>new Promise((e,s)=>{let r=new se;r.addEventListener("error",()=>s(r.error)),r.addEventListener("abort",()=>e(r.result)),r.addEventListener("load",()=>e(r.result)),r.readAsDataURL(t)}),L=class{#e;constructor(){this.#e=new Set(P)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(O.test(e)||!V.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${b(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}verify(e){let s;if(d(e))try{let{protocol:r}=new URL(e),i=r.replace(/:$/,""),o=i.split("+");s=!O.test(i)&&W.test(i)||o.every(n=>this.#e.has(n))}catch{s=!1}return!!s}reset(){this.#e.clear();for(let e of P)this.#e.add(e)}};var N=class extends L{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=e;if(A.test(s)){let i=[...s.matchAll(Y)].reverse();for(let o of i){let[n]=o;D.test(n)&&([n]=D.exec(n)),this.#e++,this.#t.add(n);let a=this.sanitize(n,{allow:["data"]}),{index:p}=o,[u,l]=[s.substring(0,p),s.substring(p+n.length)];a?s=`${u}${a}${l}`:s=`${u}${l}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=Q.sanitize(decodeURIComponent(e));return s&&A.test(s)&&(s=this.replace(s)),s=s.replace(/(?:#|%23)$/,"").replace(/(?<!(?:#|%23).*)(?:\?|%3F)$/,""),encodeURI(s)}sanitize(e,s){if(this.#e>16)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:r,deny:i,only:o,remove:n}=s??{},a=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=new Set,u=!1;if(Array.isArray(o)&&o.length){let f=super.get();for(let m of f)a.set(m,!1);let c=Object.values(o);for(let m of c)if(d(m)&&(m=m.trim(),!S.test(m))){if(super.has(m))a.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&(a.set(m,!0),p.add(m))}!u&&a.has(m)&&(u=a.get(m))}}else{if(Array.isArray(r)&&r.length){let f=Object.values(r);for(let c of f)if(d(c)&&(c=c.trim(),!S.test(c)))if(super.has(c))a.set(c,!0);else{try{super.add(c)}catch{}super.has(c)&&(a.set(c,!0),p.add(c))}}if(Array.isArray(i)&&i.length){let f=Object.values(i);for(let c of f)d(c)&&(c=c.trim(),c&&a.set(c,!1))}}let l;if(super.verify(e)){let{hash:f,href:c,pathname:m,protocol:x,search:U}=new URL(e),C=x.replace(/:$/,""),k=C.split("+"),v;if(u)v=k.every(y=>a.get(y));else for(let[y,R]of a.entries())if(v=R||C!==y&&k.every(h=>h!==y),!v)break;if(v){let y=k.includes("data"),R,h=c;if(y){let[_,...z]=m.split(","),T=`${z.join(",")}${U}${f}`,$=_.split(";"),F=$[$.length-1]==="base64",g=T;F&&(g=re(T));try{let q=B(g).trim(),{protocol:ae}=new URL(q);ae.replace(/:$/,"").split("+").some(oe=>S.test(oe))&&(h="")}catch{}let H=A.test(g);g!==T||H?H?g=this.replace(g):this.#t.has(e)?this.#t.delete(e):R=!0:this.#t.has(e)?this.#t.delete(e):R=!0,(!_||K.test(_))&&(g=this.purify(g)),h&&g?(F&&g!==T&&$.pop(),h=`${C}:${$.join(";")},${g}`):h=""}else R=!0;if(!y&&n&&j.test(h)){let _=j.exec(h),{index:z}=_;h=h.substring(0,z)}h?(l=h.replace(ee,G).replace(/%26/g,I),R&&(y||(l=l.replace(Z,I)),this.#e=0)):this.#e=0}p.size&&p.forEach(y=>{super.remove(y)})}return l||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let r=new Map([["input",e]]),i;if(this.verify(e)){let{protocol:o}=new URL(e);o==="blob:"?i=e:i=this.sanitize(e,s??{allow:["data","file"]})}if(i){let o=new URL(i),{pathname:n,protocol:a}=o,u=a.replace(/:$/,"").split("+").includes("data");if(r.set("valid",!0),u){let l=new Map,[f,...c]=n.split(","),m=`${c.join(",")}`,x=f.split(";"),U=x[x.length-1]==="base64";U&&x.pop(),l.set("mime",x.join(";")),l.set("base64",U),l.set("data",m),r.set("data",Object.fromEntries(l))}else r.set("data",null);for(let l in o){let f=o[l];d(f)&&r.set(l,f)}}else r.set("valid",!1);return Object.fromEntries(r)}reset(){super.reset(),this.#e=0,this.#t.clear()}},w=new N,de=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(t&&d(t)){let r;try{let{protocol:i}=new URL(t);r=i.replace(/:$/,"")}catch{}if(r==="blob"){let{allow:i,deny:o,only:n}=e;if(Array.isArray(i)&&i.includes("blob")&&!(Array.isArray(o)&&o.includes("blob"))||Array.isArray(n)&&n.includes("blob")){let a;try{a=await fetch(t).then(p=>p.blob()).then(ie)}catch{}if(a){if(Array.isArray(n))n.includes("data")||n.push("data");else if(Array.isArray(i)&&(i.includes("data")||i.push("data"),Array.isArray(o)&&o.includes("data"))){let p=o.indexOf("data");o.splice(p,1)}s=w.sanitize(a,e)}}URL.revokeObjectURL(t)}else r&&(s=w.sanitize(t,e))}return s||null},fe=(t,e)=>{let s;if(t&&d(t)){let r;try{let{protocol:i}=new URL(t);r=i.replace(/:$/,"")}catch{}r==="blob"?URL.revokeObjectURL(t):r&&(s=w.sanitize(t,e))}return s||null},he=async t=>w.parse(t),ue=t=>w.parse(t),ge=async t=>w.verify(t),ye=t=>w.verify(t),be=w;export{be as default,ge as isURI,ye as isURISync,he as parseURL,ue as parseURLSync,de as sanitizeURL,fe as sanitizeURLSync};
|
|
2
2
|
/*!
|
|
3
3
|
* URL Sanitizer
|
|
4
4
|
*
|