Permalink
Cannot retrieve contributors at this time
executable file
148 lines (148 sloc)
7.56 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/uri-js/dist/esnext/schemes/mailto.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { pctEncChar, pctDecChars, unescapeComponent } from "../uri"; | |
import punycode from "punycode"; | |
import { merge, subexp, toUpperCase, toArray } from "../util"; | |
const O = {}; | |
const isIRI = true; | |
//RFC 3986 | |
const UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; | |
const HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive | |
const PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded | |
//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = | |
//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; | |
//const WSP$$ = "[\\x20\\x09]"; | |
//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) | |
//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext | |
//const VCHAR$$ = "[\\x21-\\x7E]"; | |
//const WSP$$ = "[\\x20\\x09]"; | |
//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext | |
//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); | |
//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); | |
//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); | |
const ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; | |
const QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; | |
const VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); | |
const DOT_ATOM_TEXT$ = subexp(ATEXT$$ + "+" + subexp("\\." + ATEXT$$ + "+") + "*"); | |
const QUOTED_PAIR$ = subexp("\\\\" + VCHAR$$); | |
const QCONTENT$ = subexp(QTEXT$$ + "|" + QUOTED_PAIR$); | |
const QUOTED_STRING$ = subexp('\\"' + QCONTENT$ + "*" + '\\"'); | |
//RFC 6068 | |
const DTEXT_NO_OBS$$ = "[\\x21-\\x5A\\x5E-\\x7E]"; //%d33-90 / %d94-126 | |
const SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; | |
const QCHAR$ = subexp(UNRESERVED$$ + "|" + PCT_ENCODED$ + "|" + SOME_DELIMS$$); | |
const DOMAIN$ = subexp(DOT_ATOM_TEXT$ + "|" + "\\[" + DTEXT_NO_OBS$$ + "*" + "\\]"); | |
const LOCAL_PART$ = subexp(DOT_ATOM_TEXT$ + "|" + QUOTED_STRING$); | |
const ADDR_SPEC$ = subexp(LOCAL_PART$ + "\\@" + DOMAIN$); | |
const TO$ = subexp(ADDR_SPEC$ + subexp("\\," + ADDR_SPEC$) + "*"); | |
const HFNAME$ = subexp(QCHAR$ + "*"); | |
const HFVALUE$ = HFNAME$; | |
const HFIELD$ = subexp(HFNAME$ + "\\=" + HFVALUE$); | |
const HFIELDS2$ = subexp(HFIELD$ + subexp("\\&" + HFIELD$) + "*"); | |
const HFIELDS$ = subexp("\\?" + HFIELDS2$); | |
const MAILTO_URI = new RegExp("^mailto\\:" + TO$ + "?" + HFIELDS$ + "?$"); | |
const UNRESERVED = new RegExp(UNRESERVED$$, "g"); | |
const PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); | |
const NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); | |
const NOT_DOMAIN = new RegExp(merge("[^]", ATEXT$$, "[\\.]", "[\\[]", DTEXT_NO_OBS$$, "[\\]]"), "g"); | |
const NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); | |
const NOT_HFVALUE = NOT_HFNAME; | |
const TO = new RegExp("^" + TO$ + "$"); | |
const HFIELDS = new RegExp("^" + HFIELDS2$ + "$"); | |
function decodeUnreserved(str) { | |
const decStr = pctDecChars(str); | |
return (!decStr.match(UNRESERVED) ? str : decStr); | |
} | |
const handler = { | |
scheme: "mailto", | |
parse: function (components, options) { | |
const mailtoComponents = components; | |
const to = mailtoComponents.to = (mailtoComponents.path ? mailtoComponents.path.split(",") : []); | |
mailtoComponents.path = undefined; | |
if (mailtoComponents.query) { | |
let unknownHeaders = false; | |
const headers = {}; | |
const hfields = mailtoComponents.query.split("&"); | |
for (let x = 0, xl = hfields.length; x < xl; ++x) { | |
const hfield = hfields[x].split("="); | |
switch (hfield[0]) { | |
case "to": | |
const toAddrs = hfield[1].split(","); | |
for (let x = 0, xl = toAddrs.length; x < xl; ++x) { | |
to.push(toAddrs[x]); | |
} | |
break; | |
case "subject": | |
mailtoComponents.subject = unescapeComponent(hfield[1], options); | |
break; | |
case "body": | |
mailtoComponents.body = unescapeComponent(hfield[1], options); | |
break; | |
default: | |
unknownHeaders = true; | |
headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); | |
break; | |
} | |
} | |
if (unknownHeaders) | |
mailtoComponents.headers = headers; | |
} | |
mailtoComponents.query = undefined; | |
for (let x = 0, xl = to.length; x < xl; ++x) { | |
const addr = to[x].split("@"); | |
addr[0] = unescapeComponent(addr[0]); | |
if (!options.unicodeSupport) { | |
//convert Unicode IDN -> ASCII IDN | |
try { | |
addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); | |
} | |
catch (e) { | |
mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; | |
} | |
} | |
else { | |
addr[1] = unescapeComponent(addr[1], options).toLowerCase(); | |
} | |
to[x] = addr.join("@"); | |
} | |
return mailtoComponents; | |
}, | |
serialize: function (mailtoComponents, options) { | |
const components = mailtoComponents; | |
const to = toArray(mailtoComponents.to); | |
if (to) { | |
for (let x = 0, xl = to.length; x < xl; ++x) { | |
const toAddr = String(to[x]); | |
const atIdx = toAddr.lastIndexOf("@"); | |
const localPart = (toAddr.slice(0, atIdx)).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); | |
let domain = toAddr.slice(atIdx + 1); | |
//convert IDN via punycode | |
try { | |
domain = (!options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain)); | |
} | |
catch (e) { | |
components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; | |
} | |
to[x] = localPart + "@" + domain; | |
} | |
components.path = to.join(","); | |
} | |
const headers = mailtoComponents.headers = mailtoComponents.headers || {}; | |
if (mailtoComponents.subject) | |
headers["subject"] = mailtoComponents.subject; | |
if (mailtoComponents.body) | |
headers["body"] = mailtoComponents.body; | |
const fields = []; | |
for (const name in headers) { | |
if (headers[name] !== O[name]) { | |
fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + | |
"=" + | |
headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); | |
} | |
} | |
if (fields.length) { | |
components.query = fields.join("&"); | |
} | |
return components; | |
} | |
}; | |
export default handler; | |
//# sourceMappingURL=mailto.js.map |