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:
12
src/connectors/duo.html
Normal file
12
src/connectors/duo.html
Normal 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
43
src/connectors/duo.js
Normal 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
17
src/connectors/duo.scss
Normal 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
11
src/connectors/u2f.html
Normal 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
140
src/connectors/u2f.js
Normal 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(''));
|
||||
}
|
||||
Reference in New Issue
Block a user