From 69c28d1c4ae5fd52008758bef03b2072f8657bfe Mon Sep 17 00:00:00 2001 From: vibecommerce Date: Fri, 17 Mar 2017 12:31:32 -0300 Subject: [PATCH 001/119] apps.json Add new CMS e-commerce - Vibecommerce --- src/apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/apps.json b/src/apps.json index 6adadb87c..1a0733b26 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9836,6 +9836,18 @@ }, "website": "http://www.vbulletin.com" }, + "Vibecommerce": { + "cats": [ + 6 + ], + "excludes": "PrestaShop", + "icon": "vibecommerce.png", + "implies": "PHP", + "meta": { + "designer": "Vibecommerce" + }, + "website": "http://vibecommerce.com.br" + }, "viennaCMS": { "cats": [ 1 From b8e82811d2347525166036d5d7fc81c1e2f74a03 Mon Sep 17 00:00:00 2001 From: vibecommerce Date: Fri, 17 Mar 2017 12:33:27 -0300 Subject: [PATCH 002/119] vibecommerce.png Adding icon vibe commerce.png to CMS e-commerce - vibecommerce --- src/icons/vibecommerce.png | Bin 0 -> 1012 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/vibecommerce.png diff --git a/src/icons/vibecommerce.png b/src/icons/vibecommerce.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8c6a50d6d821a936faf876c881c486f4a1870a GIT binary patch literal 1012 zcmYLHdrZ?;6h1t*0nVgToKT=ViUc*%7LXx~ZPvmp5n5;~+my70qCyxOWC+X`REofK zq!2+skSadHpu7TfEswU)7U&OfqCpg0ItNY>$JENigu7e++0A{N*O&91b59vJ{>$|) zWETKf&)&;Q#IKL-I62^()m&}_u&d|p<40pvM)=9hK1dRZQi72r1c~V=HRS&-WnX? zjSShCH+D&8+{^UdaH9qBFe(_=PE>D25(cIUt;$lpmo;NYk;wzp16ZvX^g65cd`Fvs zgtT&qHzaVY znFKIQ!@wx~st03Zf}(yYn|;h2hJ@SCOi)o0<>C~?4`q_^_Z;~lF`fs@@@2Vn6JZ#t z6UI8fwZ2?lnz=QmS9M;y+H~QJOm;js>rnE6#LpumLg}<^{uGDRmFLeE|5}*;)ADfc z)}+~>?(OMOwzW1loR?P=pUBJ2$@=zCnk02Um$R1{Mhgt^B!9f&BhtD8SF09}MiZO0 zn;&jIAx}FnOm~fOaOkxge(-K3SG6uBW~%N_1tdnO)B1%!emBL=dg1sL?{?pZYwX;6 zZwz0b5^x)@Y~z2gx&E{{JR%`M5OgGYOHn>8PH~VO6nkfm&$eEwY7cH*n9fn`zEV8@R1rm_`QdA%44sl* z?i*WbpX1wdTI_n%v6*?bik7$k<~ISY*`7jey;B* Date: Sun, 19 Mar 2017 22:00:57 +0200 Subject: [PATCH 003/119] Add files via upload --- src/icons/WPcache.png | Bin 0 -> 2435 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/WPcache.png diff --git a/src/icons/WPcache.png b/src/icons/WPcache.png new file mode 100644 index 0000000000000000000000000000000000000000..45f82346927b250f6cf834c045b0ad027a5beba5 GIT binary patch literal 2435 zcmV-}34Hd6P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rc0}~M>4j**ozyJUUBuPX;R9M4}mw#|n)fLA- z_rCY?_D7Zk$PcnXNcgc42xvi#Rs{m1h<0SAYVBAZtU6XZbjF$5DgMzJr_<>#wbfCJ zV_S7!!-fm1nLOe73X7;}K?)RMU z`JQv`6HH-|y43(C5CPT#tAV9J1rW$RmIS(h7N9ASNPO_}tH18N`cTuI$-@U91?m8W z5ci?=9{*SBSn|Ukk>B`Azy@#~@NM7@pmOv(I(HF*LSP}VP$_ly;+lnR;h?`gRKM=p zY)4xt+Ytq60NkcCnLWdw9vi_iCjkZs15W`D1Eu4i(;C7vP3DwY96FUkX;4ZLnO|*w z|H;Ryt7cbLgP{0p-S!Y5AMuFb|ya3z`h^f*99(ZNNES`Sy zF&56RCfeSCT~I*j>^V$-=yB3#T5;N=rV~9YfBt}}s z1Cf9&u}neM)ss7sb3|*+ZL4nK!FxBbZC3-QFZT1T$G=Nu^#XS8+)2&6Ih4(u$vfM2 z1pmBa*Ma8$9POAnyNce9bI4Kqg@NaRh}Lj@jgRFEedtm6S~KRqx2Bm@R?7Vw?!+=p zq8*)Fy>uDjtLCt%b}6Ca8FXLhVJMMcU-RMl0l)wG9F~`YT=X(0xLfn|9y&EVLUms8 z6*En=hVDzw7-6hmyNdZ$a{*W!S-_ry9}}K^6+IWaN%X~;Up<#2EhjjAz74}LZp~qB zj?}GIc@5kEY#bd~GOfmi3f1KnN<(+tK?`t|Vs2%aJL*@Cq~i9~E9oB?qT$`Q@!17D zeBa&7C@$uu*WY3|oyL%o9M)ffgJw<#8-cQ^MAv*O<)uNubVE>9V6v|M7Q(a2QOe6r zFyLq7{a@#vudTy0O@e^{@9p>pM_Nwg!O3B51P+-%4PKL((p&{T0js82tSK}JmzFSV z2VrJOJxV6_Bl0Zc=% z{`x}ZmRXmV8c=2mHWU?L3HV?j!*NIAYK?ZX3^ndyaPMx91tCBwcJF+j-5)kFIwGau zz{!+XMc#6)i8s}7mFC3xVR{GL%bKqM>O&S)wxl`Xa4e;GJTT1QyMG|HAVT)UF#;>< zFiXopDN-N*3)R?wc3s4{&BifYVFE!f}X~nzo4A=s*%EIZ2 zlRb0*X;~PRSAo_foA)#H{@*B98Eh#@Dt)D45;Q0CZq%qHsWflI(hRzqu8iWI>q0E9 z_tD*`7>X*gS%<;hJLovxf^nvmP&!E#fzne?G6^KcFKVDDAemQTAp|%YK1;iFWfdhw z2KV0>Kwol5$27r8N$HXTvcrQk?Qf=gUU$a z(XgsEKuw8cAnITS1>riIIJeJ{ZjMdD=xzf@&Hgi8(HTCZ&|) zx-Q;Np|wV9uQKwc6fCT?SypA^x|+gD6H#vS%7+O)I-X>S-(-=`;FF|F!$5Yz=rvFj zlx(;uL?|E~rD-x(EUVocnP1&5gsAEp7@+%N4;@_>h{Z3F$z+kzYb>ByzQD(f=@za9 z!!Eqm(9gF00{{#vO-stI zbzaDPiL%RS>>{ukXcN(Bl&s@OpKbqK2=RkhEJiAo!m=z%N=lGY5{tz+dh!(8cK)67 zZ5<@jAmtUKo63F(JOd~J(B9q-P${L{s+77lolYaA#I|i5$Dy~kmry7~*TonwzWyek zocMIY0V4%W3m6O}UDV_);NQSEfzH z=kpPnSHy3e0#?jCZ=GZ6?g(@1ZZt;^4`hct*V+! zB9+2#+aD^WAJSUyGYmr;hJjLQBw|-7BJ-+vnK4Vl7Y)qE-kh9LEX%_*bv!#(f8phGFDC&l`cgz-NFn8F1eI53gv3y1f0TeE05UK!H!UzTEipM%F*iChHaamhD=;xSFfbDGkUIbX03~!q zSaf7zbY(hiZ)9m^c>ppnF*hwRGc7SWR53R?Gd4OgG%GMMIxsL}uPBEA0038dR9JLU zVRs;Ka&Km7Y-J#Hd2nSQX>fF7004NL Date: Sun, 19 Mar 2017 22:04:34 +0200 Subject: [PATCH 004/119] Update apps.json --- src/apps.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 04b2f0408..ee78903a5 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8309,6 +8309,22 @@ "icon": "WHMCS.png", "website": "http://www.whmcs.com" }, + "WPcache": { + "cats": [ + "23" + ], + "headers": { + "X-Powered-By": "WPcache(?:/([\\d.]+))?\\;version:\\1" + }, + "meta": { + "generator": "WPcache", + "keywords": "WPcache" + }, + "html": " + width="32px" height="32px" viewBox="0 0 500 500"> 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 R@{gef^|XvN^EK>F{~x=K<+cC- literal 0 HcmV?d00001 From 357a3ea15412b49213bd3c29304f0f3be3dd1b02 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 10:50:34 -0400 Subject: [PATCH 023/119] Update pattern for script matching --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 36ae557e7..eeb4c4481 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2447,7 +2447,7 @@ ], "icon": "FancyBox.png", "implies": "jQuery", - "script": "jquery\\.fancybox\\.pack\\.js$", + "script": "jquery\\.fancybox\\.pack\\.js(?:v=([\\d.]+))?$\\;version:\\1", "website": "fancyapps.com/fancybox" }, "Fat-Free Framework": { From 54c2b1e862d75190e045e461b3299a18942596f5 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 11:18:06 -0400 Subject: [PATCH 024/119] Add detection for live chat Olark via script tag --- src/apps.json | 10 +++++++++- src/icons/Olark.png | Bin 0 -> 869 bytes 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100755 src/icons/Olark.png diff --git a/src/apps.json b/src/apps.json index 04b2f0408..632c57282 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5338,6 +5338,14 @@ "script": "owl.carousel.*\\.js", "website": "http://owlgraphic.com/owlcarousel" }, + "Olark": { + "cats": [ + "52" + ], + "icon": "Olark.png", + "script": "^(http|https):\/\/static\\.olark\\.com\/jsclient\/loader1\\.js", + "website": "https://www.olark.com/" + }, "OXID eShop": { "cats": [ "6" @@ -10162,4 +10170,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/Olark.png b/src/icons/Olark.png new file mode 100755 index 0000000000000000000000000000000000000000..9dd473c5a4dd193ba41886b2719ee35bc7a850ab GIT binary patch literal 869 zcmV-r1DgDaP)XjFz=E+z z3ZsRk7@1@bK_Uz)q^MkIt6CJ9sHgw2Pq;SD+&elWExPdI&Yb%l&Tqc?&Ue44fAdOr z#{&y6@#n=XTmZU2f2_vk9^A4q51a?jz$Y*w?jOJ#FbH0X=TE>R&W`s*(1SE2Cwam@2L2a0t9(fl(oF9D%!X zN%0vj+U;qiWP2&~m8C6I;1>&!V5gFWmw*|V$;mZuqTbSlNwB~aAh3;FN-iM@Yd|86 zHQ}Ty1)1{|7-xZ>fIt-jFXWQ+2J0*Vb>VheYcHoG&g}UJ{9u7^fWRK!OyrWP(E(C{ zXpNgnst;01ekJX&nnD%$$^u^ifg0Y)v&-RQUbpVym?w`FVX}WGciYO5;TDrselSJg9~`z0An)6C&83oG5;7d4nBe& za0;XbJCYTF91L=aBw7Gt-~dpCdM;c6;*hu$Yz57r19XBmu~2Jd-Wx+e8}0*ZGH`$@ zz-LBZfa146LL^Siw*d+2xQ7EwdBl$F*CYZBypm<6JnRDJBm!K#!EeeVEO1OBz|&tV vo$|#HPyr7Z2R@nhil~Slc%%MbVY+?;Ktxy|6C9Z300000NkvXXu0mjft-Eku literal 0 HcmV?d00001 From 813199a8451759f5bd4aa26ad22763b4215d3242 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 11:33:50 -0400 Subject: [PATCH 025/119] ForkCMS -- Add detection for via meta tag --- src/apps.json | 13 ++++++++++++- src/icons/ForkCMS.png | Bin 0 -> 2032 bytes 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 src/icons/ForkCMS.png diff --git a/src/apps.json b/src/apps.json index 04b2f0408..6dd7a1cd6 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2577,6 +2577,17 @@ "icon": "Font Awesome.png", "website": "http://fontawesome.io" }, + "Fork CMS": { + "cats": [ + "1" + ], + "icon": "ForkCMS.png", + "implies": "Symfony", + "meta": { + "generator": "^Fork CMS$" + }, + "website": "http://www.fork-cms.com/" + }, "Fortune3": { "cats": [ "6" @@ -10162,4 +10173,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/ForkCMS.png b/src/icons/ForkCMS.png new file mode 100755 index 0000000000000000000000000000000000000000..5057b873cd32f632121e5dbad0f44aa475356089 GIT binary patch literal 2032 zcmVtV;n4$96@%>oBT&+)hSPH}Lof=Y$f7#AqWAG97sopprs9x5^gEDVh_KE86Ct2*m>7>9>4oe9{AN?dHT7%80Roq#y_8Y zfH%gf-1qPkU=7(#Ux*|`V0scp24TZi2#TU`b_8kf0-vG%`;lvJ1=S1tfcOlu3{f~X zG{WCs>1F@1kC~jBMXW`$j8}U5Sk=*r4JlsDVm;1Gf%j2~B2bw?Mo$vjyC6-G+AJYA zuOqjcH3n-82F0u5GY=xX{>~xxy}2JLIE*t80%9Ex?*20bk0~Y?=Nep2!21{uBA_6H zhjWw45@DSY!5M=wf)T+YT(@-totJkk{lFMPtxA|2MU26AbVsWh!wc4sUJyeetwW)( z@E*cq0;(GQPQY5>-fw-8FJIN&aECHFGE7VT48@auNY;t3RjHI$uzc&S_@;JNJ@#+X zS{eb8BGjr-uR7j=s%fKYx^u-+mdL zt)Q7_c*e8)PyZsk`yA(bpGVctlVy1axB~M2KB!Da+o;0iX{7Is7y+eaQ3LTmjW$$8 z4Ajn!FnwTv`q&^+IZe4}*|DjE_SWT4ETBPYE@s?v)f$`ysf^-%H`ZF5F({C2zY{&! zi|pHjgq+;a5$N88UU~g|n7g?jI+sv_GS&Y+OjjrixXV^!x;Amo_8!!@Jf#I%XD7I` zyPq)9k0MxWDPS?VADZQD)UMlsRwm%kJK!9;tV3Hnpj3uJ5x2Y@RmC^@_4z)FD#lvm z>N_xNJ~a>CxUvQ>mX5V7`}9s$H5c)zl6uH8#ruVVq+aQe!2MTL`D~kClrk0)kwUu- z{CNEoU)k{)WX1aPc*XoMo2Ja9Db^Uug#ra*NSfQ&`;Du3d*4fZFsY2zEyt>kQ#HqU z)v$g`2M^uW!M4k)taS;!la`uF0|AB0ODPYnJO;j*Q(@8zV|C%B{nOms-2*;q&Npgc8OmMl)9l_fOsA_u z+qF#lK+qa>AB(CHVOf%p7=z@_npjI>Elm{WDjtUwAA%xf&sggL0`KVgthbPu?s9K;@aD2V(G@F}J zdXEh8gZp>$(_cQtJNpk`5{a^lxx=S`zP;=7d}-%)nw!dtF0A{& z@rfBQvCKEJ&L1Hymn+X5{RgXhMd4sZ5btRNHj8>otj}{e3HZ&1f}5eeoqWoi?{+( zDnVO2eJ9Uy@6Ue6k%3e57w$PY%)q(oQlyLI5fgkC8xkO7b<%fVBk?tyiIYt5KG&gw z1~iujV_{h{`#v1xH_tpz7L*r{jPdxZM+p}MlMA(kI3D+? zM6fyFAXqDuN(mt-Gu0v=^q*qyz&Q84Z~zrUv0%u2pzi%r#3cmw{66;XwQ5w8iM^Wl z9>m6JVs4_zCCRctwHC)Pk^*m@n&zv|^iof=c+AJJvm*El8NQJKm5JQGE~;rxQk7^J zm7Iiv(YPmuEY0TqVrE4rCe094R3U`$iHF>VeqgR2Y9tUuK(1=V Date: Wed, 22 Mar 2017 11:40:20 -0400 Subject: [PATCH 026/119] Use non capturing pattern to match http/https --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 632c57282..767d7840d 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5343,7 +5343,7 @@ "52" ], "icon": "Olark.png", - "script": "^(http|https):\/\/static\\.olark\\.com\/jsclient\/loader1\\.js", + "script": "^https?:\/\/static\\.olark\\.com\/jsclient\/loader1\\.js", "website": "https://www.olark.com/" }, "OXID eShop": { From 295efe51922fc668d4539810ad9c483313058468 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 12:05:12 -0400 Subject: [PATCH 027/119] Add missing question mark to pattern --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index b87583987..4e0d2b2cb 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2466,7 +2466,7 @@ ], "icon": "FancyBox.png", "implies": "jQuery", - "script": "jquery\\.fancybox\\.pack\\.js(?:v=([\\d.]+))?$\\;version:\\1", + "script": "jquery\\.fancybox\\.pack\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1", "website": "http://fancyapps.com/fancybox }, "Fat-Free Framework": { @@ -10162,4 +10162,4 @@ "priority": "9" } } -} \ No newline at end of file +} From 0488c803fb7e000e1bfa3b102a07b5406a912202 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 12:22:52 -0400 Subject: [PATCH 028/119] Add missing double quote on website --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 4e0d2b2cb..4bd5f4471 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2467,7 +2467,7 @@ "icon": "FancyBox.png", "implies": "jQuery", "script": "jquery\\.fancybox\\.pack\\.js(?:\\?v=([\\d.]+))?$\\;version:\\1", - "website": "http://fancyapps.com/fancybox + "website": "http://fancyapps.com/fancybox" }, "Fat-Free Framework": { "cats": [ From 29f41b61c12bae190ba0ee00fa74e426cebfce1b Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 12:34:50 -0400 Subject: [PATCH 029/119] LivePerson -- Add new detection via script --- src/apps.json | 10 +++++++++- src/icons/LivePerson.png | Bin 0 -> 1961 bytes 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100755 src/icons/LivePerson.png diff --git a/src/apps.json b/src/apps.json index 04b2f0408..96952a79e 100755 --- a/src/apps.json +++ b/src/apps.json @@ -4412,6 +4412,14 @@ "script": "/js/al/common.js\\?[0-9_]+", "website": "http://liveinternet.ru/rating/" }, + "LivePerson": { + "cats": [ + "52" + ], + "icon": "LivePerson.png", + "script": "^https?://lptag\\.liveperson\\.net/tag/tag\\.js", + "website": "https://www.liveperson.com/" + }, "Lo-dash": { "cats": [ "12" @@ -10162,4 +10170,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/LivePerson.png b/src/icons/LivePerson.png new file mode 100755 index 0000000000000000000000000000000000000000..615e6ae4dea63c9b4486d3e6074f0ac4df258137 GIT binary patch literal 1961 zcmV;a2UhrrP) z4Q!Rw8ONV{-y(F)di&jS?=3Jvi&f`jGn+Wv{6=M9<~Ait2-zT$WMDFaWQ5FuI>?-8 zp>_XWsEZ)OLBaN(kN2GY&&hkqn;UN{TXvFPPJ7?? zoacX@=Q+kl_&k1XAB2-#e5fUAso(7V?n=ZUhs&J_Lpu^FJF7f(Jk) z7y}*z3S0(S?a5i7wH^B`m;tWy%@Onq8P>4RpaTfp1rC9WK!b&+OJhL~Sf@W6MOb08+nJ-~jzX6=jh3t~`WdS$mB0mx)t2`2 zSR}!lOBBQzFZ^8}&niG410RDsd?JQjc^UXC(7>$d_u@~*FY=9}HLHQq4TcE*F7|!U6vg_}of-f-hNvE$L#_}2R$a8I|4S9~C>68%xJ_nB|;?GMdi&65rpL*9B$I`XFzA(qZdIJA=QV;NU_CYM(Wi z#jYQKag#SnyjgMyJ4AT%uSix+|LXI>2@@;b72@u;0=Uo`huh08h|W2;%lGCI-~M>U zr71)g%Zc3H8cH^Kcs|MAWh8r+1roobj4x&r@lAJCB5cNkX4h!DG_f zh7x#TjFejoO)gx)BKN_@^?+=HGQy9DA(1{g;%l;{@L5(LWj3SZ69(kb7w+aAb4cu& z=eXUA$bEk$rE3E(AgpKG=*nXh{G1@V@zzEY2D>#I!lw}0AIh#m8mt)`Q0;l-kN*OQ zIIj1HTCsIH6E&s64y+q2U?r^iHYZUVfk$RM$LhyI z0Ft;qdfx5G+i5DPu?NV%C#$`pV@oRpn60NlFMB;dv)`=d^c`n_iAt$auB9#4u$L-eOK0G z5p6#s(X}wGfW%AFNPV`JE)ZF{4>$?s3XabOF$Y+NLo zOI&6XF|1MRn=x6Se=-Ht*<*o!8CSo*no^rQ^eZIc(C+;ptVdk(*iv@&O*&JV?lv0uz5_1R$PF?3w#Gs~U+Mh>nn_;sN=Ob%^gG zFYeC~!}epZ=0dk0|VbWc<&8F@RD_@lv2YKE}5Bz_`v% zvT@=Wd3gC0R-H|WWfV-T&UIK*c?RDxEyx>haaeVp!(JKZD4ih1`$w@i@2K~Z7>8M@ zmRpL=?MZrbSNKb@-wWm7U3lTwx;twk3eskr2lg( zSwLdvj{@$I3WVklH^X>~XB^|u$0BDC^Cz+Tn3sUx_8&%m95Bi~^7Q~jR3j8x?kq6d z5tM3M*X!WU=1IrI&KXNkq^618KmQ)zSbiUWYw~Qq{lP|5&hyB4a{>x`If+}>n-W~{ z@0+HZg^nHSLgIM+i$DVb5y}&B855$9D4W&5oD(qK&tl{F)!*#%s5!{+ENl)STu82- zf-fcQq!SSM(kt2i>+UKD!4p=HM3oeqiu-Zh>O*W5k40UekSph5bU{-5PNzXA?}htqzTT>Gb)?H>V4^np-Pl=O+3?|EzucnFM4^J(^f v`#8-(Xb5h%q>lM-+E@PcPOT-^@_GIr1`L$hj`E0}00000NkvXXu0mjfLl(Ni literal 0 HcmV?d00001 From 0d39422e875cc100fbead52bd697a5b47acc7090 Mon Sep 17 00:00:00 2001 From: Craig London Date: Wed, 22 Mar 2017 12:54:22 -0400 Subject: [PATCH 030/119] BoldChat -- add detection via script --- src/apps.json | 10 +++++++++- src/icons/BoldChat.png | Bin 0 -> 184 bytes 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100755 src/icons/BoldChat.png diff --git a/src/apps.json b/src/apps.json index 04b2f0408..cb51c8078 100755 --- a/src/apps.json +++ b/src/apps.json @@ -942,6 +942,14 @@ "script": "boba(?:\\.min)?\\.js", "website": "http://boba.space150.com" }, + "Bold Chat": { + "cats": [ + "52" + ], + "icon": "BoldChat.png", + "script": "^https?://vmss\\.boldchat\\.com/aid/\\d{18}/bc\\.vms4/vms\\.js", + "website": "https://www.boldchat.com/" + }, "Bolt": { "cats": [ "1" @@ -10162,4 +10170,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/BoldChat.png b/src/icons/BoldChat.png new file mode 100755 index 0000000000000000000000000000000000000000..ceeecf47e94157528e95698b29a293f11f7e8809 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-gY_IdI-I0(4Ty)>cY zh{X1d#xaL(STwVWZ!msyV~4{_E^a56j=A&qTv_yczZP3^itPzccCMZ5|BmvN)gRRV z;kIDu^%o*jlb%U8_Aza;;YehzDd2S%T>Pz~QDl39DD#f19A%Y#oBh^HeP_Cs-*83P iz`tp>{B* Date: Wed, 22 Mar 2017 13:18:15 -0400 Subject: [PATCH 031/119] FlexSlider -- Add detection via script --- src/apps.json | 14 +++++++++++++- src/icons/FlexSlider.png | Bin 0 -> 754 bytes 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100755 src/icons/FlexSlider.png diff --git a/src/apps.json b/src/apps.json index 04b2f0408..3d9bcb210 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2545,6 +2545,18 @@ }, "website": "http://www.flexcmp.com/cms/home" }, + "FlexSlider": { + "cats": [ + "5", + "7" + ], + "icon": "FlexSlider.png", + "implies": "jQuery", + "script": [ + "jquery\\.flexslider(?:\\.min)?\\.js$" + ], + "website": "https://woocommerce.com/flexslider/" + }, "FluxBB": { "cats": [ "2" @@ -10162,4 +10174,4 @@ "priority": "9" } } -} \ No newline at end of file +} diff --git a/src/icons/FlexSlider.png b/src/icons/FlexSlider.png new file mode 100755 index 0000000000000000000000000000000000000000..9c264278f0ee44cbb846fc9f5e6bfa235c093470 GIT binary patch literal 754 zcmVPx$R!~e-MgRZ*u79P*q`&?A{iSf5o@JA}leCstip#9U zmRX9nimkkrwejii`StkFw92}XveC86^6T-PW0L;;{+eEnqHCAy-{{o3&-(cKyp*(< zTa1@ljP~&L#G$>Xbe;F}_Wu6BpzR&augyVv*(6;`;acx{|Wq%G%bx()I51^zQTg z`TP6%`_Q$^(6r0o&D`0-)u?rz@#yd3(ckIZ=jz_*#-+ge_xZ@D!N8ljta_r!sl)#L z{kM#-@#*mS_W8=I#KWJwr*oa7Y?$TM;pElfxsb8Rs>9g8)24Boms*SU@bs5ii|5(o z?&R#TMGCnMB6xa977!2ahREznVFfH>Hjb3l|fqhkZYnU z^|pGRR8zAn$S)WEGT?SPEI{0M9MkIyWvHq*fdp`&19JeJCU64mXmx)+;A%2~BVa#W z={daOa?TH|SbEq63Wp6B06soNZV7}fz$u@nm8mYEdlPx$8&M08$GA_Kej0e?JqaYN zbC_Zr;yTl)Og+=?_Mb$ z4e+Yo;v2x`-X-w$2n6-ba;x4}DO++ty#Z!zyEzD~xqxJ+ET{VDwE-=ucwS^+-EfUI zpxj88RA*y`4cUMSBb`(>rp67Q{X}tpQ5nq+J{M?USey1W^btGI+=kYSFKGt?IfvE} k?#TMm;yV9-__H$C53ceqLWZ#1hX4Qo07*qoM6N<$f@g)RZvX%Q literal 0 HcmV?d00001 From 23707d38ffd42260cb631d2cb159a9b262bca52e Mon Sep 17 00:00:00 2001 From: WPcache Date: Wed, 22 Mar 2017 23:40:28 +0200 Subject: [PATCH 032/119] Update apps.json --- src/apps.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps.json b/src/apps.json index ee78903a5..12508822a 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8309,19 +8309,19 @@ "icon": "WHMCS.png", "website": "http://www.whmcs.com" }, - "WPcache": { + "wpCache": { "cats": [ "23" ], "headers": { - "X-Powered-By": "WPcache(?:/([\\d.]+))?\\;version:\\1" + "X-Powered-By": "wpCache(?:/([\\d.]+))?\\;version:\\1" }, "meta": { - "generator": "WPcache", - "keywords": "WPcache" + "generator": "wpCache", + "keywords": "wpCache" }, - "html": " + 256 + Created with Sketch. + + + + + + + \ No newline at end of file From d8f7028c6479682b70e4f6a8937044c71c1c6a26 Mon Sep 17 00:00:00 2001 From: Stuart Romanek Date: Fri, 24 Mar 2017 17:27:59 -0400 Subject: [PATCH 039/119] typo maybe --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 0a1cbeaa2..29be3e0ed 100755 --- a/src/apps.json +++ b/src/apps.json @@ -587,7 +587,7 @@ "implies": "Java", "website": "http://wicket.apache.org" }, - "Apostrophe CMS" : { + "Apostrophe CMS": { "cats": [ 1 ], From b677563427818db01b9c841533a8453b177dd552 Mon Sep 17 00:00:00 2001 From: Stuart Romanek Date: Fri, 24 Mar 2017 17:33:10 -0400 Subject: [PATCH 040/119] typo def --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 29be3e0ed..4232f2bd6 100755 --- a/src/apps.json +++ b/src/apps.json @@ -589,11 +589,11 @@ }, "Apostrophe CMS": { "cats": [ - 1 + "1" ], "icon": "apostrophecms.svg", "implies": "Node.js", - "website" : "apostrophecms.org", + "website": "apostrophecms.org", "html": "data-apos-refreshable" }, "AppNexus": { From 7ea190fdae061c6b17dea0e0fe07fcc056733284 Mon Sep 17 00:00:00 2001 From: Stuart Romanek Date: Fri, 24 Mar 2017 17:43:06 -0400 Subject: [PATCH 041/119] good pattern for html --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 4232f2bd6..88b266b16 100755 --- a/src/apps.json +++ b/src/apps.json @@ -594,7 +594,7 @@ "icon": "apostrophecms.svg", "implies": "Node.js", "website": "apostrophecms.org", - "html": "data-apos-refreshable" + "html": "<[^>]+data-apos-refreshable[^>]" }, "AppNexus": { "cats": [ From 689668a9f375f3ec75db4b80bda8c397d89dbd0b Mon Sep 17 00:00:00 2001 From: Stuart Romanek Date: Fri, 24 Mar 2017 17:46:20 -0400 Subject: [PATCH 042/119] proper url for app --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 88b266b16..432ad7f3b 100755 --- a/src/apps.json +++ b/src/apps.json @@ -593,7 +593,7 @@ ], "icon": "apostrophecms.svg", "implies": "Node.js", - "website": "apostrophecms.org", + "website": "http://apostrophecms.org", "html": "<[^>]+data-apos-refreshable[^>]" }, "AppNexus": { From 3a9cadcd3a1b8a31a2cb272e856f69210a19a220 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 26 Mar 2017 11:59:07 +1100 Subject: [PATCH 043/119] Fix false GitLab detection --- src/apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 04b2f0408..e63cd6347 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2790,7 +2790,6 @@ }, "html": [ "", "
" ], "icon": "GitLab.svg", @@ -10162,4 +10161,4 @@ "priority": "9" } } -} \ No newline at end of file +} From 64ad0a88dcba152e128e7844c92e8aeb6861fea3 Mon Sep 17 00:00:00 2001 From: Abd ar-Rahman Hamidi Date: Sun, 26 Mar 2017 14:42:19 +0500 Subject: [PATCH 044/119] Expose website property --- src/drivers/phantomjs/driver.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/phantomjs/driver.js index 0503fbc7a..a99f2612d 100644 --- a/src/drivers/phantomjs/driver.js +++ b/src/drivers/phantomjs/driver.js @@ -91,6 +91,7 @@ confidence: wappalyzer.detected[url][app].confidenceTotal.toString(), version: wappalyzer.detected[url][app].version, icon: wappalyzer.apps[app].icon, + website: wappalyzer.apps[app].website, categories: cats }); } From 71f168d6757925cbd77d24e923f819e1dde3828e Mon Sep 17 00:00:00 2001 From: DaAwesomeP Date: Sun, 26 Mar 2017 17:06:42 -0500 Subject: [PATCH 045/119] webextension ensure tab is from correct window --- src/drivers/webextension/js/popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index 6e81a7939..99dd16ea1 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -24,7 +24,7 @@ document.addEventListener('DOMContentLoaded', function() { displayApps: function() { var appName, confidence, version; - browser.tabs.query({ active: true }).then(function(tabs) { + browser.tabs.query({ active: true, currentWindow: true }).then(function(tabs) { function sendGetApps(response) { if ( response.tabCache && response.tabCache.count > 0 ) { detectedApps.innerHTML = ''; From 2c9f33d482234f5a291f9c411718aa04433b0c7b Mon Sep 17 00:00:00 2001 From: jvoisin Date: Mon, 27 Mar 2017 12:42:04 +0200 Subject: [PATCH 046/119] Fix a typo spotted by @gadcam --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index f37016214..a52653daa 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2725,7 +2725,7 @@ ], "env": "^gerrit_", "html": [ - ">Gerrit Code Review\\s*\"\\s*\\(([0-9.])\\)\\;version:\\1", + ">Gerrit Code Review\\s*\"\\s*\\(([0-9.]+)\\)\\;version:\\1", "<(?:div|style) id=\"gerrit_" ], "icon": "gerrit.svg", From 55de31d23b993b87a729387afeb38600a5f086dd Mon Sep 17 00:00:00 2001 From: Bradley Chee Date: Tue, 28 Mar 2017 22:48:00 -0700 Subject: [PATCH 047/119] Added detection for Medium --- src/apps.json | 12 ++++++++++++ src/icons/Medium.svg | 9 +++++++++ 2 files changed, 21 insertions(+) create mode 100755 src/icons/Medium.svg diff --git a/src/apps.json b/src/apps.json index 04b2f0408..bfd2dfddb 100755 --- a/src/apps.json +++ b/src/apps.json @@ -4747,6 +4747,18 @@ }, "website": "http://www.mediawiki.org" }, + "Medium": { + "cats": [ + "1" + ], + "headers": { + "X-Powered-By": "Medium" + }, + "url": "^(?:www\\.)?medium\\.com", + "script": "medium\\.com", + "icon": "Medium.svg", + "website": "https://medium.com" + }, "Meebo": { "cats": [ "5" diff --git a/src/icons/Medium.svg b/src/icons/Medium.svg new file mode 100755 index 000000000..f85a5519f --- /dev/null +++ b/src/icons/Medium.svg @@ -0,0 +1,9 @@ + + + + + + + + + From c57e0521416b57d7a7a085178ba6b970d15cf2da Mon Sep 17 00:00:00 2001 From: Bradley Chee Date: Tue, 28 Mar 2017 23:58:58 -0700 Subject: [PATCH 048/119] Updated Meteor to include implications --- src/apps.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/apps.json b/src/apps.json index 04b2f0408..b35f40501 100755 --- a/src/apps.json +++ b/src/apps.json @@ -4774,6 +4774,11 @@ "env": "^Meteor$", "html": "]+__meteor-css__", "icon": "Meteor.png", + "implies": [ + "MongoDB", + "Node.js", + "jQuery" + ], "website": "http://meteor.com" }, "Methode": { From 66b0254f8c29943d95eb4c38bd0e6f465bb605cb Mon Sep 17 00:00:00 2001 From: wpCache Date: Wed, 29 Mar 2017 16:27:20 +0300 Subject: [PATCH 049/119] Delete wpCache.png --- src/icons/wpCache.png | Bin 1802 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/icons/wpCache.png diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png deleted file mode 100644 index a40102912ea990998cfaa4a1895c9e8f73499c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1802 zcmZ`(c{JOJ8vRK~LJ*=Adw*(qsuM2+u??cBN-dpQYB!dM@hpjmomgKRgci@zN`h9I z8PguiwA9j8#d54=)Tq*C>=bRLt?ik5@#p;U&Ufy2&$;)z=l=KQf9G~dPDV`z0023% z6Ukl7;0X{g@s3YT{VXQQ2%;+y09tM$k3ytQ%rGZ+R{%)W2Y{?R05}v&S?d6hfCGTd zU;wbH0ssu1+j-SSY`{XDFOh)bld0`#EE6lzbSK|<06?NoAThPTIueU;CfW5O{12!y z#!3Ma86}paV#y?;r%&HlWgsWe>-1n|6fb_&Eu!J2YW8@&6wEK`{F$B&m&vn_diOzT zg)pSAI-JY8jD zH)uR8ZGP6yFQkrFm+{Yu^5J%tx^?VN=u19reXHOOaUMI1kVQS8$5|AJ-~?7%YSq%1 z{M_+n8dw9+2e-Y(`EbGjUUVTJo)rc6{TVK85i+1u@`;Jy);yKrXR!2codyyY{8j>> zrEDzG#wZT1kRiV^a_-T*8tQ(w(vr@{-!lUsaaZ@pHND0O+KE(MzVa622x-`OD-Ieu zQ{=6tIUd^?TUz!BSqY@Se{5KYW%ID;E7H`j@Pe)lwcx1bt;oi7=BEa7F)sjw{b;6b zqHiKfMyRUefe9;u^k=LUyA9(Xd#c2rf0s3Hkdsn*faXIw|!#Hbnzkj9se|!aWBSk zq^LpNHMauup`w}tD;m3D>pQr$zYGDq7&PmXV1SnYt>;CM+DM#fW$|CY5nx;50 zS!U38@N3!+4N9yHXH}v8=NhRBAD}I&;4kd+swyxvgyIO3B~Op3K&_w@?=V59gv%My zIMP>`U1x)wkyOk=jaa2o^E8xd_HE8}?$;X+bP6D) zk4~Yz4cDsIDO;p~Z-w+GJJ$yUX@ZWwUu=B^h9CWUFI7WSIeQSHx9Uo~Tl$`rAJBQq zGh^MAuv_v@9pFtbm@4kV+DyHwH9_x^NT^W z!B`dKU%tXbyrV*8`J0LZm1MapY>0YE6|8l~XG7Kcy7p6Dl{%XqiPd@G2m7YHje6@Y zsRwmc*R7=;Ig|Msg*s^boXQu2MW?NF1{71vCiyvxT#}vL6E(XvyKSREM!YXyVvA4wTS^n)M?CE~=tvjN$B&|`w zq)2hLjkdG6TJY1_@)6|CV;6UtD1_2o+kOAgBxNV_nxER3RuT7-uClqyi<%&=fA8mG z0yoj)rYIdl$A^BKQUIC8t@@htZ+iNyrx%Ehp7q?lV7sUoepUR8^_UlZn3ND^xK$V< zTuguo&X|D3;jtzro+fxJGYczY^Yb`kD;#csO{(}?AcjVXq^A7;K>MpBLvcXkq``wm zWhR9%!T}FeCM6&>BDpnNdoB%8Z|OH9Au`@!@)>8 zGYkNdxl4b_BI2$Y7z|$-86~f{15h2LQ5aH5N6ESD6jTW$WtsL-pgL`y;K=OskYH4x hA%Kr$In`b^0yZ&<%s(B>%Ec7``Jx-?p+j)a{{Y|22nGNE From d501d1430b29e00d81fb95c71b2dc1683ce16431 Mon Sep 17 00:00:00 2001 From: wpCache Date: Wed, 29 Mar 2017 16:27:34 +0300 Subject: [PATCH 050/119] Add files via upload --- src/icons/wpCache.png | Bin 0 -> 1218 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/wpCache.png diff --git a/src/icons/wpCache.png b/src/icons/wpCache.png new file mode 100644 index 0000000000000000000000000000000000000000..12470ff470a18122121f503e488dc4f5f1b62686 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081LLXypAc6gBLf2iJ$-#$ zLqmOUZ_n1&mX#}4u3NWm`t)h3smT@=W?5O8w{PG6|NsBrzkmPy`Sbnz_nw|^Jw2U> zi15dcAFp1$Dlac5Jw3I(z3t4IGm922jEah=s;Y2taWXM6vbVR*%uFvXE^>6V&(F^- zE-tLBEbr~@$;->Nv9U5XHk>+jik+Q}hlg8pb5l=Gm#(gMNJ#L#d-oPDT;S*D^Zfbq zbLY+m1o-{?_wU!QUpsc}xO3xYir8~4<5L=xwf^nc6D_) zIXOIh_~7HmkCl}bM~)nsIdg`mr~8W+FDxz1mn~cR^XJd9vXT=gjswB-=g)k7y`7yM z&CN}9bhLtk0$#s5{m(7%MA_Z{NO^loTf?Cp~=lFe4*<>((s`7A*Mv`}fYBJIl+<3JUUO&6>Gn z$>N5F`mV0d!-o$)cyQm#%QG%6_Uzd+6&2+U4))d6m9@3ij~+d|ckk}Ri4$heo>f?w zKV{0~88fEW*4Fs@`<^*-y1u^7)YSMz^!IPT=wwXtc6Z_Zwk7c^ki%Kv5m^jO9@jyb z(Me-=1yGQ^#M9T6{UNgqw~+FzR5@VOGX{IQIEGl9PEL?u6=8H!OG{Hzv-za6Cg+XJ zoR}R?X6~%4`1zxfl||CAt93>ri-55qBQGmc8k<|9AY-6mA*ZM20)x$4dUQ6+blYs6 z)3j*Prmj`9cCjs9rm=q790B3U+xRXpsKwgZ)-pRQrzHyq8#@=<#c_K_s%mFTPk4Cd zjDmE|+c&aTDrD!*IU5^u_l~8FP37J_wLY~IW1c*h7dUZRUrcOcwdUo?=GxXB=63EHmgbX8 z_2+MIFl<`BVa1LmSJv?)xmd1W>CBqHR6n^$biJkh{B%>}WMAF=J1y6H%0@62*E;hi z7cDk0E-nf#_Fmm16fh-l<=VZAH+u_9<@xmRoN;oPlXG`26PLyY2?2ve>;*+RYxSA! z9^4kb&}~2Iqw9wcYz%KVn8!V{lMeufxLAp6M2T}zYGO%dex5=|W^O8jfw8`kg}$M= zxSi4jpbAxxij>5XRI6l=vQ!2m14DCN17lqyix5LYD?D9TUE%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(m_pw zD+_y17GV}vaA`0(oWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3rvj~D@O1Ta JS?83{1OWF^^40(V literal 0 HcmV?d00001 From 53986e7d6d4bbc5a78764be52907b49a40f60e1c Mon Sep 17 00:00:00 2001 From: wpCache Date: Wed, 29 Mar 2017 16:29:15 +0300 Subject: [PATCH 051/119] Update apps.json --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 12508822a..b6f906d98 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8323,7 +8323,7 @@ "html": " + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f3fc37b56c5fabfc7decb66e0b464cb34c403ea4 Mon Sep 17 00:00:00 2001 From: Daniel Zdziebko Date: Sun, 2 Apr 2017 07:50:27 +0200 Subject: [PATCH 060/119] Polish language for Wappalyzer --- .../webextension/_locales/pl/messages.json | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/drivers/webextension/_locales/pl/messages.json diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json new file mode 100644 index 000000000..4e15a95c4 --- /dev/null +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -0,0 +1,61 @@ +{ + "github": { "message": "Fork Wappalyzer on GitHub!" }, + "twitter": { "message": "Follow Wappalyzer on Twitter" }, + "website": { "message": "Przejdź do wappalyzer.com" }, + "options": { "message": "Opcje" }, + "optionsSave": { "message": "Zapisz opcje" }, + "optionsSaved": { "message": "Zapisano" }, + "optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" }, + "optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" }, + "nothingToDo": { "message": "Nic tu nie ma." }, + "noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." }, + "categoryName1": { "message": "CMS" }, + "categoryName2": { "message": "Forum" }, + "categoryName3": { "message": "Menedżer baz danych" }, + "categoryName4": { "message": "Narzędzia dokumentacji" }, + "categoryName5": { "message": "Widżet" }, + "categoryName10": { "message": "Statystyki" }, + "categoryName11": { "message": "Blog" }, + "categoryName12": { "message": "Framework JavaScript" }, + "categoryName13": { "message": "Issue Tracker" }, + "categoryName14": { "message": "Odtwarzacz wideo" }, + "categoryName15": { "message": "System komentarzy" }, + "categoryName16": { "message": "Captcha" }, + "categoryName17": { "message": "Skrypt czcionek" }, + "categoryName18": { "message": "Framework webowy" }, + "categoryName19": { "message": "Różne" }, + "categoryName20": { "message": "Edytor" }, + "categoryName21": { "message": "LMS" }, + "categoryName22": { "message": "Serwer internetowy" }, + "categoryName23": { "message": "Narzędzia cache" }, + "categoryName24": { "message": "Rich Text Editor" }, + "categoryName25": { "message": "JavaScript Graphics" }, + "categoryName26": { "message": "Framework mobilny" }, + "categoryName27": { "message": "Język programowania" }, + "categoryName28": { "message": "System operacyjny" }, + "categoryName29": { "message": "Silnik wyszukiwarki" }, + "categoryName30": { "message": "Web Mail" }, + "categoryName31": { "message": "CDN" }, + "categoryName32": { "message": "Automatyzacja marketingu" }, + "categoryName33": { "message": "Web Server Extension" }, + "categoryName34": { "message": "Baza danych" }, + "categoryName35": { "message": "Mapy" }, + "categoryName36": { "message": "Sieć reklamowa" }, + "categoryName37": { "message": "Network Service" }, + "categoryName38": { "message": "Media Server" }, + "categoryName39": { "message": "Webcam" }, + "categoryName40": { "message": "Drukarka" }, + "categoryName41": { "message": "Procesor płatności" }, + "categoryName42": { "message": "Tag Manager" }, + "categoryName43": { "message": "Paywall" }, + "categoryName44": { "message": "Build/CI System" }, + "categoryName45": { "message": "SCADA System" }, + "categoryName46": { "message": "Remote Access" }, + "categoryName47": { "message": "Development Tool" }, + "categoryName48": { "message": "Network Storage" }, + "categoryName49": { "message": "Feed Readers" }, + "categoryName50": { "message": "Document Management Systems" }, + "categoryName51": { "message": "Landing Page Builder" }, + "categoryName52": { "message": "Czat na żywo" }, + "categoryName53": { "message": "CRM" } +} From 662d5a34eac800bc29104d8c11a86c7c0b46c1a9 Mon Sep 17 00:00:00 2001 From: Daniel Zdziebko Date: Sun, 2 Apr 2017 08:05:15 +0200 Subject: [PATCH 061/119] Update messages.json --- .../webextension/_locales/pl/messages.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 4e15a95c4..84fe6cc73 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -1,6 +1,6 @@ { "github": { "message": "Fork Wappalyzer on GitHub!" }, - "twitter": { "message": "Follow Wappalyzer on Twitter" }, + "twitter": { "message": "Obserwuj Wappalyzer na Twitterze" }, "website": { "message": "Przejdź do wappalyzer.com" }, "options": { "message": "Opcje" }, "optionsSave": { "message": "Zapisz opcje" }, @@ -17,7 +17,7 @@ "categoryName10": { "message": "Statystyki" }, "categoryName11": { "message": "Blog" }, "categoryName12": { "message": "Framework JavaScript" }, - "categoryName13": { "message": "Issue Tracker" }, + "categoryName13": { "message": "Lista problemów" }, "categoryName14": { "message": "Odtwarzacz wideo" }, "categoryName15": { "message": "System komentarzy" }, "categoryName16": { "message": "Captcha" }, @@ -29,33 +29,33 @@ "categoryName22": { "message": "Serwer internetowy" }, "categoryName23": { "message": "Narzędzia cache" }, "categoryName24": { "message": "Rich Text Editor" }, - "categoryName25": { "message": "JavaScript Graphics" }, + "categoryName25": { "message": "Grafika JavaScript" }, "categoryName26": { "message": "Framework mobilny" }, "categoryName27": { "message": "Język programowania" }, "categoryName28": { "message": "System operacyjny" }, "categoryName29": { "message": "Silnik wyszukiwarki" }, - "categoryName30": { "message": "Web Mail" }, + "categoryName30": { "message": "Poczta internetowa" }, "categoryName31": { "message": "CDN" }, "categoryName32": { "message": "Automatyzacja marketingu" }, - "categoryName33": { "message": "Web Server Extension" }, + "categoryName33": { "message": "Rozszerzenie serwera WWW" }, "categoryName34": { "message": "Baza danych" }, "categoryName35": { "message": "Mapy" }, "categoryName36": { "message": "Sieć reklamowa" }, - "categoryName37": { "message": "Network Service" }, - "categoryName38": { "message": "Media Server" }, - "categoryName39": { "message": "Webcam" }, + "categoryName37": { "message": "Usługa sieciowa" }, + "categoryName38": { "message": "Serwer mediów" }, + "categoryName39": { "message": "Kamera internetowa" }, "categoryName40": { "message": "Drukarka" }, "categoryName41": { "message": "Procesor płatności" }, - "categoryName42": { "message": "Tag Manager" }, - "categoryName43": { "message": "Paywall" }, - "categoryName44": { "message": "Build/CI System" }, - "categoryName45": { "message": "SCADA System" }, - "categoryName46": { "message": "Remote Access" }, - "categoryName47": { "message": "Development Tool" }, - "categoryName48": { "message": "Network Storage" }, - "categoryName49": { "message": "Feed Readers" }, - "categoryName50": { "message": "Document Management Systems" }, - "categoryName51": { "message": "Landing Page Builder" }, + "categoryName42": { "message": "Menedżer tagów" }, + "categoryName43": { "message": "Menedżer płatności" }, + "categoryName44": { "message": "System Build/CI" }, + "categoryName45": { "message": "System SCADA" }, + "categoryName46": { "message": "Dostęp zdalny" }, + "categoryName47": { "message": "Narzędzia deweloperskie" }, + "categoryName48": { "message": "Magazyn sieciowy" }, + "categoryName49": { "message": "Czytnik" }, + "categoryName50": { "message": "Systemy zarządzania dokumentami" }, + "categoryName51": { "message": "Konstruktory stron" }, "categoryName52": { "message": "Czat na żywo" }, "categoryName53": { "message": "CRM" } } From 42000f2429c3acf2bd995a92cd2527a95b0515cd Mon Sep 17 00:00:00 2001 From: Abd ar-Rahman Hamidi Date: Sun, 2 Apr 2017 16:44:54 +0500 Subject: [PATCH 062/119] Fix not answering any response if no apps detected --- src/drivers/phantomjs/driver.js | 39 +++++++++++++++------------------ 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/phantomjs/driver.js index a99f2612d..83851390d 100644 --- a/src/drivers/phantomjs/driver.js +++ b/src/drivers/phantomjs/driver.js @@ -73,31 +73,28 @@ displayApps: function() { var app, cats, - apps = [], - count = wappalyzer.detected[url] ? Object.keys(wappalyzer.detected[url]).length : 0; + apps = []; wappalyzer.log('driver.displayApps'); - if ( count ) { - for ( app in wappalyzer.detected[url] ) { - cats = []; - - wappalyzer.apps[app].cats.forEach(function(cat) { - cats.push(wappalyzer.categories[cat].name); - }); - - apps.push({ - name: app, - confidence: wappalyzer.detected[url][app].confidenceTotal.toString(), - version: wappalyzer.detected[url][app].version, - icon: wappalyzer.apps[app].icon, - website: wappalyzer.apps[app].website, - categories: cats - }); - } - - wappalyzer.driver.sendResponse(apps); + for ( app in wappalyzer.detected[url] ) { + cats = []; + + wappalyzer.apps[app].cats.forEach(function(cat) { + cats.push(wappalyzer.categories[cat].name); + }); + + apps.push({ + name: app, + confidence: wappalyzer.detected[url][app].confidenceTotal.toString(), + version: wappalyzer.detected[url][app].version, + icon: wappalyzer.apps[app].icon, + website: wappalyzer.apps[app].website, + categories: cats + }); } + + wappalyzer.driver.sendResponse(apps); }, /** From 842293daf61eab5b099cbe09a020adb7320c6a5a Mon Sep 17 00:00:00 2001 From: Thomas Schoffelen Date: Sun, 2 Apr 2017 15:46:15 +0200 Subject: [PATCH 063/119] Added Scholica icon --- src/icons/Scholica.svg | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/icons/Scholica.svg diff --git a/src/icons/Scholica.svg b/src/icons/Scholica.svg new file mode 100644 index 000000000..b35216915 --- /dev/null +++ b/src/icons/Scholica.svg @@ -0,0 +1,24 @@ + + + + logo-green-icon + Created with Sketch. + + + + + + + + + \ No newline at end of file From effc63ace198fd05b91fd4df0000113c5440673f Mon Sep 17 00:00:00 2001 From: Thomas Schoffelen Date: Sun, 2 Apr 2017 15:56:49 +0200 Subject: [PATCH 064/119] Update apps.json --- src/apps.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/apps.json b/src/apps.json index 105484c2a..9c0ccd9b6 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6953,6 +6953,16 @@ ], "website": "http://schneider-electric.com" }, + "Scholica": { + "cats": [ + "21" + ], + "headers": { + "X-Scholica-Version": "" + }, + "icon": "Scholica.png", + "website": "http://scholica.com" + }, "Scientific Linux": { "cats": [ "28" From 71ca792a375cfbb0e15bcfd8243afd1a492ed436 Mon Sep 17 00:00:00 2001 From: Thomas Schoffelen Date: Sun, 2 Apr 2017 16:06:01 +0200 Subject: [PATCH 065/119] Update apps.json --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 9c0ccd9b6..e1c58c928 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6960,7 +6960,7 @@ "headers": { "X-Scholica-Version": "" }, - "icon": "Scholica.png", + "icon": "Scholica.svg", "website": "http://scholica.com" }, "Scientific Linux": { From 6ecc78cc3d183c5023970a163bc83f25b2c5c07a Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 5 Apr 2017 00:23:20 +0800 Subject: [PATCH 066/119] Update Dockerfile - curl is builtin in phusion/baseimage, so there is no need to install it before nodesource - nodesource script will do apt-get update, so there is no need to do it manually - change security.ubuntu.com to use mirror site since it's very slow - separate apt package dependencies into different line so they can be easily traced by git - apt-get update cache clean up show be in the same layer of Docker image, or it'll not really work --- docker/Dockerfile | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index ec435c0bd..c4e7806c0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,11 +8,19 @@ ENV WAPPALYZER_ROOT /home/wappalyzer/synced ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node # Install packages +RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN apt-get update && apt-get install -y sudo curl -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - -RUN apt-get install -y nodejs bzip2 zip libfreetype6 libfontconfig rsync -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list +RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ + apt-get install -y \ + nodejs \ + bzip2 \ + zip \ + libfreetype6 \ + libfontconfig \ + rsync && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Add user From 80f3b0796957374426f2f7abac015cd3cc6ce25c Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 5 Apr 2017 00:28:31 +0800 Subject: [PATCH 067/119] Move Travis CI to Ubuntu Trusty As GCC v4.8 is already installed, there is no need to use ubuntu-toolchain-r-test ppa for it, then we can speed up every CI round! --- .travis.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3f1090e37..36a4ebc63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ language: node_js node_js: - "node" sudo: false +dist: trusty before_install: - export WAPPALYZER_ROOT=$TRAVIS_BUILD_DIR - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR @@ -13,9 +14,3 @@ cache: - node_modules env: - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 From 27185f59faa4accbcfd017f4da346a09a89ae852 Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 14:38:52 +0800 Subject: [PATCH 068/119] update homeland update homeland --- src/apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/apps.json b/src/apps.json index 105484c2a..ab9ce1d1b 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5443,6 +5443,18 @@ "script": "^/nodebb\\.min\\.js\\?", "website": "https://nodebb.org" }, + "Homeland": { + "cats": [ + "1", + "2" + ], + "headers": { + "Set-Cookie:": "^homeland$" + }, + "icon": "Homeland.png", + "implies": "Ruby on Rails", + "website": "https://gethomeland.com" + }, "OWL Carousel": { "cats": [ "5", From 9a15cecf15682f0b233285b972bf57f4cc7b9512 Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 14:45:01 +0800 Subject: [PATCH 069/119] upload homeland icon upload homeland icon --- src/icons/Homeland.png | Bin 0 -> 19700 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/icons/Homeland.png diff --git a/src/icons/Homeland.png b/src/icons/Homeland.png new file mode 100644 index 0000000000000000000000000000000000000000..a269934c4dba63a1cca807535b5f18438300a762 GIT binary patch literal 19700 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 aJmYkoQP$Hf%s>0jEr!2gs{a;4i25HJ@=X^2 literal 0 HcmV?d00001 From 2c5f1fef8c97afab26ec711434588bdba95af91f Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 18:22:29 +0800 Subject: [PATCH 070/119] Update apps.json --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index ab9ce1d1b..a6e85a2f6 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5449,7 +5449,7 @@ "2" ], "headers": { - "Set-Cookie:": "^homeland$" + "Set-Cookie:": "_homeland_" }, "icon": "Homeland.png", "implies": "Ruby on Rails", From 4d31e0d8de58db917ee52f0eab006821c2f0e893 Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 19:02:32 +0800 Subject: [PATCH 071/119] Update apps.json --- src/apps.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/apps.json b/src/apps.json index a6e85a2f6..856e1fc53 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9,6 +9,15 @@ "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, + "Typecho": { + "cats": [ + "11" + ], + "icon": "typecho.svg", + "implies": "PHP", + "url": "/admin/login\\.php?referer=http%3A%2F%2F", + "website": "http://typecho.org/" + }, "1C-Bitrix": { "cats": [ "1" From 377b7c6c4ca502a333917e061e6e230014e4833d Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 19:09:34 +0800 Subject: [PATCH 072/119] adjust position adjust position add typecho --- src/apps.json | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/apps.json b/src/apps.json index 856e1fc53..f774120fc 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9,15 +9,7 @@ "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, - "Typecho": { - "cats": [ - "11" - ], - "icon": "typecho.svg", - "implies": "PHP", - "url": "/admin/login\\.php?referer=http%3A%2F%2F", - "website": "http://typecho.org/" - }, + "1C-Bitrix": { "cats": [ "1" @@ -3196,6 +3188,18 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, + "Homeland": { + "cats": [ + "1", + "2" + ], + "headers": { + "Set-Cookie:": "_homeland_" + }, + "icon": "Homeland.png", + "implies": "Ruby on Rails", + "website": "https://gethomeland.com" + }, "HERE": { "cats": [ "35" @@ -5452,18 +5456,7 @@ "script": "^/nodebb\\.min\\.js\\?", "website": "https://nodebb.org" }, - "Homeland": { - "cats": [ - "1", - "2" - ], - "headers": { - "Set-Cookie:": "_homeland_" - }, - "icon": "Homeland.png", - "implies": "Ruby on Rails", - "website": "https://gethomeland.com" - }, + "OWL Carousel": { "cats": [ "5", @@ -7764,6 +7757,15 @@ "url": "/typo3/", "website": "http://www.typo3.org" }, + "Typecho": { + "cats": [ + "11" + ], + "icon": "typecho.svg", + "implies": "PHP", + "url": "/admin/login\\.php?referer=http%3A%2F%2F", + "website": "http://typecho.org/" + }, "Taiga": { "cats": [ "13" From 1bc003918f25c92961e1bf1ee604821ea7c3294b Mon Sep 17 00:00:00 2001 From: strwei <24722645@qq.com> Date: Thu, 6 Apr 2017 19:11:12 +0800 Subject: [PATCH 073/119] Add files via upload --- src/icons/typecho.svg | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/icons/typecho.svg diff --git a/src/icons/typecho.svg b/src/icons/typecho.svg new file mode 100644 index 000000000..b447bb51b --- /dev/null +++ b/src/icons/typecho.svg @@ -0,0 +1,10 @@ + + + typecho-logo + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + \ No newline at end of file From e38e32af10f4e54fa01012143c293766962bc183 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Thu, 6 Apr 2017 22:46:55 +1000 Subject: [PATCH 074/119] Add clipboard.js --- src/apps.json | 9 +++++++++ src/icons/Clipboard.js.svg | 3 +++ 2 files changed, 12 insertions(+) create mode 100644 src/icons/Clipboard.js.svg diff --git a/src/apps.json b/src/apps.json index 105484c2a..30ab43781 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1431,6 +1431,15 @@ "icon": "Clientexec.png", "website": "http://www.clientexec.com" }, + "Clipboard.js": { + "cats": [ + "19" + ], + "env": "^Clipboard$", + "icon": "Clipboard.js.svg", + "script": "clipboard(?:\\.min)?\\.js", + "website": "https://clipboardjs.com/" + }, "CloudCart": { "cats": [ "6" diff --git a/src/icons/Clipboard.js.svg b/src/icons/Clipboard.js.svg new file mode 100644 index 000000000..007a950a7 --- /dev/null +++ b/src/icons/Clipboard.js.svg @@ -0,0 +1,3 @@ + + + From 7641fde55c0a47b9f4f7c29e7d8ddc6a6c9f2313 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Thu, 6 Apr 2017 23:05:45 +1000 Subject: [PATCH 075/119] Add highlight.js --- src/apps.json | 11 +++++++++++ src/icons/Highlight.js.png | Bin 0 -> 772 bytes 2 files changed, 11 insertions(+) create mode 100644 src/icons/Highlight.js.png diff --git a/src/apps.json b/src/apps.json index 30ab43781..1803afc68 100755 --- a/src/apps.json +++ b/src/apps.json @@ -3397,6 +3397,16 @@ "script": "highcharts.*\\.js", "website": "http://highcharts.com" }, + "Highlight.js": { + "cats": [ + "19" + ], + "env": "^hljs$", + "html": "]*href=\"[^\"]+highlight(?:\\.min)?\\.js[^\"]+.css", + "icon": "Highlight.js.png", + "script": "highlight(?:\\.min)?\\.js", + "website": "https://highlightjs.org/" + }, "Highstock": { "cats": [ "25" @@ -6608,6 +6618,7 @@ ], "env": "^Reveal$", "icon": "Reveal.js.png", + "implies": "Highlight.js", "script": "reveal(?:\\.min)?\\.js", "website": "http://lab.hakim.se/reveal-js" }, diff --git a/src/icons/Highlight.js.png b/src/icons/Highlight.js.png new file mode 100644 index 0000000000000000000000000000000000000000..525fafdb4910726040ba4621faeed07133b11401 GIT binary patch literal 772 zcmV+f1N;1mP)D-#m3RPyVAF}(6F$zm6f}cmAQ_Oz>SWw zc6gn3ccy4+lxAm)Uto(`TbfEtcRfFZG&gc7ENU1WXB8QH5f@<*7ElNcQv(R;N^pzPJX%ii<;uK^iIg830{fcJ-Vbo9v95qj-O zT()QJ29BO5Wkd6HU!jK9O4?_{E{#qGlDqS>BlAqoR#!+?h!5}{D+kml)VvLVsiw?= zJ}4wcac|4c{+-g!!G`a(2LjyAaD9pEbcWx|0_SIhtX zrEdVmX(l_M{Hp-4%2FUlV9^XgrSP?eyP$B3hhf3H2X7&_2F2Z0)FiqC`XhIGAbJFg zbO_-4%qihr5Rw#(!9WT=CM)A*fQnH(3)~l`Jmmlu;np0KHpwG!4;7Ls%q718{!n*^ z^)D0C6Yyy}1zKw|pZ^&Kllg_{c&t>599S&^z~@|OwMI%QYwO!o+|-*Upchx`dB{a; z%X Date: Thu, 6 Apr 2017 16:02:15 +0200 Subject: [PATCH 076/119] Improve a bit the detection of prestashop This can be tested on [this](https://www.kaviari.fr/fr/) website. --- src/apps.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index 04b2f0408..10eb96e31 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6110,6 +6110,10 @@ "meta": { "generator": "PrestaShop" }, + "headers": { + "Set-Cookie": "^PrestaShop", + "Powered-By": "^Prestashop$" + }, "website": "http://www.prestashop.com" }, "Project Wonderful": { @@ -10162,4 +10166,4 @@ "priority": "9" } } -} \ No newline at end of file +} From f4ea7b9bf071e3da96d498a1b1e6bf7d1a0d191f Mon Sep 17 00:00:00 2001 From: jvoisin Date: Thu, 6 Apr 2017 16:43:59 +0200 Subject: [PATCH 077/119] Lower false-positives ford3js This should close #1505 --- src/apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index 04b2f0408..458d2e617 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1696,7 +1696,7 @@ ], "env": "^d3$", "icon": "D3.png", - "script": "d3(?:\\. v\\d+)?(?:\\.min)?\\.js", + "script": "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js", "website": "http://d3js.org" }, "DHTMLX": { @@ -10162,4 +10162,4 @@ "priority": "9" } } -} \ No newline at end of file +} From ce5cad6c6bb22a127251ff2a5a5085330057d279 Mon Sep 17 00:00:00 2001 From: AlexByte Date: Wed, 5 Apr 2017 15:29:19 +0300 Subject: [PATCH 078/119] Fix false positive script detection of Reveal.js --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index e36664ac0..46270f1f1 100755 --- a/src/apps.json +++ b/src/apps.json @@ -6474,7 +6474,7 @@ ], "env": "^Reveal$", "icon": "Reveal.js.png", - "script": "reveal(?:\\.min)?\\.js", + "script": "(?:^|/)reveal(?:\\.min)?\\.js", "website": "http://lab.hakim.se/reveal-js" }, "Revel": { From 1d588e5bdc759319135aecc47c77d98e33cc1024 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Fri, 7 Apr 2017 12:02:30 +1000 Subject: [PATCH 079/119] Add Netlify --- src/apps.json | 11 +++++++++++ src/icons/Netlify.svg | 9 +++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/icons/Netlify.svg diff --git a/src/apps.json b/src/apps.json index 105484c2a..ffeb66a88 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5360,6 +5360,17 @@ "icon": "Nepso.png", "website": "http://nepso.com" }, + "Netlify": { + "cats": [ + "22", + "31" + ], + "headers": { + "Server": "Netlify" + }, + "icon": "Netlify.svg", + "website": "https://www.netlify.com/" + }, "Netmonitor": { "cats": [ "10" diff --git a/src/icons/Netlify.svg b/src/icons/Netlify.svg new file mode 100644 index 000000000..370591793 --- /dev/null +++ b/src/icons/Netlify.svg @@ -0,0 +1,9 @@ + + + + + + + + + From f67906f994e7fd7091479503bfce1abc15ed323f Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 8 Apr 2017 10:43:08 +1000 Subject: [PATCH 080/119] Removed spin.js and vis.js (too many false positives) --- src/apps.json | 20 -------------------- src/icons/spin.js.png | Bin 1155 -> 0 bytes src/icons/vis.js.png | Bin 698 -> 0 bytes 3 files changed, 20 deletions(-) delete mode 100644 src/icons/spin.js.png delete mode 100644 src/icons/vis.js.png diff --git a/src/apps.json b/src/apps.json index 105484c2a..0f2a2d0f3 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9939,16 +9939,6 @@ "script": "shine(?:\\.min)?\\.js", "website": "http://bigspaceship.github.io/shine.js/" }, - "spin.js": { - "cats": [ - "12", - "25" - ], - "env": "^Spinner$", - "icon": "spin.js.png", - "script": "spin(?:\\.min)?\\.js", - "website": "http://fgnass.github.io/spin.js/" - }, "swift.engine": { "cats": [ "1" @@ -10056,16 +10046,6 @@ "icon": "default.svg", "website": "http://www.viennacms.nl" }, - "vis.js": { - "cats": [ - "25" - ], - "env": "^vis$", - "html": "]+?href=\"[^\"]+vis(?:\\.min)?\\.css", - "icon": "vis.js.png", - "script": "vis(?:\\.min)?\\.js", - "website": "http://visjs.org" - }, "webEdition": { "cats": [ "1" diff --git a/src/icons/spin.js.png b/src/icons/spin.js.png deleted file mode 100644 index 4d79611b6efc80ad49c90e502a5f5398f2701903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq96P)YNBh1DQMp^Fd^&BAXNq9Uq&dSOv7Xo00 zhlgtdfxtW3L0Bdt0??6jQmItlgoFf*m@-f{H8q(}PEOwQW#ZuApqLLJE-p?B(OYQ8 zkovovoSbd=4ZIArnh@l~+Z{Mp&r zzeE-J=H_M!?EjxZE?PS~JD$0@x$TaQ4l8_G7$G9em<*(YV*H`1s>)wiSGQbWU+>~m zb#=A!Q)AiN+nWSuY$QST2dq|Wkx($O-4r!7HT&R%jU)hYaoJ1U+S*zW0ysQ8d^bBg zE7(Y2{k35HS0Mm{!QkUg&=kAfK6G?+6cJ!!W8+PEd3m7_KvGiDmlYKiULk<8vNAha zG6@5P^EFia>-P3`$3vQ!n6QtIj(!)(xyfXTHJi<*hK2?Qbi@Y*S$dtCnpy%sc_AS; z87v?#*F&&mFKGa9_-%iG{|yH)Ffef2)z#&E$gbelTwGj~uB@!s zImetl!)_kDL>J4$=VV9CnL=Y#lWZfEwSWr>7ebf(C%)2||YSf&iVJon=c) zOK*81=X(47g@gxyyOQBI#dId1AkU#cln4UAN%s}3vzsS!?hFtDz;BZ2Of)w)JE2J_ z#gqY_bQ+`4I0UDlmE2^K=}Tz@0B+!Kib_jMt$Mw_3vG(M5yg-Xl|+fu=_eK-+>V0B z&ZCD|fd6gW1B{G}1g58_SrpEn5}S8yfDoSFDzec!`eK|X7l;Te>2vxcAkCBl`|8TH0+nZp$zf$*F?-J zQ*6m?!;|Zt#q8>1Stn$5Lcl1yUH(KFZi>}8SAtt+i zr~FR9sL3|J)cW_n>CO1e--gWDhr~A_GY=!qbp&P{C9d-JL-`d;()K*-=4Xg!CtCMr zWX2JK=hu*uzZl!He8hPanO@F>(r)xtSCkB9Tj6a=?}E_W79^nvaWs&SQ_N?tz)cmd z3I{8uAaQ%q6wFON!-QLR)OaZet0qtciMC$>pr7r z7njI@nAI&ua_)lbFf2R{#=LeUvW&=_HE>m+zlRrZpzT^8^q*!+`7k8+6&6oTr3?tr zN1NlzA6#GB0jXYa?s<#M*o4Fv)6=E}ZqU}%i*aHSAMPz8qacy+IvAg{wL-oL6%nf` zp>(IWlUNldUq8gU6uGwNksy6#qtwXtCN6`N(naH5`(2* z!efy!cElWwm~DtT3Nb~Z#-*W#Pi>VyQhh>|z|c%3#9Xb>MbvBb6I(R;NoO?%>jjO$ g+OBB*C&|D13hF>J*?FA4BLDyZ07*qoM6N<$f&w#7hyVZp From 6a5ea43c6a2e01803bed519ee8cfea6bda8f85b8 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Sun, 9 Apr 2017 22:08:01 +1000 Subject: [PATCH 081/119] fetch upstream --- docker/Dockerfile | 16 +++- src/apps.json | 70 ++++++++++++------ src/drivers/phantomjs/driver.js | 39 +++++----- .../webextension/_locales/pl/messages.json | 61 +++++++++++++++ src/icons/Homeland.png | Bin 0 -> 19700 bytes src/icons/Netlify.svg | 9 +++ src/icons/Scholica.svg | 24 ++++++ src/icons/spin.js.png | Bin 1155 -> 0 bytes src/icons/typecho.svg | 10 +++ src/icons/vis.js.png | Bin 698 -> 0 bytes 10 files changed, 182 insertions(+), 47 deletions(-) create mode 100644 src/drivers/webextension/_locales/pl/messages.json create mode 100644 src/icons/Homeland.png create mode 100644 src/icons/Netlify.svg create mode 100644 src/icons/Scholica.svg delete mode 100644 src/icons/spin.js.png create mode 100644 src/icons/typecho.svg delete mode 100644 src/icons/vis.js.png diff --git a/docker/Dockerfile b/docker/Dockerfile index ec435c0bd..c4e7806c0 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -8,11 +8,19 @@ ENV WAPPALYZER_ROOT /home/wappalyzer/synced ENV WAPPALYZER_NODE_PATH /home/wappalyzer/node # Install packages +RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list -RUN apt-get update && apt-get install -y sudo curl -RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - -RUN apt-get install -y nodejs bzip2 zip libfreetype6 libfontconfig rsync -RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list +RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ + apt-get install -y \ + nodejs \ + bzip2 \ + zip \ + libfreetype6 \ + libfontconfig \ + rsync && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Add user diff --git a/src/apps.json b/src/apps.json index 1803afc68..bcf666d2b 100755 --- a/src/apps.json +++ b/src/apps.json @@ -1733,7 +1733,7 @@ ], "env": "^d3$", "icon": "D3.png", - "script": "d3(?:\\. v\\d+)?(?:\\.min)?\\.js", + "script": "/d3(?:\\. v\\d+)?(?:\\.min)?\\.js", "website": "http://d3js.org" }, "DHTMLX": { @@ -3196,6 +3196,18 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, + "Homeland": { + "cats": [ + "1", + "2" + ], + "headers": { + "Set-Cookie:": "_homeland_" + }, + "icon": "Homeland.png", + "implies": "Ruby on Rails", + "website": "https://gethomeland.com" + }, "HERE": { "cats": [ "35" @@ -5379,6 +5391,17 @@ "icon": "Nepso.png", "website": "http://nepso.com" }, + "Netlify": { + "cats": [ + "22", + "31" + ], + "headers": { + "Server": "Netlify" + }, + "icon": "Netlify.svg", + "website": "https://www.netlify.com/" + }, "Netmonitor": { "cats": [ "10" @@ -6253,6 +6276,10 @@ "meta": { "generator": "PrestaShop" }, + "headers": { + "Set-Cookie": "^PrestaShop", + "Powered-By": "^Prestashop$" + }, "website": "http://www.prestashop.com" }, "Project Wonderful": { @@ -6619,7 +6646,7 @@ "env": "^Reveal$", "icon": "Reveal.js.png", "implies": "Highlight.js", - "script": "reveal(?:\\.min)?\\.js", + "script": "(?:^|/)reveal(?:\\.min)?\\.js", "website": "http://lab.hakim.se/reveal-js" }, "Revel": { @@ -6973,6 +7000,16 @@ ], "website": "http://schneider-electric.com" }, + "Scholica": { + "cats": [ + "21" + ], + "headers": { + "X-Scholica-Version": "" + }, + "icon": "Scholica.svg", + "website": "http://scholica.com" + }, "Scientific Linux": { "cats": [ "28" @@ -7763,6 +7800,15 @@ "url": "/typo3/", "website": "http://www.typo3.org" }, + "Typecho": { + "cats": [ + "11" + ], + "icon": "typecho.svg", + "implies": "PHP", + "url": "/admin/login\\.php?referer=http%3A%2F%2F", + "website": "http://typecho.org/" + }, "Taiga": { "cats": [ "13" @@ -9959,16 +10005,6 @@ "script": "shine(?:\\.min)?\\.js", "website": "http://bigspaceship.github.io/shine.js/" }, - "spin.js": { - "cats": [ - "12", - "25" - ], - "env": "^Spinner$", - "icon": "spin.js.png", - "script": "spin(?:\\.min)?\\.js", - "website": "http://fgnass.github.io/spin.js/" - }, "swift.engine": { "cats": [ "1" @@ -10076,16 +10112,6 @@ "icon": "default.svg", "website": "http://www.viennacms.nl" }, - "vis.js": { - "cats": [ - "25" - ], - "env": "^vis$", - "html": "]+?href=\"[^\"]+vis(?:\\.min)?\\.css", - "icon": "vis.js.png", - "script": "vis(?:\\.min)?\\.js", - "website": "http://visjs.org" - }, "webEdition": { "cats": [ "1" diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/phantomjs/driver.js index a99f2612d..83851390d 100644 --- a/src/drivers/phantomjs/driver.js +++ b/src/drivers/phantomjs/driver.js @@ -73,31 +73,28 @@ displayApps: function() { var app, cats, - apps = [], - count = wappalyzer.detected[url] ? Object.keys(wappalyzer.detected[url]).length : 0; + apps = []; wappalyzer.log('driver.displayApps'); - if ( count ) { - for ( app in wappalyzer.detected[url] ) { - cats = []; - - wappalyzer.apps[app].cats.forEach(function(cat) { - cats.push(wappalyzer.categories[cat].name); - }); - - apps.push({ - name: app, - confidence: wappalyzer.detected[url][app].confidenceTotal.toString(), - version: wappalyzer.detected[url][app].version, - icon: wappalyzer.apps[app].icon, - website: wappalyzer.apps[app].website, - categories: cats - }); - } - - wappalyzer.driver.sendResponse(apps); + for ( app in wappalyzer.detected[url] ) { + cats = []; + + wappalyzer.apps[app].cats.forEach(function(cat) { + cats.push(wappalyzer.categories[cat].name); + }); + + apps.push({ + name: app, + confidence: wappalyzer.detected[url][app].confidenceTotal.toString(), + version: wappalyzer.detected[url][app].version, + icon: wappalyzer.apps[app].icon, + website: wappalyzer.apps[app].website, + categories: cats + }); } + + wappalyzer.driver.sendResponse(apps); }, /** diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json new file mode 100644 index 000000000..84fe6cc73 --- /dev/null +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -0,0 +1,61 @@ +{ + "github": { "message": "Fork Wappalyzer on GitHub!" }, + "twitter": { "message": "Obserwuj Wappalyzer na Twitterze" }, + "website": { "message": "Przejdź do wappalyzer.com" }, + "options": { "message": "Opcje" }, + "optionsSave": { "message": "Zapisz opcje" }, + "optionsSaved": { "message": "Zapisano" }, + "optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" }, + "optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" }, + "nothingToDo": { "message": "Nic tu nie ma." }, + "noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." }, + "categoryName1": { "message": "CMS" }, + "categoryName2": { "message": "Forum" }, + "categoryName3": { "message": "Menedżer baz danych" }, + "categoryName4": { "message": "Narzędzia dokumentacji" }, + "categoryName5": { "message": "Widżet" }, + "categoryName10": { "message": "Statystyki" }, + "categoryName11": { "message": "Blog" }, + "categoryName12": { "message": "Framework JavaScript" }, + "categoryName13": { "message": "Lista problemów" }, + "categoryName14": { "message": "Odtwarzacz wideo" }, + "categoryName15": { "message": "System komentarzy" }, + "categoryName16": { "message": "Captcha" }, + "categoryName17": { "message": "Skrypt czcionek" }, + "categoryName18": { "message": "Framework webowy" }, + "categoryName19": { "message": "Różne" }, + "categoryName20": { "message": "Edytor" }, + "categoryName21": { "message": "LMS" }, + "categoryName22": { "message": "Serwer internetowy" }, + "categoryName23": { "message": "Narzędzia cache" }, + "categoryName24": { "message": "Rich Text Editor" }, + "categoryName25": { "message": "Grafika JavaScript" }, + "categoryName26": { "message": "Framework mobilny" }, + "categoryName27": { "message": "Język programowania" }, + "categoryName28": { "message": "System operacyjny" }, + "categoryName29": { "message": "Silnik wyszukiwarki" }, + "categoryName30": { "message": "Poczta internetowa" }, + "categoryName31": { "message": "CDN" }, + "categoryName32": { "message": "Automatyzacja marketingu" }, + "categoryName33": { "message": "Rozszerzenie serwera WWW" }, + "categoryName34": { "message": "Baza danych" }, + "categoryName35": { "message": "Mapy" }, + "categoryName36": { "message": "Sieć reklamowa" }, + "categoryName37": { "message": "Usługa sieciowa" }, + "categoryName38": { "message": "Serwer mediów" }, + "categoryName39": { "message": "Kamera internetowa" }, + "categoryName40": { "message": "Drukarka" }, + "categoryName41": { "message": "Procesor płatności" }, + "categoryName42": { "message": "Menedżer tagów" }, + "categoryName43": { "message": "Menedżer płatności" }, + "categoryName44": { "message": "System Build/CI" }, + "categoryName45": { "message": "System SCADA" }, + "categoryName46": { "message": "Dostęp zdalny" }, + "categoryName47": { "message": "Narzędzia deweloperskie" }, + "categoryName48": { "message": "Magazyn sieciowy" }, + "categoryName49": { "message": "Czytnik" }, + "categoryName50": { "message": "Systemy zarządzania dokumentami" }, + "categoryName51": { "message": "Konstruktory stron" }, + "categoryName52": { "message": "Czat na żywo" }, + "categoryName53": { "message": "CRM" } +} diff --git a/src/icons/Homeland.png b/src/icons/Homeland.png new file mode 100644 index 0000000000000000000000000000000000000000..a269934c4dba63a1cca807535b5f18438300a762 GIT binary patch literal 19700 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 aJmYkoQP$Hf%s>0jEr!2gs{a;4i25HJ@=X^2 literal 0 HcmV?d00001 diff --git a/src/icons/Netlify.svg b/src/icons/Netlify.svg new file mode 100644 index 000000000..370591793 --- /dev/null +++ b/src/icons/Netlify.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/icons/Scholica.svg b/src/icons/Scholica.svg new file mode 100644 index 000000000..b35216915 --- /dev/null +++ b/src/icons/Scholica.svg @@ -0,0 +1,24 @@ + + + + logo-green-icon + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/icons/spin.js.png b/src/icons/spin.js.png deleted file mode 100644 index 4d79611b6efc80ad49c90e502a5f5398f2701903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq96P)YNBh1DQMp^Fd^&BAXNq9Uq&dSOv7Xo00 zhlgtdfxtW3L0Bdt0??6jQmItlgoFf*m@-f{H8q(}PEOwQW#ZuApqLLJE-p?B(OYQ8 zkovovoSbd=4ZIArnh@l~+Z{Mp&r zzeE-J=H_M!?EjxZE?PS~JD$0@x$TaQ4l8_G7$G9em<*(YV*H`1s>)wiSGQbWU+>~m zb#=A!Q)AiN+nWSuY$QST2dq|Wkx($O-4r!7HT&R%jU)hYaoJ1U+S*zW0ysQ8d^bBg zE7(Y2{k35HS0Mm{!QkUg&=kAfK6G?+6cJ!!W8+PEd3m7_KvGiDmlYKiULk<8vNAha zG6@5P^EFia>-P3`$3vQ!n6QtIj(!)(xyfXTHJi<*hK2?Qbi@Y*S$dtCnpy%sc_AS; z87v?#*F&&mFKGa9_-%iG{|yH)Ffef2)z#&E$gbelTwGj~uB@!s zImetl!)_kDL>J4$=VV9CnL=Y#lWZfEwSWr>7ebf(C%)2||YSf&iVJon=c) zOK*81=X(47g@gxyyOQBI#dId1AkU#cln4UAN%s}3vzsS!?hFtDz;BZ2Of)w)JE2J_ z#gqY_bQ+`4I0UDlmE2^K=}Tz@0B+!Kib_jMt$Mw_3vG(M5yg-Xl|+fu=_eK-+>V0B z&ZCD|fd6gW1B{G}1g58_SrpEn5 + + typecho-logo + Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + + + \ No newline at end of file diff --git a/src/icons/vis.js.png b/src/icons/vis.js.png deleted file mode 100644 index f40c5df55f6a9c807375d6621e7df03435dc27d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)}S8yfDoSFDzec!`eK|X7l;Te>2vxcAkCBl`|8TH0+nZp$zf$*F?-J zQ*6m?!;|Zt#q8>1Stn$5Lcl1yUH(KFZi>}8SAtt+i zr~FR9sL3|J)cW_n>CO1e--gWDhr~A_GY=!qbp&P{C9d-JL-`d;()K*-=4Xg!CtCMr zWX2JK=hu*uzZl!He8hPanO@F>(r)xtSCkB9Tj6a=?}E_W79^nvaWs&SQ_N?tz)cmd z3I{8uAaQ%q6wFON!-QLR)OaZet0qtciMC$>pr7r z7njI@nAI&ua_)lbFf2R{#=LeUvW&=_HE>m+zlRrZpzT^8^q*!+`7k8+6&6oTr3?tr zN1NlzA6#GB0jXYa?s<#M*o4Fv)6=E}ZqU}%i*aHSAMPz8qacy+IvAg{wL-oL6%nf` zp>(IWlUNldUq8gU6uGwNksy6#qtwXtCN6`N(naH5`(2* z!efy!cElWwm~DtT3Nb~Z#-*W#Pi>VyQhh>|z|c%3#9Xb>MbvBb6I(R;NoO?%>jjO$ g+OBB*C&|D13hF>J*?FA4BLDyZ07*qoM6N<$f&w#7hyVZp From fa32d079d7054b0bed5247c3a95a6faf6f4b6d1a Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Sun, 9 Apr 2017 22:11:15 +1000 Subject: [PATCH 082/119] Highlight.js remove html and env patterns --- src/apps.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/apps.json b/src/apps.json index bcf666d2b..d725f0086 100755 --- a/src/apps.json +++ b/src/apps.json @@ -3413,10 +3413,8 @@ "cats": [ "19" ], - "env": "^hljs$", - "html": "]*href=\"[^\"]+highlight(?:\\.min)?\\.js[^\"]+.css", "icon": "Highlight.js.png", - "script": "highlight(?:\\.min)?\\.js", + "script": "/highlight\\.js/([\\d.]+?)/highlight\\.min\\.js", "website": "https://highlightjs.org/" }, "Highstock": { From 419ca89b6ea23440cd1c482192d96bacb995ab48 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Sun, 9 Apr 2017 22:21:37 +1000 Subject: [PATCH 083/119] Remove regex capture group --- src/apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apps.json b/src/apps.json index d725f0086..b84b56c32 100755 --- a/src/apps.json +++ b/src/apps.json @@ -3414,7 +3414,7 @@ "19" ], "icon": "Highlight.js.png", - "script": "/highlight\\.js/([\\d.]+?)/highlight\\.min\\.js", + "script": "/highlight\\.js/[\\d.]+?/highlight\\.min\\.js", "website": "https://highlightjs.org/" }, "Highstock": { From bdbc518c4d85d94deb7fa9cf5b31f3ce02755b2b Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Sun, 9 Apr 2017 22:24:10 +1000 Subject: [PATCH 084/119] Remove empty lines --- src/apps.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/apps.json b/src/apps.json index cab41b9c1..b84b56c32 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9,7 +9,6 @@ "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, - "1C-Bitrix": { "cats": [ "1" @@ -5484,7 +5483,6 @@ "script": "^/nodebb\\.min\\.js\\?", "website": "https://nodebb.org" }, - "OWL Carousel": { "cats": [ "5", From b30e94991b2ddbb1c9d47d91b2c53a4623eab6c2 Mon Sep 17 00:00:00 2001 From: Ward Oosterlijnck Date: Mon, 10 Apr 2017 10:44:29 +1000 Subject: [PATCH 085/119] icon optional and defaults to default.svg --- bin/wappalyzer-validate-icons | 6 ++--- schema.json | 3 +-- src/apps.json | 39 --------------------------- src/drivers/bookmarklet/driver.js | 2 +- src/drivers/phantomjs/driver.js | 2 +- src/drivers/webextension/js/driver.js | 2 +- src/drivers/webextension/js/popup.js | 2 +- 7 files changed, 8 insertions(+), 48 deletions(-) diff --git a/bin/wappalyzer-validate-icons b/bin/wappalyzer-validate-icons index 3ec796ac6..20cc4b70e 100755 --- a/bin/wappalyzer-validate-icons +++ b/bin/wappalyzer-validate-icons @@ -12,9 +12,9 @@ var for (app in json.apps) { (function(app) { var basePath = process.env.WAPPALYZER_ROOT + '/src/icons/'; - var iconPath = json.apps[app].icon; + var iconPath = json.apps[app].icon || 'default.svg'; var path = basePath + iconPath; - + var type; if (path.substr(path.length - 4) === '.png') { type = "PNG"; @@ -26,7 +26,7 @@ for (app in json.apps) { var err = new Error('Icon file extension specified for app "' + app + '" is not ".png" or ".svg": src/icons/' + iconPath); throw err; } - + fs.exists(path, function(exists) { if (exists) { if (type === "PNG") { diff --git a/schema.json b/schema.json index c70605b61..ac366218f 100644 --- a/schema.json +++ b/schema.json @@ -85,8 +85,7 @@ "required": true }, "icon": { - "type": "string", - "required": true + "type": "string" } } } diff --git a/src/apps.json b/src/apps.json index eca8e667e..136a5cc28 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9,7 +9,6 @@ "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, - "1C-Bitrix": { "cats": [ "1" @@ -866,7 +865,6 @@ "3" ], "html": "", @@ -6236,10 +6240,6 @@ "meta": { "generator": "PrestaShop" }, - "headers": { - "Set-Cookie": "^PrestaShop", - "Powered-By": "^Prestashop$" - }, "website": "http://www.prestashop.com" }, "Project Wonderful": { @@ -7753,15 +7753,6 @@ "url": "/typo3/", "website": "http://www.typo3.org" }, - "Typecho": { - "cats": [ - "11" - ], - "icon": "typecho.svg", - "implies": "PHP", - "url": "/admin/login\\.php?referer=http%3A%2F%2F", - "website": "http://typecho.org/" - }, "Taiga": { "cats": [ "13" @@ -8105,6 +8096,15 @@ "url": "typepad\\.com", "website": "http://www.typepad.com" }, + "Typecho": { + "cats": [ + "11" + ], + "icon": "typecho.svg", + "implies": "PHP", + "url": "/admin/login\\.php?referer=http%3A%2F%2F", + "website": "http://typecho.org/" + }, "Typekit": { "cats": [ "17" From 9ffbc6a272dae5a7f5e5041077f1294fb36a2616 Mon Sep 17 00:00:00 2001 From: DaAwesomeP Date: Mon, 10 Apr 2017 17:44:51 -0500 Subject: [PATCH 087/119] travis create checksums and push releases --- .travis.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.travis.yml b/.travis.yml index 3f1090e37..d9370dba1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,18 @@ before_install: - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - ln -s docker/node/package.json package.json +after_success: + - sha256sum build/* > build/SHA256SUMS + - cat build/SHA256SUMS +deploy: + provider: releases + api_key: + secure: "" + file_glob: true + file: build/* + skip_cleanup: true + on: + tags: true after_script: ls -l --block-size=kB build cache: directories: From 8d458f776548ec2c766d02a6cebba8f379411db1 Mon Sep 17 00:00:00 2001 From: DaAwesomeP Date: Mon, 10 Apr 2017 22:00:34 -0500 Subject: [PATCH 088/119] add option to keep icon static --- src/drivers/webextension/_locales/en/messages.json | 1 + src/drivers/webextension/js/defaults.js | 1 + src/drivers/webextension/js/driver.js | 4 +++- src/drivers/webextension/js/options.js | 5 +++++ src/drivers/webextension/options.html | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 7a5ebe100..624d02221 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Save options" }, "optionsSaved": { "message": "Saved" }, "optionUpgradeMessage": { "message": "Tell me about upgrades" }, + "optionChangeIcon": { "message": "Change the icon in the toolbar to the first detected application instead of the Wappalyzer logo" }, "optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" }, "nothingToDo": { "message": "Nothing to do here." }, "noAppsDetected": { "message": "No applications detected." }, diff --git a/src/drivers/webextension/js/defaults.js b/src/drivers/webextension/js/defaults.js index 3ec2d3e09..296cb0323 100644 --- a/src/drivers/webextension/js/defaults.js +++ b/src/drivers/webextension/js/defaults.js @@ -1,5 +1,6 @@ var defaults = { autoAnalyzeHeaders: 0, upgradeMessage: 1, + changeIcon: 1, tracking: 1 }; diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index cf4ae7b9f..5fb6b5f01 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -215,7 +215,9 @@ icon = 'converted/' + icon + '.png'; } - browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon }); + if (parseInt(localStorage['changeIcon'], 10)) { + browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon }); + } found = true; } diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index 71974de97..2f812224f 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -27,6 +27,10 @@ document.addEventListener('DOMContentLoaded', function() { d.getElementById('option-upgrade-message').setAttribute('checked', 'checked'); } + if ( parseInt(options.opts.changeIcon) ) { + d.getElementById('option-change-icon').setAttribute('checked', 'checked'); + } + if ( parseInt(options.opts.tracking) ) { d.getElementById('option-tracking').setAttribute('checked', 'checked'); } @@ -36,6 +40,7 @@ document.addEventListener('DOMContentLoaded', function() { var option; options.opts.upgradeMessage = d.getElementById('option-upgrade-message').checked ? 1 : 0; + options.opts.changeIcon = d.getElementById('option-change-icon' ).checked ? 1 : 0; options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0; for ( option in options.opts ) { diff --git a/src/drivers/webextension/options.html b/src/drivers/webextension/options.html index 4b6817ce7..4834595b2 100644 --- a/src/drivers/webextension/options.html +++ b/src/drivers/webextension/options.html @@ -29,6 +29,7 @@

+

From da545f54de766fd0cfb2cfb96f4fd5dfca580619 Mon Sep 17 00:00:00 2001 From: Julius2001 Date: Tue, 11 Apr 2017 14:05:19 +0200 Subject: [PATCH 089/119] Added Bootstrap Table --- src/apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/apps.json b/src/apps.json index eca8e667e..cbae7e033 100755 --- a/src/apps.json +++ b/src/apps.json @@ -994,6 +994,19 @@ "implies": "CodeIgniter", "website": "http://cibonfire.com" }, + "Bootstrap Table": { + "cats": [ + "12" + ], + "html": "]+href=\"[^>]*bootstrap-table(?:\\.min)?\\.css", + "icon": "Bootstrap Table.svg", + "implies": [ + "Bootstrap", + "jQuery" + ], + "script": "bootstrap-table(?:\\.min)?\\.js", + "website": "http://bootstrap-table.wenzhixin.net.cn/" + }, "Bounce Exchange": { "cats": [ "32" From ead5b672ff8676f743c716c7dd97065e8b21b81a Mon Sep 17 00:00:00 2001 From: Julius2001 Date: Tue, 11 Apr 2017 14:06:10 +0200 Subject: [PATCH 090/119] Added Bootstrap Table --- src/icons/Bootstrap Table.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/icons/Bootstrap Table.svg diff --git a/src/icons/Bootstrap Table.svg b/src/icons/Bootstrap Table.svg new file mode 100644 index 000000000..2f05ef1f4 --- /dev/null +++ b/src/icons/Bootstrap Table.svg @@ -0,0 +1,4 @@ + + + BT + From fa046c3b860d35d1bbac73aca2dc7b817e7c37a0 Mon Sep 17 00:00:00 2001 From: youssefhad Date: Thu, 13 Apr 2017 14:23:41 +0100 Subject: [PATCH 091/119] add vinala and keep lighty --- src/apps.json | 12 ++++++++++++ src/icons/Vinala.png | Bin 0 -> 1777 bytes 2 files changed, 12 insertions(+) create mode 100644 src/icons/Vinala.png diff --git a/src/apps.json b/src/apps.json index eca8e667e..91d0a8d78 100755 --- a/src/apps.json +++ b/src/apps.json @@ -8405,6 +8405,18 @@ "icon": "Vimeo.png", "website": "http://vimeo.com" }, + + "Vinala": { + "cats": [ + "18" + ], + "headers": { + "Set-Cookie": "vinala_version" + }, + "icon": "Vinala.png", + "implies": "PHP", + "website": "https://github.com/vinala/vinala" + }, "Virata EmWeb": { "cats": [ "22" diff --git a/src/icons/Vinala.png b/src/icons/Vinala.png new file mode 100644 index 0000000000000000000000000000000000000000..8aa46505e9e9fc5b63a7c91fc4cb40e976c112f9 GIT binary patch literal 1777 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D28KyQK~z{r)z^DW zTh{@{ad(gY(QIoqX$4{m3E^oVU@#_jFmIbj2qeKF5CXL3X-L2r0K0LmJKBh7!3GW~t<^R_5p^4D7!;}1_(3?ZDkm&_=@a>NuQl~GF{BJG3Jl*z}m!|{B%P*;N8Y|@) z4X=@xPqh>$2~g06^4DWVrq-jzK3|KtZrzG_9p>=cFow;;cKFAT1y9?T!scHjhdg2N z;0${=_ya5j&V4>lY4|o7rcgB8`hndOVra62Gm4Dn{7sH1NzD?o@ zLGLvf6GyQ_p8^u+V2+)_YUCJJ!^g22HUV|mES5tiW%p?d&y&+W;ZeZsoh|AeSg7yg zVbF|-3{xm;ybGl$xd?Y*D=ger=(1X2%n-w#A%&B36=qf+^vtVpGDo3E=+nw#`(~DD z10QK<CE3VwXd1Dcd+NEpL9Z5Z49I~s|T7pz$P4>Kj_yH*5hM|ZV-IYa-M3d~}ci->-o{V}+ zrKHY77W4)T)OYb9@YWfU|7E$bG`hp4z#lxr&wW{aJ$&V+&~)fWo=JKOn&7wbMbPYD`@j0>zph1g%Rv>Z)2vCA zV1ps?&W)9$l3|j4fP&|i58Zg64V%MC$TUo$@8A)2rh#PtC^#)mu51aEY%$cwx}af7 zcV&!jI>|nk!bkYqQL~VT-Sn=Mm5@p0y?}`WB>P91)%Y75R}58pD@^I#SW9hRBvr;UPZ$fr>e1IhXC<+CkT3)?f&lN(Q)eLuTH#X8P4Uz0)Iktzll`!sI zDXN(3SdSdHtV9n7k?bGUi7F9JdzNW_EwsEwn7Ef9=QJ`&_OY5M{iP*&6l?MQuq8}F z7IW<_lKiJFsrZ$4NwPmfh7NFD~hX8a}I_w zK8*ZwSW2s~QB;;h@}BjymPmbOn@j6?if*zyp=U{US5q!CNcNw;s_+BUmBM)b6r7dk zpyTrwf1Q!>Et2=Ba_a8vc%GuF%oaGZyRpt{`vpnok*>_0Vqd8ad5vnUZbK@*_%WI%2uGs&* z|0h#BLHT7jDp+DK_U7QMB;lOy2iB2(1OwC^~s#;;%?3AQde(0>e;cE-=i?$4gGBjA8*=*XXOD+Z2%h`aW_ z=zAE6hrK5bxRwZql&;fv&_l`Y{~gw$Bd@qd!|&q_&y^UDhHD@SxE=@BV4Tg=9lQVM z{eMCs3H*U`Ec~Y!j{t5&!95avZ(9=K^Pk~=!Y~|?WE}}RKA%kS`9Ao1D3pHy?i+~( TO<(pa00000NkvXXu0mjfJ-B0C literal 0 HcmV?d00001 From b8eddc4fb2d3244138413f25a0c4e30d9782f2d3 Mon Sep 17 00:00:00 2001 From: Dmitry Krekota Date: Fri, 14 Apr 2017 00:15:55 +0300 Subject: [PATCH 092/119] Updated PHP icon (svg) --- src/apps.json | 2 +- src/icons/PHP.png | Bin 822 -> 0 bytes src/icons/PHP.svg | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 src/icons/PHP.png create mode 100644 src/icons/PHP.svg diff --git a/src/apps.json b/src/apps.json index eca8e667e..e14490300 100755 --- a/src/apps.json +++ b/src/apps.json @@ -5885,7 +5885,7 @@ "Set-Cookie": "PHPSESSID", "X-Powered-By": "php/?([\\d.]+)?\\;version:\\1" }, - "icon": "PHP.png", + "icon": "PHP.svg", "url": "\\.php(?:$|\\?)", "website": "http://php.net" }, diff --git a/src/icons/PHP.png b/src/icons/PHP.png deleted file mode 100644 index 47525ab1df4636378d44eeaf094eba9ea5b59214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmV-61Ihe}P)gT zqQVfWEUGjq`mHIUW~;lZ^*8k0xyN}w?zkhgxNKw-H3IPQ&MaSw9 z8)6?B&U4b`K*@ZFC~uM`TB#vh$oHg4tt7S1Fb(b&%^OD_A}UnAd@1^uAz8Z!}k#5 z3RIuji|;|kO?Z4=;LFs)zt^+7f@ODU31*dABhXlhbd=R2<<2A3c!nZ)O2(<>Yp9DJ zj}$@^5N0}`xlDI`d`YVgHm`)Hyu*jvdy1*iM7z(SF1?Ed6ySIT>ljCNEl|Q?MXJj$ zw9PWGpJYL2eK_52;wE;3y|m$l=-vOYdIwr-TVqJCk_#$&L3ilXgJb?YQ zE2zSd2LsKX<|ZzHqnVBJD%WKy06xt`Zp8ga^Km6oWeQmLRcs zm>;Pw>t4YZ9MClIBbcMugHPN;542FcbA8db!gNyHFs^{iFCVI%GV%vcbx!f=^7`+= zy4deE4{D>!mKDFKn$@UE;XX`;(^igvqfk6b$?RKP#~mvcpo=3Y(HP1wPFt-q_-fCr zrOlZr>JwX)zbOgy%N9F^>l_RJnF>cZ!corn0X&;t+G9jY9RL6T07*qoM6N<$f=Abf Ay8r+H diff --git a/src/icons/PHP.svg b/src/icons/PHP.svg new file mode 100644 index 000000000..7ac50a150 --- /dev/null +++ b/src/icons/PHP.svg @@ -0,0 +1 @@ + \ No newline at end of file From 8774fb6b86d3ef3d4fe09ffa7077e608b57934c2 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 15 Apr 2017 15:23:46 +1000 Subject: [PATCH 093/119] Add Edge support --- bin/wappalyzer-build | 38 +- docker/Dockerfile | 20 +- src/apps.json | 54 +- src/drivers/webextension/images/icon_150.png | Bin 0 -> 5781 bytes src/drivers/webextension/images/icon_44.png | Bin 0 -> 1725 bytes src/drivers/webextension/images/icon_50.png | Bin 0 -> 1942 bytes src/drivers/webextension/js/driver.js | 12 +- .../js/ms_background_scripts_api_bridge.js | 846 ++++++++++++++++++ .../js/ms_content_scripts_api_bridge.js | 323 +++++++ src/drivers/webextension/js/popup.js | 24 +- src/drivers/webextension/manifest.edge.json | 49 +- src/drivers/webextension/manifest.json | 56 +- src/wappalyzer.js | 2 +- 13 files changed, 1330 insertions(+), 94 deletions(-) create mode 100644 src/drivers/webextension/images/icon_150.png create mode 100644 src/drivers/webextension/images/icon_44.png create mode 100644 src/drivers/webextension/images/icon_50.png create mode 100644 src/drivers/webextension/js/ms_background_scripts_api_bridge.js create mode 100644 src/drivers/webextension/js/ms_content_scripts_api_bridge.js diff --git a/bin/wappalyzer-build b/bin/wappalyzer-build index b526af24b..ab8cabbde 100755 --- a/bin/wappalyzer-build +++ b/bin/wappalyzer-build @@ -41,7 +41,7 @@ do rm "$dest" fi - node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true + #node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true done IFS="$OIFS" @@ -55,13 +55,41 @@ wappalyzer links # WebExtension echo "Building WebExtension driver..." -pushd $WAPPALYZER_ROOT/src/drivers/webextension > /dev/null +webextension_dir=$WAPPALYZER_ROOT/src/drivers/webextension -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . -x manifest.edge.json +pushd $webextension_dir > /dev/null -zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip . -x manifest.json +zip -qr $WAPPALYZER_ROOT/build/wappalyzer_webextension.zip . -printf "@ manifest.edge.json\n@=manifest.json\n" | zipnote -w $WAPPALYZER_ROOT/build/wappalyzer_webextension.edge.zip +popd > /dev/null + +# Edge + +pushd $WAPPALYZER_ROOT/build > /dev/null + +mv $webextension_dir/manifest.json $webextension_dir/manifest.webextension.json +mv $webextension_dir/manifest.edge.json $webextension_dir/manifest.json + +manifoldjs -l debug -p edgeextension -f edgeextension -m $webextension_dir/manifest.json + +mv $webextension_dir/manifest.json $webextension_dir/manifest.edge.json +mv $webextension_dir/manifest.webextension.json $webextension_dir/manifest.json + +manifest_dir="Wappalyzer/edgeextension/manifest" + +sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml +sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml +sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml + +cp $webextension_dir/images/icon_44.png $manifest_dir/Assets/Square44x44Logo.png +cp $webextension_dir/images/icon_150.png $manifest_dir/Assets/Square150x150Logo.png +cp $webextension_dir/images/icon_50.png $manifest_dir/Assets/StoreLogo.png + +manifoldjs -l debug -p edgeextension package $manifest_dir + +mv Wappalyzer/edgeextension/package/edgeExtension.appx wappalyzer_edge.appx + +rm -rf Wappalyzer popd > /dev/null diff --git a/docker/Dockerfile b/docker/Dockerfile index c4e7806c0..c35776024 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,15 +12,15 @@ RUN sed -i 's/^deb-src\ /\#deb-src\ /g' /etc/apt/sources.list RUN sed -i 's/archive\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list RUN sed -i 's/security\.ubuntu\.com/au.archive.ubuntu.com/g' /etc/apt/sources.list RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ - apt-get install -y \ - nodejs \ - bzip2 \ - zip \ - libfreetype6 \ - libfontconfig \ - rsync && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + apt-get install -y \ + nodejs \ + bzip2 \ + zip \ + libfreetype6 \ + libfontconfig \ + rsync && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Add user @@ -50,6 +50,8 @@ ADD node/package.json $WAPPALYZER_NODE_PATH/package.json RUN su wappalyzer -c "cd $WAPPALYZER_NODE_PATH && npm i" +RUN npm i -g manifoldjs + # SSH RUN rm -f /etc/service/sshd/down diff --git a/src/apps.json b/src/apps.json index eca8e667e..8bbc56a63 100755 --- a/src/apps.json +++ b/src/apps.json @@ -9,7 +9,6 @@ "url": "/shop/catalog/browse\\?sessid=", "website": "http://1and1.com" }, - "1C-Bitrix": { "cats": [ "1" @@ -3188,18 +3187,6 @@ }, "website": "http://www.greenvalley.nl/Public/Producten/Content_Management/CMS" }, - "Homeland": { - "cats": [ - "1", - "2" - ], - "headers": { - "Set-Cookie:": "_homeland_" - }, - "icon": "Homeland.png", - "implies": "Ruby on Rails", - "website": "https://gethomeland.com" - }, "HERE": { "cats": [ "35" @@ -3430,6 +3417,18 @@ ], "website": "http://twitter.github.com/hogan.js" }, + "Homeland": { + "cats": [ + "1", + "2" + ], + "headers": { + "Set-Cookie:": "_homeland_" + }, + "icon": "Homeland.png", + "implies": "Ruby on Rails", + "website": "https://gethomeland.com" + }, "Hotaru CMS": { "cats": [ "1" @@ -5467,7 +5466,6 @@ "script": "^/nodebb\\.min\\.js\\?", "website": "https://nodebb.org" }, - "OWL Carousel": { "cats": [ "5", @@ -6249,6 +6247,10 @@ "^priceDisplayMethod$\\;confidence:25", "^priceDisplayPrecision$\\;confidence:25" ], + "headers": { + "Powered-By": "^Prestashop$", + "Set-Cookie": "^PrestaShop" + }, "html": [ "Powered by ]+>PrestaShop", "", @@ -6259,10 +6261,6 @@ "meta": { "generator": "PrestaShop" }, - "headers": { - "Set-Cookie": "^PrestaShop", - "Powered-By": "^Prestashop$" - }, "website": "http://www.prestashop.com" }, "Project Wonderful": { @@ -7782,15 +7780,6 @@ "url": "/typo3/", "website": "http://www.typo3.org" }, - "Typecho": { - "cats": [ - "11" - ], - "icon": "typecho.svg", - "implies": "PHP", - "url": "/admin/login\\.php?referer=http%3A%2F%2F", - "website": "http://typecho.org/" - }, "Taiga": { "cats": [ "13" @@ -8135,6 +8124,15 @@ "url": "typepad\\.com", "website": "http://www.typepad.com" }, + "Typecho": { + "cats": [ + "11" + ], + "icon": "typecho.svg", + "implies": "PHP", + "url": "/admin/login\\.php?referer=http%3A%2F%2F", + "website": "http://typecho.org/" + }, "Typekit": { "cats": [ "17" @@ -10376,4 +10374,4 @@ "priority": "9" } } -} +} \ No newline at end of file diff --git a/src/drivers/webextension/images/icon_150.png b/src/drivers/webextension/images/icon_150.png new file mode 100644 index 0000000000000000000000000000000000000000..7028f9c5e8ec561052b6e3d93e40cdcc47ad4586 GIT binary patch literal 5781 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 Q2xKgfinel%;+v5F0l~RDlmGw# literal 0 HcmV?d00001 diff --git a/src/drivers/webextension/images/icon_44.png b/src/drivers/webextension/images/icon_44.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6321eaacd8e2de1029d9a698ac1c5255b791b1 GIT binary patch literal 1725 zcmV;u215CXP)62{Ctcr$r@-0e|I?DC+`P- z2^fGz^cFLc^3zxOR`j9*e3Sd-5{23hlugk6Axf%WAG+;>WXxquc?)=&S1PUEJquWX zt1$H2m9CvX`9c}~Hh)QvxUHuJ)=oM}(=^TPx@%Ye^4<#yxH4tuLQ(P(@TCOOJCw-k zmdI`Yx&VN+RJxk(7Lg|a=M+}f0v^p6v>$HdcKf^l_N6uFV5vWWEK63!Yh;f@^x9V= zD*{O^I-je#5=-w-CfH%N^b%X~ewAnE?MY#H8M|GUJMxggeaTRi&u5z#+=I>^zQQf1 z5@Oir+&Ry7ooW;KSt4MkxePXJUO?&f*^^~%ZPXKOTjtzR8aKl}chmQQ-vX(Lu$3{> z#pAoa$>mpP;6D^%{k4B%Xi!ZyJ)$)m--xc*dQOIy@uJt~ZfXFYOB5_X@I;jU6N3O0 z&Piw8L#6SgdqnuX&(-vDMSAn}vjX;c8W-7a&wijL5s>awla+OIDK7P*HEgWXsKz!;+eJzYJNVS zC;nQ_AKtIz<~uLv>5cn{Mr=~j9UMCn=8k!vXdq28fH@V24tubz>$ zudy}7<#aZr8Qxm}^IX|8@;xlAF673VB1%fVpBaRhVsOAZ!|Eez-sYc80j4<(7FOl( zPD^*Zdsv-P{kwugJ*(d1z5xI!;hqvp%mDtrVT&Ix-h=-@F#au|?V#T}XoppA7Vx2HquS4JK9B;b4Fc(>|7ePXJabMY-OTpH zRT-x6^{N~yYKkelc@|E$gZ6!WJi7WVI*$y*1$IF7MFQ6UJhqOFY7Xcp)1*LZUjwSf zCS{qknB}-k3x*_8kk>5D<*nVvhz+U9vx?ST)=@cWA0KuXqhwiH{JOr<4AR=*Wl=A} z(vdnmsKbO*kEBRC4vEkD#-fUj10j^HC!G`35jw2@N=Tg?@0~Rd2k_nnd-NIh^0?<3 zLyVVzxnsVJTt^An=Imr%vPVUq-OX{U9fca};6B!x)tx-~?=xHW^p6m2$GlwsJcgtL z*NsdJt3D!nfHWf$L(HTBRoHxDwR6JuqsMLmq0yn$az9TUI;UI9r|!EV`dJ`rWVd$=GI+9DcFkM#+k z+8yHx3)qV`R|VK~=xq6CUEeUR{Xwd>d5LO-#Us5&M289MUQ&%rOqsl2is>kR>m&Nq zrxRT7*pi{W)rWbkd&-y4d}=F1*aqZ{b|ogW9aoTH&OGNBA-ji8yB%9wW4n%v*6aK{ z_4;J6OsaxHv>r`k(KbV5K5*s81Zgp~x~YTB z`_J1$N@fc~Nv^5YrNK}tI>0)Re3*h|~JgDNCKOtc)qOMel z{xb|)zLCStGz*#GD5T%+=D2kj#aOc=2bH#KI@$cr1$|p9;X$`$1b>a@?r}F}aZMyw zAo_)KiVK_u)Kh3k{(GSUf@Ze?*(B{A@a$ zjJc9>&W30W1}WI)C1a#!YlJPiI$V8#Eho5Gqma7t0;z4y=iVE*6qn*sjEnyRgpN+y Tzq72s00000NkvXXu0mjf<0?vL literal 0 HcmV?d00001 diff --git a/src/drivers/webextension/images/icon_50.png b/src/drivers/webextension/images/icon_50.png new file mode 100644 index 0000000000000000000000000000000000000000..935b35b72739e4d4c002d490517f10202ebe587f GIT binary patch literal 1942 zcmV;H2Wj|;P)9Kli=I{(xmc6cBdNC{a_zX={wqG)7tj)+Dwus0m1n{WY03qmE*y z?KI8UPHfXjqLUiinUHC0aCC}*c1)%X8l%RLqP2CB8mmY`a2G*k0}Cz-y!USZ(6K?D z3G6PK%y9nPyZ5~Nz2~0u{hk9OHew@o(=6Yyb6$b7>Ue>@`u^emmKYAFdAzCF9Dyf* zUjhmsfiip8wq_3tLth9W1&)ddpl%0pEtXH1rdqVG_ks6f{aq!N&gMI+mxKE5bwB`2 zQxu~v-(I=;a~Y8ZY;zk9=O2J&gWe?BCG5rzUJot}d@g{@ckY@crMVr*j$r#)prj^T zc<819S>2p%~>B}>**%W?w`#w4@^bGO+i#JR~UA{N;o#yNPN42a< z_Ue2oMGc4<(Sk@CZDaG{Jd#G+aU^J@dgD2~%Rf{%6NNM%$ySR_G#Gz5^O->McvG9~ z`1X?s%7DaJJoKJ!gYGVaJLZoC;Ff7_8czgi`fuk@T_qr7aklnQW}3eE4IevoOCb67 z%1K&W`0qebw2VLd-gF-M#Z)@ldO6<|;?&WPnKUCA@1)Cj^X0jz>@EL@o{$kqmA&1r ziuS6_`pIOz`>Pzpm8)nx5oFJc4g9mFm5ux7GCIQv zz@chC87csf4dRB)JIF>CF0$2{XhV$eEusW zrP`xai;FMwh$0sOZISq}J5|>FaR$GA_3Mk1BWvMxZzgaj5oHj$jWMzeY4aq9ow9%(4vGKF5UuX}0J zRUjFZj#q^!PuH>%Q&i71ff%$bSCq?D=$_*7%z4m*J>HU<2(*TIJa<2VmT;qbx zLbyi7k?M)RTDbt6E)DNw7Y8aLPi|f6olW`)HDH|c0v?21;pWb^AnzO#Ua?jVWJ#5D zZK9d1rbXP-r)D|HTbjj!731;Tnn=_8K{h;EN8^7wBl6d21dL{*UNxjXV9h5t3gK1O zzJ%oaR-2R6G}5(fsiH(hkW=m$#fR^8&>J=*Xdk6)(a(r>_x7P_Q{&c0GKGEf+ttAMvtoHp1KvOdL=ML>wONR$NL-%t3US z?KJE4=(5);NJz1Pq0Pe$Ccdsw?%2)0-$W4mzTiMtJlh>yHqk=^+9Q-sY+R?A_e_?eIA zo{!1!A(Pcp6rt__zG_tn(zRPiQ8R|z#HoV#-5|rdm;f79p`f2*4rRKV5O8LEJHto3~Bh#_0Ox1+;GKl-ET&AdFN!KPI zKH**>Y193jH=3-2pCU+}}NCam0Kd2;R1}$ZV5bV^XdH-29)yINNV=A3KO?+NY?8VArt^qSyJx&qo zHeim$@=>HL{-oH8mBn2BbyC+6#QVxM;!`5noFv^v4Lp5;FPdesW{y{s)_Pf&$B2#C ch}~5C9}5?mHcAZZM*si-07*qoM6N<$f`GrQy#N3J literal 0 HcmV?d00001 diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index cf4ae7b9f..709094e38 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -1,5 +1,5 @@ /** - * Chrome driver + * WebExtension driver */ (function() { @@ -74,13 +74,19 @@ chrome.runtime.onMessage.addListener(w.driver.onMessage); } - browser.tabs.query({}).then(function(tabs) { + var callback = function(tabs) { tabs.forEach(function(tab) { if ( tab.url.match(/^https?:\/\//) ) { browser.tabs.executeScript(tab.id, { file: 'js/content.js' }); } }) - }); + }; + + try { + browser.tabs.query({}).then(callback); + } catch ( e ) { + browser.tabs.query({}, callback); + } browser.tabs.onRemoved.addListener(function(tabId) { w.log('remove tab'); diff --git a/src/drivers/webextension/js/ms_background_scripts_api_bridge.js b/src/drivers/webextension/js/ms_background_scripts_api_bridge.js new file mode 100644 index 000000000..d023cf1b0 --- /dev/null +++ b/src/drivers/webextension/js/ms_background_scripts_api_bridge.js @@ -0,0 +1,846 @@ +if (!Range.prototype["intersectsNode"]) { + Range.prototype["intersectsNode"] = function (node) { + let range = document.createRange(); + range.selectNode(node); + return 0 > this.compareBoundaryPoints(Range.END_TO_START, range) + && 0 < this.compareBoundaryPoints(Range.START_TO_END, range); + }; +} +var getExtensionProtocol = function () { + if (typeof browser == "undefined") { + if (typeof chrome !== "undefined") + return "chrome-extension://"; + } + else { + return "ms-browser-extension://"; + } +}; +class FakeEvent { + addListener(callback) { } + addRules(rules, callback) { } + getRules(ruleIdentifiers, callback) { } + hasListener(callback) { return false; } + hasListeners() { return false; } + removeRules(ruleIdentifiers, callback) { } + removeListener(callback) { } +} +class EdgeBridgeHelper { + constructor() { + this.fakeEvent = new FakeEvent(); + } + toAbsolutePath(relativePath) { + if (relativePath.indexOf("ms-browser-extension://") == 0) { + return relativePath.replace(myBrowser.runtime.getURL(""), ""); + } + else if (relativePath.indexOf("/") != 0) { + var absolutePath = ""; + var documentPath = document.location.pathname; + absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1); + absolutePath += relativePath; + return absolutePath; + } + return relativePath; + } +} +var bridgeHelper = new EdgeBridgeHelper(); +class EdgeBridgeDebugLog { + constructor() { + this.CatchOnException = true; + this.VerboseLogging = true; + this.FailedCalls = {}; + this.SuccededCalls = {}; + this.DeprecatedCalls = {}; + this.BridgedCalls = {}; + this.UnavailableApis = {}; + this.EdgeIssues = {}; + } + log(message) { + try { + if (this.VerboseLogging) { + console.log(message); + } + } + catch (e) { + } + } + info(message) { + try { + if (this.VerboseLogging) { + console.info(message); + } + } + catch (e) { + } + } + warn(message) { + try { + if (this.VerboseLogging) { + console.warn(message); + } + } + catch (e) { + } + } + error(message) { + try { + if (this.VerboseLogging) { + console.error(message); + } + } + catch (e) { + } + } + DoActionAndLog(action, name, deprecatedTo, bridgedTo) { + var result; + try { + result = action(); + this.AddToCalledDictionary(this.SuccededCalls, name); + if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") { + this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); + this.AddToCalledDictionary(this.DeprecatedCalls, name); + } + if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") { + this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo); + this.AddToCalledDictionary(this.BridgedCalls, name); + } + return result; + } + catch (ex) { + this.AddToCalledDictionary(this.FailedCalls, name); + if (this.CatchOnException) + this.error("API Call Failed: " + name + " - " + ex); + else + throw ex; + } + } + LogEdgeIssue(name, message) { + this.warn(message); + this.AddToCalledDictionary(this.EdgeIssues, name); + } + LogUnavailbleApi(name, deprecatedTo) { + this.warn("API Call '" + name + "' is not supported in Edge"); + this.AddToCalledDictionary(this.UnavailableApis, name); + if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") { + this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); + this.AddToCalledDictionary(this.DeprecatedCalls, name); + } + } + AddToCalledDictionary(dictionary, name) { + if (typeof dictionary[name] !== "undefined") { + dictionary[name]++; + } + else { + dictionary[name] = 1; + } + } +} +var bridgeLog = new EdgeBridgeDebugLog(); +class EdgeChromeAppBridge { + getDetails() { + return bridgeLog.DoActionAndLog(() => { + return EdgeChromeRuntimeBridge.prototype.getManifest(); + }, "app.getManifest", undefined, "runtime.getManifest"); + } + get isInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.isInstalled is not available in Edge"; }, "app.isInstalled"); } + getIsInstalled() { return bridgeLog.DoActionAndLog(() => { throw "app.getIsInstalled is not available in the Edge"; }, "app.getIsInstalled"); } + installState() { return bridgeLog.DoActionAndLog(() => { throw "app.installState is not available in Edge"; }, "app.installState"); } + runningState() { return bridgeLog.DoActionAndLog(() => { throw "app.runningState is not available in Edge"; }, "app.runningState"); } +} +class EdgeBrowserActionBridge { + get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.browserAction.onClicked; }, "browserAction.onClicked"); } + disable(tabId) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.disable(tabId); + }, "browserAction.disable"); + } + enable(tabId) { + bridgeLog.DoActionAndLog(() => { + if (typeof tabId !== "undefined" && typeof tabId !== "null") { + myBrowser.browserAction.enable(tabId); + } + else { + myBrowser.browserAction.enable(); + } + }, "browserAction.Enable"); + } + getBadgeBackgroundColor(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.getBadgeBackgroundColor(details, callback); + }, "browserAction.getBadgeBackgroundColor"); + } + getBadgeText(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.getBadgeText(details, callback); + }, "browserAction.getBadgeText"); + } + setBadgeBackgroundColor(details) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.setBadgeBackgroundColor(details); + }, "browserAction.setBadgeBackgroundColor"); + } + setBadgeText(details) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.setBadgeText(details); + }, "browserAction.setBadgeText"); + } + setIcon(details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof details.path !== "undefined") { + if (typeof details.path === "object") { + for (var key in details.path) { + if (details.path.hasOwnProperty(key)) { + details.path[key] = bridgeHelper.toAbsolutePath(details.path[key]); + } + } + } + else { + details.path = bridgeHelper.toAbsolutePath(details.path); + } + } + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.browserAction.setIcon(details, callback); + } + else { + myBrowser.browserAction.setIcon(details); + } + }, "browserAction.setIcon", undefined, "browserAction.setIcon with absolute path"); + } + setPopup(details) { + bridgeLog.DoActionAndLog(() => { + myBrowser.browserAction.setPopup(details); + }, "browserAction.setPopup"); + } +} +class EdgeChromeBrowserActionBridge extends EdgeBrowserActionBridge { + getPopup(details, callback) { + bridgeLog.LogUnavailbleApi("browserAction.getPopup"); + } + getTitle(details, callback) { + bridgeLog.LogUnavailbleApi("browserAction.getTitle"); + } + setTitle(details) { + bridgeLog.LogUnavailbleApi("browserAction.setTitle"); + } +} +class EdgeContextMenusBridge { + get ACTION_MENU_TOP_LEVEL_LIMIT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT; }, "contextMenus.ACTION_MENU_TOP_LEVEL_LIMIT"); } + get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.contextMenus.onClicked; }, "contextMenus.onClicked"); } + create(createProperties, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.contextMenus.create(createProperties, callback); + } + else { + myBrowser.contextMenus.create(createProperties); + } + }, "contextMenus.create"); + } + remove(menuItemId, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.contextMenus.remove(menuItemId, callback); + } + else { + myBrowser.contextMenus.remove(menuItemId); + } + }, "contextMenus.remove"); + } + removeAll(callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.contextMenus.removeAll(callback); + } + else { + myBrowser.contextMenus.removeAll(); + } + }, "contextMenus.removeAll"); + } + update(id, updateProperties, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.contextMenus.update(id, updateProperties, callback); + } + else { + myBrowser.contextMenus.update(id, updateProperties); + } + }, "contextMenus.update"); + } +} +class EdgeCookiesBridge { + get(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.cookies.get(details, callback); + }, "cookies.get"); + } + getAll(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.cookies.getAll(details, callback); + }, "cookies.getAll"); + } + remove(details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.cookies.remove(details, callback); + } + else { + myBrowser.cookies.remove(details); + } + }, "cookies.remove"); + } + set(details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.cookies.set(details, callback); + } + else { + myBrowser.cookies.set(details); + } + }, "cookies.set"); + } +} +class EdgeChromeCookiesBridge extends EdgeCookiesBridge { + get onChanged() { bridgeLog.LogUnavailbleApi("cookies.onChanged"); return bridgeHelper.fakeEvent; } +} +class EdgeExtensionBridge { + getBackgroundPage() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getBackgroundPage(); + }, "extension.getBackgroundPage"); + } + getURL(path) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getURL(path); + }, "extension.getURL"); + } + getViews(fetchProperties) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getViews(fetchProperties); + }, "extension.getViews"); + } +} +class EdgeChromeExtensionBridge extends EdgeExtensionBridge { + get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); } + get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); } + get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); } + get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); } + get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); } + get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); } + connect(extensionId, connectInfo) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo); + }, "extension.connect", "runtime.connect", "runtime.connect"); + } + sendMessage(message, responseCallback) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined); + }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage"); + } + sendRequest(extensionId, message, options, responseCallback) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback); + }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage"); + } + isAllowedFileSchemeAccess(callback) { + bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess"); + } + isAllowedIncognitoAccess(callback) { + bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess"); + } + setUpdateUrlData(data) { + bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData"); + } +} +class EdgeHistoryBridge { + get onVisited() { bridgeLog.LogUnavailbleApi("history.onVisited"); return bridgeHelper.fakeEvent; } + get onVisitRemoved() { bridgeLog.LogUnavailbleApi("history.onVisitRemoved"); return bridgeHelper.fakeEvent; } + addUrl(details, callback) { + bridgeLog.LogUnavailbleApi("history.addUrl"); + } + deleteAll(callback) { + bridgeLog.LogUnavailbleApi("history.deleteAll"); + } + deleteRange(range, callback) { + bridgeLog.LogUnavailbleApi("history.deleteRange"); + } + deleteUrl(details, callback) { + bridgeLog.LogUnavailbleApi("history.deleteUrl"); + } + getVisits(details, callback) { + bridgeLog.LogUnavailbleApi("history.getVisits"); + } + search(query, callback) { + bridgeLog.LogUnavailbleApi("history.search"); + } +} +class EdgeI18nBridge { + getAcceptLanguages(callback) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.i18n.getAcceptLanguages(callback); + }, "i18n.getAcceptLanguages"); + } + getMessage(messageName, substitutions) { + return bridgeLog.DoActionAndLog(() => { + if (messageName.indexOf("@@extension_id") > -1) { + return myBrowser.runtime.id; + } + if (typeof substitutions !== "undefined" && typeof substitutions !== "null") { + return myBrowser.i18n.getMessage(messageName, substitutions); + } + else { + return myBrowser.i18n.getMessage(messageName); + } + }, "i18n.getMessage"); + } + getUILanguage() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.i18n.getUILanguage(); + }, "i18n.getUILanguage"); + } +} +class EdgeNotificationBridge { + get onButtonClicked() { bridgeLog.LogUnavailbleApi("notifications.onButtonClicked"); return bridgeHelper.fakeEvent; } + get onClicked() { bridgeLog.LogUnavailbleApi("notifications.onClicked"); return bridgeHelper.fakeEvent; } + get onClosed() { bridgeLog.LogUnavailbleApi("notifications.onClosed"); return bridgeHelper.fakeEvent; } + get onPermissionLevelChanged() { bridgeLog.LogUnavailbleApi("notifications.onPermissionLevelChanged"); return bridgeHelper.fakeEvent; } + get onShowSettings() { bridgeLog.LogUnavailbleApi("notifications.onShowSettings"); return bridgeHelper.fakeEvent; } + clear(notificationId, callback) { + bridgeLog.LogUnavailbleApi("notifications.clear"); + } + create(notificationId, options, callback) { + bridgeLog.LogUnavailbleApi("notifications.create"); + } + getAll(callback) { + bridgeLog.LogUnavailbleApi("notifications.getAll"); + } + getPermissionLevel(callback) { + bridgeLog.LogUnavailbleApi("notifications.getPermissionLevel"); + } + update(notificationId, options, callback) { + bridgeLog.LogUnavailbleApi("notifications.update"); + } +} +class EdgePageActionBridge { + get onClicked() { return bridgeLog.DoActionAndLog(() => { return myBrowser.pageAction.onClicked; }, "pageAction.onClicked"); } + getPopup(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.getPopup(details, callback); + }, "pageAction.getPopup"); + } + getTitle(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.getTitle(details, callback); + }, "pageAction.getTitle"); + } + hide(tabId) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.hide(tabId); + }, "pageAction.hide"); + } + setTitle(details) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.setTitle(details); + }, "pageAction.setTitle"); + } + setIcon(details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.pageAction.setIcon(details, callback); + } + else { + myBrowser.pageAction.setIcon(details, callback); + } + }, "pageAction.setIcon"); + } + setPopup(details) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.setPopup(details); + }, "pageAction.setPopup"); + } + show(tabId) { + bridgeLog.DoActionAndLog(() => { + myBrowser.pageAction.show(tabId); + }, "pageAction.show"); + } +} +class EdgePermissionsBridge { + get onAdded() { bridgeLog.LogUnavailbleApi("permissions.onAdded"); return bridgeHelper.fakeEvent; } + get onRemoved() { bridgeLog.LogUnavailbleApi("permissions.onRemoved"); return bridgeHelper.fakeEvent; } + contains(permissions, callback) { + bridgeLog.LogUnavailbleApi("permissions.contains"); + } + getAll(callback) { + bridgeLog.LogUnavailbleApi("permissions.getAll"); + } + remove(permissions, callback) { + bridgeLog.LogUnavailbleApi("permissions.remove"); + } + request(permissions, callback) { + bridgeLog.LogUnavailbleApi("permissions.request"); + } +} +class EdgeRuntimeBridge { + get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); } + get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); } + get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); } + get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); } + get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); } + get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); } + connect(extensionId, connectInfo) { + return bridgeLog.DoActionAndLog(() => { + if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") { + return myBrowser.runtime.connect(extensionId, connectInfo); + } + else { + return myBrowser.runtime.connect(extensionId); + } + }, "runtime.connect"); + } + getBackgroundPage(callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.runtime.getBackgroundPage(callback); + }, "runtime.getBackgroundPage"); + } + getManifest() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.runtime.getManifest(); + }, "runtime.getManifest"); + } + getURL(path) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.runtime.getURL(path); + }, "runtime.getURL"); + } + sendMessage(extensionId, message, options, responseCallback) { + bridgeLog.DoActionAndLog(() => { + if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") { + myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback); + } + else if (typeof options !== "undefined" && typeof options !== "null") { + myBrowser.runtime.sendMessage(extensionId, message, options); + } + else if (typeof message !== "undefined" && typeof message !== "null") { + myBrowser.runtime.sendMessage(extensionId, message); + } + else { + myBrowser.runtime.sendMessage(undefined, extensionId); + } + }, "runtime.sendMessage"); + } +} +class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge { + get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; } + get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; } + get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; } + get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; } + get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; } + get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; } + openOptionsPage(callback) { + bridgeLog.DoActionAndLog(() => { + var optionsPage = myBrowser.runtime.getManifest()["options_page"]; + var optionsPageUrl = myBrowser.runtime.getURL(optionsPage); + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.create({ url: optionsPageUrl }, callback); + } + else { + myBrowser.tabs.create({ url: optionsPageUrl }); + } + }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })"); + } + connectNative(application) { + bridgeLog.LogUnavailbleApi("runtime.connectNative"); + return null; + } + getPackageDirectoryEntry(callback) { + bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry"); + } + getPlatformInfo(callback) { + bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo"); + } + reload() { + bridgeLog.LogUnavailbleApi("runtime.reload"); + } + requestUpdateCheck(callback) { + bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck"); + } + restart() { + bridgeLog.LogUnavailbleApi("runtime.restart"); + } + setUninstallURL(url, callback) { + bridgeLog.LogUnavailbleApi("runtime.setUninstallURL"); + } + sendNativeMessage(application, message, responseCallback) { + bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage"); + } +} +class EdgeStorageBridge { + get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); } + get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); } +} +class EdgeChromeStorageBridge extends EdgeStorageBridge { + get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); } + get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); } +} +class EdgeTabsBridge { + get onActivated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onActivated; }, "tabs.onActivated"); } + get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onCreated; }, "tabs.onCreated"); } + get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onRemoved; }, "tabs.onRemoved"); } + get onReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onReplaced; }, "tabs.onReplaced"); } + get onUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.tabs.onUpdated; }, "tabs.onUpdated"); } + create(createProperties, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.create(createProperties, callback); + } + else { + myBrowser.tabs.create(createProperties); + } + }, "tabs.create"); + } + detectLanguage(tabId, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.tabs.detectLanguage(tabId, callback); + }, "tabs.detectLanguage"); + } + executeScript(tabId, details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.executeScript(tabId, details, callback); + } + else { + myBrowser.tabs.executeScript(tabId, details); + } + }, "tabs.executeScript"); + } + get(tabId, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.tabs.get(tabId, callback); + }, "tabs.get"); + } + getCurrent(callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.tabs.getCurrent(callback); + }, "tabs.getCurrent"); + } + insertCSS(tabId, details, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.insertCSS(tabId, details, callback); + } + else { + myBrowser.tabs.insertCSS(tabId, details); + } + }, "tabs.insertCSS"); + } + query(queryInfo, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.tabs.query(queryInfo, callback); + }, "tabs.query"); + } + remove(tabId, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.remove(tabId, callback); + } + else { + myBrowser.tabs.remove(tabId); + } + }, "tabs.remove"); + } + sendMessage(tabId, message, responseCallback) { + bridgeLog.DoActionAndLog(() => { + if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") { + myBrowser.tabs.sendMessage(tabId, message, responseCallback); + } + else { + myBrowser.tabs.sendMessage(tabId, message); + } + }, "tabs.sendMessage"); + } + update(tabId, updateProperties, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.update(tabId, updateProperties, callback); + } + else { + myBrowser.tabs.update(tabId, updateProperties); + } + }, "tabs.update"); + } +} +class EdgeChromeTabsBridge extends EdgeTabsBridge { + get onAttached() { bridgeLog.LogUnavailbleApi("tabs.onAttached"); return bridgeHelper.fakeEvent; } + get onDetached() { bridgeLog.LogUnavailbleApi("tabs.onDetached"); return bridgeHelper.fakeEvent; } + get onHighlighted() { bridgeLog.LogUnavailbleApi("tabs.onHighlighted"); return bridgeHelper.fakeEvent; } + get onMoved() { bridgeLog.LogUnavailbleApi("tabs.onMoved"); return bridgeHelper.fakeEvent; } + get onSelectionChanged() { + return bridgeLog.DoActionAndLog(() => { + var fakeEvent = bridgeHelper.fakeEvent; + fakeEvent.addListener = (callback) => { + myBrowser.tabs.onActivated.addListener((activeInfo) => { + callback(activeInfo.tabId, { windowId: activeInfo.windowId }); + }); + }; + return fakeEvent; + }, "tabs.onSelectionChanged", "tabs.onActivated", "tabs.onActivated"); + } + duplicate(tabId, callback) { + bridgeLog.DoActionAndLog(() => { + this.get(tabId, function (tab) { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.create({ url: tab.url }, callback); + } + else { + myBrowser.tabs.create({ url: tab.url }); + } + }); + }, "tabs.duplicate", undefined, "tabs.create"); + } + getAllInWindow(windowId, callback) { + bridgeLog.DoActionAndLog(() => { + this.query({ windowId: windowId }, callback); + }, "tabs.getAllInWindow", "tabs.query", "tabs.query"); + } + getSelected(windowId, callback) { + bridgeLog.DoActionAndLog(() => { + this.query({ active: true }, (tabs) => callback(tabs[0])); + }, "tabs.getSelected", "tabs.query", "tabs.query"); + } + sendRequest(tabId, request, responseCallback) { + bridgeLog.DoActionAndLog(() => { + this.sendMessage(tabId, request, responseCallback); + }, "tabs.sendRequest", "tabs.sendMessage", "tabs.sendMessage"); + } + captureVisibleTab(windowId, options, callback) { + bridgeLog.LogUnavailbleApi("tabs.captureVisibleTab"); + } + connect(tabId, connectInfo) { + bridgeLog.LogUnavailbleApi("tabs.connect"); + return null; + } + highlight(highlightInfo, callback) { + bridgeLog.LogUnavailbleApi("tabs.highlight"); + } + move(tabId, moveProperties, callback) { + bridgeLog.LogUnavailbleApi("tabs.move"); + } + reload(tabId, reloadProperties, callback) { + bridgeLog.LogUnavailbleApi("tabs.reload"); + } +} +class EdgeWebNavigationBridge { + get onBeforeNavigate() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onBeforeNavigate; }, "webNavigation.onBeforeNavigate"); } + get onCommitted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCommitted; }, "webNavigation.onCommitted"); } + get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCompleted; }, "webNavigation.onCompleted"); } + get onCreatedNavigationTarget() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onCreatedNavigationTarget; }, "webNavigation.onCreatedNavigationTarget"); } + get onDOMContentLoaded() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onDOMContentLoaded; }, "webNavigation.onDOMContentLoaded"); } + get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onErrorOccurred; }, "webNavigation.onErrorOccurred"); } + get onHistoryStateUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onHistoryStateUpdated; }, "webNavigation.onHistoryStateUpdated"); } + get onReferenceFragmentUpdated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onReferenceFragmentUpdated; }, "webNavigation.onReferenceFragmentUpdated"); } + get onTabReplaced() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webNavigation.onTabReplaced; }, "webNavigation.onTabReplaced"); } + getAllFrames(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.webNavigation.getAllFrames(details, callback); + }, "webNavigation.getAllFrames"); + } + getFrame(details, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.webNavigation.getFrame(details, callback); + }, "webNavigation.getFrame"); + } +} +class EdgeWebRequestBridge { + get MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; }, "webNavigation.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES"); } + get onAuthRequired() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onAuthRequired; }, "webNavigation.onAuthRequired"); } + get onBeforeRedirect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRedirect; }, "webNavigation.onBeforeRedirect"); } + get onBeforeRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeRequest; }, "webNavigation.onBeforeRequest"); } + get onBeforeSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onBeforeSendHeaders; }, "webNavigation.onBeforeSendHeaders"); } + get onCompleted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onCompleted; }, "webNavigation.onCompleted"); } + get onErrorOccurred() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onErrorOccurred; }, "webNavigation.onErrorOccurred"); } + get onHeadersReceived() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onHeadersReceived; }, "webNavigation.onHeadersReceived"); } + get onResponseStarted() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onResponseStarted; }, "webNavigation.onResponseStarted"); } + get onSendHeaders() { return bridgeLog.DoActionAndLog(() => { return myBrowser.webRequest.onSendHeaders; }, "webNavigation.onSendHeaders"); } + handlerBehaviorChanged(callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.webRequest.handlerBehaviorChanged(callback); + } + else { + myBrowser.webRequest.handlerBehaviorChanged(); + } + }, "webRequest.handlerBehaviorChanged"); + } +} +class EdgeWindowsBridge { + get WINDOW_ID_CURRENT() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_CURRENT; }, "windows.WINDOW_ID_CURRENT"); } + get WINDOW_ID_NONE() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.WINDOW_ID_NONE; }, "windows.WINDOW_ID_NONE"); } + get onCreated() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onCreated; }, "windows.onCreated"); } + get onFocusChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onFocusChanged; }, "windows.onFocusChanged"); } + get onRemoved() { return bridgeLog.DoActionAndLog(() => { return myBrowser.windows.onRemoved; }, "windows.onRemoved"); } + create(createData, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.windows.create(createData, callback); + } + else { + myBrowser.windows.create(createData); + } + }, "windows.create"); + } + get(windowId, getInfo, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.windows.get(windowId, getInfo, callback); + }, "windows.get"); + } + getAll(getInfo, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.windows.getAll(getInfo, callback); + }, "windows.getAll"); + } + getCurrent(getInfo, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.windows.getCurrent(getInfo, callback); + }, "windows.getCurrent"); + } + getLastFocused(getInfo, callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.windows.getLastFocused(getInfo, callback); + }, "windows.getLastFocused"); + } + update(windowId, updateInfo, callback) { + bridgeLog.DoActionAndLog(() => { + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.windows.update(windowId, updateInfo, callback); + } + else { + myBrowser.windows.update(windowId, updateInfo); + } + }, "windows.update"); + } +} +class EdgeChromeWindowsBridge extends EdgeWindowsBridge { + remove(windowId, callback) { + bridgeLog.LogUnavailbleApi("windows.remove"); + } +} +class EdgeBackgroundBridge { + constructor() { + this.app = new EdgeChromeAppBridge(); + this.browserAction = typeof browser.browserAction !== "undefined" ? new EdgeChromeBrowserActionBridge() : undefined; + this.contextMenus = typeof browser.contextMenus !== "undefined" ? new EdgeContextMenusBridge() : undefined; + this.cookies = typeof browser.cookies !== "undefined" ? new EdgeChromeCookiesBridge() : undefined; + this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined; + this.history = typeof browser.history !== "undefined" ? new EdgeHistoryBridge() : undefined; + this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined; + this.notifications = typeof browser.notifications !== "undefined" ? new EdgeNotificationBridge() : undefined; + this.pageAction = typeof browser.pageAction !== "undefined" ? new EdgePageActionBridge() : undefined; + this.permissions = typeof browser.permissions !== "undefined" ? new EdgePermissionsBridge() : undefined; + this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined; + this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined; + this.tabs = typeof browser.tabs !== "undefined" ? new EdgeChromeTabsBridge() : undefined; + this.webNavigation = typeof browser.webNavigation !== "undefined" ? new EdgeWebNavigationBridge() : undefined; + this.webRequest = typeof browser.webRequest !== "undefined" ? new EdgeWebRequestBridge() : undefined; + this.windows = typeof browser.windows !== "undefined" ? new EdgeChromeWindowsBridge() : undefined; + } +} +var myBrowser = browser; +var chrome = new EdgeBackgroundBridge(); diff --git a/src/drivers/webextension/js/ms_content_scripts_api_bridge.js b/src/drivers/webextension/js/ms_content_scripts_api_bridge.js new file mode 100644 index 000000000..183aafc02 --- /dev/null +++ b/src/drivers/webextension/js/ms_content_scripts_api_bridge.js @@ -0,0 +1,323 @@ +if (!Range.prototype["intersectsNode"]) { + Range.prototype["intersectsNode"] = function (node) { + let range = document.createRange(); + range.selectNode(node); + return 0 > this.compareBoundaryPoints(Range.END_TO_START, range) + && 0 < this.compareBoundaryPoints(Range.START_TO_END, range); + }; +} +var getExtensionProtocol = function () { + if (typeof browser == "undefined") { + if (typeof chrome !== "undefined") + return "chrome-extension://"; + } + else { + return "ms-browser-extension://"; + } +}; +class FakeEvent { + addListener(callback) { } + addRules(rules, callback) { } + getRules(ruleIdentifiers, callback) { } + hasListener(callback) { return false; } + hasListeners() { return false; } + removeRules(ruleIdentifiers, callback) { } + removeListener(callback) { } +} +class EdgeBridgeHelper { + constructor() { + this.fakeEvent = new FakeEvent(); + } + toAbsolutePath(relativePath) { + if (relativePath.indexOf("ms-browser-extension://") == 0) { + return relativePath.replace(myBrowser.runtime.getURL(""), ""); + } + else if (relativePath.indexOf("/") != 0) { + var absolutePath = ""; + var documentPath = document.location.pathname; + absolutePath = documentPath.substring(0, documentPath.lastIndexOf("/") + 1); + absolutePath += relativePath; + return absolutePath; + } + return relativePath; + } +} +var bridgeHelper = new EdgeBridgeHelper(); +class EdgeBridgeDebugLog { + constructor() { + this.CatchOnException = true; + this.VerboseLogging = true; + this.FailedCalls = {}; + this.SuccededCalls = {}; + this.DeprecatedCalls = {}; + this.BridgedCalls = {}; + this.UnavailableApis = {}; + this.EdgeIssues = {}; + } + log(message) { + try { + if (this.VerboseLogging) { + console.log(message); + } + } + catch (e) { + } + } + info(message) { + try { + if (this.VerboseLogging) { + console.info(message); + } + } + catch (e) { + } + } + warn(message) { + try { + if (this.VerboseLogging) { + console.warn(message); + } + } + catch (e) { + } + } + error(message) { + try { + if (this.VerboseLogging) { + console.error(message); + } + } + catch (e) { + } + } + DoActionAndLog(action, name, deprecatedTo, bridgedTo) { + var result; + try { + result = action(); + this.AddToCalledDictionary(this.SuccededCalls, name); + if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") { + this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); + this.AddToCalledDictionary(this.DeprecatedCalls, name); + } + if (typeof bridgedTo !== "undefined" && typeof bridgedTo !== "null") { + this.info("API Call '" + name + "' has been bridged to another Edge API: " + bridgedTo); + this.AddToCalledDictionary(this.BridgedCalls, name); + } + return result; + } + catch (ex) { + this.AddToCalledDictionary(this.FailedCalls, name); + if (this.CatchOnException) + this.error("API Call Failed: " + name + " - " + ex); + else + throw ex; + } + } + LogEdgeIssue(name, message) { + this.warn(message); + this.AddToCalledDictionary(this.EdgeIssues, name); + } + LogUnavailbleApi(name, deprecatedTo) { + this.warn("API Call '" + name + "' is not supported in Edge"); + this.AddToCalledDictionary(this.UnavailableApis, name); + if (typeof deprecatedTo !== "undefined" && typeof deprecatedTo !== "null") { + this.warn("API Call Deprecated - Name: " + name + ", Please use " + deprecatedTo + " instead!"); + this.AddToCalledDictionary(this.DeprecatedCalls, name); + } + } + AddToCalledDictionary(dictionary, name) { + if (typeof dictionary[name] !== "undefined") { + dictionary[name]++; + } + else { + dictionary[name] = 1; + } + } +} +var bridgeLog = new EdgeBridgeDebugLog(); +class EdgeExtensionBridge { + getBackgroundPage() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getBackgroundPage(); + }, "extension.getBackgroundPage"); + } + getURL(path) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getURL(path); + }, "extension.getURL"); + } + getViews(fetchProperties) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.extension.getViews(fetchProperties); + }, "extension.getViews"); + } +} +class EdgeChromeExtensionBridge extends EdgeExtensionBridge { + get onConnect() { return bridgeLog.DoActionAndLog(() => { return EdgeRuntimeBridge.prototype.onConnect; }, "extension.onConnect", "runtime.onConnect", "runtime.onConnect"); } + get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onMessage", "runtime.onMessage", "runtime.onMessage"); } + get onRequest() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "extension.onRequest", "runtime.onMessage", "runtime.onMessage"); } + get onRequestExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "extension.onRequestExternal", "runtime.onMessageExternal", "runtime.onMessageExternal"); } + get inIncognitoContext() { return bridgeLog.DoActionAndLog(() => { return myBrowser.extension["inPrivateContext"]; }, "extension.inIncognitoContext", undefined, "extension.inPrivateContext"); } + get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "extension.lastError", undefined, "runtime.lastError"); } + connect(extensionId, connectInfo) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.connect(extensionId, connectInfo); + }, "extension.connect", "runtime.connect", "runtime.connect"); + } + sendMessage(message, responseCallback) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.sendMessage(message, responseCallback, undefined, undefined); + }, "extension.sendMessage", "runtime.sendMessage", "runtime.sendMessage"); + } + sendRequest(extensionId, message, options, responseCallback) { + return bridgeLog.DoActionAndLog(() => { + return EdgeRuntimeBridge.prototype.sendMessage(extensionId, message, options, responseCallback); + }, "extension.sendRequest", "runtime.sendMessage", "runtime.sendMessage"); + } + isAllowedFileSchemeAccess(callback) { + bridgeLog.LogUnavailbleApi("extension.isAllowedFileSchemeAccess"); + } + isAllowedIncognitoAccess(callback) { + bridgeLog.LogUnavailbleApi("extension.isAllowedIncognitoAccess"); + } + setUpdateUrlData(data) { + bridgeLog.LogUnavailbleApi("extension.setUpdateUrlData"); + } +} +class EdgeI18nBridge { + getAcceptLanguages(callback) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.i18n.getAcceptLanguages(callback); + }, "i18n.getAcceptLanguages"); + } + getMessage(messageName, substitutions) { + return bridgeLog.DoActionAndLog(() => { + if (messageName.indexOf("@@extension_id") > -1) { + return myBrowser.runtime.id; + } + if (typeof substitutions !== "undefined" && typeof substitutions !== "null") { + return myBrowser.i18n.getMessage(messageName, substitutions); + } + else { + return myBrowser.i18n.getMessage(messageName); + } + }, "i18n.getMessage"); + } + getUILanguage() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.i18n.getUILanguage(); + }, "i18n.getUILanguage"); + } +} +class EdgeRuntimeBridge { + get id() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.id; }, "runtime.id"); } + get lastError() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.lastError; }, "runtime.lastError"); } + get onConnect() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onConnect; }, "runtime.onConnect"); } + get onInstalled() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onInstalled; }, "runtime.onInstalled"); } + get onMessage() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessage; }, "runtime.onMessage"); } + get onMessageExternal() { return bridgeLog.DoActionAndLog(() => { return myBrowser.runtime.onMessageExternal; }, "runtime.onMessageExternal"); } + connect(extensionId, connectInfo) { + return bridgeLog.DoActionAndLog(() => { + if (typeof connectInfo !== "undefined" && typeof connectInfo !== "null") { + return myBrowser.runtime.connect(extensionId, connectInfo); + } + else { + return myBrowser.runtime.connect(extensionId); + } + }, "runtime.connect"); + } + getBackgroundPage(callback) { + bridgeLog.DoActionAndLog(() => { + myBrowser.runtime.getBackgroundPage(callback); + }, "runtime.getBackgroundPage"); + } + getManifest() { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.runtime.getManifest(); + }, "runtime.getManifest"); + } + getURL(path) { + return bridgeLog.DoActionAndLog(() => { + return myBrowser.runtime.getURL(path); + }, "runtime.getURL"); + } + sendMessage(extensionId, message, options, responseCallback) { + bridgeLog.DoActionAndLog(() => { + if (typeof responseCallback !== "undefined" && typeof responseCallback !== "null") { + myBrowser.runtime.sendMessage(extensionId, message, options, responseCallback); + } + else if (typeof options !== "undefined" && typeof options !== "null") { + myBrowser.runtime.sendMessage(extensionId, message, options); + } + else if (typeof message !== "undefined" && typeof message !== "null") { + myBrowser.runtime.sendMessage(extensionId, message); + } + else { + myBrowser.runtime.sendMessage(undefined, extensionId); + } + }, "runtime.sendMessage"); + } +} +class EdgeChromeRuntimeBridge extends EdgeRuntimeBridge { + get onConnectExternal() { bridgeLog.LogUnavailbleApi("runtime.onConnectExternal"); return bridgeHelper.fakeEvent; } + get onRestartRequired() { bridgeLog.LogUnavailbleApi("runtime.onRestartRequired"); return bridgeHelper.fakeEvent; } + get onStartup() { bridgeLog.LogUnavailbleApi("runtime.onStartup"); return bridgeHelper.fakeEvent; } + get onSuspend() { bridgeLog.LogUnavailbleApi("runtime.onSuspend"); return bridgeHelper.fakeEvent; } + get onSuspendCanceled() { bridgeLog.LogUnavailbleApi("runtime.onSuspendCanceled"); return bridgeHelper.fakeEvent; } + get onUpdateAvailable() { bridgeLog.LogUnavailbleApi("runtime.onUpdateAvailable"); return bridgeHelper.fakeEvent; } + openOptionsPage(callback) { + bridgeLog.DoActionAndLog(() => { + var optionsPage = myBrowser.runtime.getManifest()["options_page"]; + var optionsPageUrl = myBrowser.runtime.getURL(optionsPage); + if (typeof callback !== "undefined" && typeof callback !== "null") { + myBrowser.tabs.create({ url: optionsPageUrl }, callback); + } + else { + myBrowser.tabs.create({ url: optionsPageUrl }); + } + }, "runtime.openOptionsPage", undefined, "tabs.create({ url: optionsPageUrl })"); + } + connectNative(application) { + bridgeLog.LogUnavailbleApi("runtime.connectNative"); + return null; + } + getPackageDirectoryEntry(callback) { + bridgeLog.LogUnavailbleApi("runtime.getPackageDirectoryEntry"); + } + getPlatformInfo(callback) { + bridgeLog.LogUnavailbleApi("runtime.getPlatformInfo"); + } + reload() { + bridgeLog.LogUnavailbleApi("runtime.reload"); + } + requestUpdateCheck(callback) { + bridgeLog.LogUnavailbleApi("runtime.requestUpdateCheck"); + } + restart() { + bridgeLog.LogUnavailbleApi("runtime.restart"); + } + setUninstallURL(url, callback) { + bridgeLog.LogUnavailbleApi("runtime.setUninstallURL"); + } + sendNativeMessage(application, message, responseCallback) { + bridgeLog.LogUnavailbleApi("runtime.sendNativeMessage"); + } +} +class EdgeStorageBridge { + get local() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.local"); } + get onChanged() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.onChanged; }, "storage.onChanged"); } +} +class EdgeChromeStorageBridge extends EdgeStorageBridge { + get managed() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.managed", undefined, "storage.local"); } + get sync() { return bridgeLog.DoActionAndLog(() => { return myBrowser.storage.local; }, "storage.sync", undefined, "storage.local"); } +} +class EdgeContentBridge { + constructor() { + this.extension = typeof browser.extension !== "undefined" ? new EdgeChromeExtensionBridge() : undefined; + this.i18n = typeof browser.i18n !== "undefined" ? new EdgeI18nBridge() : undefined; + this.runtime = typeof browser.runtime !== "undefined" ? new EdgeChromeRuntimeBridge() : undefined; + this.storage = typeof browser.storage !== "undefined" ? new EdgeChromeStorageBridge() : undefined; + } +} +var myBrowser = browser; +var chrome = new EdgeContentBridge(); diff --git a/src/drivers/webextension/js/popup.js b/src/drivers/webextension/js/popup.js index dbb4444e0..4b959e954 100644 --- a/src/drivers/webextension/js/popup.js +++ b/src/drivers/webextension/js/popup.js @@ -10,13 +10,21 @@ document.addEventListener('DOMContentLoaded', function() { popup = { init: function() { - browser.tabs.query({ active: true, currentWindow: true }).then(function(tabs) { + var callback = function(tabs) { if ( tabs[0].url.match(/https?:\/\//) ) { detectedApps.innerHTML = '
' + browser.i18n.getMessage('noAppsDetected') + '
'; } else { detectedApps.innerHTML = '
' + browser.i18n.getMessage('nothingToDo') + '
'; } - }); + }; + + try { + // Chrome, Firefox + browser.tabs.query({ active: true, currentWindow: true }).then(callback); + } catch ( e ) { + // Edge + browser.tabs.query({ active: true, currentWindow: true }, callback); + } popup.displayApps(); }, @@ -24,7 +32,7 @@ document.addEventListener('DOMContentLoaded', function() { displayApps: function() { var appName, confidence, version; - browser.tabs.query({ active: true, currentWindow: true }).then(function(tabs) { + var callback = function(tabs) { function sendGetApps(response) { if ( response.tabCache && response.tabCache.count > 0 ) { detectedApps.innerHTML = ''; @@ -60,7 +68,15 @@ document.addEventListener('DOMContentLoaded', function() { } else { chrome.runtime.sendMessage({ id: 'get_apps', tab: tabs[0] }, sendGetApps); } - }); + }; + + try { + // Chrome, Firefox + browser.tabs.query({ active: true, currentWindow: true }).then(callback); + } catch ( e ) { + // Edge + browser.tabs.query({ active: true, currentWindow: true }, callback); + } } }; diff --git a/src/drivers/webextension/manifest.edge.json b/src/drivers/webextension/manifest.edge.json index 4c94099f2..9e9faf3a6 100644 --- a/src/drivers/webextension/manifest.edge.json +++ b/src/drivers/webextension/manifest.edge.json @@ -1,44 +1,51 @@ { "name": "Wappalyzer", - "short_name": "Wappalyzer", - "author": "Elbert Alias", + "short_name": "Wappalyzer", + "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", - "version": "4", + "version": "4.0.1", "default_locale": "en", "manifest_version": 2, "icons": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", "128": "images/icon_128.png" }, "page_action": { "default_icon": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, "default_title": "Wappalyzer", "default_popup": "popup.html" }, "background": { "page": "background.html", - "persistent": true + "persistent": true }, "content_scripts": [ { - "matches": [ "http://*/*", "https://*/*" ], + "matches": [ + "http://*/*", + "https://*/*" + ], "js": [ "js/browser-polyfill.js", "js/content.js" ], "run_at": "document_idle" - }, { - "matches": [ "http://*/*", "https://*/*" ], + }, + { + "matches": [ + "http://*/*", + "https://*/*" + ], "js": [ "js/browser-polyfill.js", "js/iframe.js" @@ -50,7 +57,7 @@ "web_accessible_resources": [ "js/inject.js" ], - "options_page": "options.html", + "options_page": "options.html", "permissions": [ "tabs", "webRequest", @@ -58,5 +65,9 @@ "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "content_security_policy": "script-src 'self'; object-src 'self'", + "-ms-preload": { + "backgroundScript": "js/ms_background_scripts_api_bridge.js", + "contentScript": "js/ms_content_scripts_api_bridge.js" + } } diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 54d2a07e4..38b9f5abb 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -1,47 +1,53 @@ { "name": "Wappalyzer", - "short_name": "Wappalyzer", - "author": "Elbert Alias", + "short_name": "Wappalyzer", + "author": "Elbert Alias", "homepage_url": "https://wappalyzer.com/", "description": "Identify web technologies", "version": "4.0.1", "default_locale": "en", "manifest_version": 2, "icons": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", "128": "images/icon_128.png" }, "page_action": { "default_icon": { - "16": "images/icon_16.png", - "19": "images/icon_19.png", - "32": "images/icon_32.png", - "38": "images/icon_38.png", - "128": "images/icon_128.png" - }, + "16": "images/icon_16.png", + "19": "images/icon_19.png", + "32": "images/icon_32.png", + "38": "images/icon_38.png", + "128": "images/icon_128.png" + }, "default_title": "Wappalyzer", "default_popup": "popup.html" }, "background": { - "page": "background.html" - + "page": "background.html", + "persistent": true }, "content_scripts": [ { - "matches": [ "http://*/*", "https://*/*" ], + "matches": [ + "http://*/*", + "https://*/*" + ], "js": [ "js/browser-polyfill.js", "js/content.js" ], "run_at": "document_idle" - }, { - "matches": [ "http://*/*", "https://*/*" ], + }, + { + "matches": [ + "http://*/*", + "https://*/*" + ], "js": [ - "js/browser-polyfill.js", - "js/iframe.js" + "js/browser-polyfill.js" ], "run_at": "document_start", "all_frames": true @@ -50,11 +56,7 @@ "web_accessible_resources": [ "js/inject.js" ], - "options_page": "options.html", - "options_ui": { - "page": "options.html", - "open_in_tab": false - }, + "options_page": "options.html", "permissions": [ "tabs", "webRequest", @@ -62,5 +64,9 @@ "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'" + "content_security_policy": "script-src 'self'; object-src 'self'", + "-ms-preload": { + "backgroundScript": "js/ms_background_scripts_api_bridge.js", + "contentScript": "js/ms_content_scripts_api_bridge.js" + } } diff --git a/src/wappalyzer.js b/src/wappalyzer.js index 8eb4f289f..6b13f0c88 100644 --- a/src/wappalyzer.js +++ b/src/wappalyzer.js @@ -1,5 +1,5 @@ /** - * Wappalyzer v2 + * Wappalyzer v4 * * Created by Elbert Alias * From 3fa81843fdef812c9b25a4f80c533b729b76642e Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sat, 15 Apr 2017 15:54:36 +1000 Subject: [PATCH 094/119] Install manifoldjs in Travis CI --- .travis.yml | 1 + bin/wappalyzer-build | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3f1090e37..a5289283d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ before_install: - export WAPPALYZER_NODE_PATH=$TRAVIS_BUILD_DIR - export PATH=$PATH:$TRAVIS_BUILD_DIR/bin - ln -s docker/node/package.json package.json +before_script: npm i -g manifoldjs after_script: ls -l --block-size=kB build cache: directories: diff --git a/bin/wappalyzer-build b/bin/wappalyzer-build index ab8cabbde..a07a85b59 100755 --- a/bin/wappalyzer-build +++ b/bin/wappalyzer-build @@ -41,7 +41,7 @@ do rm "$dest" fi - #node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true + node $WAPPALYZER_NODE_PATH/node_modules/svg2png/bin/svg2png-cli "$svg" --width=32 --height=32 --output "$dest" || true done IFS="$OIFS" @@ -80,6 +80,7 @@ manifest_dir="Wappalyzer/edgeextension/manifest" sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-NAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-IDENTITY-PUBLISHER-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml sed -i 's/INSERT-YOUR-PACKAGE-PROPERTIES-PUBLISHERDISPLAYNAME-HERE/Wappalyzer/' $manifest_dir/appxmanifest.xml +sed -i 's/Version="0.\([^"]\+\)/Version="\1.0/' $manifest_dir/appxmanifest.xml cp $webextension_dir/images/icon_44.png $manifest_dir/Assets/Square44x44Logo.png cp $webextension_dir/images/icon_150.png $manifest_dir/Assets/Square150x150Logo.png From 44c79f4f133f37dcc2eb3eda2690e17099baa1e1 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 16 Apr 2017 11:24:49 +1000 Subject: [PATCH 095/119] Up version number --- src/drivers/phantomjs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/phantomjs/package.json b/src/drivers/phantomjs/package.json index f055bf0af..eed2410c6 100644 --- a/src/drivers/phantomjs/package.json +++ b/src/drivers/phantomjs/package.json @@ -2,7 +2,7 @@ "name": "wappalyzer", "description": "Uncovers the technologies used on websites", "homepage": "https://github.com/AliasIO/Wappalyzer", - "version": "3.0.9", + "version": "3.0.10", "author": "Elbert Alias", "license": "GPL-3.0", "repository": { From ce172c30fd7dc0e1607a1657a62cba518324556c Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 16 Apr 2017 11:34:34 +1000 Subject: [PATCH 096/119] Add API key to Travis CI configuration --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1b59f9ea0..d78ea5d9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,11 +14,12 @@ after_success: deploy: provider: releases api_key: - secure: "" + secure: mco1ycbfGXZEiBywOmM5A50Y1QPFawj4i0gdB9JDkXDvY7N2kPZyCdAeOQOMEJuetGT3HvJuTG0Ll47sithZfPqq6wx/4EeP8YQYYFIyoOlsIGi5MDR1kS5ZOqKDWGe5+x+/rUZbmuMHvgHWNSjPG8mBrp5xWmON6ETkLWfVB0c= file_glob: true file: build/* skip_cleanup: true on: + repo: AliasIO/Wappalyzer tags: true after_script: ls -l --block-size=kB build cache: From cbd4286551a5f312287b736065b47ed78cf31ccd Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 16 Apr 2017 11:48:30 +1000 Subject: [PATCH 097/119] Modify dynamic icon option --- src/drivers/webextension/_locales/el/messages.json | 1 + src/drivers/webextension/_locales/en/messages.json | 2 +- src/drivers/webextension/_locales/es/messages.json | 1 + src/drivers/webextension/_locales/fr/messages.json | 1 + src/drivers/webextension/_locales/gr/messages.json | 1 + src/drivers/webextension/_locales/it/messages.json | 1 + src/drivers/webextension/_locales/pl/messages.json | 1 + src/drivers/webextension/_locales/ro/messages.json | 1 + src/drivers/webextension/js/defaults.js | 2 +- src/drivers/webextension/js/driver.js | 8 +++++--- src/drivers/webextension/js/options.js | 6 +++--- 11 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/drivers/webextension/_locales/el/messages.json b/src/drivers/webextension/_locales/el/messages.json index e7bbcdef3..41058767a 100644 --- a/src/drivers/webextension/_locales/el/messages.json +++ b/src/drivers/webextension/_locales/el/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" }, "optionsSaved": { "message": "Αποθηκεύτηκε" }, "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" }, "nothingToDo": { "message": "Καμία ενέργεια." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 624d02221..21a787bb2 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -6,7 +6,7 @@ "optionsSave": { "message": "Save options" }, "optionsSaved": { "message": "Saved" }, "optionUpgradeMessage": { "message": "Tell me about upgrades" }, - "optionChangeIcon": { "message": "Change the icon in the toolbar to the first detected application instead of the Wappalyzer logo" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Anonymously send reports on detected applications to wappalyzer.com for research" }, "nothingToDo": { "message": "Nothing to do here." }, "noAppsDetected": { "message": "No applications detected." }, diff --git a/src/drivers/webextension/_locales/es/messages.json b/src/drivers/webextension/_locales/es/messages.json index d175e0e55..9a2639722 100644 --- a/src/drivers/webextension/_locales/es/messages.json +++ b/src/drivers/webextension/_locales/es/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Guardar opciones" }, "optionsSaved": { "message": "Guardado" }, "optionUpgradeMessage": { "message": "Indicarme actualizaciones" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Enviar informes anónimos sobre las aplicaciones detectadas a wappalyzer.com para análisis" }, "nothingToDo": { "message": "Nada que hacer aquí." }, "noAppsDetected": { "message": "Aplicaciones no detectadas." }, diff --git a/src/drivers/webextension/_locales/fr/messages.json b/src/drivers/webextension/_locales/fr/messages.json index 05de10bf8..5c5fdf456 100644 --- a/src/drivers/webextension/_locales/fr/messages.json +++ b/src/drivers/webextension/_locales/fr/messages.json @@ -4,6 +4,7 @@ "nothingToDo": { "message": "Rien à faire ici." }, "optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" }, "optionUpgradeMessage": { "message": "M'afficher les mises à jour" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "options": { "message": "Options" }, "optionsSave": { "message": "Sauver les options" }, "optionsSaved": { "message": "Sauvé" }, diff --git a/src/drivers/webextension/_locales/gr/messages.json b/src/drivers/webextension/_locales/gr/messages.json index 4b13de522..055cb2b95 100644 --- a/src/drivers/webextension/_locales/gr/messages.json +++ b/src/drivers/webextension/_locales/gr/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Ρυθμίσεις αποθήκευσης" }, "optionsSaved": { "message": "Αποθηκεύτηκε" }, "optionUpgradeMessage": { "message": "Ενημερώστε με για αναβαθμίσεις" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Ανώνυμη αποστολή αναφορών για εντοπισμένες εφαρμογές στο wappalyzer.com για έρευνα" }, "nothingToDo": { "message": "Καμία ενέργεια." }, "noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." }, diff --git a/src/drivers/webextension/_locales/it/messages.json b/src/drivers/webextension/_locales/it/messages.json index 04a7acf97..b93fea5d8 100644 --- a/src/drivers/webextension/_locales/it/messages.json +++ b/src/drivers/webextension/_locales/it/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Salva opzioni" }, "optionsSaved": { "message": "Salvato" }, "optionUpgradeMessage": { "message": "Parlami dell'upgrade" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Inviare anonimamente un report sulle applicazioni rilevate a wappalyzer.com per l'analisi" }, "nothingToDo": { "message": "Niente da fare qui." }, "noAppsDetected": { "message": "Nessuna applicazione rilevata." }, diff --git a/src/drivers/webextension/_locales/pl/messages.json b/src/drivers/webextension/_locales/pl/messages.json index 84fe6cc73..f70d54208 100644 --- a/src/drivers/webextension/_locales/pl/messages.json +++ b/src/drivers/webextension/_locales/pl/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Zapisz opcje" }, "optionsSaved": { "message": "Zapisano" }, "optionUpgradeMessage": { "message": "Powiadamiaj mnie o aktualizacjach" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Przesyłaj anonimowe statystyki aplikacji wykrytych przez Wappalyzer do twórców" }, "nothingToDo": { "message": "Nic tu nie ma." }, "noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." }, diff --git a/src/drivers/webextension/_locales/ro/messages.json b/src/drivers/webextension/_locales/ro/messages.json index f9d732bdf..48fd99b91 100644 --- a/src/drivers/webextension/_locales/ro/messages.json +++ b/src/drivers/webextension/_locales/ro/messages.json @@ -6,6 +6,7 @@ "optionsSave": { "message": "Salvează opțiuni" }, "optionsSaved": { "message": "Salvat" }, "optionUpgradeMessage": { "message": "Anunță-mă dacă sunt actualizări" }, + "optionDynamicIcon": { "message": "Use application icon instead of Wappalyzer logo" }, "optionTracking": { "message": "Trimite rapoarte anonime despre aplicațiile detectate către wappalyzer.com pentru cercetare" }, "nothingToDo": { "message": "Nimic de făcut pe pagina curentă." }, "noAppsDetected": { "message": "Nici o aplicație detectată." }, diff --git a/src/drivers/webextension/js/defaults.js b/src/drivers/webextension/js/defaults.js index 296cb0323..98ce709d0 100644 --- a/src/drivers/webextension/js/defaults.js +++ b/src/drivers/webextension/js/defaults.js @@ -1,6 +1,6 @@ var defaults = { autoAnalyzeHeaders: 0, upgradeMessage: 1, - changeIcon: 1, + dynamicIcon: 1, tracking: 1 }; diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index f429736cb..164ce1c0b 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -216,14 +216,16 @@ w.apps[appName].cats.forEach(function(cat) { var icon = w.apps[appName].icon || 'default.svg'; + if ( !parseInt(localStorage['dynamicIcon'], 10) ) { + icon = 'default.svg'; + } + if ( cat == match && !found ) { if ( /\.svg$/i.test(icon) ) { icon = 'converted/' + icon + '.png'; } - if (parseInt(localStorage['changeIcon'], 10)) { - browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon }); - } + browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon }); found = true; } diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index 2f812224f..3a3aeac2d 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -27,8 +27,8 @@ document.addEventListener('DOMContentLoaded', function() { d.getElementById('option-upgrade-message').setAttribute('checked', 'checked'); } - if ( parseInt(options.opts.changeIcon) ) { - d.getElementById('option-change-icon').setAttribute('checked', 'checked'); + if ( parseInt(options.opts.dynamicIcon) ) { + d.getElementById('option-dynamic-icon').setAttribute('checked', 'checked'); } if ( parseInt(options.opts.tracking) ) { @@ -40,7 +40,7 @@ document.addEventListener('DOMContentLoaded', function() { var option; options.opts.upgradeMessage = d.getElementById('option-upgrade-message').checked ? 1 : 0; - options.opts.changeIcon = d.getElementById('option-change-icon' ).checked ? 1 : 0; + options.opts.dynamicIcon = d.getElementById('option-dynamic-icon' ).checked ? 1 : 0; options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0; for ( option in options.opts ) { From 7e2449ca1985226c19c50bd1a6df5acc2edd0894 Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Sun, 16 Apr 2017 11:57:12 +1000 Subject: [PATCH 098/119] Fix WebExtensions options --- src/drivers/webextension/manifest.json | 20 +++++++++++--------- src/drivers/webextension/options.html | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 38b9f5abb..1bc2a6e5c 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -26,8 +26,8 @@ "default_popup": "popup.html" }, "background": { - "page": "background.html", - "persistent": true + "page": "background.html" + }, "content_scripts": [ { @@ -43,11 +43,12 @@ }, { "matches": [ - "http://*/*", + "http://*/*", "https://*/*" ], "js": [ - "js/browser-polyfill.js" + "js/browser-polyfill.js", + "js/iframe.js" ], "run_at": "document_start", "all_frames": true @@ -57,6 +58,10 @@ "js/inject.js" ], "options_page": "options.html", + "options_ui": { + "page": "options.html", + "open_in_tab": false + }, "permissions": [ "tabs", "webRequest", @@ -64,9 +69,6 @@ "http://*/*", "https://*/*" ], - "content_security_policy": "script-src 'self'; object-src 'self'", - "-ms-preload": { - "backgroundScript": "js/ms_background_scripts_api_bridge.js", - "contentScript": "js/ms_content_scripts_api_bridge.js" - } + "content_security_policy": "script-src 'self'; object-src 'self'" } + diff --git a/src/drivers/webextension/options.html b/src/drivers/webextension/options.html index 4834595b2..b3a853619 100644 --- a/src/drivers/webextension/options.html +++ b/src/drivers/webextension/options.html @@ -29,7 +29,7 @@

- +

From 7db12a03fb7320f63433c33a71b00b636df514f5 Mon Sep 17 00:00:00 2001 From: AlexByte Date: Sun, 16 Apr 2017 06:21:15 +0300 Subject: [PATCH 099/119] Remove the inappropriate use of the Photo Galleries category. --- src/apps.json | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/apps.json b/src/apps.json index b99c07b5e..442c29752 100755 --- a/src/apps.json +++ b/src/apps.json @@ -2593,8 +2593,7 @@ }, "FlexSlider": { "cats": [ - "5", - "7" + "5" ], "icon": "FlexSlider.png", "implies": "jQuery", @@ -4360,7 +4359,6 @@ }, "Lightbox": { "cats": [ - "7", "12" ], "html": "]*href=\"[^\"]+lightbox(?:\\.min)?\\.css", @@ -5478,8 +5476,7 @@ }, "OWL Carousel": { "cats": [ - "5", - "7" + "5" ], "html": "]*href=\"[^\"]+owl.carousel(?:\\.min)?\\.css", "icon": "OWL Carousel.png", @@ -7311,7 +7308,6 @@ }, "Slimbox": { "cats": [ - "7", "12" ], "html": "]*href=\"[^/]*slimbox(?:-rtl)?\\.css", @@ -7322,7 +7318,6 @@ }, "Slimbox 2": { "cats": [ - "7", "12" ], "html": "]*href=\"[^/]*slimbox2(?:-rtl)?\\.css", @@ -7685,7 +7680,6 @@ }, "Supersized": { "cats": [ - "7", "25" ], "icon": "Supersized.png", @@ -9929,7 +9923,6 @@ }, "prettyPhoto": { "cats": [ - "7", "12" ], "env": "pp_(?:alreadyInitialized|descriptions|images|titles)", From 256f1d8103812775b70e4c5e22c61981b91bad51 Mon Sep 17 00:00:00 2001 From: Dmitry Krekota Date: Mon, 17 Apr 2017 00:12:29 +0300 Subject: [PATCH 100/119] Updated PHP icon --- src/icons/PHP.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/icons/PHP.svg b/src/icons/PHP.svg index 7ac50a150..3c8553621 100644 --- a/src/icons/PHP.svg +++ b/src/icons/PHP.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 574e7b1245efff91ba4eb0bcb87d44bdcfddf6de Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Mon, 17 Apr 2017 09:30:55 +1000 Subject: [PATCH 101/119] Add missing locale options --- src/drivers/webextension/_locales/en/messages.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/drivers/webextension/_locales/en/messages.json b/src/drivers/webextension/_locales/en/messages.json index 21a787bb2..3edc49047 100644 --- a/src/drivers/webextension/_locales/en/messages.json +++ b/src/drivers/webextension/_locales/en/messages.json @@ -15,6 +15,10 @@ "categoryName3": { "message": "Database Manager" }, "categoryName4": { "message": "Documentation Tool" }, "categoryName5": { "message": "Widget" }, + "categoryName6": { "message": "Ecommerce" }, + "categoryName7": { "message": "Photo Galleries" }, + "categoryName8": { "message": "Wikis" }, + "categoryName9": { "message": "Hostin Panels" }, "categoryName10": { "message": "Analytics" }, "categoryName11": { "message": "Blog" }, "categoryName12": { "message": "JavaScript Framework" }, From d4a4bfd3ee38458c09937f00541af3cefe1e695f Mon Sep 17 00:00:00 2001 From: Elbert Alias Date: Mon, 17 Apr 2017 11:13:33 +1000 Subject: [PATCH 102/119] Use promises for options in WebExtension driver --- src/drivers/bookmarklet/driver.js | 5 +- src/drivers/phantomjs/driver.js | 17 ++- src/drivers/webextension/css/options.css | 2 +- src/drivers/webextension/js/content.js | 2 + src/drivers/webextension/js/defaults.js | 6 -- src/drivers/webextension/js/driver.js | 129 +++++++++++++++-------- src/drivers/webextension/js/options.js | 74 +++++++------ src/drivers/webextension/manifest.json | 1 + src/drivers/webextension/options.html | 4 - 9 files changed, 145 insertions(+), 95 deletions(-) delete mode 100644 src/drivers/webextension/js/defaults.js diff --git a/src/drivers/bookmarklet/driver.js b/src/drivers/bookmarklet/driver.js index 01cdb4abb..230ff6aaf 100644 --- a/src/drivers/bookmarklet/driver.js +++ b/src/drivers/bookmarklet/driver.js @@ -1,7 +1,10 @@ /** - * Bookmarklet driver + * WebExtension driver */ +/** global: wappalyzer */ +/** global: XMLHttpRequest */ + (function() { if ( typeof wappalyzer === 'undefined' ) { return; diff --git a/src/drivers/phantomjs/driver.js b/src/drivers/phantomjs/driver.js index e7fc9b621..cf4d97901 100644 --- a/src/drivers/phantomjs/driver.js +++ b/src/drivers/phantomjs/driver.js @@ -1,3 +1,10 @@ +/** + * PhantomJS driver + */ + +/** global: phantom */ +/** global: wappalyzer */ + (function() { var url, @@ -16,7 +23,9 @@ require('fs').changeWorkingDirectory(scriptDir); require('system').args.forEach(function(arg, i) { - var arr = /^(--[^=]+)=(.+)$/.exec(arg); + var + value, + arr = /^(--[^=]+)=(.+)$/.exec(arg); if ( arr && arr.length === 3 ) { arg = arr[1]; @@ -35,7 +44,9 @@ break; case '--resource-timeout': - resourceTimeout = value; + if ( value ) { + resourceTimeout = value; + } break; default: @@ -112,7 +123,7 @@ init: function() { var page, hostname, - headers = {}; + headers = {}, a = document.createElement('a'), json = JSON.parse(require('fs').read('apps.json')); diff --git a/src/drivers/webextension/css/options.css b/src/drivers/webextension/css/options.css index a5398318c..090242223 100644 --- a/src/drivers/webextension/css/options.css +++ b/src/drivers/webextension/css/options.css @@ -83,7 +83,7 @@ a:active { #about { border-top: 1px solid #dbdbdb; - margin-top: 2.5rem; + margin-top: 1.5rem; padding: 1.5rem 0 0 0; } diff --git a/src/drivers/webextension/js/content.js b/src/drivers/webextension/js/content.js index e394e8eb7..ac21ee724 100644 --- a/src/drivers/webextension/js/content.js +++ b/src/drivers/webextension/js/content.js @@ -1,3 +1,5 @@ +/** global: browser */ + (function() { var c = { init: function() { diff --git a/src/drivers/webextension/js/defaults.js b/src/drivers/webextension/js/defaults.js deleted file mode 100644 index 98ce709d0..000000000 --- a/src/drivers/webextension/js/defaults.js +++ /dev/null @@ -1,6 +0,0 @@ -var defaults = { - autoAnalyzeHeaders: 0, - upgradeMessage: 1, - dynamicIcon: 1, - tracking: 1 -}; diff --git a/src/drivers/webextension/js/driver.js b/src/drivers/webextension/js/driver.js index 164ce1c0b..cdefcefe6 100644 --- a/src/drivers/webextension/js/driver.js +++ b/src/drivers/webextension/js/driver.js @@ -24,6 +24,26 @@ console.log('[wappalyzer ' + args.type + '] ' + args.message); }, + /** + * Get a value from localStorage + */ + getOption: function(name, defaultValue, callback) { + browser.storage.local.get(name).then(function(item) { + callback(item.hasOwnProperty(name) ? item[name] : defaultValue); + }); + }, + + /** + * Set a value in localStorage + */ + setOption: function(name, value) { + var option = {}; + + option[name] = value; + + browser.storage.local.set(option); + }, + /** * Initialize */ @@ -54,19 +74,27 @@ try { var version = browser.runtime.getManifest().version; - if ( localStorage['version'] == null ) { - firstRun = true; - - // Set defaults - for ( var option in defaults ) { - localStorage[option] = defaults[option]; + w.driver.getOption('version', null, function(previousVersion) { + if ( previousVersion === null ) { + w.driver.goToURL({ + url: w.config.websiteURL + 'installed' + }); + } else if ( version !== previousVersion ) { + w.driver.getOption('upgradeMessage', true, function(upgradeMessage) { + if ( upgradeMessage ) { + w.driver.goToURL({ + url: w.config.websiteURL + 'upgraded', + background: true + }); + } + }); } - } else if ( version !== localStorage['version'] && parseInt(localStorage['upgradeMessage'], 10) ) { - upgraded = true; - } - localStorage['version'] = version; - } catch(e) { } + w.driver.setOption('version', version); + }); + } catch(e) { + // Do nothing + } if ( typeof chrome === 'undefined' ) { browser.runtime.onMessage.addListener(w.driver.onMessage); @@ -183,10 +211,14 @@ }, + /** + * Open a tab + */ goToURL: function(args) { - var url = args.url + ( typeof args.medium === 'undefined' ? '' : '?pk_campaign=chrome&pk_kwd=' + args.medium); - - browser.tabs.create({ url: url, active: args.background === undefined || !args.background }); + browser.tabs.create({ + url: args.url, + active: args.background === undefined || !args.background + }); }, /** @@ -208,37 +240,42 @@ tabCache[tab.id].appsDetected = w.detected[url]; if ( count > 0 ) { - // Find the main application to display - var appName, found = false; + w.driver.getOption('dynamicIcon', true, function(dynamicIcon) { + var appName, found = false; - w.driver.categoryOrder.forEach(function(match) { - for ( appName in w.detected[url] ) { - w.apps[appName].cats.forEach(function(cat) { - var icon = w.apps[appName].icon || 'default.svg'; + // Find the main application to display + w.driver.categoryOrder.forEach(function(match) { + for ( appName in w.detected[url] ) { + w.apps[appName].cats.forEach(function(cat) { + var icon = w.apps[appName].icon || 'default.svg'; - if ( !parseInt(localStorage['dynamicIcon'], 10) ) { - icon = 'default.svg'; - } - - if ( cat == match && !found ) { - if ( /\.svg$/i.test(icon) ) { - icon = 'converted/' + icon + '.png'; + if ( !dynamicIcon ) { + icon = 'default.svg'; } - browser.pageAction.setIcon({ tabId: tab.id, path: 'images/icons/' + icon }); + if ( cat === match && !found ) { + if ( /\.svg$/i.test(icon) ) { + icon = 'converted/' + icon + '.png'; + } - found = true; - } - }); + browser.pageAction.setIcon({ + tabId: tab.id, + path: 'images/icons/' + icon + }); + + found = true; + } + }); + } + }); + + if ( typeof chrome !== 'undefined' ) { + // Browser polyfill doesn't seem to work here + chrome.pageAction.show(tab.id); + } else { + browser.pageAction.show(tab.id); } }); - - if ( typeof chrome !== 'undefined' ) { - // Browser polyfill doesn't seem to work here - chrome.pageAction.show(tab.id); - } else { - browser.pageAction.show(tab.id); - } }; }, @@ -246,17 +283,19 @@ * Anonymously track detected applications for research purposes */ ping: function() { - if ( Object.keys(w.ping.hostnames).length && parseInt(localStorage['tracking'], 10) ) { - w.driver.post('http://ping.wappalyzer.com/v2/', w.ping); + w.driver.getOption('tracking', true, function(tracking) { + if ( Object.keys(w.ping.hostnames).length && tracking ) { + w.driver.post('http://ping.wappalyzer.com/v2/', w.ping); - w.log('w.driver.ping: ' + JSON.stringify(w.ping)); + w.log('w.driver.ping: ' + JSON.stringify(w.ping)); - w.ping = { hostnames: {} }; + w.ping = { hostnames: {} }; - w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache); + w.driver.post('https://ad.wappalyzer.com/log/wp/', w.adCache); - w.adCache = []; - } + w.adCache = []; + } + }); }, /** diff --git a/src/drivers/webextension/js/options.js b/src/drivers/webextension/js/options.js index 3a3aeac2d..d73b869ed 100644 --- a/src/drivers/webextension/js/options.js +++ b/src/drivers/webextension/js/options.js @@ -1,57 +1,61 @@ +/** global: localStorage */ + document.addEventListener('DOMContentLoaded', function() { var d = document; var options = { - opts: defaults, - init: function() { options.load(); - d.getElementById('github' ).addEventListener('click', function() { window.open(wappalyzer.config.githubURL); }); - d.getElementById('twitter' ).addEventListener('click', function() { window.open(wappalyzer.config.twitterURL); }); - d.getElementById('wappalyzer').addEventListener('click', function() { window.open(wappalyzer.config.websiteURL + '?pk_campaign=chrome&pk_kwd=options'); }); + d.querySelector('#github' ).addEventListener('click', function() { open(wappalyzer.config.githubURL); }); + d.querySelector('#twitter' ).addEventListener('click', function() { open(wappalyzer.config.twitterURL); }); + d.querySelector('#wappalyzer').addEventListener('click', function() { open(wappalyzer.config.websiteURL); }); + }, - d.getElementById('options-save').addEventListener('click', options.save); + get: function(name, defaultValue, callback) { + browser.storage.local.get(name).then(function(item) { + callback(item.hasOwnProperty(name) ? item[name] : defaultValue); + }); }, - load: function() { - var option, value; + set: function(name, value) { + var option = {}; - for ( option in options.opts ) { - if ( value = localStorage[option] ) { - options.opts[option] = value; - } - } + option[name] = value; - if ( parseInt(options.opts.upgradeMessage) ) { - d.getElementById('option-upgrade-message').setAttribute('checked', 'checked'); - } + browser.storage.local.set(option); + }, - if ( parseInt(options.opts.dynamicIcon) ) { - d.getElementById('option-dynamic-icon').setAttribute('checked', 'checked'); - } + load: function() { + options.get('upgradeMessage', true, function(value) { + var el = d.querySelector('#option-upgrade-message'); - if ( parseInt(options.opts.tracking) ) { - d.getElementById('option-tracking').setAttribute('checked', 'checked'); - } - }, + el.checked = value; + + el.addEventListener('change', function() { + options.set('upgradeMessage', el.checked); + }); + }); + + options.get('dynamicIcon', true, function(value) { + var el = d.querySelector('#option-dynamic-icon'); - save: function() { - var option; + el.checked = value; - options.opts.upgradeMessage = d.getElementById('option-upgrade-message').checked ? 1 : 0; - options.opts.dynamicIcon = d.getElementById('option-dynamic-icon' ).checked ? 1 : 0; - options.opts.tracking = d.getElementById('option-tracking' ).checked ? 1 : 0; + el.addEventListener('change', function() { + options.set('dynamicIcon', el.checked); + }); + }); - for ( option in options.opts ) { - localStorage[option] = options.opts[option]; - } + options.get('tracking', true, function(value) { + var el = d.querySelector('#option-tracking'); - d.getElementById('options-saved').style.display = 'inline'; + el.checked = value; - setTimeout(function(){ - d.getElementById('options-saved').style.display = 'none'; - }, 2000); + el.addEventListener('change', function() { + options.set('tracking', el.checked); + }); + }); } }; diff --git a/src/drivers/webextension/manifest.json b/src/drivers/webextension/manifest.json index 1bc2a6e5c..79d8409e9 100644 --- a/src/drivers/webextension/manifest.json +++ b/src/drivers/webextension/manifest.json @@ -63,6 +63,7 @@ "open_in_tab": false }, "permissions": [ + "storage", "tabs", "webRequest", "webNavigation", diff --git a/src/drivers/webextension/options.html b/src/drivers/webextension/options.html index b3a853619..755b909e2 100644 --- a/src/drivers/webextension/options.html +++ b/src/drivers/webextension/options.html @@ -33,10 +33,6 @@

-

- Saved -

-