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

Feature/use hcaptcha if bot (#1089)

* Add captcha to login page

* pull out shared method

* Update parse parameter logic

* Load captcha

* responsive iframe height
* correct i18n
* site key provided by server

* Fix locale parsing

* Add optional success callbackUri

* Make captcha connector responsive

* Handle parameter versions in webauthn

* Move variables to top of script

* Add captcha to registration

* Move captcha above `<hr>` div to be part of input form

* Add styled mobile captcha connector

* Linter Fixes

* Remove duplicate import

* Use listener to load captcha

* PR review
This commit is contained in:
Matt Gibson
2021-07-23 14:30:04 -05:00
committed by GitHub
parent 2b5f61cadd
commit a73cbbb672
14 changed files with 247 additions and 66 deletions

View File

@@ -1,18 +1,70 @@
import { getQsParam } from './common';
import { b64Decode, buildDataString, parseWebauthnJson } from './common-webauthn';
import { b64Decode, getQsParam } from './common';
import { buildDataString, parseWebauthnJson } from './common-webauthn';
// tslint:disable-next-line
require('./webauthn.scss');
let parsed = false;
let webauthnJson: any;
let parentUrl: string = null;
let parentOrigin: string = null;
let sentSuccess = false;
let locale: string = 'en';
let locales: any = {};
function parseParameters() {
if (parsed) {
return;
}
parentUrl = getQsParam('parent');
if (!parentUrl) {
error('No parent.');
return;
} else {
parentUrl = decodeURIComponent(parentUrl);
parentOrigin = new URL(parentUrl).origin;
}
locale = getQsParam('locale').replace('-', '_');
const version = getQsParam('v');
if (version === '1') {
parseParametersV1();
} else {
parseParametersV2();
}
parsed = true;
}
function parseParametersV1() {
const data = getQsParam('data');
if (!data) {
error('No data.');
return;
}
webauthnJson = b64Decode(data);
}
function parseParametersV2() {
let dataObj: { data: any, btnText: string; } = null;
try {
dataObj = JSON.parse(b64Decode(getQsParam('data')));
}
catch (e) {
error('Cannot parse data.');
return;
}
webauthnJson = dataObj.data;
}
document.addEventListener('DOMContentLoaded', async () => {
const locale = getQsParam('locale').replace('-', '_');
parseParameters();
try {
locales = await loadLocales(locale);
} catch {
@@ -34,8 +86,8 @@ document.addEventListener('DOMContentLoaded', async () => {
content.classList.remove('d-none');
});
async function loadLocales(locale: string) {
const filePath = `locales/${locale}/messages.json?cache=${process.env.CACHE_TAG}`;
async function loadLocales(newLocale: string) {
const filePath = `locales/${newLocale}/messages.json?cache=${process.env.CACHE_TAG}`;
const localesResult = await fetch(filePath);
return await localesResult.json();
}
@@ -54,25 +106,15 @@ function start() {
return;
}
const data = getQsParam('data');
if (!data) {
parseParameters();
if (!webauthnJson) {
error('No data.');
return;
}
parentUrl = getQsParam('parent');
if (!parentUrl) {
error('No parent.');
return;
} else {
parentUrl = decodeURIComponent(parentUrl);
parentOrigin = new URL(parentUrl).origin;
}
let json: any;
try {
const jsonString = b64Decode(data);
json = parseWebauthnJson(jsonString);
json = parseWebauthnJson(webauthnJson);
}
catch (e) {
error('Cannot parse data.');