1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-20 10:13:31 +00:00

scripts, connectors, and webpack adjustments

This commit is contained in:
Kyle Spearrin
2018-06-05 09:01:40 -04:00
parent 8f14ced5af
commit 29d0803a5c
11 changed files with 75 additions and 48 deletions

12
src/connectors/duo.html Normal file
View File

@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title>Bitwarden Duo Connector</title>
</head>
<body></body>
</html>

43
src/connectors/duo.js Normal file
View File

@@ -0,0 +1,43 @@
require('../scripts/duo');
require('./duo.scss');
!(function () {
var frameElement = document.createElement('iframe');
frameElement.setAttribute('id', 'duo_iframe');
setFrameHeight();
document.body.appendChild(frameElement);
var hostParam = getQsParam('host');
var requestParam = getQsParam('request');
Duo.init({
host: hostParam,
sig_request: requestParam,
submit_callback: function (form) {
invokeCSCode(form.elements.sig_response.value);
}
});
window.onresize = setFrameHeight;
function setFrameHeight() {
frameElement.style.height = window.innerHeight + 'px';
}
})();
function getQsParam(name) {
var url = window.location.href;
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
function invokeCSCode(data) {
try {
invokeCSharpAction(data);
}
catch (err) {
}
}

17
src/connectors/duo.scss Normal file
View File

@@ -0,0 +1,17 @@
html, body {
margin: 0;
padding: 0;
}
body {
background: #efeff4 url('../images/loading.svg') 0 0 no-repeat;
}
iframe {
display: block;
width: 100%;
height: 400px;
border: none;
margin: 0;
padding: 0;
}

11
src/connectors/u2f.html Normal file
View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Bitwarden U2F Connector</title>
</head>
<body></body>
</html>

140
src/connectors/u2f.js Normal file
View File

@@ -0,0 +1,140 @@
require('../scripts/u2f');
document.addEventListener('DOMContentLoaded', function (event) {
init();
});
var parentUrl = null,
parentOrigin = null,
version = null,
stop = false,
sentSuccess = false;
function init() {
start();
onMessage();
info('ready');
}
function start() {
sentSuccess = false;
if (!u2f.isSupported) {
error('U2F is not supported in this browser.');
return;
}
var data = getQsParam('data');
if (!data) {
error('No data.');
return;
}
parentUrl = getQsParam('parent');
if (!parentUrl) {
error('No parent.');
return;
}
else {
var link = document.createElement('a');
link.href = parentUrl;
parentOrigin = link.origin;
}
var versionQs = getQsParam('v');
if (!versionQs) {
error('No version.');
return;
}
try {
version = parseInt(versionQs);
var jsonString = b64Decode(data);
var json = JSON.parse(jsonString);
}
catch (e) {
error('Cannot parse data.');
return;
}
if (!json.appId || !json.challenge || !json.keys || !json.keys.length) {
error('Invalid data parameters.');
return;
}
stop = false
initU2f(json);
}
function initU2f(obj) {
if (stop) {
return;
}
u2f.sign(obj.appId, obj.challenge, obj.keys, function (data) {
if (data.errorCode) {
if (data.errorCode !== 5) {
error('U2F Error: ' + data.errorCode);
setTimeout(function () {
initU2f(obj);
}, 1000)
}
else {
initU2f(obj);
}
return;
}
success(data);
}, 10);
}
function onMessage() {
window.addEventListener('message', function (event) {
if (!event.origin || event.origin === '' || event.origin !== parentOrigin) {
return;
}
if (event.data === 'stop') {
stop = true;
}
else if (event.data === 'start' && stop) {
start();
}
}, false);
}
function error(message) {
parent.postMessage('error|' + message, parentUrl);
}
function success(data) {
if (sentSuccess) {
return;
}
var dataString = JSON.stringify(data);
parent.postMessage('success|' + dataString, parentUrl);
sentSuccess = true;
}
function info(message) {
parent.postMessage('info|' + message, parentUrl);
}
function getQsParam(name) {
var url = window.location.href;
name = name.replace(/[\[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, ' '));
}
function b64Decode(str) {
return decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}