UNPKG

node-red-node-email

Version:

Node-RED nodes to send and receive simple emails.

503 lines (441 loc) 9.71 kB
/** * Binary (exe, images and so, etc.) * * Note: * This function is not considered for Unicode */ function isBINARY(data) { var i = 0; var len = data && data.length; var c; for (; i < len; i++) { c = data[i]; if (c > 0xFF) { return false; } if ((c >= 0x00 && c <= 0x07) || c === 0xFF) { return true; } } return false; } exports.isBINARY = isBINARY; /** * ASCII (ISO-646) */ function isASCII(data) { var i = 0; var len = data && data.length; var b; for (; i < len; i++) { b = data[i]; if (b > 0xFF || (b >= 0x80 && b <= 0xFF) || b === 0x1B) { return false; } } return true; } exports.isASCII = isASCII; /** * ISO-2022-JP (JIS) * * RFC1468 Japanese Character Encoding for Internet Messages * RFC1554 ISO-2022-JP-2: Multilingual Extension of ISO-2022-JP * RFC2237 Japanese Character Encoding for Internet Messages */ function isJIS(data) { var i = 0; var len = data && data.length; var b, esc1, esc2; for (; i < len; i++) { b = data[i]; if (b > 0xFF || (b >= 0x80 && b <= 0xFF)) { return false; } if (b === 0x1B) { if (i + 2 >= len) { return false; } esc1 = data[i + 1]; esc2 = data[i + 2]; if (esc1 === 0x24) { if (esc2 === 0x28 || // JIS X 0208-1990/2000/2004 esc2 === 0x40 || // JIS X 0208-1978 esc2 === 0x42) { // JIS X 0208-1983 return true; } } else if (esc1 === 0x26 && // JIS X 0208-1990 esc2 === 0x40) { return true; } else if (esc1 === 0x28) { if (esc2 === 0x42 || // ASCII esc2 === 0x49 || // JIS X 0201 Halfwidth Katakana esc2 === 0x4A) { // JIS X 0201-1976 Roman set return true; } } } } return false; } exports.isJIS = isJIS; /** * EUC-JP */ function isEUCJP(data) { var i = 0; var len = data && data.length; var b; for (; i < len; i++) { b = data[i]; if (b < 0x80) { continue; } if (b > 0xFF || b < 0x8E) { return false; } if (b === 0x8E) { if (i + 1 >= len) { return false; } b = data[++i]; if (b < 0xA1 || 0xDF < b) { return false; } } else if (b === 0x8F) { if (i + 2 >= len) { return false; } b = data[++i]; if (b < 0xA2 || 0xED < b) { return false; } b = data[++i]; if (b < 0xA1 || 0xFE < b) { return false; } } else if (0xA1 <= b && b <= 0xFE) { if (i + 1 >= len) { return false; } b = data[++i]; if (b < 0xA1 || 0xFE < b) { return false; } } else { return false; } } return true; } exports.isEUCJP = isEUCJP; /** * Shift-JIS (SJIS) */ function isSJIS(data) { var i = 0; var len = data && data.length; var b; while (i < len && data[i] > 0x80) { if (data[i++] > 0xFF) { return false; } } for (; i < len; i++) { b = data[i]; if (b <= 0x80 || (0xA1 <= b && b <= 0xDF)) { continue; } if (b === 0xA0 || b > 0xEF || i + 1 >= len) { return false; } b = data[++i]; if (b < 0x40 || b === 0x7F || b > 0xFC) { return false; } } return true; } exports.isSJIS = isSJIS; /** * UTF-8 */ function isUTF8(data) { var i = 0; var len = data && data.length; var b; for (; i < len; i++) { b = data[i]; if (b > 0xFF) { return false; } if (b === 0x09 || b === 0x0A || b === 0x0D || (b >= 0x20 && b <= 0x7E)) { continue; } if (b >= 0xC2 && b <= 0xDF) { if (i + 1 >= len || data[i + 1] < 0x80 || data[i + 1] > 0xBF) { return false; } i++; } else if (b === 0xE0) { if (i + 2 >= len || data[i + 1] < 0xA0 || data[i + 1] > 0xBF || data[i + 2] < 0x80 || data[i + 2] > 0xBF) { return false; } i += 2; } else if ((b >= 0xE1 && b <= 0xEC) || b === 0xEE || b === 0xEF) { if (i + 2 >= len || data[i + 1] < 0x80 || data[i + 1] > 0xBF || data[i + 2] < 0x80 || data[i + 2] > 0xBF) { return false; } i += 2; } else if (b === 0xED) { if (i + 2 >= len || data[i + 1] < 0x80 || data[i + 1] > 0x9F || data[i + 2] < 0x80 || data[i + 2] > 0xBF) { return false; } i += 2; } else if (b === 0xF0) { if (i + 3 >= len || data[i + 1] < 0x90 || data[i + 1] > 0xBF || data[i + 2] < 0x80 || data[i + 2] > 0xBF || data[i + 3] < 0x80 || data[i + 3] > 0xBF) { return false; } i += 3; } else if (b >= 0xF1 && b <= 0xF3) { if (i + 3 >= len || data[i + 1] < 0x80 || data[i + 1] > 0xBF || data[i + 2] < 0x80 || data[i + 2] > 0xBF || data[i + 3] < 0x80 || data[i + 3] > 0xBF) { return false; } i += 3; } else if (b === 0xF4) { if (i + 3 >= len || data[i + 1] < 0x80 || data[i + 1] > 0x8F || data[i + 2] < 0x80 || data[i + 2] > 0xBF || data[i + 3] < 0x80 || data[i + 3] > 0xBF) { return false; } i += 3; } else { return false; } } return true; } exports.isUTF8 = isUTF8; /** * UTF-16 (LE or BE) * * RFC2781: UTF-16, an encoding of ISO 10646 * * @link http://www.ietf.org/rfc/rfc2781.txt */ function isUTF16(data) { var i = 0; var len = data && data.length; var pos = null; var b1, b2, next, prev; if (len < 2) { if (data[0] > 0xFF) { return false; } } else { b1 = data[0]; b2 = data[1]; if (b1 === 0xFF && // BOM (little-endian) b2 === 0xFE) { return true; } if (b1 === 0xFE && // BOM (big-endian) b2 === 0xFF) { return true; } for (; i < len; i++) { if (data[i] === 0x00) { pos = i; break; } else if (data[i] > 0xFF) { return false; } } if (pos === null) { return false; // Non ASCII } next = data[pos + 1]; // BE if (next !== void 0 && next > 0x00 && next < 0x80) { return true; } prev = data[pos - 1]; // LE if (prev !== void 0 && prev > 0x00 && prev < 0x80) { return true; } } return false; } exports.isUTF16 = isUTF16; /** * UTF-16BE (big-endian) * * RFC 2781 4.3 Interpreting text labelled as UTF-16 * Text labelled "UTF-16BE" can always be interpreted as being big-endian * when BOM does not founds (SHOULD) * * @link http://www.ietf.org/rfc/rfc2781.txt */ function isUTF16BE(data) { var i = 0; var len = data && data.length; var pos = null; var b1, b2; if (len < 2) { if (data[0] > 0xFF) { return false; } } else { b1 = data[0]; b2 = data[1]; if (b1 === 0xFE && // BOM b2 === 0xFF) { return true; } for (; i < len; i++) { if (data[i] === 0x00) { pos = i; break; } else if (data[i] > 0xFF) { return false; } } if (pos === null) { return false; // Non ASCII } if (pos % 2 === 0) { return true; } } return false; } exports.isUTF16BE = isUTF16BE; /** * UTF-16LE (little-endian) */ function isUTF16LE(data) { var i = 0; var len = data && data.length; var pos = null; var b1, b2; if (len < 2) { if (data[0] > 0xFF) { return false; } } else { b1 = data[0]; b2 = data[1]; if (b1 === 0xFF && // BOM b2 === 0xFE) { return true; } for (; i < len; i++) { if (data[i] === 0x00) { pos = i; break; } else if (data[i] > 0xFF) { return false; } } if (pos === null) { return false; // Non ASCII } if (pos % 2 !== 0) { return true; } } return false; } exports.isUTF16LE = isUTF16LE; /** * UTF-32 * * Unicode 3.2.0: Unicode Standard Annex #19 * * @link http://www.iana.org/assignments/charset-reg/UTF-32 * @link http://www.unicode.org/reports/tr19/tr19-9.html */ function isUTF32(data) { var i = 0; var len = data && data.length; var pos = null; var b1, b2, b3, b4; var next, prev; if (len < 4) { for (; i < len; i++) { if (data[i] > 0xFF) { return false; } } } else { b1 = data[0]; b2 = data[1]; b3 = data[2]; b4 = data[3]; if (b1 === 0x00 && b2 === 0x00 && // BOM (big-endian) b3 === 0xFE && b4 === 0xFF) { return true; } if (b1 === 0xFF && b2 === 0xFE && // BOM (little-endian) b3 === 0x00 && b4 === 0x00) { return true; } for (; i < len; i++) { if (data[i] === 0x00 && data[i + 1] === 0x00 && data[i + 2] === 0x00) { pos = i; break; } else if (data[i] > 0xFF) { return false; } } if (pos === null) { return false; } // The byte order should be the big-endian when BOM is not detected. next = data[pos + 3]; if (next !== void 0 && next > 0x00 && next <= 0x7F) { // big-endian return data[pos + 2] === 0x00 && data[pos + 1] === 0x00; } prev = data[pos - 1]; if (prev !== void 0 && prev > 0x00 && prev <= 0x7F) { // little-endian return data[pos + 1] === 0x00 && data[pos + 2] === 0x00; } } return false; } exports.isUTF32 = isUTF32; /** * JavaScript Unicode array */ function isUNICODE(data) { var i = 0; var len = data && data.length; var c; for (; i < len; i++) { c = data[i]; if (c < 0 || c > 0x10FFFF) { return false; } } return true; } exports.isUNICODE = isUNICODE;