From f189d72943c490ae97323997aef8987bc58f3b5e Mon Sep 17 00:00:00 2001 From: Thomas Bruederli <thomas@roundcube.net> Date: Thu, 10 Sep 2015 15:27:58 -0400 Subject: [PATCH] Merged branch 'dev-mailvelope' --- program/js/common.js | 69 ++++++++++++++++++++++++++++++---- 1 files changed, 60 insertions(+), 9 deletions(-) diff --git a/program/js/common.js b/program/js/common.js index 2c699d0..329ffb5 100644 --- a/program/js/common.js +++ b/program/js/common.js @@ -448,7 +448,7 @@ ], icann_addr = 'mailtest\\x40('+icann_domains.join('|')+')', word = '('+atom+'|'+quoted_string+')', - delim = '[,;\s\n]', + delim = '[,;\\s\\n]', local_part = word+'(\\x2e'+word+')*', addr_spec = '(('+local_part+'\\x40'+domain+')|('+icann_addr+'))', reg1 = inline ? new RegExp('(^|<|'+delim+')'+addr_spec+'($|>|'+delim+')', 'i') : new RegExp('^'+addr_spec+'$', 'i'); @@ -683,11 +683,60 @@ }; -// This code was written by Tyler Akins and has been placed in the -// public domain. It would be nice if you left this header intact. // Base64 code from Tyler Akins -- http://rumkin.com var Base64 = (function () { var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + + // private method for UTF-8 encoding + var utf8_encode = function(string) { + string = string.replace(/\r\n/g, "\n"); + var utftext = ''; + + for (var n = 0; n < string.length; n++) { + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if(c > 127 && c < 2048) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + } + + return utftext; + }; + + // private method for UTF-8 decoding + var utf8_decode = function (utftext) { + var i = 0, string = '', c = c2 = c3 = 0; + + while (i < utftext.length) { + c = utftext.charCodeAt(i); + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if (c > 191 && c < 224) { + c2 = utftext.charCodeAt(i + 1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i + 1); + c3 = utftext.charCodeAt(i + 2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + } + + return string; + }; var obj = { /** @@ -703,9 +752,11 @@ catch (e) {}; } + input = utf8_encode(input); + var chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, output = '', len = input.length; - do { + while (i < len) { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); @@ -723,7 +774,7 @@ output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); - } while (i < len); + } return output; }, @@ -736,7 +787,7 @@ if (typeof(window.atob) === 'function') { // it may fail on unicode characters, the fallback can handle them try { - return atob(input); + return utf8_decode(atob(input)); } catch (e) {}; } @@ -747,7 +798,7 @@ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); len = input.length; - do { + while (i < len) { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); @@ -763,9 +814,9 @@ output = output + String.fromCharCode(chr2); if (enc4 != 64) output = output + String.fromCharCode(chr3); - } while (i < len); + } - return output; + return utf8_decode(output); } }; -- Gitblit v1.9.1