send/frontend/src/utils.js

124 lines
2.7 KiB
JavaScript
Raw Normal View History

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) {
if (!('Notification' in window)) {
2017-06-21 20:23:36 +00:00
return;
} else if (Notification.permission === 'granted') {
new Notification(str);
2017-06-21 20:23:36 +00:00
} else if (Notification.permission !== 'denied') {
Notification.requestPermission(function(permission) {
if (permission === 'granted') new Notification(str);
});
2017-06-21 20:23:36 +00:00
}
}
function gcmCompliant() {
try {
2017-07-12 17:53:29 +00:00
return window.crypto.subtle
.generateKey(
{
name: 'AES-GCM',
2017-07-12 17:53:29 +00:00
length: 128
},
2017-07-12 17:53:29 +00:00
true,
['encrypt', 'decrypt']
)
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();
});
})
.catch(err => {
2017-07-12 17:53:29 +00:00
return Promise.reject();
});
} catch (err) {
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';
}
}
function isFile(id) {
2017-07-22 00:01:26 +00:00
return ![
'referrer',
'totalDownloads',
'totalUploads',
'testpilot_ga__cid'
].includes(id);
}
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
}
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,
notify,
2017-07-20 22:16:00 +00:00
gcmCompliant,
findMetric,
isFile,
2017-07-21 20:25:08 +00:00
sendEvent,
ONE_DAY_IN_MS
2017-06-02 03:59:27 +00:00
};