From dafc44013c95e87dfd96e7e3fd41c49738db3cb2 Mon Sep 17 00:00:00 2001 From: Patrick Sun Date: Tue, 1 Dec 2020 01:56:48 +1100 Subject: [PATCH] version 1.2.4 working version for Biukop Secure Internet --- README.md | 0 background.js | 178 ++++++++++++++++++++++++++++++++++++++++ icons/lock48.png | Bin 0 -> 3897 bytes icons/lock96.png | Bin 0 -> 11881 bytes icons/unlock48.png | Bin 0 -> 3736 bytes icons/unlock96.png | Bin 0 -> 9714 bytes manifest.json | 44 ++++++++++ settings.css | 37 +++++++++ settings.html | 75 +++++++++++++++++ settings.js | 200 +++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 534 insertions(+) create mode 100644 README.md create mode 100644 background.js create mode 100644 icons/lock48.png create mode 100644 icons/lock96.png create mode 100644 icons/unlock48.png create mode 100644 icons/unlock96.png create mode 100644 manifest.json create mode 100644 settings.css create mode 100644 settings.html create mode 100644 settings.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/background.js b/background.js new file mode 100644 index 0000000..fd08f46 --- /dev/null +++ b/background.js @@ -0,0 +1,178 @@ +const DEBUG = 0; +const DIRECT_PROXY = { + type: 'direct' +}; +const DEFAULT_PROXY_SETTINGS = { + type: 'direct', + host: '', + port: 0, + username: '', + password: '', + proxyDNS: false +}; +let proxies = [ DIRECT_PROXY, DIRECT_PROXY ]; +var skipLocal = 1; +var pendingRequests = []; +var currentProxy = 0; + +function buttonClicked() { + currentProxy = (currentProxy ? 0 : 1); + if ( proxies[1].type == 'direct' ){ + currentProxy = 0; + } + browser.storage.local.set({ currentProxy: currentProxy }); + updateState(); +} + +function updateState() { + if(currentProxy==0) + { + browser.browserAction.setIcon({path: "icons/unlock48.png"}); + browser.browserAction.setTitle({title: "Local IP"}); + } + else + { + browser.browserAction.setIcon({path: "icons/lock48.png"}); + browser.browserAction.setTitle({title: "Biukop Secure Internet"}); + } +} + +function decodepass(pass) { + var result = atob(pass); + if (result.length <=3) + return pass; + if ("#!" != result.substring(result.length-3,result.length-1)) + return pass; + var tail = Number(result.substring(2,3)); + result = result.substring(5, result.length - tail); + return result; +} + +function settingsChanged(settings) { + if ("proxySettings" in settings){ + proxies[1] = settings.proxySettings.newValue; + proxies[1].password = decodepass(proxies[1].password); + } + + if ("skipLocal" in settings){ + skipLocal = settings.skipLocal.newValue; + } + + if ("currentProxy" in settings) { + currentProxy = settings.currentProxy.newValue; + updateState(); + } +} + +function completed(requestDetails) { + if (DEBUG) { + console.log("completed request: " + requestDetails.requestId); + } + var index = pendingRequests.indexOf(requestDetails.requestId); + if (index > -1) { + pendingRequests.splice(index, 1); + } + + console.log("completed"); +} + +function provideCredentialsSync(requestDetails) { + console.log("check credential"); + if (!requestDetails.isProxy) + return; + if (!currentProxy == 1) + return; + if (pendingRequests.indexOf(requestDetails.requestId) != -1) { + //if we've seen the request before, assume bad credentials and give up + console.log("Bad proxy credentials for request: " + requestDetails.requestId); + return {cancel:true}; + } + + var credentials = { + username: proxies[1].username, + password: proxies[1].password + } + pendingRequests.push(requestDetails.requestId); + if (DEBUG) { + console.log(`Providing proxy credentials for request: ${requestDetails.requestId} username: ${credentials.username}`); + } + return {authCredentials: credentials}; +} + +function isLocalIPv4(host) +{ + var octets = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.exec(host); + if(!octets) + return false; + if(octets[1]>255||octets[2]>255||octets[3]>255||octets[4]>255) + return false; + if(octets[1]==10||octets[1]==127) //class A or local loopback + return true; + if(octets[1]==172&&octets[2]>=16&&octets[2]<=31) //class B + return true; + if(octets[1]==192&&octets[2]==168) //class C + return true; + return false; +} + +function isLocal(host) +{ + if(host.indexOf('biukop') != -1) + return true; + + if(host.indexOf('.') == -1) + return true; + if(host.endsWith(".local")) + return true; + if(host=="::1") + return true; + return(isLocalIPv4(host)); +} + +function handleProxyRequest(requestInfo) { + const url = new URL(requestInfo.url); + var host = url.hostname; + var proxyNum = currentProxy; + if (skipLocal) { + if(isLocal(host)) { + if (DEBUG) + console.log(`Local host detected: ${host}`); + proxyNum = 0; + } + } + if (DEBUG) { + console.log(`Proxying: ${url.hostname}`); + console.log(proxies[proxyNum]); + } + return(proxies[proxyNum]); +} + +browser.storage.local.get({ currentProxy: 0, skipLocal: true, proxySettings: DEFAULT_PROXY_SETTINGS }, items=>{ + currentProxy = items.currentProxy; + skipLocal = items.skipLocal; + proxies[1] = items.proxySettings; + proxies[1].password = decodepass(proxies[1].password); + updateState(); +}); + +browser.storage.onChanged.addListener(settingsChanged); +browser.browserAction.onClicked.addListener(buttonClicked); +browser.proxy.onRequest.addListener(handleProxyRequest, {urls: [""]}); +browser.proxy.onError.addListener(error => { + console.error(`Proxy error: ${error.message}`); +}); +browser.webRequest.onAuthRequired.addListener( + provideCredentialsSync, + {urls: [""]}, + ["blocking"] +); +browser.webRequest.onCompleted.addListener( + completed, + {urls: [""]} +); +browser.webRequest.onErrorOccurred.addListener( + completed, + {urls: [""]} +); + + diff --git a/icons/lock48.png b/icons/lock48.png new file mode 100644 index 0000000000000000000000000000000000000000..cb77238e6d5c17077bbb4836f4780cbfb3588398 GIT binary patch literal 3897 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 Hu0mjf&9jHS literal 0 HcmV?d00001 diff --git a/icons/lock96.png b/icons/lock96.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef70c6db0d5698927b0ece3f5ae6de73125974a GIT binary patch literal 11881 zcmV-vE|$@WP)Z z36xz|b>+VIzW4rEqpDPz2V0V5NtUr}Nw%@^1h%omWG06W2@6)@KzA=XolYktfuso# zlBQQ077YtRlZlW(+i{2qO^odrJDz}ewk8i6tf^G0=~w;f4fpms=iK*89%ReW&q}3p zwf?G7)vx#ezvtXD?6c2#3SC%9+;~kFan2zO%Q&$AY0S=yp;YNZx!41(6(*;SVac-9 zm>3&{bqNNCmY`BDVPgDn&(0^GxZv2>_=bar4xE)F*{Z3@>9Eym8l^NUm2x^TI5;yr zG_-Hovc-?AS$oDqOO~$M+is<>PGNRt0zG{TF;hE^sfj}f!XhgEb>pOg9XsyE=5wz{ z-{2D1G&`lwVZz|FH}CYX(8Wc9fzl|Kdl4)G_U+w0c<1fkea~Z$K6=B>9lI_&c<4wp zJyS=VSTvhW7!yI80M1#YNei$R$`}-j28&0Av3BjM=gvEK<9FY1*&F_1-B}wSER_4v zY)tX<=gXQWC!m)#v0Uwi(g{Y79Nuut%{Tx0-9P+?8~5)!VA|~r24QtBs~HG9798kP$)&nGK%7#>-SAAIk-AO7s`e)bEGKJ{F%WXUr0_4mO#htvU~ z0(v5YYM`KP25T*{EJdIV3Sj|O&0SY34IKtZ9MH@hYH^BoCPIs%GWP6#22utaDna})O|ImiXu_Mo5*Ume!`E_skw;=%9KoUT!Rm1q$^T8Lt_~q~X*`I#vx+sW% zpopMYL2q9PA%LFHprSIgW*V5BX&^BMg-Q>iN)P&adQgZ$avMnF6peZvajOm+w-9Kc zr(8y*Ttv${9G-2VGB|`)%T_@LJ@}LV{YMz6j@iHc?swk4<-%)jd+;Cr0_)dbh5n&s z|9=aBwNx9Jpn%;wA6fBSzmA0B)BaqQZ?6On6T&B8$_YcZC^_`NTF9@{Ut z5?}k1zr)Xe;BENjk6ixypZj08{VEXtD-=M|Jhdk}hafCr&+aEyf9%)(>qD*B4O{E5 zaAX-Kr>Ah_ncY}D(2Kruh_o_*_2*xNE!!@{(9j_2v(u>6X3%W5ktP`nfKF59Eb5I0 zW~L{hkfK^CqF4w}?de6ax&V!4if4B2!9x$+k6k+-!?J-A`U^!IkL&ov=Y9{@yzvJ7 z<70<$^;MVR!ykP8XFv7(fBG?gtJ$jyK?n0h0H+>TD;zwyclZ;(`J4ZEd}3;OXhLk+ zdNB?j+>iTz@O`Ww9>Bt(J`|U)#YI=Y1sgZ4$N1PNo`3#%Sl$nfFpQoLg5aLs-s%xR zJvA{gaj37aZ%}J<-v0dudRncSE$!y?1@+owU;8o&JM-^SbD_5nP-ua4Jm+k}t*%G-baKmN)e{4SqY`^rMlCOqxE>q;VKv-DM- z;h;^#U%&d*um1Je_~i1wzCpa>9q-1@r+47*{_1AD{;btlwPFz}XKcciZ+#C2daKy6 z<0%|Id z-*;gDp8v3W*N(IH?An2io6o~l*IthG8#mzAZ+{z)J^B#V3|8=!-}y9#h8N+Ii?78G z?z$guz3!6FoV{VwBX7L^L*LKbt9`E1UtKu?SsK6M@3qlnG4W@A`t^^0>)YS@m9Q0Edqq#jkwiBe-hwI&50I4AH91xbCMv2*eFM_|SuxnVH4XB}=|KJUsME#)OT4 zvtFRpYN4;Mk4@0iPd|+nD^_4|a1aL$9AvGeR~uP0f_9SP;K3tTKmO=LpMQSelk3k| zy#g0(-3C<{!p-0OKlt8v{|aXeL|D9XA%5!%U%{F)HsMeH{C51$&wljqefNF;>~inQ zS{hGtp7C-kjQZw>0Fvb70+5(L!j2t}Z~gSAe&q&gRYUC=`nKHX03%oB|WV7=w1ZeG&m2g3<=gru=(y z(hdQlLK#o*+4<=Q?*F@AubLLNUa$qLH(!Epf8#s&%Wr%YODYN%z3Ec?{+Ip;3I*Ks z;ZH!fpZdy|zkbUv@`tc5e-cy|Opre9EAUb$ebDC9y5*LeKUFA}aLqN>VdLg=@R`qi z2E8uB727uAND|@7cfTLyP~m%jdmCl2&u!eaaebi>-AfS;>uvK zJFnP|hxZ-DlFb)loHYM*mr@E@nqsClg)>&KzWJJK z-*tUq;dn^&w{F-{>TqoZ9|1ZlKdO%y_n%P+b3dzW4D=3ldYD{=1+zK^)}EN=Sf zM^Re10#7{t4F38XU*{LR=|k^8VheA&>-KM5p%5UT4E;rqZmg~dfWpuhKPW;W^Yf1n z|M;BoiODx#bkXZEFffQa{{DwJzV}(2v0^FeJ&QRyx##Y?aq}&Ig^RXt|KQ@KOP}1g zZyySU2w_w}b_((MD=ji#M$>65V7k`8k&e?LwEloXupWN{`Sa;S^Y`gSI zKo{}Qoqvx5&+pxb<)D_yB$1u1}!#qQ|@u0B!V(ABBQw$Pd*6G$v48(w96fRv1*1?VTL8x> z=*c3HlP!8S36IdzWy@D$;o_xm+Mu1p7#bSDdFO8Z&Bbe9XKS-=SCWX$%dG>{_#C!xwC62uDXJux{;gY`S1O z#%B^dc-I|pXkqbi0Sktg58ZY5kKd$&J`{=rFL=xw0nE%yzvPi5ZS2~$Ykd?IHVqCA zpi-&ek;k4uYhoPL!C_o~!wra2hoAi9$9UtFmwo-*bI;v1F)<-n5rK8aaLjK24E0x0 z2t#Dn;gsA00e%#K7W$E71&obNVtjlW;}bLd7#o`c6=eGRM!r<)U+S`;0+%(gefw5a z`bMz(sh!yQ)MI?9^UmLfoqP6QOW!A1`vs3~tgd9j<#OdEKMTVGg@3QFl*@(;LgpNv z+5I%KRvqikJrC>7T!Tj*dkV^B*tBWm*LLjM$yu#>k*T3jQY$4wiF#Q8ujrhe<*Hav z>_Ze*5Vu=U>ZS3zLxSN&i=G}@xcs)ssiSWl8#{(IYtO){v(Cohr|!WsJDMOhoC3Fs@QXj@A#JQd*EEb8&P_9%l)7E(Ia1Bv7 z^UCkLP(`6K@PDT#_rG;wdabfFqhiN5;^an!v&(BRK1vbNJcMKffQt3;G^) zNsQX$#7ngQrOTpbCXi$$^bagU+-~|40T}-So^eD!TkH6~ca3S8NC`3gpS~SAYHif)Y z`=y*OC=DRg3cXhAud^Mf8 zB(Yf#7WONpRyLY-437+<(mQ~$BS$fQe2fLq+f%`KJ=)kexB-RobT_uFv$`UHwQJ9O z!T%`-Xv|Kp9y@k)2_0B653{uz!`9V)K@e**O-xTu;rjQ!^^wizz7Dlo?UY}Sh*(M7 zM6sBlx3`KX_8dkdaVQi6q$dH+PPXXTl~N%#+A-It(o<#%%d^vALw6zeNQ(R z@@qTQwG18I62Ro-3msEWPY+t{R!>-nL=%-lvo0Fm+b{7mX>gXb@z^5|&m4UIAlu;A zx*GKftUBxUSh(VKsI+Q6bbW1`W1T@`YOl>4C08kmg(6CoDyGvEt;URh&%J2H@pAgU zQ0nc*mUUKF1VDw56IU1(DM}g1qoFuXn6VH98dQ9zb$omRg;MF*l0^&0pbVnmwWlNj zs$9Sy8SH_LX)|B@d#6Itv(wm5WnkwN3Q++%2$7~4YSVHm`}zk6{Tu*DiOR5D$^pR^ zfA)2xHbAvxUb7Gy%>+vpRco)?d?shl#V~-gR!)+?SQvyz+DWP1tign&Q1eUxFSpXn zGHI6FA#GM@D3LPIkt9W=T~QP@)}ONp?KtZor?0lianimt+c8G>?nWsY$K_iV&tTMSW`7vR}$rIt8h9F>FS4hYYF9=>0=GQ3{GYlQ@pr%_c${BAIUjIMMFrvAlCG zBs_?OKn#XvvwZ=8xUVl&-EaKdsi6dIx}ITVK^a$`*N5AGG>%&R)rG*d2Fj&1Jk8M})S5}bZEu27 za>{@+Du9N8R`X5(tNvBxp5T1T&|VYMG(x zms|AHzyhmB`mvx|#<8)9&flMGkp=t^BR?M59U;mXPz$alQ#p1yNuDy5>ZoBt+OiZ`YTaLsu zp7`FA6wYd`RFQiNBox(50=AxVNzRza6^al)+Wh$@fcA@g07VSWIxXgi`-V8PB&SxX zidHd7S}Z5ULJ7sfi8%n}4FMPHY~v^*gorce&%>#HaFT+<n*`~w|Q;vkPMt*(?LDPBJD;c*>D=7+*g ziY#Cg&M z>R)SU|Mq`%g?jb3)^8z5hK*?U9WP6BXnvzY`hCfUG=*H^GRaUQDf+S0M zgXyGZ61HWu1@wXFcqf@dnY7zSLB&!DVWF666kt?@AgUq=t7uIemdy`dy`XZci!9;z zbOXy54d8~WHgQfedc4j)soA3B&IVxSn?UEJKxF1~hfj&3Ryu=AtEAJC{{V8Jl9YOB1C|MFp+y>UZ{dJzaRAuK56P}H%hg0DkMyNuz$ zQFqA!qg!DpYeXO#F)+}NE$5$y`|f|Bk~xEnn%?NcScQoA{l2ft6w2uB?{DhHF_^fH z{-H(e_{epTc_RJ|p{c#Sedr$;Bs`wt65d7YqbaIhl`CbKVv)6geqJmU1ps7boI*f& z4x2LyA47qbnd75k;#;+5J$m~V;_)Y*M16K@ z|Ki~V4_N4`F-93WX4$=SSTBX#YVAEY^7PIlO&1QHxO{(GHr}WO%SF*6s8OS zIv@ziSxW!BG1@6QdyE@tr<7)u&ayP5>r_muJ$it zt)s{%DpJCeveTt$C6x-1a}zxG+;bQ`dK}a#Guw=Dcyt_e;AiV?G@31eF`$t_G3ZMU z(NSTf6aGrd%CO-?v_b7^BQvO>C0N8$0_^374BN!@yMWq;`K<)T0 z;}f%bNPA~x&*h~_I;dv=}jNK?7ADjaJqZfl`|ED zMH`g|5EQEt_ve(tutdcUwxr%Wr;#Ta@;esbsRc+496#?!HH)E zw33)nRK>1}8Z9!uE+xhM~Bup--_Vz-V5^9Y$%GCu-kL(#($fmC=d)Jk#*n|R30skqM4g$%5xh`OR zyAXIV2Ei6N5B{lswrCCiF>Eo*Xg=O?goN*=} zcSm`AT4IJGLzS|K7G8AAAT$O_shzNGPp zDE$pZN8JAqg87V@<@7YjSq?R(P)}||&N_WCg3LvRbk7hM!%?S;au`Qbt z=G3yLpGYmI%+rw)@e`Df2Ap@Uj;}$chD;3EYsV0FDrU&Z2Fd?LQ~9W95vlPGm;HzG zzlWR}HiZfJ@n7(r3$ zh)ToV*t@O>AdXu)i4zpc6y0R}X34ImeEey{5=ocI)LJF*G#?DdFa>P@nHADXcA$(T zS=LMvmPA6}@RYURpCZF1P2h0HU#)kta>9&P0;rtbkZ~PC2zx1SB%dHcKI!Coht6yc zt+*D9G({X_3@B1i(T-azoPZ`xbzybs1ZZo5P>R(?^9Cnv;euK_*I-9Sn=y4Y2hPyX zm=))hpZmBd51?ygDHMl}rqlGHtT^j@HXI3xhBgVvCnZBhHTiojW`|9phA9-;`4VM= zHJe5sXe%18g@Gkd2`PbQ9}>Xu->_oI3qt<6`D22V){a6q_5p04z0D=>5Q^5)h8i9C za-M9Cw*F%%qJq>V!XbO_V$paGCq4UtSPO{=ikv7Xc$tKw37ZAo@jp_35NJZn&idYh zjH4#OJvE$mq{%Ea`1*CHlEJ6JA&3GYYw`0W8uIzaJURg;P+HhytR-AerS5WeS|Mkn zDy29&@lj6D@dwU_jl2m`OXg6J%m>+WC>B^|PiSPfa)$;2~OXeDY8 zXb4Nv@^nQqZ6y4xZQ)4Zl(%qXBj=CymfnvL3KF#24yAGlbjsm@MD<$xW>2!ZL`_r~ zlb4*t^YCG#rOlu)&Pg|lgr7=^9RwqIr$?Ghnix=;YCYLXi^g*3>WlFbkAMq4Y~Qsw zM$JI6ls}Cp0aI64sXro5mHpB{5U)k{nHkzxQ+AQG)Ml#S1y z6F^>$n9vg9i<70SG2_#qc{6OMG$~rlXT{2}PqMEGpAg69g{o4qvmAa(aBn%QrOb^T zt(jv#NK&RG-|&N9L(XVb=akV2V^gD?_cN@)qUB0=U<_tGC~5Z7{u-Lctm#e^L=Poh zpsiQkmQz^WNvDIr=8;8i7pTswz5OOojx?Km1UoSw24+r@slXIqbjF&UI3Y;Uh9(p; zCcda+L_-~ihY$x&o8e1{Ttp#fO`HZRSP;J_&U%ex#XkCy=!uXzIc@Yl2{U4s5@_$d zHJihX;qiq3R&$i*eS+=|JF7brvz%1FB2N9~gXWGfv#tZ2wP~cJXB;pT!3+dJH8Y!Z zOb5dbk|M(xk!YIA3<|N+@X3(lYZ*?YRL5!4^OR>~&_<^o0s)^@$#gX-h>w`GZ+ntf zSDy^~PJ0rhWrv^o3^~go8e~?f(}%dOs!Oba?r=jHb{6fVqf417+2h0`nj{S88@QP{ zP1(G4 zS*9p9*HvM`F_jMj*&~qVC_r*PTqVH7=0yySmW4+J4P$5_X)C@`M~bX zJ9!4o^3EJ9i5Qz2hQ7h4PLM$Fn>0FRMQLwIIAfPOhA^eYKSW`HGjYYCXP(uQIZeC5 zPwb8lK;{~a8VZ%(P7g0aN5m@{FUw&jMM93E5tn&KNsMDT@|lM#C=X!g>Jze*ouBO# zdRUm&c`a7n*(wIhtgi=!#&|O(rD4v`vJ9P=g$P(=R|3bUL}-)N7m+eBFFo{dH48#a z62BHfBz{z~v-1cI4WrOjs(n6|HYk>=eB@J_~~r zE{eS~4=a#~$OIMT{2`CqIl0UIg7S5PIbfTR95!72N^+PTC`Lypj3hd`$$Pw1 zUXxSaVJn|u=h?L=3bQASfQ_6XgCnzfgoY}K)~rns6{|9&+xOZsHl$8&a zGL0lXfgNMzgm|z~9Is`H37-~cee;L)WG^omt9`Mh^N!dzWO?quvA_HsZ66irjmqoF z9+@?op$}0GVP4SRmou{es^JQ9G-QV9T+X3i(P22qvEd3#HBVc}lt&OKmq z$H-I@oBCEzC#(ry=glBIA&0qM;?yTxDi0;K^YDf7i6Gd9ryPD#aVX%ZC}61D`Iady z^c8F1QU^l14P!r<_YDe)?z%zPl+I7G5D3BoP4JyhXegI@9XrpI3h-1AH=!RDCMJkN zQ<@J-noRe1ffC?XT7e{fSBy+5pA3mWHFs3TzSJq3Ai8H5t9KdM{hUD|PCMn2r7ya( zhRgfp20ZEoMm|>#os^D3U*;Xryof@`0;AKJTH!Ed(t0aZJ-+5Vs)$)jG{Jyb1k8#c zJU(s<9L-^hFdJfS==S#2<@7D*F&^!)84(5}kK~-KfN2bpb$)*0EC+Im!U+;IRB#}6 zz&giwq|~Tbo3+IG3{@GX#*k2q$NvSkP@W7X;V{E0zB`P zXTl6mYv+qBbI?JKG#VfJiEsoq(7r9mB8EQ`Qnk`j#>{fMJDr-$mrj&07PuluS*+LW zoW+ns5OBiv5kKpdz=x%J&hgBdOz+UCtyb<+BlT|jSrkQGqtAD#CJaZds)YGOG?;@% zO!@*lg{CRPxheBJrSJ{Unh>~vabU`V{qY zSRAl#+hrg9aPPJDc8scH{`ZMJ+?G}^8 zjP8yEx)cR*qb+~$JkTZ@DiI8CxaSh89DDbTrD$`~KB=fgts*U7V0?)@^5f|n$KJWo25@RLqq<~!hJBpEtPY>A#Caqejh zT`EfH)Pv`zySgKQG}ZLxsJ=@PP#%VInjiSopR_OtC5HEjnovok@J=D5WWRZqtGK=^ zch8fm32%<|HX2sQogPP{DJI$jbMP&v5PfGDobx?DW`@xSQjkQdVa_<|i1e^W9uTnk zA>1bnJHmzM5&`px8E1^6TZc#_lCnKDe7B2G;As*JS6<={k3Z-1IMzH0TT@o5gl&E1 zBc4>CVI|bV+y^L+X4=kBZyymE?KfHa0I1C9xEnr!C6m>efJJ@6xgB?%C@Du>9Rr4@ zLj<-~z(n}FD-reP#j{fXsjEvqAh6Pm7fJcfWt=g>f1o5yk>?4{n}-|*AR)B5B`G2M zA{ni(j8SA0LhO5<_40;z?x?^9&X*$RdceSukyO+C8G%H|d9i*j( zO`c%48rbXaXF$D927<^K!$gn>I2DD}K~j-v`f zVOj^mcV!-FHpfvq-PI*5$goYJF_cV6hoGVv^$1WlOEVTAOl3kenXjMHjJA|n2F7SV zaYdpK>$(2UvmHcQ9q3bdMt&2e=r4^HTyet*wq6NrOt3e{@k*fS(8x_fwWCo5QW48d zisSl0A}4_g`bmsT`;;u>^Fva z{ondzjUWmJ?x>bvJQ>U8&yga#&4f88Wgu_UNpp>!a|c#x5M1lkl2-(Nh?Me4SI7Q) zvX@X$sI4jBOgYQs+6CEcfu8WaRDht(J12~VQ>Ku*$P`|tAwZSdMB&A!a)5*R0Tkx3}z12`A(fEp!dR(FW9 z#@AN4M&R!?jI35-h=-LQe`s#Gu4 zz78D64Pm8uN;uIEohM{D->a4Lho}lBW=yV`<*i9vGlnmi$Vs6=s=4uSJ}S>=1UZNa zqY|j|+RZ#s&-c-u#^`{K*;0P~1M^f_;6$G(GD1SWiaPjW*NGlT6y1By^X`8BN=A zz9*QO4Ib*||1zUN1QKW|)_al*LZv&*IIH0kHpM(2Mt!(+DzQCBaVHJ~G}7}Rgj5e- z5ZTv6^XCLmrpfnx&$13Azz)l19fGU%ld!ap{bh3W zrIQ?c5E)MiaXy0%g!DyPZ&auI(s^fF@b{t7YObqNZaAkr718m8L(xm-|E zzWG3?E6zhKA@>~5BYHYJT#vaZ=ICVH+LLFOeu^TSk(41}V!X*s`PnHOvi)tYBhYQl zdF)x5dio;&A)l_iIIna*s=ytM zDN?>~EjLLHQK<;WxYsB4(1aU6okd8rE&@B~1gi+;aSN5(O7nvN}+dnfo zd1*Ut^rdmL5I1L|cDoU#?Pi#!?NYhiw@7PM;Sv@jotbiu7?(7$APdqoE+lbcs3TsA zAC7)cCNA2l=_;LzNO89 j;YFh+D4ZT11mOPxYw|ZCm`Uov00000NkvXXu0mjfhxOb8 literal 0 HcmV?d00001 diff --git a/icons/unlock48.png b/icons/unlock48.png new file mode 100644 index 0000000000000000000000000000000000000000..36d1997c93d702f3f98358367d35171b0f09b484 GIT binary patch literal 3736 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", + "webRequest", + "webRequestBlocking" + ], + "browser_action": { + "browser_style": true, + "default_icon": "icons/lock48.png", + "default_title": "Secure Channel - Biukop" + }, + "commands": { + "_execute_browser_action": { + "suggested_key": { + "default": "Ctrl+Shift+Y" + }, + "description": "Enable/Disable Secure Connection" + } + }, + "background": { + "scripts": [ + "background.js" + ] + }, + "options_ui": { + "page": "settings.html", + "browser_style": true + }, + "applications": { + "gecko": { + "strict_min_version": "68.0" + } + } +} \ No newline at end of file diff --git a/settings.css b/settings.css new file mode 100644 index 0000000..d2fa93b --- /dev/null +++ b/settings.css @@ -0,0 +1,37 @@ +#dnsrow{ + display: none; +} +.configtable { + border-collapse:collapse; + margin: 0px; + font-size: 12pt; + width:100%; + border: 0px dotted grey; + box-shadow: 3px 3px 12px #000 inset; + border-radius: 10px; +} +.configtable th,.configtable td { + border: 1px solid white; + padding: 10px; +} +.configtable th { + color: #000; + font-size: 18px; + text-align: left; +} + +.configtable td { + width: 50%; +} + +.configtable tr { + background-color: lavender; + transition: background-color 0.5s ease; +} +.configtable tr:hover { + background-color: #fff; +} + +td.authcode { + width:90%; +} \ No newline at end of file diff --git a/settings.html b/settings.html new file mode 100644 index 0000000..33ce94e --- /dev/null +++ b/settings.html @@ -0,0 +1,75 @@ + + + + + + + + +
+ + + + + + + + + + + + + +
+ License Code: +
+ + + +
+
abcd
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ Authorized Settings +
Type + +
Host
Port
Username
Enabled
+
+ + + \ No newline at end of file diff --git a/settings.js b/settings.js new file mode 100644 index 0000000..6d588dd --- /dev/null +++ b/settings.js @@ -0,0 +1,200 @@ +var g_mid = ""; + +function saveCurrentProxy(e) { + e.preventDefault(); + browser.storage.local.set({ + currentProxy: document.querySelector("#currentProxy").checked?1:0 + }); +} + +function showproxy(config){ + document.querySelector("#host").value = config.host ; + document.querySelector("#port").value = config.port ; + document.querySelector('#type [value="socks"]').selected = true; + document.querySelector("#username").value = config.username; + + if (config.host == ""){ + document.querySelector("#currentProxy").checked = false; + document.querySelector("#currentProxy").disabled = true; + }else{ + document.querySelector("#currentProxy").checked = config.enable; + document.querySelector("#currentProxy").disabled = false; + } + updateState(); +} + +function updateState() { + if(currentProxy==0) + { + browser.browserAction.setIcon({path: "icons/unlock48.png"}); + browser.browserAction.setTitle({title: "Local IP"}); + } + else + { + browser.browserAction.setIcon({path: "icons/lock48.png"}); + browser.browserAction.setTitle({title: "Biukop Secure Internet"}); + } +} + +function IsJsonString(str) { + try { + JSON.parse(str); + } catch (e) { + return false; + } + return true; +} + +function showMessage(msg) { + var el = document.querySelector("#errMsg"); + if (msg != undefined) + el.innerText = msg; + else{ + el.innerText = ""; + } +} + +function showLink(href, text) { + console.log(href); + console.log(text); + var el = document.querySelector("#msgLink"); + if ( href != undefined && text !=undefined ) { + el.href = href; + el.innerText = text; + el.visibility = 'visible'; + }else{ + el.innerText = ''; + el.visibility = 'hidden'; + } +} + +function defaultConfig(){ + return { + type: 'direct', + host: '', + port: 0, + username: '', + password: '', + proxyDNS: false, + enable:false, + } +} + +function isValidResponse(msg){ + if ( IsJsonString(xhr.responseText) ){ + config = JSON.parse(xhr.responseText); + config.success = true; + } + return false; +} + +function license(val){ + + if ( val == undefined || val == "" || val.length < 5 ){ + showMessage("Please enter a valid license"); + return; + } + + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState === 4){ + var config = defaultConfig(); + if (IsJsonString(xhr.responseText)) { + config = JSON.parse(xhr.responseText); + showMessage(config.errMsg); + showLink(config.link, config.linkText); + }else{ + showMessage(xhr.responseText); + showLink('',''); + } + showproxy(config); + + browser.storage.local.set({ + proxySettings: { + type: config.type, + host: config.host, + port: config.port, + username: config.username, + password: config.password, + proxyDNS: config.proxyDNS, + }, + skipLocal: true, + mid: g_mid, + license: val, + currentProxy: config.enable? 1: 0 + }); + } + }; + xhr.open('POST', 'https://license.biukop.com.au/dedicatedip/'); + //xhr.open('POST', 'https://lawipac.com/dumprequest.php'); + xhr.setRequestHeader('Content-Type', 'application/json'); + var data = { + license: val, + mid: g_mid + }; + xhr.send(JSON.stringify(data)); + +} + + + +function restoreOptions(e) { + + function onGot(item) { + g_mid = item.mid; + init_mid(item.mid); //just in case + document.querySelector("#license").value = item.license; + document.querySelector("#currentProxy").checked = item.currentProxy ==1; + license(item.license); + } + + function onError(error) { + console.log(`Error: ${error}`); + } + var gettingItem = browser.storage.local.get({ + mid: "", + currentProxy: 0, + skipLocal: true, + license: "", + proxySettings: { + type: 'direct', + host: '', + port: 0, + username: '', + password: '', + proxyDNS: false + } + }); + gettingItem.then(onGot, onError); + + +} + + +function register(e) { + e.preventDefault(); + var license_code = document.querySelector("#license").value; + license(license_code); +} + + +document.addEventListener("DOMContentLoaded", restoreOptions); +document.querySelector("#currentProxy").addEventListener("change", saveCurrentProxy); +document.querySelector("#register").addEventListener("click", register); + +function init_mid(existing_id) { + function createUUID() { + var uuid = new Date().valueOf(); + return (uuid + '-xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx').replace(/[xy]/g, function(c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } + + if ( existing_id== undefined || existing_id == "" || existing_id.length < 10 ){ + var uuid = createUUID(); + console.log("create new mid =:" + uuid) ; + g_mid = uuid; + browser.storage.local.set({mid: uuid}); + } +}