From f74c296ad570cae1e335df858d38ccd925f05571 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Tue, 22 Jun 2021 15:35:33 -0400 Subject: [PATCH] add captcha connector (#1042) * add captcha connector * Update src/connectors/captcha.html Co-authored-by: Addison Beck * Update src/connectors/captcha.scss Co-authored-by: Addison Beck Co-authored-by: Addison Beck --- src/connectors/captcha.html | 14 ++++++ src/connectors/captcha.scss | 6 +++ src/connectors/captcha.ts | 85 +++++++++++++++++++++++++++++++++++++ webpack.config.js | 6 +++ 4 files changed, 111 insertions(+) create mode 100644 src/connectors/captcha.html create mode 100644 src/connectors/captcha.scss create mode 100644 src/connectors/captcha.ts diff --git a/src/connectors/captcha.html b/src/connectors/captcha.html new file mode 100644 index 0000000000..16aa5bdb63 --- /dev/null +++ b/src/connectors/captcha.html @@ -0,0 +1,14 @@ + + + + + + Bitwarden Captcha Connector + + + + +
+ + + diff --git a/src/connectors/captcha.scss b/src/connectors/captcha.scss new file mode 100644 index 0000000000..4a6ebdf9dc --- /dev/null +++ b/src/connectors/captcha.scss @@ -0,0 +1,6 @@ +body { + min-width: 0px !important; + padding: 0; + margin: 0; + background: transparent; +} diff --git a/src/connectors/captcha.ts b/src/connectors/captcha.ts new file mode 100644 index 0000000000..810189fc42 --- /dev/null +++ b/src/connectors/captcha.ts @@ -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); +} + diff --git a/webpack.config.js b/webpack.config.js index 37a84a624f..58a656d42a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -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',