aboutsummaryrefslogtreecommitdiff
path: root/src/stackexchange-com-fixes/register.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/stackexchange-com-fixes/register.js')
-rw-r--r--src/stackexchange-com-fixes/register.js68
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");
+ }
+ }
+})();