diff options
Diffstat (limited to 'src/stackexchange-com-fixes/register.js')
-rw-r--r-- | src/stackexchange-com-fixes/register.js | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/stackexchange-com-fixes/register.js b/src/stackexchange-com-fixes/register.js new file mode 100644 index 0000000..b00dba1 --- /dev/null +++ b/src/stackexchange-com-fixes/register.js @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: CC0-1.0 + * + * Use Hacktcha on Stack Exchange registration page. + * + * Copyright (C) 2022 Wojtek Kosior + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the CC0 1.0 Universal License as published by + * the Creative Commons Corporation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * CC0 1.0 Universal License for more details. + */ + +/* Use with https://meta.stackexchange.com/users/signup */ + +/* Load captcha-parent.js first. */ + +(async () => { + const captcha_div = document.createElement("div"); + const submit_but = document.getElementById("submit-button"); + const token_field = document.createElement("textarea"); + + /* + * Let's remove <noscript> tag with the original reCAPTCHA iframe and an + * unnecessary button. + */ + document.querySelector("#no-captcha-here + *").remove(); + for (const elem of [...captcha_div.childNodes]) + elem.remove(); + + token_field.name = "g-recaptcha-response"; + token_field.style.display = "none"; + + document.getElementById("no-captcha-here").after(token_field); + token_field.after(captcha_div); + + /* + * The reCAPTCHA site key is present in 2 places: in a script and in fallback iframe's + * URL. Let's use the former as the source for now. + */ + let site_key; + const site_key_regex = /['"]sitekey['"]\s*:\s*['"]([a-zA-Z0-9-]+)['"]/; + + for (const script of document.scripts) { + match = site_key_regex.exec(script.textContent); + if (match !== null) + site_key = match[1]; + } + + if (site_key === null) { + console.error("Could not extract site key :("); + return; + } + + submit_but.setAttribute("disabled", ""); + + for await (const token of HCHA.run(captcha_div, site_key)) { + if (token === null) { + submit_but.setAttribute("disabled", ""); + } else { + token_field.value = token; + submit_but.removeAttribute("disabled"); + } + } +})(); |