2017-06-28 18:30:14 +00:00
|
|
|
function arrayToHex(iv) {
|
2017-06-02 03:59:27 +00:00
|
|
|
let hexStr = '';
|
2017-06-09 17:44:12 +00:00
|
|
|
for (const i in iv) {
|
2017-06-02 03:59:27 +00:00
|
|
|
if (iv[i] < 16) {
|
|
|
|
hexStr += '0' + iv[i].toString(16);
|
|
|
|
} else {
|
|
|
|
hexStr += iv[i].toString(16);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return hexStr;
|
|
|
|
}
|
|
|
|
|
2017-06-28 18:30:14 +00:00
|
|
|
function hexToArray(str) {
|
|
|
|
const iv = new Uint8Array(str.length / 2);
|
2017-06-02 03:59:27 +00:00
|
|
|
for (let i = 0; i < str.length; i += 2) {
|
|
|
|
iv[i / 2] = parseInt(str.charAt(i) + str.charAt(i + 1), 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
return iv;
|
|
|
|
}
|
|
|
|
|
2017-06-21 20:23:36 +00:00
|
|
|
function notify(str) {
|
2017-06-20 19:18:14 +00:00
|
|
|
if (!('Notification' in window)) {
|
2017-06-21 20:23:36 +00:00
|
|
|
return;
|
|
|
|
} else if (Notification.permission === 'granted') {
|
2017-06-21 21:31:21 +00:00
|
|
|
new Notification(str);
|
2017-06-21 20:23:36 +00:00
|
|
|
} else if (Notification.permission !== 'denied') {
|
|
|
|
Notification.requestPermission(function(permission) {
|
2017-06-21 21:31:21 +00:00
|
|
|
if (permission === 'granted') new Notification(str);
|
|
|
|
});
|
2017-06-21 20:23:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-10 20:27:01 +00:00
|
|
|
function gcmCompliant() {
|
|
|
|
try {
|
2017-07-12 17:53:29 +00:00
|
|
|
return window.crypto.subtle
|
|
|
|
.generateKey(
|
2017-07-10 20:27:01 +00:00
|
|
|
{
|
|
|
|
name: 'AES-GCM',
|
2017-07-12 17:53:29 +00:00
|
|
|
length: 128
|
2017-07-10 20:27:01 +00:00
|
|
|
},
|
2017-07-12 17:53:29 +00:00
|
|
|
true,
|
|
|
|
['encrypt', 'decrypt']
|
2017-07-10 20:27:01 +00:00
|
|
|
)
|
2017-07-12 17:53:29 +00:00
|
|
|
.then(key => {
|
|
|
|
return window.crypto.subtle
|
|
|
|
.encrypt(
|
|
|
|
{
|
|
|
|
name: 'AES-GCM',
|
|
|
|
iv: window.crypto.getRandomValues(new Uint8Array(12)),
|
|
|
|
additionalData: window.crypto.getRandomValues(new Uint8Array(6)),
|
|
|
|
tagLength: 128
|
|
|
|
},
|
|
|
|
key,
|
|
|
|
new ArrayBuffer(8)
|
|
|
|
)
|
|
|
|
.then(() => {
|
|
|
|
return Promise.resolve();
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
return Promise.reject();
|
|
|
|
});
|
2017-07-10 20:27:01 +00:00
|
|
|
})
|
|
|
|
.catch(err => {
|
2017-07-12 17:53:29 +00:00
|
|
|
return Promise.reject();
|
|
|
|
});
|
|
|
|
} catch (err) {
|
2017-07-10 20:27:01 +00:00
|
|
|
return Promise.reject();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-20 22:16:00 +00:00
|
|
|
function findMetric(href) {
|
2017-07-22 00:01:26 +00:00
|
|
|
switch (href) {
|
2017-07-20 22:16:00 +00:00
|
|
|
case 'https://www.mozilla.org/':
|
|
|
|
return 'mozilla';
|
|
|
|
case 'https://www.mozilla.org/about/legal':
|
|
|
|
return 'legal';
|
|
|
|
case 'https://testpilot.firefox.com/about':
|
|
|
|
return 'about';
|
|
|
|
case 'https://testpilot.firefox.com/privacy':
|
|
|
|
return 'privacy';
|
|
|
|
case 'https://testpilot.firefox.com/terms':
|
|
|
|
return 'terms';
|
|
|
|
case 'https://www.mozilla.org/en-US/privacy/websites/#cookies':
|
|
|
|
return 'cookies';
|
|
|
|
case 'https://github.com/mozilla/send':
|
|
|
|
return 'github';
|
|
|
|
case 'https://twitter.com/FxTestPilot':
|
|
|
|
return 'twitter';
|
|
|
|
case 'https://www.mozilla.org/firefox/new/?scene=2':
|
|
|
|
return 'download-firefox';
|
|
|
|
default:
|
|
|
|
return 'other';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-20 23:06:06 +00:00
|
|
|
function isFile(id) {
|
2017-07-22 00:01:26 +00:00
|
|
|
return ![
|
|
|
|
'referrer',
|
|
|
|
'totalDownloads',
|
|
|
|
'totalUploads',
|
|
|
|
'testpilot_ga__cid'
|
|
|
|
].includes(id);
|
2017-07-20 23:06:06 +00:00
|
|
|
}
|
|
|
|
|
2017-07-21 20:25:08 +00:00
|
|
|
function sendEvent() {
|
2017-07-22 00:01:26 +00:00
|
|
|
return window.analytics.sendEvent
|
|
|
|
.apply(window.analytics, arguments)
|
|
|
|
.catch(() => 0);
|
2017-07-21 20:25:08 +00:00
|
|
|
}
|
|
|
|
|
2017-07-20 23:06:06 +00:00
|
|
|
const ONE_DAY_IN_MS = 86400000;
|
|
|
|
|
2017-06-02 03:59:27 +00:00
|
|
|
module.exports = {
|
2017-06-28 18:30:14 +00:00
|
|
|
arrayToHex,
|
|
|
|
hexToArray,
|
2017-07-10 20:27:01 +00:00
|
|
|
notify,
|
2017-07-20 22:16:00 +00:00
|
|
|
gcmCompliant,
|
2017-07-20 23:06:06 +00:00
|
|
|
findMetric,
|
|
|
|
isFile,
|
2017-07-21 20:25:08 +00:00
|
|
|
sendEvent,
|
2017-07-20 23:06:06 +00:00
|
|
|
ONE_DAY_IN_MS
|
2017-06-02 03:59:27 +00:00
|
|
|
};
|