add captcha connector (#1042)

* add captcha connector

* Update src/connectors/captcha.html

Co-authored-by: Addison Beck <abeck@bitwarden.com>

* Update src/connectors/captcha.scss

Co-authored-by: Addison Beck <abeck@bitwarden.com>

Co-authored-by: Addison Beck <abeck@bitwarden.com>
This commit is contained in:
Kyle Spearrin 2021-06-22 15:35:33 -04:00 committed by GitHub
parent f8a7439675
commit f74c296ad5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Bitwarden Captcha Connector</title>
<script src="https://hcaptcha.com/1/api.js"></script>
</head>
<body>
<div id="captcha"></div>
</body>
</html>

View File

@ -0,0 +1,6 @@
body {
min-width: 0px !important;
padding: 0;
margin: 0;
background: transparent;
}

85
src/connectors/captcha.ts Normal file
View File

@ -0,0 +1,85 @@
import { getQsParam } from './common';
declare var hcaptcha: any;
// tslint:disable-next-line
require('./captcha.scss');
document.addEventListener('DOMContentLoaded', () => {
init();
});
(window as any).captchaSuccess = captchaSuccess;
(window as any).captchaError = captchaError;
let parentUrl: string = null;
let parentOrigin: string = null;
let sentSuccess = false;
function init() {
start();
onMessage();
info('ready');
}
function start() {
sentSuccess = false;
const data = getQsParam('data');
if (!data) {
error('No data.');
return;
}
parentUrl = getQsParam('parent');
if (!parentUrl) {
error('No parent.');
return;
} else {
parentUrl = decodeURIComponent(parentUrl);
parentOrigin = new URL(parentUrl).origin;
}
hcaptcha.render('captcha', {
sitekey: 'bc38c8a2-5311-4e8c-9dfc-49e99f6df417',
callback: 'captchaSuccess',
'error-callback': 'captchaError',
});
}
function captchaSuccess(response: string) {
success(response);
}
function captchaError() {
error('An error occurred with the captcha. Try again.');
}
function onMessage() {
window.addEventListener('message', event => {
if (!event.origin || event.origin === '' || event.origin !== parentOrigin) {
return;
}
if (event.data === 'start') {
start();
}
}, false);
}
function error(message: string) {
parent.postMessage('error|' + message, parentUrl);
}
function success(data: string) {
if (sentSuccess) {
return;
}
parent.postMessage('success|' + data, parentUrl);
sentSuccess = true;
}
function info(message: string) {
parent.postMessage('info|' + message, parentUrl);
}

View File

@ -107,6 +107,11 @@ const plugins = [
filename: 'sso-connector.html',
chunks: ['connectors/sso'],
}),
new HtmlWebpackPlugin({
template: './src/connectors/captcha.html',
filename: 'captcha-connector.html',
chunks: ['connectors/captcha'],
}),
new CopyWebpackPlugin({
patterns:[
{ from: './src/.nojekyll' },
@ -198,6 +203,7 @@ const webpackConfig = {
'connectors/webauthn-fallback': './src/connectors/webauthn-fallback.ts',
'connectors/duo': './src/connectors/duo.ts',
'connectors/sso': './src/connectors/sso.ts',
'connectors/captcha': './src/connectors/captcha.ts',
},
externals: {
'u2f': 'u2f',