1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-15 15:53:27 +00:00

cleanup event listeners for u2f

This commit is contained in:
Kyle Spearrin
2017-07-26 00:20:30 -04:00
parent 21d4f9e193
commit 01ccd21ef3
2 changed files with 82 additions and 63 deletions

View File

@@ -6,65 +6,79 @@
this.connectorLink = document.createElement('a');
}
U2f.prototype.init = function (data) {
var self = this;
(function () {
var thisU2f = null;
self.connectorLink.href = 'https://vault.bitwarden.com/u2f-connector.html' +
'?data=' + this.base64Encode(JSON.stringify(data)) +
'&parent=' + encodeURIComponent(document.location.href) +
'&v=1';
U2f.prototype.init = function (data) {
var self = thisU2f = this;
self.iframe = document.getElementById('u2f_iframe');
self.iframe.src = self.connectorLink.href;
self.connectorLink.href = 'https://vault.bitwarden.com/u2f-connector.html' +
'?data=' + this.base64Encode(JSON.stringify(data)) +
'&parent=' + encodeURIComponent(document.location.href) +
'&v=1';
window.addEventListener('message', function (event) {
if (!self.validMessage(event)) {
self.error('Invalid message.');
self.iframe = document.getElementById('u2f_iframe');
self.iframe.src = self.connectorLink.href;
window.addEventListener('message', parseMessage, false);
};
U2f.prototype.validMessage = function (event) {
if (!event.origin || event.origin === '' || event.origin !== this.connectorLink.origin) {
return false;
}
return event.data.indexOf('success|') === 0 || event.data.indexOf('error|') === 0 || event.data.indexOf('info|') === 0;
};
U2f.prototype.stop = function () {
this.sendMessage('stop');
};
U2f.prototype.start = function () {
this.sendMessage('start');
};
U2f.prototype.sendMessage = function (message) {
var self = this;
if (!self.iframe || !self.iframe.src || !self.iframe.contentWindow) {
return;
}
self.iframe.contentWindow.postMessage(message, self.iframe.src);
};
U2f.prototype.base64Encode = function (str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
};
U2f.prototype.cleanup = function () {
window.removeEventListener('message', parseMessage, false);
};
function parseMessage(event) {
if (!thisU2f) {
return;
}
if (!thisU2f.validMessage(event)) {
thisU2f.error('Invalid message.');
return;
}
var parts = event.data.split('|');
if (parts[0] === 'success' && self.success) {
self.success(parts[1]);
if (parts[0] === 'success' && thisU2f.success) {
thisU2f.success(parts[1]);
}
else if (parts[0] === 'error' && self.error) {
self.error(parts[1]);
else if (parts[0] === 'error' && thisU2f.error) {
thisU2f.error(parts[1]);
}
else if (parts[0] === 'info') {
if (self.info) {
self.info(parts[1]);
if (thisU2f.info) {
thisU2f.info(parts[1]);
}
}
}, false);
};
U2f.prototype.validMessage = function (event) {
if (!event.origin || event.origin === '' || event.origin !== this.connectorLink.origin) {
return false;
}
return event.data.indexOf('success|') === 0 || event.data.indexOf('error|') === 0 || event.data.indexOf('info|') === 0;
};
U2f.prototype.stop = function () {
this.sendMessage('stop');
};
U2f.prototype.start = function () {
this.sendMessage('start');
};
U2f.prototype.sendMessage = function (message) {
var self = this;
if (!self.iframe || !self.iframe.src || !self.iframe.contentWindow) {
return;
}
self.iframe.contentWindow.postMessage(message, self.iframe.src);
};
U2f.prototype.base64Encode = function (str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
};
};
})();