aboutsummaryrefslogtreecommitdiffstats
path: root/tool/cf_email_decoder/cfemail.user.js
diff options
context:
space:
mode:
authoruser <t@or>2020-12-07 03:11:26 +0000
committeruser <t@or>2020-12-07 03:11:26 +0000
commit8640d81bf35da3c92c74a9a62b661126f98c2055 (patch)
tree1afc4227ad75db83f5777b8478d3f776c3c2f427 /tool/cf_email_decoder/cfemail.user.js
parentbe1d1dd7d8e2f277ff7e1fe00690a2b8ab1fca67 (diff)
parenta7fabb1837b55f6b7514d0f7a1587671539033a6 (diff)
downloadcloudflare-tor-8640d81bf35da3c92c74a9a62b661126f98c2055.tar.lz
cloudflare-tor-8640d81bf35da3c92c74a9a62b661126f98c2055.tar.xz
cloudflare-tor-8640d81bf35da3c92c74a9a62b661126f98c2055.zip
Merge remote-tracking branch 'tool/cf_email_decoder/main'
Diffstat (limited to 'tool/cf_email_decoder/cfemail.user.js')
-rw-r--r--tool/cf_email_decoder/cfemail.user.js64
1 files changed, 64 insertions, 0 deletions
diff --git a/tool/cf_email_decoder/cfemail.user.js b/tool/cf_email_decoder/cfemail.user.js
new file mode 100644
index 00000000..673f898f
--- /dev/null
+++ b/tool/cf_email_decoder/cfemail.user.js
@@ -0,0 +1,64 @@
+// ==UserScript==
+// @name Decode Cloudflare-encoded email addresses
+// @namespace https://codeberg.org/smege1001/cf_email_decoder
+// @match *://*/*
+// @grant none
+// @version 1.2.2
+// @author smege1001
+// ==/UserScript==
+
+/**
+* @license CC0-1.0
+**/
+
+const emailprotectionURLHashRegex = /\/cdn-cgi\/l\/email-protection#([aA0-fF9]*)/;
+const emailprotectionURLNoHashRegex = /\/cdn-cgi\/l\/email-protection/; //hash is stored on data-cfemail
+
+function decodeEmail(hash) { //cloudflare email address decoder
+ var hashArray = []; //split the hash into bytes
+ for (var hAIndex = 0; hAIndex < hash.length; hAIndex += 2) {
+ hashArray.push(parseInt(hash.substring(hAIndex, hAIndex + 2), 16));
+ }
+
+ var decoded = "";
+ var key = hashArray[0]; //get the decode key
+
+ for (var index = 1; index < hashArray.length; index++) {
+ decoded += String.fromCharCode(hashArray[index] ^ key);
+ }
+ return decoded;
+}
+
+var links = document.querySelectorAll("a"); //get all the links
+
+for (var linksIndex = 0; linksIndex < links.length; linksIndex++) {
+ var link = links[linksIndex];
+ if (emailprotectionURLHashRegex.test(link.href)) {
+ var hash = link.href.match(emailprotectionURLHashRegex)[1];
+ var decodedEmail = decodeEmail(hash);
+
+ link.href = "mailto:" + decodedEmail; //replace the stupid email protection with just a mailto link
+
+ if (link.getElementsByClassName("__cf_email__").length > 0) {
+ var linkChild = link.getElementsByClassName("__cf_email__")[0];
+ linkChild.innerText = decodedEmail;
+
+ linkChild.removeAttribute("data-cfemail");
+ linkChild.classList.remove("__cf_email__");
+
+ if (linkChild.getAttribute("class") == "") linkChild.removeAttribute("class");
+ }
+ } else if (emailprotectionURLNoHashRegex.test(link.href) && link.hasAttribute("data-cfemail")) {
+ var hash = link.getAttribute("data-cfemail");
+ var decodedEmail = decodeEmail(hash);
+
+ link.href = "mailto:" + decodedEmail;
+ link.innerText = decodedEmail; //the inner text is just [email protected]
+
+ //remove the useless attributes
+ link.removeAttribute("data-cfemail");
+ link.classList.remove("__cf_email__");
+
+ if (link.getAttribute("class") == "") link.removeAttribute("class");
+ }
+}