aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tool/cf_email_decoder/.gitignore51
-rw-r--r--tool/cf_email_decoder/LICENSE119
-rw-r--r--tool/cf_email_decoder/README.md9
-rw-r--r--tool/cf_email_decoder/cfemail.user.js64
-rw-r--r--tool/cf_email_decoder/readme/compare_decoded_address.pngbin0 -> 3000 bytes
-rw-r--r--tool/cf_email_decoder/readme/compare_decoded_namedlink.pngbin0 -> 15097 bytes
-rw-r--r--tool/cf_email_decoder/readme/compare_encoded_address.pngbin0 -> 2442 bytes
-rw-r--r--tool/cf_email_decoder/readme/compare_encoded_namedlink.pngbin0 -> 53465 bytes
8 files changed, 243 insertions, 0 deletions
diff --git a/tool/cf_email_decoder/.gitignore b/tool/cf_email_decoder/.gitignore
new file mode 100644
index 00000000..c0df46a4
--- /dev/null
+++ b/tool/cf_email_decoder/.gitignore
@@ -0,0 +1,51 @@
+# ---> Emacs
+# -*- mode: gitignore; -*-
+*~
+\#*\#
+/.emacs.desktop
+/.emacs.desktop.lock
+*.elc
+auto-save-list
+tramp
+.\#*
+
+# Org-mode
+.org-id-locations
+*_archive
+
+# flymake-mode
+*_flymake.*
+
+# eshell files
+/eshell/history
+/eshell/lastdir
+
+# elpa packages
+/elpa/
+
+# reftex files
+*.rel
+
+# AUCTeX auto folder
+/auto/
+
+# cask packages
+.cask/
+dist/
+
+# Flycheck
+flycheck_*.el
+
+# server auth directory
+/server/
+
+# projectiles files
+.projectile
+
+# directory configuration
+.dir-locals.el
+
+# network security
+/network-security.data
+
+
diff --git a/tool/cf_email_decoder/LICENSE b/tool/cf_email_decoder/LICENSE
new file mode 100644
index 00000000..a343ccd4
--- /dev/null
+++ b/tool/cf_email_decoder/LICENSE
@@ -0,0 +1,119 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES
+NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE
+AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION
+ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE
+OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS
+LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION
+OR WORKS PROVIDED HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer exclusive
+Copyright and Related Rights (defined below) upon the creator and subsequent
+owner(s) (each and all, an "owner") of an original work of authorship and/or
+a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the
+purpose of contributing to a commons of creative, cultural and scientific
+works ("Commons") that the public can reliably and without fear of later claims
+of infringement build upon, modify, incorporate in other works, reuse and
+redistribute as freely as possible in any form whatsoever and for any purposes,
+including without limitation commercial purposes. These owners may contribute
+to the Commons to promote the ideal of a free culture and the further production
+of creative, cultural and scientific works, or to gain reputation or greater
+distribution for their Work in part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation
+of additional consideration or compensation, the person associating CC0 with
+a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
+and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
+and publicly distribute the Work under its terms, with knowledge of his or
+her Copyright and Related Rights in the Work and the meaning and intended
+legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be protected
+by copyright and related or neighboring rights ("Copyright and Related Rights").
+Copyright and Related Rights include, but are not limited to, the following:
+
+i. the right to reproduce, adapt, distribute, perform, display, communicate,
+and translate a Work;
+
+ ii. moral rights retained by the original author(s) and/or performer(s);
+
+iii. publicity and privacy rights pertaining to a person's image or likeness
+depicted in a Work;
+
+iv. rights protecting against unfair competition in regards to a Work, subject
+to the limitations in paragraph 4(a), below;
+
+v. rights protecting the extraction, dissemination, use and reuse of data
+in a Work;
+
+vi. database rights (such as those arising under Directive 96/9/EC of the
+European Parliament and of the Council of 11 March 1996 on the legal protection
+of databases, and under any national implementation thereof, including any
+amended or successor version of such directive); and
+
+vii. other similar, equivalent or corresponding rights throughout the world
+based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of,
+applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
+unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
+and Related Rights and associated claims and causes of action, whether now
+known or unknown (including existing as well as future claims and causes of
+action), in the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time extensions),
+(iii) in any current or future medium and for any number of copies, and (iv)
+for any purpose whatsoever, including without limitation commercial, advertising
+or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the
+benefit of each member of the public at large and to the detriment of Affirmer's
+heirs and successors, fully intending that such Waiver shall not be subject
+to revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be
+judged legally invalid or ineffective under applicable law, then the Waiver
+shall be preserved to the maximum extent permitted taking into account Affirmer's
+express Statement of Purpose. In addition, to the extent the Waiver is so
+judged Affirmer hereby grants to each affected person a royalty-free, non
+transferable, non sublicensable, non exclusive, irrevocable and unconditional
+license to exercise Affirmer's Copyright and Related Rights in the Work (i)
+in all territories worldwide, (ii) for the maximum duration provided by applicable
+law or treaty (including future time extensions), (iii) in any current or
+future medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional purposes
+(the "License"). The License shall be deemed effective as of the date CC0
+was applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder of
+the License, and in such case Affirmer hereby affirms that he or she will
+not (i) exercise any of his or her remaining Copyright and Related Rights
+in the Work or (ii) assert any associated claims and causes of action with
+respect to the Work, in either case contrary to Affirmer's express Statement
+of Purpose.
+
+ 4. Limitations and Disclaimers.
+
+a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered,
+licensed or otherwise affected by this document.
+
+b. Affirmer offers the Work as-is and makes no representations or warranties
+of any kind concerning the Work, express, implied, statutory or otherwise,
+including without limitation warranties of title, merchantability, fitness
+for a particular purpose, non infringement, or the absence of latent or other
+defects, accuracy, or the present or absence of errors, whether or not discoverable,
+all to the greatest extent permissible under applicable law.
+
+c. Affirmer disclaims responsibility for clearing rights of other persons
+that may apply to the Work or any use thereof, including without limitation
+any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims
+responsibility for obtaining any necessary consents, permissions or other
+rights required for any use of the Work.
+
+d. Affirmer understands and acknowledges that Creative Commons is not a party
+to this document and has no duty or obligation with respect to this CC0 or
+use of the Work.
diff --git a/tool/cf_email_decoder/README.md b/tool/cf_email_decoder/README.md
new file mode 100644
index 00000000..403da032
--- /dev/null
+++ b/tool/cf_email_decoder/README.md
@@ -0,0 +1,9 @@
+# cf\_email\_decoder
+cf\_email\_decoder is a userscript that decodes email addresses that are protected by Cloudflare
+
+## Comparisons
+
+| Encoded | Decoded |
+|-----------------------------------------|-----------------------------------------|
+|![](readme/compare_encoded_namedlink.png)|![](readme/compare_decoded_namedlink.png)|
+|![](readme/compare_encoded_address.png) |![](readme/compare_decoded_address.png) |
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");
+ }
+}
diff --git a/tool/cf_email_decoder/readme/compare_decoded_address.png b/tool/cf_email_decoder/readme/compare_decoded_address.png
new file mode 100644
index 00000000..f570e429
--- /dev/null
+++ b/tool/cf_email_decoder/readme/compare_decoded_address.png
Binary files differ
diff --git a/tool/cf_email_decoder/readme/compare_decoded_namedlink.png b/tool/cf_email_decoder/readme/compare_decoded_namedlink.png
new file mode 100644
index 00000000..e20ca9d9
--- /dev/null
+++ b/tool/cf_email_decoder/readme/compare_decoded_namedlink.png
Binary files differ
diff --git a/tool/cf_email_decoder/readme/compare_encoded_address.png b/tool/cf_email_decoder/readme/compare_encoded_address.png
new file mode 100644
index 00000000..a59b988f
--- /dev/null
+++ b/tool/cf_email_decoder/readme/compare_encoded_address.png
Binary files differ
diff --git a/tool/cf_email_decoder/readme/compare_encoded_namedlink.png b/tool/cf_email_decoder/readme/compare_encoded_namedlink.png
new file mode 100644
index 00000000..8e0b3cca
--- /dev/null
+++ b/tool/cf_email_decoder/readme/compare_encoded_namedlink.png
Binary files differ