From ef2f7aeaaa97f970f7e4147784a838ea04dc08e3 Mon Sep 17 00:00:00 2001 From: MassiveBox Date: Tue, 30 Jan 2024 15:49:24 +0100 Subject: [PATCH] Initial commit --- LICENSE | 21 +++++ README.md | 53 ++++++++++++ background.js | 189 +++++++++++++++++++++++++++++++++++++++++ icons/LICENSE | 5 ++ icons/cf-green-16.png | Bin 0 -> 1107 bytes icons/cf-green-32.png | Bin 0 -> 1754 bytes icons/cf-green-64.png | Bin 0 -> 2951 bytes icons/cf-grey-16.png | Bin 0 -> 835 bytes icons/cf-grey-32.png | Bin 0 -> 1285 bytes icons/cf-grey-64.png | Bin 0 -> 2118 bytes icons/cf-orange-16.png | Bin 0 -> 1148 bytes icons/cf-orange-32.png | Bin 0 -> 1801 bytes icons/cf-orange-64.png | Bin 0 -> 3030 bytes icons/cf-red-16.png | Bin 0 -> 1102 bytes icons/cf-red-32.png | Bin 0 -> 1751 bytes icons/cf-red-64.png | Bin 0 -> 2940 bytes icons/cf.svg | 167 ++++++++++++++++++++++++++++++++++++ icons/make.sh | 17 ++++ manifest.json | 31 +++++++ popup.css | 16 ++++ popup.html | 13 +++ popup.js | 54 ++++++++++++ 22 files changed, 566 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 background.js create mode 100644 icons/LICENSE create mode 100644 icons/cf-green-16.png create mode 100644 icons/cf-green-32.png create mode 100644 icons/cf-green-64.png create mode 100644 icons/cf-grey-16.png create mode 100644 icons/cf-grey-32.png create mode 100644 icons/cf-grey-64.png create mode 100644 icons/cf-orange-16.png create mode 100644 icons/cf-orange-32.png create mode 100644 icons/cf-orange-64.png create mode 100644 icons/cf-red-16.png create mode 100644 icons/cf-red-32.png create mode 100644 icons/cf-red-64.png create mode 100644 icons/cf.svg create mode 100755 icons/make.sh create mode 100644 manifest.json create mode 100644 popup.css create mode 100644 popup.html create mode 100644 popup.js diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9b0a480 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 traktofon, (c) 2024 MassiveBox. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2cd66f --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +Detect CloudFlare (Chromium port) +=============================== + +An extension for Chromium-based browsers which aims to detect whether the current page uses CloudFlare. +It adds an icon to the browser toolbar which indicates the detection status. + +This is intended to help users detect which of the sites they visit is using CloudFlare, so that they can take the appropriate actions (e.g. changing their password) if they are worried that they are affected by the [cloudbleed bug](https://bugs.chromium.org/p/project-zero/issues/detail?id=1139). + +**Note**: This extension detects whether the page _currently_ uses CloudFlare. It cannot detect whether the page might have used CloudFlare in the past, especially during the time period where it was affected by cloudbleed (i.e. 2016-09-22 thru 2017-02-18). For this, you may check [this list](https://github.com/pirate/sites-using-cloudflare). + + +Installation +------------ + +The extension is not available (yet) on Chrome's WebStore. To install the extension from source: + +* Clone or download this repository +* In your browser, go to [chrome://extensions](chrome://extensions) +* Enable "developer mode" - there should be a toggle on the top right for it +* Click "load unpacked extension" and choose the folder where you cloned or downloaded the repository +* The extension will be loaded. Note that it won't have automatic updates. You might have to pin it to keep it always visible. + + +How it Works +------------ + +The extension analyzes all HTTP(S) requests and checks whether any of them are served by CloudFlare proxies, as identified by certain headers in the HTTP(S) response. Based on the result of this analysis, the icon changes color: + +![green](icons/cf-green-32.png) No requests were served by CloudFlare. + +![orange](icons/cf-orange-32.png) Extenal resources were served by CloudFlare. + +![red](icons/cf-red-32.png) The page itself was served by CloudFlare. + +Clicking on the icon will show a popup with detailed information about the domains which use CloudFlare. +Because the extension only uses the headers provided by the server to determine whether a website uses CloudFlare or not, it doesn't make any additional connection to other servers, APIs or DNS resolvers. + + +Notes +----- + +* This extension analyzes **all** requests made by the browser, though other extensions (e.g. adblockers) may block some requests before they are made. +* When navigating forward/backward inside a tab, the detection status will reset to neutral. To get the correct status, the page needs to be reloaded. (Though nowadays the reload happens automatically for many webpages.) + +## Fork information and donations + +This is a fork of [cf-detect](https://github.com/traktofon/cf-detect), which is for Firefox-based browsers. Thanks to [traktofon](https://github.com/traktofon) for the base code. +Right now, the extension is a simple port of the original, with the same features being supported. I plan on working more on this project to port it to Manifest V3 and add some improvements. + +Copyright (c) 2017 traktofon, (c) 2024 MassiveBox. +The software is distributed under the MIT license. Consult the LICENSE file to learn more. + +If you like this fork, consider supporting its creator with a small [donation](https://massivebox.net/pages/donate.html). diff --git a/background.js b/background.js new file mode 100644 index 0000000..25edc69 --- /dev/null +++ b/background.js @@ -0,0 +1,189 @@ +const iconColorAndDesc = { + 0: { color: "grey", desc: "Detect Cloudflare" }, + 1: { color: "green", desc: "This page doesn't seem to use Cloudflare." }, + 2: { color: "orange", desc: "External resources on this page use Cloudflare." }, + 3: { color: "red", desc: "This page uses Cloudflare!" } +}; + +function Counter() { + this.counts = new Map(); + this.setCount = function(key,val) { + this.counts.set(key, val); + }; + this.getCount = function(key) { + if (!this.counts.has(key)) { return 0; } + else { return this.counts.get(key); } + }; + this.incCount = function(key) { + if (!this.counts.has(key)) { this.counts.set(key,1); } + else { this.counts.set(key, this.counts.get(key)+1); } + }; + this.delCount = function(key) { + this.counts.delete(key); + }; +} + +function mapToObject( map ) { + obj = {}; + map.forEach( function(val,key) { obj[key]=val; } ); + return obj; +} + +function CFInfo() { + this.domainCounter = new Counter(); + this.result = 0; + // maybe more in the future +} + +function CFInfoByTab() { + this.info = new Map(); + this.getInfo = function(id) { + return this.info.get(id); + } + this.getOrCreate = function(id) { + if (!this.info.has(id)) { this.info.set(id, new CFInfo()); } + return this.info.get(id); + }; + this.delInfo = function(id) { + this.info.delete(id); + }; +} + +var cfInfo = new CFInfoByTab(); + +function onError(e) { + console.log(`CF-Detect-Background: ${e}`); +} + +function getDomainFromURL( urltxt ) { + try { + var url = new URL(urltxt); + return url.hostname; + } catch(err) { + return null; + } +} + +function updateStatus( tabId ) { + var info = cfInfo.getInfo(tabId); + if (info) { + if (info.result >= 3) return; // no need for further updates + var counts = info.domainCounter.counts; + if (counts.size == 0) { + info.result = 1; + updateIcon( tabId, 1 ); + } else { + chrome.tabs.get(tabId, function(tab) { + try { + var domain = getDomainFromURL(tab.url); + if (counts.has(domain)) { + info.result = 3; + updateIcon( tabId, 3 ); + } else { + info.result = 2; + updateIcon( tabId, 2 ); + } + } catch (error) { + onError(error); + } + }); + } + } else { + updateIcon( tabId, 0 ); + } +} + +function updateIcon( tabId, result ) { + var cd = iconColorAndDesc[result]; + var color = cd.color; + var title = cd.desc; + chrome.browserAction.setTitle({ + tabId: tabId, + title: title + }); + chrome.browserAction.setIcon({ + tabId: tabId, + path: { + 16: `icons/cf-${color}-16.png` , + 32: `icons/cf-${color}-32.png` , + 64: `icons/cf-${color}-64.png` + } + }); +} + +function cfdetect( details ) { + var headers = details.responseHeaders; + var cf = false; + for (var i=0; i" ] }, + [ "responseHeaders" ] +); + +chrome.webNavigation.onBeforeNavigate.addListener( handleBeforeNavigate ); + +chrome.tabs.onUpdated.addListener( handleTabUpdate ); +chrome.tabs.onRemoved.addListener( handleTabClose ); +chrome.tabs.onReplaced.addListener( handleTabReplace ); + +chrome.runtime.onConnect.addListener( handleConnect ); + +// vim: set expandtab ts=4 sw=4 : diff --git a/icons/LICENSE b/icons/LICENSE new file mode 100644 index 0000000..c2320fb --- /dev/null +++ b/icons/LICENSE @@ -0,0 +1,5 @@ +The drawing in "cf.svg" is derived from the "cloud" icon in +Font Awesome by Dave Gandy - http://fontawesome.io . + +It is licensed under the SIL Open Font License 1.1, +http://scripts.sil.org/OFL . diff --git a/icons/cf-green-16.png b/icons/cf-green-16.png new file mode 100644 index 0000000000000000000000000000000000000000..4daf9bd440071ce7deec584db1831695f7c6b43f GIT binary patch literal 1107 zcmeAS@N?(olHy`uVBq!ia0vp^0w65F1|45bDP46hOx7_4S6Fo+k-*%fF5lweEp zc6R~NK=9LfcRi5eEbxdd2GSm2>~=ESj)8%h(bL5-#N+tgDbXGwfg)}Di_;{|Mz^MR z&WydH(9B|LDD0)AwnlMRLYcD1iM$MvKo(cQuL>a?N{)t#c2}K6!qNmH`Asb^HBU}; zJ!bONKYOzvzu*a7dI$O zk!)bSVQch93oL_hI zzJl2o^N9D17w`K=|KmD&>gHnp95%jHg7y)A8btYG86GXXksGnne2u^wGpVMl2gKgw zFfMTaxiVYLZ=-|Zw`j9=m+qu1m!?iSczf2Vk50$$?W;I`FLPt*ul8?Nf1{!k`Z9RV zXm)wNx-eg*)M2Oo&b@cow`jas4!owbI!I8W)lVOxn(9zJ2`Cz zYh?JN^=YwH(m%=@7 zg-#4vn)M*3c~-ZB^_)ALKNJj^Bp6=$-n#rn&0><}&%YCWGGhL`^n09CA=5jrLT9x? zY6w@CsCv!(ri8OPrSYSSY0?%y{bDv9*O^hRv~e_JVRc z=So-c`{>ITGjpryI53@5VKAK0@iVqD{$@iw>xV@T*f(1pIAAQtW5euUo6)*l?oX)5 z@6`+;67^|}owL(Tf7;)QJKgwsRpOa@raMaHq&^>*bK0d?&*jPx#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;wH)0002_L%V+f000SaNLh0L002k;002k;M#*bF000Gu zNkl6fRTW}DM2jBkqJ;y*nE~2Lu-|gLJ@9p;ZgbE4y zmm1I{VXeMXbp9)aGtLSFYlWT(x_fa#+YMn!w(#e2;m(`FlkW*{&ugy{oo0Yx7=~du z_Ix)Bz23~usSe1_DfAgOH1FGCL&IX^ctVD7v_*I0`;N6*R;S}VC)|=KtPg6d5f90L z=L>|xCMlKix>CQN2lEH8CsmF=GpV!M71{J7vQ}5tr^UisU$$n1OWPZ1T*~S*q3=5$pK3P-E0m1Ax)$Jr7O&Ds`HNTe_mTN8p@h1DJdPFYxG1%j4-do(o_;%~8shwU^OStXdP;!@W#CcH2wLahrVHl?)3C&$yr}a zODDFs<*opOLt1xXvn%_?2Jp zj9ya%6da+DBQZslQ*2u+r@Wk2R9m;SsCLBUD(kKDRaQ$O*RgS(5tvYzfF+z|33%>s z>E*ctEc<(|wCo4BRMRN8RLHm1^v}1#wW9ig*NT8B{D=a&VY)NMjimC3RC!Q+!oHyT z1SI&BtW5BM;{^@L$7OaA-2O^%C}o{6E=pK9Tm|(wl@!zi>Qh)-pJF}|>hGEu>i<@8 zb;<1;)g>#Y+Cqr2h4??A7U889A%)ne7>$vX7$dif= zdj<*@6f4NQ3`_z_V4fYg0PBwdWze%N<)-a0{sP!=rq@Rs&Ol(8`-#9Xh^i|-8&wCO z><-UbiRU=)sX0`$9h0`!WZfcs=Uo>`JZ!uiSg{cptP>yH&Zq$Zc8hV-ZUOsbqrZJJ zkfg?u1VBdTCGeo~SR|aiP>~{@K6ZAx_v+jP;qJLgriPEl%7L%+ z1mUIC9f<1qoj#_SrMXPg-o9`TLuGoY&N0r1<5kno-$4D;ZquKU6ZF0s==j%nUhj7kHrgj z>G@5Lx4v($V_~G3_jHp5kxK&Kr-c4L2t9m+O3$dMbCLlb+5o*4Xw|FES0jbj^~aAf zvZMbSbg4^S`fuxR5n;kU)1C7F0000bbVXQnWMOn=I%9HWVRU5xGB7bWEif`IGB{K* zHaajhIx#aVFgQ9eFfR_T^#A|>C3HntbYx+4WjbwdWNBu305UK!H!UzSEiyP%F*Z6d zH99akD=;`ZFfcZWNSOct06TO=SafrCXF6hGb7d`ca%li&X>4UWFE1}>Z*65SW^!R} wYcFGOWMwa7W-Vl8bY)|7FKJ_MZgVeVW-fDfXN$-ZMF0Q*07*qoM6N<$g6`KfDgXcg literal 0 HcmV?d00001 diff --git a/icons/cf-green-64.png b/icons/cf-green-64.png new file mode 100644 index 0000000000000000000000000000000000000000..a8f335f6c963ba4607000bbebe16c40ba8f1a2b9 GIT binary patch literal 2951 zcmZXWdpy(MAICqNxfe2Ynfu&wX(*QsnLD{nD7nXmk$dH~WkgXf8Iq!0zPXfpxkYWd zxL+%mExGPjp_oZpZohqhzkhz0*W>X%&&TVW$Mc+jPddiI>Y%_e0RR9F+E|;PHXw%sJ$QZPt;<0e^(`g=h|~|239;}!8s!O`fLKNw`uF+*jU>Plq z&mR`Kbv-G?XKMK^uAB-!TjT1Ne?)KLQu|Higfv}$_Fmj57UUMaZL3lAHAkl0}AEgrI=(-W3uNp za#2E2Q8j!vKGU`oUk=|oL1=3QIZrQ56^d>lN!hmtys*fvC)&QX>==?C$ zgNLhq8P2i~WKqT$yE%-3cI+-+HFN>#K)QKto*)Y@@3mzYuq}mXq1E}cct&TOG%^5r!RX9#@1u+jWK@wJn=6cf>csspZ)k*w ztTsIREo{)Uq}`MG0l8YT-#wzdp9k|2d7RZ2I<>y1L3wvAwPvTVS+uKL6xjT}al>5y zsA#GR`h&0=*(TAO+Ilhe{4#pTObVSU02%I85i8h?knx~ z`IUaGUh(PkhP5MC^rK5{4#$@+>8*hDxx7bcN#QnVS!8!?V8g`OK(L?^Is|m^sY2qg zl&sHG4m_7leDx(R{?7I*yI&Q1*-0Ps3mD6j`dV}DDmW)o$tIYNqIIVeBsp^l_;S`2Z1F46*)AXwSU59 zil^yIUb|vp4p57mDXZ^YG%hG}e7GBeR)#IbrMYSdNSu% zAfOV%Z_)2XdWjJFv<(JSYa2pgCZXEdrNq|jUld5Cv7<$KZq0F5#oROxvSr zebzN?45oDVNeOt=0+xJb3&A-mRh5Fsyc(}$Eq-fRQ!mamjP*5v`PHF~RDmw>N$&GhTx)T`Kp0xbiqClnbY} zX?mhFWB3p)4-bQo*1amXGGjWCOcN(c#20akIho2>h|S4Vs&8d;Nz{Kcidq-&ZK}8W ziStF(EbzHAKt5Vtl$=|r+@{j~` zz&-Ow^*CU$@vc|?{*BisGYyjo)`rL=J)$l9lGFcnlf^!AwCa zr1_T@jWWc4YXKRn^~|H6Wu}nPbB~KpCdskuzTRYT*;FG-ZK|o{epZQMJ|O#hed|w) zN{@Tcl*751ENAQ`p)%JuFSo(HIrZO zPkVHoOFiL?k1#(*YK)+|0d+f1-jo{w+KzGzaGYK6?W~g2X*a&U9MoGY%(^W#nyqi! z^FDK}(p#F!uUVCDnEkcTqL-&e~W!x*IJ5fXQdsXqfB*q7*n_7uzUxL zBCo>qK|9bvHS2EO#@h@C(>fm|cJz4Ak$!$(isdo}`&S7;O&M)=>tkuJwaG7a2NEly z+AL=Y(+2;R*LWzlcHG!h;!_}OnM5JbkGZLh?#$v@ zfAP_Trm7tGI4^oPPJK?KK1)10`@7ne6eYe5knDhS%&7q=vn}5E{h}%+uax4I2LfWp zY8E=g#+wBYt6q_Ww6u_PL)Oj+q7PnoMyiS5(0koCUj%kPO-`p0K`#GIf3)Sx zEnd3G2I`|HnX@D0gs_76!&v$ooogxTsJnz!>y3m{%9yb~m*?N?%k}IP5Z08>uHCZp zXzR_zO0XLC%6VscptEC|c*RndJke0B-TbG>NVN+-W)tg$E%$g=w9oYVY$&wB z+Zi%SQOGU&i?=mLi6O#XsJP(LXKeY_Y2Wi z15th#qj4HnqVPZf{t^y_Kp=v`Lve_JsEc7C2>);_4&fi5fyG_M`Cmrh{lmkeIsF93 UyWJ~l!MO&ov2ZZ2GxbgWCrg|@wg3PC literal 0 HcmV?d00001 diff --git a/icons/cf-grey-16.png b/icons/cf-grey-16.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1050cb20b493e6e725803ed1a1f43ea9c94a3b GIT binary patch literal 835 zcmeAS@N?(olHy`uVBq!ia0vp^0w65F0wkYiyV3oBOs5nz$3C4NPB>>+sSM@pwVAFT^vI!PH(*wopG*Eg8jq!-QVxtn>lyJ z%~wl#PoE8o@i~zg#~+>*XDF_D+RjwJw3EEDw8j8OW9Ka&cLv=sH`MFCIqpu4B%)b>Qo96W-@JW~$cvc|CF_cyMh=>6Z$d5oiDY-kLS1 zZ?5jHzAW~&oA>V9bD^iSGhVJ(qhzw;$eF0x-{)GNJ(t&(5$@X`VQ98`y-Lio2jOhr z{TDw|b7_*<=6;!@_-WFX%S-kw{4IO1`ibK;ms4t=cUXNYNqK6NZRWN#?MtL*2Jb<^ThlL8 zH(%&$Y2`g3w}s(x+UDJsO6l3Fd?jmDx_%z97VyBKR))sf1{PKZ2Ks#KzoKZ!%}>cptHjh` zUNS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_C{@!xO8?! zcABTo(mjg~Ez`U=tvhvMRM4cSYj3L@Vo`L_Sp9U8kL<%$tXYu}{HMI*v;s8Nrip)Q z5>9`{YdUjA@vgIft2Qir_g>GB-EPJC#q#avE$4r?d|v%y?&1HtPI9f=p8PM!ptH>X zLM=}$o51cVlN|q8PE~eaafiov(`>;7Y7%peW`5BU{-^L&XKgX(vcR}wA7gVYkNy_F z@y#YQ_;vFRwFZNhB}ec4O8NMh{dTRjMXl0K`-#^kC*=OM^`ED_UEbU7Y0dv#3bPmt z*376j{Jnvid#U$iJs- z|GLkeWvlk>^SMlY*K7Qh%QB_It-4?Cj@UZ!mT4gOgHQjq>8n;7@IRlpX4UzXq2>RJ zSL`^uC$61aIH-*6ak8EnFGHQ3!?o%;C-w>{6m8v@E7koz1;>bA`sTXbZLNdBjEAQ?_dZ_r zPt~Gtm2~5dy)7rEhi^L)_baNs%VQEB=gF-blv=naxL)WgFgvK#5||vm(6s7`l&RO+ z<3js8Hl1d;>h7ccXu4oe^v2aco_7EIv}H}9jKT?(rOGG&T3qPmzOVdCKuxG@Q4!lT z#dUfOiun_Mi&!rG>COM2!O_&=z_L#Fb8Bh}UZ33l>t21H*ZJmiue6et=Ug_|Cn{0NdJ1pp*lrrpCN-r?4h3YdKAgrg=g6MsPJdaoCa^wTC2PT<_3q5yTqP#nn&WKd`}Ugqiw~#I zGHd8}1^hbzq~8g8Ulgk9&$}SryguN@oQDs?uFdKEaI!{gxp@k&muBYag)vR>v$+$V zdvGmt(KwNqe4K6X&MBe=yHv$Y+<%-rdM4K6;>iWS%;!i=*xo;p(eeAUS;=>A*-x@$ z|Ebhlka~8d9@oq*^D`@Zr2V!}__5Q&^(gO>tqOPCewy|9C0_2Xspz?zyP?SKn`ro^ zS==Y%Rqnc-ViUS0c;?7XX$B94Ij%2V`g)(empRnPyI1(%^?LvROg&qaw#8&j1C<}D zC9V-ADTyViR>?)FK#IZ0z|dURz)07~BE-LW$AsWm&J!S$mSc7aRE=#vcN-R#*EiKAqNXyJgwbIwu&&bbB)lVx*%*)nK&QD3z oPfpWKNi9iDF450S&d)0b^7VlFx=#qX0*zttboFyt=akR{09WEP1poj5 literal 0 HcmV?d00001 diff --git a/icons/cf-grey-64.png b/icons/cf-grey-64.png new file mode 100644 index 0000000000000000000000000000000000000000..285e7c4d51769c486a55640ef1c5da981e975947 GIT binary patch literal 2118 zcmZXVc|6qZ8peO(4KXGASmwyS4P%Ln8QB>k`<89Y3|WV<>m4LvNOob$SSyK$N+Mz` zLk${{NLi;u3tqdN>72jL=lpSB*K^(X{e7N4ACjG|1?Ys>2><{ezt&8hax1uspsH6@w>NWS<=rg9^2rj@%leW2-)A<;nemBT z8!wq1Ok}#S$K}fF!X7(aa{T`5dM#4E!FEBmp+v|5CbN4cb zz5-^b?c0$x=sq8)&Vn%Ce4~TZ;$6#R*4Ri9CXygRS@zm@PQBd;R_=O{dRAQV$OV&q z*@azsBu-54mL{5m`RHD6YC_u7n+eb5a(b`$j<3A-c!s}Lh4J6h``{}Y1(bW=*0OUv z?5M~bjUU({dPoNMm?;nFSc;SaR|>^Ih@&A%Vzr+ClOCCKT7&57M>YAe^}2KbdT(r* zu`(xA#U{ktp8G55Om%Nrd9Gfedo@@$Z(KlttOBLzw@0`h4{fY}#BGB$#0um^$L$q4 zhf@4LEFCBc88H^Er>NANk{x1xKf-*%{xw^yWyP9fo zsb#U`52!|b*-AI<yS-+eq zTV#-Z5E2{0On-=H59R_h^Myy%)!R#$RCsv`WU6yFvG;NOqyL!OvTj3=iZ&d((Y9fxLbYI!iusU2 zl(ay@6^@`Tp@}d<@X!QQM5SESyg?jc`W6(mm-}@1T$RWxyq(kYu13-H%qhkGu0diJ zP0RyXfGqL&G2X)9ej585g=O@JM@fz{n=tS+*?e6_Ft5USlOSR8hTF?zNd{L!g)=fJ zXWmA71ID!kiaB$=sJe8W+nU~uJS$>*Qd5e{_a|!6z$gm3bZ_@u+}-fK+>Xx3{Sd7! zm{QE?_*lXweZK9osztDlGRfaYMYuZL`h3xc0VObj+7sc~_N8s(XDXWZR%Q z$9J3;y4ZikPv(-%2c3GKTZfa7B8U>zv=Aa6b2_h~byyA~pEvdHg;gVlX>2v&hd(%O z>hie${O*Y3`mx5ahipwa@Io4_t1vT~dX0Cmi*ofDEm5be6Myu8oOvxJZ^S*88v9MP zonwHZOj#W`ht@$=PtBGKfkQg;-HP`>SG7~JIj(!$yqY?axd%Tc@$94==SXS0laRdj7?Qg^*J z4iP5}6+=5Bkb_T%{T&!(2J1EX=32dRZruv+8ixdgA;Q zL&wfYTg7Q_3_783Qcd=$T61%=SKr3bWU+3T!qFE+9&a4Reu3SEZ}+VJEVJN(6(|3$ z(R<@lecy?QM7BOX``LZ)h6BHUcXNmVxoB94OqxSyAq7Xg-c%W9@OMx#Nxn9pQmMAD zf>NBYsLximRc_5?oVHb1vs$*Fzr1E*kUpM8xe^W9V^+49_#;XA3v&f1r-$6;^|vyP z+A_#K0R!7TYAu0oL_y4C!I4!_+{<=(#RP-uv|k(Vq9_6}G*aazR2V^PSWx`p2NkqD6t80`ery*bFfSfxmzmfe{l4-*-?s?7R%Ju10!VX)1SR^Z}vAC>3elylJ0LskPw9(i%<=?E`*Vh05 literal 0 HcmV?d00001 diff --git a/icons/cf-orange-16.png b/icons/cf-orange-16.png new file mode 100644 index 0000000000000000000000000000000000000000..00cf6f321d24e185004dbe70e2d99690c7bba771 GIT binary patch literal 1148 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 literal 0 HcmV?d00001 diff --git a/icons/cf-red-32.png b/icons/cf-red-32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e8781b5264a9f75f80b428e73d36a80fbbce04 GIT binary patch literal 1751 zcmZXUeLT}^8^CYoB}|7jR69(4Ax+d7Q?b0niDb)|aJ+;wXFbnf&*!;5pX>g9uKT{e*Ztp>=s%9zVNDf{O06fl7*}}_9YZ;2anRQ%rbvnXPrAO0#sDCH z+1=S8;QYjVNxJ9IkJ>#Qf(aGoS_YHoj8gZUx!nTyGpbfa^nK6e%6q&mF!$(5I~`4= zoIHuD`V>6lIo4&kY#1gN{i3(`lfM7e3>6utr){r-rZzs5bk7+Lyy_}uz0lBD-WKK<2wx0tjEqq4cu=DYS* zT(FtCW~PyFcK2eT6UQ%i1^Chu|6D8(76`{aookkDQY5p|1m2gp+?ypE(Y-K`wAm?F z-g>FSJ=@OnfmiZwpk;yMz^5d*u#DrO%(*tAF%TLQKB!r(StV6`oglGz7%=-R;Yn>( ziaN^6S=5RfCeQoTn+ zowK}&S0I?28IZL{&zsTrzU_^zvT6A^X&QfhWG67Dtpj>;!SkWU--?l>`%obQLzRvT}Ly{p1dxRQJi^pBpqug>m8m zK57Uxsb;IjU@9INd=6mxvu({OaWZK?u{FI-<=V7Fg3kh(=WkA}*ME_JP+6&3sS4mV zAwM1koiN?x8C$p#7Cdrz8DP%1F?wh8&KY~j=;)i#3|-902=PIqhX=)$uQfZCg9RH& zs&rtS%g9c-oA@XJ|FNr>(swJn?gjs_ia0dR{D%@a!Z%*)f|3{iPHJe_hPx#T`qF37Rw`j9JNFkOxSL>oHrt3x-_-%mN{on`3xb}&fx zSoK(ijW+ZbvmnLek4t%wbbe2ZW-_b`gtd5Gd=!!bFAU-U$iY4@&1i0(#le9NJK1#>{`@*hw5&BzmPePo30R0n_+pu za@%a?hF;d0n zzBZ(~1W^fiDiIx?NR$GYBh65zNOMzjs{k`gH1Y?unS}|`3XMcUJ0Gt6j}Q|_h>ZB> z{|iX#{|c5_*b=E=^X&&pG6@}qrw~n(5+gxGB$SvWb zvl7b4o_ECWzQ5l;zwvrJ-k;~=_4z!WpU=OaSSt&oQ!Iik0Dw~_#s)T2!v7vl2I@*7 zm*-GH=c#9|2S9Za>yZmRwL^kzjPyZ8kMI(;h`Acum;(?d0{|h4s!+EGivR>G1F(D> z0IlZ$@CRf!SZh-c815j945*}re5Emx3g!Ug>p@f+|7)&x`se__B5z`#XNUW?njLP( zGb+;F^0ra2+jjFl3(F_|vxYR@lDMao{O8YOEagi!`y6B6n-6CnJmxJhe^V|id#%db z%h5G{>_96ai^nJ3LHep;b#n?5&Lau6c6c_rwv#mDukpYkI>+51vsV=Fe0Q%W2iB4q z{%ab>Z)N=-K^ZZbdcx&YRRwt-LhA={n3mFc61!WA#nB(Znn4xJE+?il5VK~Dd6s!^ zP8~CTdb+>H<>OPGtw-AXkiHEA#A0JgOfx)}!X7&5g2@x@SYz#IBYIA}7&gTpaFH8e zqu!X|5@%bBE^M%e^y9TI_ zBkYfVod<%sxKWPIpyITQqnyd0=mD}+&Dm6YfARIR78OEMj`#De8<=t*os0YHoGH6_ zENflLsqIgW{Zd(ic?T7=ohwrvqL;<$(z&5rizXJ+=6HXe@db-PWX4e~8F(3w@oXJM zrowQ%t0wEI(}t93SX@(}j3%Dzx~|<)_DSSqZ!-5$$9mA*;DS;(#LwetDr)(4#STm{r+r(`D22<%bEP zLV9%JspgjRRDHwDoBJ?upyMgqtkNnzk6RkQo$ee$GftDg#CA$iGO|ZR?3PA~tIa`p z#rD0X&dWDt81aZ)ZRa!&;B<*ELqr#I)X~=XPH!Q7A-#F<%@xrwot=21wEeNjLx*Nb zx?__H9$$7svE{vUGhHEH#4RZz*KbY!7SW(3;2Vc+-qm=!kFuE6jyU*W-&%=z#AP-x z)w8szZ0I8J!%mbZ0N*KS+}UVcQxF+exdqAqj)y40QBxVz|%5hHGs`QaN*{9X+vgL}gRJ#+dvdzL+jz2}{c+HrUo;itkZ{^Png)$Jx;i>i zk@Ar4kSOP^`PDMPKhq=kw0(4V-F0+5B1uIHLc>_g-)X4LsARQ}16>)gNI|$Lfx_lf zP#~b1KTa?0+bdq0$r*NG=UiWrS7(uQ2AF}$SY~T;^$BD5g7#?55ZkI-ssty^l|Lhg zkaUwgzhkT#fo@QKP=3t+=@t3v7r*P#rQ|ZR#;9-y%WdU@8f{G0kc`uxLS`9DHh_{~ z;5wGvLa#NBI!icRorT0J$HBTTo#7DVNW5X+_)@V{5d~+~ui_GV5y&)5OgaQVqC4B% z;JU@z#GW~DNq0tSMhadMD7d_{Sb~@Ko8_~D&FghN;L#5q$jfMZQgC(-3a|$8O141huDqHc@0C-c6>sA@w=K^ zW*uh(?CC9AxdXO#$Cj$OIsd{A248sD%`_)D(b&d;C%hjE=n7!zyS35qJNQi1BVumA zWk^0BvV=wqF1s>yo7iWvNcUJs@lfdyGMgL7nmi((V9#*9or5IRZ zb$z~)M#3PW?*?~SEPbuC9F?f%t4_f=KCY_0?^c)ZFPGX{9P+;gNdE9h18bMmE& zT^a1?FP&#Crp%$5N_oWf1%Q~5HVxn&aA6<>r`Q>BEHi|Q^L}raN;s*y`7sOkzRlMv>I!0@~G!Z-=+K)Myk9&ydfM;f96PZ4MA3dL?B{l1sU$i2oHot-fcJ z1P_Tvnq{aTclqg&pk>Ykz4>4gYeBuM=by`%y6y5@`%?9<_F2KW;FINJ091ryNSZNBPEhv?3ei3Fi(5#a2qF>&62}&iry`edTpWmKf$7tQEumU|LoN7 z3rOMQ4R>KsxfO(;2{!dKDN>Jv7o?T;1kO>n~_4t?=u4L=L}0yK#G z-dnoOQXI{1u+LUz`{O9;`oi84j|Q@}EfW_SbSv@nyf2r?pfYH5W5yz_5sjp9+BvrI z;-eM)noRj}Lt8JN<`SBwqDGwJb+run%!9Tfx zJk_F`Ez2mS5b;<($)=mtNcbSWNjo>HmUnR-H55ZzxW0Fl`T3CP z>0Kmbtr*jdX4?Y;)y8e~E^g=So#hyD=Syw*X%Y~F>C}z?iCw!C5 zqDlX;Zj0tnj!?=P+WhoM{wJM<#i|WqGX>o_yA4!RJ4Y+oKb1AKbD|-mP*ncIH)7oX z=HZ5JkEFCLXWbfv`hAqf8aiOzT(It1t{8VJfU2^}B_(B5B~=YOm5W-+>RKvl3d$N< z%F0mo%H97GeEr=}9-;p)C~N*(xEO1kNfls!zYuiSQ|pdPkh@Ya1_eA&Xm>3r6zb*g z>kjq6xcK=%UH#qMp{^cEZthrjS1c6e>hBjs?dPf9laAAd)N6o=p@l(({_O|<1WQ3$ A_y7O^ literal 0 HcmV?d00001 diff --git a/icons/cf.svg b/icons/cf.svg new file mode 100644 index 0000000..a8dda87 --- /dev/null +++ b/icons/cf.svg @@ -0,0 +1,167 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/make.sh b/icons/make.sh new file mode 100755 index 0000000..746572f --- /dev/null +++ b/icons/make.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +colors="red:#cc0000 green:#00cc00 orange:#ddaa00 grey:#cccccc" + +for res in 16 32 64; do + for color in ${colors}; do + colname=${color%:*} + colspec=${color#*:} + convert -background none cf.svg \ + +level-colors "${colspec}," \ + -colorspace RGB \ + -resize "${res}" \ + -colorspace sRGB \ + "cf-${colname}-${res}.png" + done +done + diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..312034c --- /dev/null +++ b/manifest.json @@ -0,0 +1,31 @@ +{ + "manifest_version": 2, + "name": "Detect Cloudflare", + "homepage_url": "https://git.massivebox.net/massivebox/cf-detect-chrome", + "description": "Adds an icon to the toolbar which indicates whether the current page uses Cloudflare. If it does, the icon changes color. Detection is performed by analyzing the response headers of all requests.", + "version": "0.7", + "icons": { + "16": "icons/cf-grey-16.png", + "32": "icons/cf-grey-32.png", + "64": "icons/cf-grey-64.png" + }, + "permissions": [ + "webRequest", + "webNavigation", + "tabs", + "" + ], + "background": { + "scripts": [ "background.js" ] + }, + "browser_action": { + "browser_style": true, + "default_title": "Indicates whether this page uses Cloudflare", + "default_icon": { + "16": "icons/cf-grey-16.png", + "32": "icons/cf-grey-32.png", + "64": "icons/cf-grey-64.png" + }, + "default_popup": "popup.html" + } +} diff --git a/popup.css b/popup.css new file mode 100644 index 0000000..c33272f --- /dev/null +++ b/popup.css @@ -0,0 +1,16 @@ +body { + padding: 0em 1em; +} + +p#status { + font-weight: bold; +} + +ul { + margin-top: -1ex; + padding-left: 1em; +} + +.count { + color: #cc0000; +} diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..5360de3 --- /dev/null +++ b/popup.html @@ -0,0 +1,13 @@ + + + + + + + +
+

Detection Status.

+
+ + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..8b48078 --- /dev/null +++ b/popup.js @@ -0,0 +1,54 @@ +const statusText = { + 0: "No requests have been processed yet.", + 1: "No requests were served by Cloudflare.", + 2: "Requests for these domains were served by Cloudflare:", + 3: "Requests for these domains were served by Cloudflare:", + 99: "Detection result unavailable." +}; + +var getTab = chrome.tabs.query( { active:true, currentWindow:true }, function(tabs){ + try { + var tab = tabs[0]; + var port = chrome.runtime.connect(); + port.postMessage(tab.id); + port.onMessage.addListener( function(msg) { + port.disconnect(); + if (msg) { + writeStatus(msg.result); + populatePopup(msg.counts); + } else { + writeStatus(0); + } + }); + }catch (error){ + writeStatus(99); + console.log(`CF-Detect-Popup: ${error}`); + } +}); + +function writeStatus( st ) { + var p = document.getElementById("status"); + p.textContent = statusText[st]; +} + +function populatePopup( domainCounts ) { + var ndomain = 0; + var div = document.getElementById("top"); + var ul = document.createElement("ul"); + for (var domain in domainCounts) { + if (!domainCounts.hasOwnProperty(domain)) continue; + ++ndomain; + var count = domainCounts[domain]; + var li = document.createElement("li"); + var text = document.createTextNode(`${domain}: `); + var span = document.createElement("span"); + span.setAttribute("class", "count"); + span.textContent = `${count}`; + li.appendChild(text); + li.appendChild(span); + ul.appendChild(li); + } + if (ndomain>0) div.appendChild(ul); +} + +// vim: set expandtab ts=4 sw=4 :