diff --git a/CHANGELOG b/CHANGELOG index f70dbb9d7..a0dcc374f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Version 1.0.3 (2014-06-27) +-------------------------- +Changed Base64 encoding function to prevent character encoding errors, thanks @shermozle! (#231) + Version 1.0.2 (2014-06-24) -------------------------- Added guard to prevent document size field from being set as "NaNxNaN" (#220) diff --git a/package.json b/package.json index 6f8e3915c..7f503ee68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "snowplow-tracker", - "version": "1.0.2", + "version": "1.0.3", "devDependencies": { "grunt": "~0.4.2", "intern": "~1.4.0", @@ -14,7 +14,6 @@ "grunt-browserify": "~1.3.0", "jstimezonedetect": "~1.0.5", "JSON": "~1.0.0", - "Base64": "~0.2.0", "sha1": "git://github.com/pvorb/node-sha1.git#v1.0.0", "grunt-lodash": "~0.3.0" }, diff --git a/src/js/lib/base64.js b/src/js/lib/base64.js new file mode 100644 index 000000000..715c0e63b --- /dev/null +++ b/src/js/lib/base64.js @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2013 Kevin van Zonneveld (http://kvz.io) + * and Contributors (http://phpjs.org/authors) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +(function() { + + var object = typeof exports !== 'undefined' ? exports : this; // For eventual node.js environment support + + function base64_encode(data) { + // discuss at: http://phpjs.org/functions/base64_encode/ + // original by: Tyler Akins (http://rumkin.com) + // improved by: Bayron Guevara + // improved by: Thunder.m + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Rafał Kukawski (http://kukawski.pl) + // bugfixed by: Pellentesque Malesuada + // example 1: base64_encode('Kevin van Zonneveld'); + // returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA==' + // example 2: base64_encode('a'); + // returns 2: 'YQ==' + // example 3: base64_encode('✓ à la mode'); + // returns 3: '4pyTIMOgIGxhIG1vZGU=' + + var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = '', + tmp_arr = []; + + if (!data) { + return data; + } + + data = unescape(encodeURIComponent(data)); + + do { + // pack three octets into four hexets + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + // use hexets to index into b64, and append result to encoded string + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + var r = data.length % 3; + + return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); + } + + object.base64encode = base64_encode; + +}()); diff --git a/src/js/payload.js b/src/js/payload.js index 7dc633a6e..b875ec2c0 100644 --- a/src/js/payload.js +++ b/src/js/payload.js @@ -37,9 +37,7 @@ var lodash = require('./lib/lodash'), json2 = require('JSON'), - Base64 = require('Base64'), - base64encode = Base64.btoa, - base64decode = Base64.atob, + base64 = require('./lib/base64'), object = typeof exports !== 'undefined' ? exports : this; // For eventual node.js environment support @@ -51,7 +49,7 @@ function base64urlencode(data) { if (!data) return data; - var enc = base64encode(data); + var enc = base64.base64encode(data); return enc.replace(/=/g, '') .replace(/\+/g, '-') .replace(/\//g, '_'); diff --git a/src/js/snowplow.js b/src/js/snowplow.js index 45e5c0ed1..4c5b13696 100644 --- a/src/js/snowplow.js +++ b/src/js/snowplow.js @@ -88,7 +88,7 @@ windowAlias = window, /* Tracker identifier with version */ - version = 'js-1.0.2', // Update banner.js too + version = 'js-1.0.3', /* Contains three variables that are shared with tracker.js and must be passed by reference */ mutSnowplowState = {