From 1916612f184245caa77f6cc3d4c017ef3af290a5 Mon Sep 17 00:00:00 2001 From: Alfredo Chissotti <20033498@studenti.uniupo.it> Date: Wed, 14 Sep 2022 16:53:15 +0200 Subject: [PATCH] ancora da mettere il domain in https --- .../.lck | 0 .../.lck | 0 .../.lck | 0 .../.lck | 0 .../.lck | 0 LuciMicro/src/code/Subscriber.java | 26 +++--- ScenariMicroservizio/res/CONF/zona.json | 2 +- WebServer/bin/code/Helper.class | Bin 2288 -> 2291 bytes WebServer/bin/code/Home.class | Bin 4559 -> 4670 bytes WebServer/bin/code/ImageRes.class | Bin 2759 -> 2869 bytes WebServer/bin/code/MissingPage.class | Bin 432 -> 521 bytes WebServer/bin/code/ObtainToken.class | Bin 4393 -> 4494 bytes WebServer/bin/code/Resources.class | Bin 4113 -> 4351 bytes WebServer/bin/code/Server$1.class | Bin 0 -> 1371 bytes WebServer/bin/code/Server.class | Bin 2562 -> 3969 bytes WebServer/gencert.bash | 0 WebServer/src/code/Helper.java | 23 ++--- WebServer/src/code/Home.java | 5 +- WebServer/src/code/ImageRes.java | 5 +- WebServer/src/code/MissingPage.java | 15 ---- WebServer/src/code/ObtainToken.java | 4 +- WebServer/src/code/Resources.java | 6 +- WebServer/src/code/Server.java | 83 +++++++++--------- WebServer/testcert.pem | 21 +++++ antifurto/bin/code/Antifurto.class | Bin 11726 -> 10000 bytes antifurto/bin/code/Automa.class | Bin 4088 -> 4342 bytes antifurto/bin/code/Esecutore.class | Bin 4605 -> 4293 bytes antifurto/bin/code/Helper.class | Bin 1106 -> 1449 bytes antifurto/bin/code/MyQueue.class | Bin 1160 -> 1157 bytes antifurto/bin/code/Pair.class | Bin 902 -> 899 bytes antifurto/bin/code/Publisher.class | Bin 1355 -> 1042 bytes antifurto/bin/code/SubscribeCallback.class | Bin 9255 -> 8241 bytes antifurto/bin/code/Timer.class | Bin 856 -> 853 bytes antifurto/res/stato.json | 2 +- antifurto/src/code/Antifurto.java | 4 +- webapp/public/conf/conf.json | 10 +++ .../public/js/authentication/configuration.js | 27 ++++++ .../js/authentication/requests-to-domain.js | 34 +++---- webapp/public/js/authentication/script.js | 52 +++++------ webapp/public/js/scriptIndex.js | 1 - 40 files changed, 182 insertions(+), 138 deletions(-) create mode 100644 CloudAppManagerSimple/cloudappman-1663003550820-pub-tcplocalhost/.lck create mode 100644 CloudAppManagerSimple/cloudappman-1663003764784-pub-tcplocalhost/.lck create mode 100644 CloudAppManagerSimple/cloudappman-1663003961575-pub-tcplocalhost/.lck create mode 100644 CloudAppManagerSimple/cloudappman-1663074319287-pub-tcplocalhost/.lck create mode 100644 CloudAppManagerSimple/cloudappman-1663164389395-pub-tcplocalhost/.lck create mode 100644 WebServer/bin/code/Server$1.class mode change 100644 => 100755 WebServer/gencert.bash delete mode 100644 WebServer/src/code/MissingPage.java create mode 100644 WebServer/testcert.pem create mode 100644 webapp/public/conf/conf.json create mode 100644 webapp/public/js/authentication/configuration.js diff --git a/CloudAppManagerSimple/cloudappman-1663003550820-pub-tcplocalhost/.lck b/CloudAppManagerSimple/cloudappman-1663003550820-pub-tcplocalhost/.lck new file mode 100644 index 0000000..e69de29 diff --git a/CloudAppManagerSimple/cloudappman-1663003764784-pub-tcplocalhost/.lck b/CloudAppManagerSimple/cloudappman-1663003764784-pub-tcplocalhost/.lck new file mode 100644 index 0000000..e69de29 diff --git a/CloudAppManagerSimple/cloudappman-1663003961575-pub-tcplocalhost/.lck b/CloudAppManagerSimple/cloudappman-1663003961575-pub-tcplocalhost/.lck new file mode 100644 index 0000000..e69de29 diff --git a/CloudAppManagerSimple/cloudappman-1663074319287-pub-tcplocalhost/.lck b/CloudAppManagerSimple/cloudappman-1663074319287-pub-tcplocalhost/.lck new file mode 100644 index 0000000..e69de29 diff --git a/CloudAppManagerSimple/cloudappman-1663164389395-pub-tcplocalhost/.lck b/CloudAppManagerSimple/cloudappman-1663164389395-pub-tcplocalhost/.lck new file mode 100644 index 0000000..e69de29 diff --git a/LuciMicro/src/code/Subscriber.java b/LuciMicro/src/code/Subscriber.java index a93424d..28a5811 100644 --- a/LuciMicro/src/code/Subscriber.java +++ b/LuciMicro/src/code/Subscriber.java @@ -68,16 +68,16 @@ public class Subscriber implements MqttCallback { @Override public void messageArrived(String topic, MqttMessage message) throws MqttException, JSONException, IOException { - Helper.print("new message: " + topic + " " + message.toString()); + // Helper.print("new message: " + topic + " " + message.toString()); if (topic.equals(Luci.getMqttTree("rpc/", "luci"))) { - Helper.print("invio la mia configurazione"); + // Helper.print("invio la mia configurazione"); sendFile(Luci.getMqttTree("from/", "luci")); return; } if (topic.equals("to/all")) { - Helper.print("invio il mio stato"); + // Helper.print("invio il mio stato"); sendStatus(Luci.getMqttTree("from/", "luci")); return; } @@ -93,7 +93,7 @@ public class Subscriber implements MqttCallback { String nome = msgJson.getString("nome"); for (Luce k : Luci.luciList) { if (k.getNome().equalsIgnoreCase(nome)) { - System.out.println("Nome gia' presente, inserimento annullato\n"); + // System.out.println("Nome gia' presente, inserimento annullato\n"); return; } @@ -125,9 +125,9 @@ public class Subscriber implements MqttCallback { // sensM tempo if (topic.equals(Luci.getMqttTree("from", "gpio/" + sensM))) { - System.out.println(giorno); + // System.out.println(giorno); if(giorno)return; - + if (msgJson.has("event") && msgJson.getInt("event") == 1) { if (runningEsec) { Esecutore.timer.cancel(); @@ -140,7 +140,7 @@ public class Subscriber implements MqttCallback { } runningEsec = true; esec.run(runningEsec); -// +// } return; } @@ -150,7 +150,7 @@ public class Subscriber implements MqttCallback { // prendo l'ultimo pezzo del topic, diventa il mio nome String pezzo = topic.substring(23);// seleziono solo il nome della lamp - System.out.println("nome lamp\t" + pezzo); + // System.out.println("nome lamp\t" + pezzo); for (int i = 0; i < Luci.luciList.size(); i++) { if (Luci.luciList.get(i).getIN().equalsIgnoreCase(pezzo) && msgJson.has("event") @@ -167,7 +167,7 @@ public class Subscriber implements MqttCallback { if (msgJson.has("status")) return; String pezzo = topic.substring(23);// seleziono solo il nome della lamp - System.out.println("nome lamp\t" + pezzo); + // System.out.println("nome lamp\t" + pezzo); for (int i = 0; i < Luci.luciList.size(); i++) { if (Luci.luciList.get(i).getOUT().equalsIgnoreCase(pezzo) && msgJson.has("event")) { @@ -197,18 +197,18 @@ public class Subscriber implements MqttCallback { } return; } - + if (topic.startsWith(Luci.getMqttTree("from", "arduino/AN0"))) { if (msgJson.has("event")){ -// +// // if(msgJson.getInt("event")<200)giorno=false; // else giorno=true; - + giorno=(msgJson.getInt("event")>=200); } return; } - + Helper.print("Impossibile"); } diff --git a/ScenariMicroservizio/res/CONF/zona.json b/ScenariMicroservizio/res/CONF/zona.json index a8066f2..563ebc5 100644 --- a/ScenariMicroservizio/res/CONF/zona.json +++ b/ScenariMicroservizio/res/CONF/zona.json @@ -1,3 +1,3 @@ {"attiva-scenari":"IN7", "learn-trigger":"IN4", -"luce-antifurto":"OUT5"} +"luce-antifurto":"OUT1"} diff --git a/WebServer/bin/code/Helper.class b/WebServer/bin/code/Helper.class index 86dd7fc9a55e63a13e62aff94e8acf0d1ca252a9..6bd7d5b6b5b7978e5a12b325d22e6157c128e468 100644 GIT binary patch delta 239 zcmWN~J4!=g5XJHT#LwJ_3SKpk&qPBWH^~JtJ|Inqk2F5g*#+&iN|QjAVI#~Y?A?M3 za23{~wcufzGyH}#-|27q`e$ulgsLsyqm5T==#QaqOMeO7Lf-Rvs7XFU!)()kRwv~x z5>j^ACbC0ADWmN7#c8ZiVvlvIRH(79$v7aV?jO>ov@Ok~9a&eYC(V73Oyi;SNZOYk zOHZVy(ldWcMmF%T<T(y?Gt%F4>Ri#}f)<zR8T(Ud*1Bem8#Uar!5uT8h)oh6Fy`6{ GEdBw+<|GyX delta 237 zcmWm7%}N4c6vpxYYoo8BP?Hlie#JDF6H#f<LdiZ{SmC;bw2c;SvI_}<a~UqZh%TV3 za2G_&pvTRD=ll-O`3b+nk3W~%TTok6-EhtIEzC!&XzxKgmt{5!>Wi-+ajtB?`SJD! zo=qY`Vzx-Aa6n{_g-N_aQM(dVcB#>zE@^N?(>|q%G?libtNo#7TbfzVPvT?giS$%@ zChbVO(sP^pfxED!e~$aQxzx`Ad)%<kmHMvLaceKdX*yz^J2l)>=7A|tz>PgmI9`=< G%>Dr_dLwE8 diff --git a/WebServer/bin/code/Home.class b/WebServer/bin/code/Home.class index 44c26f24d03ef7539af8342c18b034c37078b5bc..6c09f94b09cb75af9bab8e792360c2f0e093960d 100644 GIT binary patch delta 1167 zcmaizZETZe6o#*-UvJxOxDDy{s*}18wn>4g%!L_5!9kb-bpz*s&6KTdliAL$Dse)| zbZY#F%Bu-OO^nf?BpT{i8K4u90irlV{AFS^!9-(7jAnmG$mYHN(SQCqd3)~bdCoca zb2?QqQ5ifxb9@50ld0E(%X}7oL#2~3rJ+=+f1q(!XHPWV9SdR+%qNfhOkcS%mh-Cl zTXD!$t$4^a;;OB24jbDucV;x|zSiTcao2_n1udy)=gtk${!P*CeKCtsL&e<XPKP_M z&=A!9vHnzVB0gY|bsVc@-e*BRXTsu(d>-bcGi{w-d&=N5OM6m}_W3z&DA^pJyDXea zgcJR-cz8#zepH)kKW7Y~#$+;)3@2mJuHJa}f3$PXjKALVjiJg3`>Wg*7o2FICw&+f zAA_mEqY>f2;*(e#B3S|(mlPL_bIl0DCs@#Sl#&LIY4DCy+TgW4#bw7>=%Us3o?(^k zEv^!IfI6M4E?#VVvMgzh6mib>X1Q%*ILittD;s>aFPF)3x9!Wa?jY$!ks>qwznB#n zrzxZMTzsPVAPW>jcqt)BDf6+pf$Lbv^;GI>DP^qWM%F9SN|<(TqMLI1s30L?H&r~t zB3_}cntjyrCO0!egt-!7JhP&-3AV+j7M8_wi?AYGq1@%>$mpfuev`fhH+5Qx+tp3I zs;*GQJE&3RTeVGftWvy-HLPZ{;zKkNWi4H-Q!nf3r-=dX<q0-2#C^O*8*i|M{p$8D zw(<_!_<#;R<N*%ROqLdoi<uB}O3dW_g3bz>l5mkt{Gc+w$eLdT{VwRTpg+a@CFY9q zSJlD{ZN|kG<D=aK*lP0FX6DmjLfW;A(^Rl;`PeK0{8|Og+-wn(Ar@n>+F~d$EB`$? z>0dR-(b2+rdri7ic68}UViah=5Ir*g5qY~)2E}DSLIV$K*rzp2TD|Vp)9g{*1lwgs zCy(hXDN6=<Qp}*3J!1AMzM%X|QeGw{dmiU)sqcz;U(7)<ABoA_BjJeL9MkbH*~O%w zuLWHY^u3^qf__x~C!XSGX_ut^ChZStm!(asRK{s3e6J*DK_EA#{;|z+Am@RTU$mqB zS-CN+!Jg9wJ<l?=R?myMwejP=ie<`*WW%^lxHzWwLR;zK1V%m0#jkR4G8fOPKeWGw K^L)#9*#7|0Q3F!| delta 1071 zcmaKr>u(fQ7{-5Ry6x<4yM-2MS=udY3v6|*c&Va|)NrX_lOnbyr9d^?cDq#CZC&b( zDoenkC`4fVP*4+NG<b=IrLeR`t5gbz7Yy-(F)^BG;w2<T!xs`#eY$^uGs!zM@B2IF zJ<oH_Of0-q;k`ILJ^|G7)j{u)*<RduY`l5ol4q!JZnsO^bx(I}iNs^kRByR4Zs&mc zM{&0mQvAR=Y*kh|DdTs(v2#bZX63ocd`$z9j;#%m{^m$~Pt@Sm_-Ow?cVB#)&4}}d z-IPD(Wt`JCALsEXpE&jIv%XIaIp)?a1HC<N&NwBW(!l42qPj$)FA+>cBc0vxSg@<R zCmIZykeex|*|XGKaQ1m_c3m`-Ij?xiobNrWlMPsW2xb;8a-{1}IE~$KOQCO+S%=wm znz^l~C|+x7T%*jZaa9!t##ms{;&+{+*6%7@B<={+8Wk!GSEZ?H2^Vm|?@Dv$#88@h zRajP&?a$6+(k%C9r&)cJ#o+>TRk`H<V|I9y`jnPs@sVO9Hz*d7O)>e*)0<!Se99;x zL@9R@V7a~?Vgc(3%Bvgcq?{NPJi$T+S;P>Fd5KE)a}x(C4RcIW&cQWJ%%<8VsCbQX zD~r@fWA3m?-bNPH+TOdEs|KaqqXspa;6CnPnX<LI?`NeNuV)1tSVe?7wS7Qs*U-;{ zY@?nhX<!#?IUwRyS{Y_Dud$Ig*u*=u@h<ClpNC0H<hYm#F_U7Z)(JW<=#mPTY2rJY z`B|-g74*BHD}w$K^S795%3r62X*L*(R+GbK<6)!8Ws{jhn<?TEjyYq#Lq*5`#iOH} zQQT+~l?OJ*ok)JboES;w?=;DF$?lNTo%raI(=mD4Ezcg43B8gVm#FO$G^lm$P~T_O z_c=Kpr=32H>{onT(zo-Jm_ac+#OxIFqVg}3V4teP4Dh;`H$}WH;;5MS#H3cKa6+4Q zQqG;x6jOq}5cIX6Zv|Zz^n>z0@(e$z_KRx2srIL8S5&)7Qc@>pzg3)(s((~_8@09A znQKPtU_n>gZoNG(VM96?dsxB?EM;%zM7YVij%@-3vf-pgSlXFWdd}B>GK$gu%*4+! TaWWIna!z%xvgftZFY*5ebPMrU diff --git a/WebServer/bin/code/ImageRes.class b/WebServer/bin/code/ImageRes.class index 12a6728d9101478be3e3e6c556121a979fe80536..dbea630fa79283942da8b0301e7d631ba032c7a8 100644 GIT binary patch delta 619 zcmXw$+e=hY7{!14%w-=>Dmgah&hc(FqtkdNm@tYizBmOL4n9~NhatlurtIRILG)6g z=`PLgccZt6PE&^X5E%U@J=aq~wVe<?*5=!LeQT}Fw-$b1<$U||X$9EJ>shBgD6s`C zdOBEBIdNz*Gv=N>opq2nrEH>fHuqCV?TR11Sae{WBqsEE>ynV~zFQT-JpJ~qn&z{= z+VVyJGa5Hk_QZw+WrG*o%y`PpA9qJ{S;?%Rd0nS`gC)^|h>lnh?U(z?7ai_#U-F=o zJP-9T`K9);peoUxDAwidsGHBX=P!=t&SZqmQ{8R1iWmBX-RgfOsMD@pr{CE9Q`1=7 z0MUXU$NYAoZ55e{dz5&Tg(^c~kF7^cTbuMNf2g5A(<0|ucX>pU0Toz7#tS5t=^Fk( zPco>2q27<|wn&?izNB1czj-*2v{fK<P}v0zr<Lt7untF)C2?<x!BAQSJ%-cq3cjk6 zm1`a+l~l$)qol{!Qqf}kt;uF_)8G(cgJA+xv4v{3p=dGKMhzWA=%JQA>gcDQ6b**o z$SIo0(oD`UC)v(bc5t1Y%ybfEju`W1e8$Mu<NIqA%(i2aTM{X$F4i3UV#LR7Z95}1 z3A6YPHq&V`bQ%9{<KJU6dzsN!oJiZ9V%m8Y%vo-7-$n4Kh);NC?i|xU=Os(1e@YgC Avj6}9 delta 522 zcmXw!OKVd>9L0ZgbCa1~liFNOlQFH<)@n?QeOMJDilTJYTChUMqL#E23boRLxGHoZ zf}*sE<Ey@(=vKsQv=Cef6&HR5KY-vySAxYcAPi^bod4sTdE2^{@V=~nr~^lMQT2LS zJQPh5FUkg@f-X~uq)o3>)!AP{nF;YTl*tVJ7tMlmPN+BEow%^YKcSD7)ZLU5kBy!$ zPtFXN=T4U=&Q3`x=8zn3zU6V7JCc<sbKEtr<R@|8%&N3_Xs)QN`$W)fVk&9AsuuCg zd{fhleK=eN5yhp+hOFcQWI)W{<R=1>!<M$6%=;ZRI#-y_?g_{gT<xwQb2av^(qDSV zKq0Kd{{HtIbST<^!-dEy$86zvL2B1Op=FK1qPA;?{=rB=*``sysKdb`rD875XRYd& z0>*VjtAI%z37CG_u$XymLpfZtc#6#y6Ko`DUn$zr>|hJKNt36I16Dc8RtDL|2pyEz z&KWwHqKkRkxj;7;*~w*g*)L~UCW~IOD}6%i<Rz)bS^mvfh^o2ZjivKQdT61SR{E@6 pzqQ+ER}8RZet2!U>y2=R8}@FtF>fNc*T4rnvYKc4W1jLH{TI9JY$pH! diff --git a/WebServer/bin/code/MissingPage.class b/WebServer/bin/code/MissingPage.class index 42e50527a873cc37cd9eae6f17674b384ec80a8e..75b596d29b9aab57513af13b34ed5b4e6036b8e5 100644 GIT binary patch delta 248 zcmYL?I}ZUt6ot?1Vi?PMzm{ke9)(&YIueOmFS0?iBoqpNKsmocqM{-SQTtKitOUiJ zbI+Xb=AO)bKs{f#JAfX_TD3zGVS$=HI=OX!JDpFwnX8}>m9Q+t5Z8mM*{F{Q*gv4# z7)vCy&We;i49)tdcE0Ou1r(FJ+ANmdTB4|5ot+H>0!d!>J%|uB%~YWada!wcICBul pQ2iQ+P_xK!#YbyQ20h$*Kwc5~)9UjdgG3y85&@D0z7l5x&Krr`CzAjG delta 220 zcmYLD%?`m}5S*>n$JdtnCx~zoJvjHm$x-6q1%yU=X`9r6M{x7Si*O<i9>CLh0<m>* z*qPa#+3X(mOGdsvk0*c$T1t*>i5&6*(t-&~#XTCTQ}^tV*%2rZoOQJE$MYabf^fT7 zZG8cUFi_LBdb<TV+pqn27erwqP(LrpJJ`@bDDr`n4P+Th+;y3W*%;kGR~CdaV`_t6 kAXH%SN*e8Rr!gDu9pWFAzo7*kHmYpv9IJ6PSZip00XGaCHvj+t diff --git a/WebServer/bin/code/ObtainToken.class b/WebServer/bin/code/ObtainToken.class index 494475d0a087a1bacff6206336cab5a2daeda27c..cebfebf5f5c5a64fbcf426c8d9f7ccfdaa558342 100644 GIT binary patch delta 1097 zcmaizYiv|i6otP%otZQDmg!?kqn8G#Q`^#^Ee|8rK@3PLSZN(ZgBpoeQd&ZpX`C8g zXoHCf#Av7&Lt3?gh*lC`b;xwuBBCH6MiN9&d{hPBPc*?F#HMx6B*vfq*>|0D*WPEX zefHTGeyYNLe{%F7a4moK+U<TrfpB^6*0Pdh;{)qETI20)HbIJ}QA}uP?{tx%J0cw# z!=B9&OzrTT%WfsT<5J_U_RW-JD(+jI=f-?BB|>mbckB91&8=OxwBFO%X85@G(K!XS z7H;e6-k69d4WGK>fmH=x+I+>=hO^Vy$~m{eIwIe?6INN|d%-XD9o?Hd1N<mla%((W zsJuH-p6F_emv7jpi)yJ3@Uy$jj>vCrrycR07iPH$dzPEATYAdzav2t3gp+)PhZEo_ z(cOHIg>w%PY_3gH*ix6KB<gj%Atytb;taDF`E*(N-_l>|>t}wczn{6G>ZsAQnrNW5 zSavujP2IuA(_G;MayU(c6G*dU=q4pCjT*;<mTSR24vo=x`!Fk_0f}0rzCP^G$_!14 z{aM_S!%iR+8{uXTYaQz-?T!_?O_Tds=UDCs`ISAE7EOeb*%R(tTU*RA$NKmDoF?0` zb30iTwyGGUN>yI?UzVxO@bHihgNF|__EV*?3Ln+j%%O-HW)q>Oo?5P=j%%prI_42$ zK6kKyyI9EGT*(F&(WQ(Bxtc9R^-dSFP1#Sfgq=ER11#lLmhp~eA7?qIY2+-|bDkCa z#Y(2QLA*4H;YKNCm6Xvem9$8NZBobf#j=1WIHlU=VW#v%V+a^d8-j-EhI$d0q*{?- zjmG@Hx%VPrPadD7DuRR3(~H5SP{lYrLpi&spid1wtD>J%vCpfZ0h-v&o$OItFVMkW zHt`~H2DzV?d5C>H!Ygc7BfA*Ztc)_plr_RjjPe=>7~*wOyusUw4lC!Fa*iwKL`+F1 zmGqhZ80Sr${S?2jU;PhrK}i>tG@+bHM#ay5u}Dik!%{>>`!Ob$G9okdUzh{hm$x|O z_7x5|XQp(dEw!uW)c9kDr?o|fGj6PC%er?J9oFkRLM88M<Brmxg0f8vkT-#mnZ@L( mqU_~=&KLTfp>JedU(GkU_+2jkkc&U5T683YU-_LsaQ*>+1qk*4 delta 1014 zcmaiyX-rgC6vuyen3?zH$qeua)@Q3wa8ww!1fz9qt&Jj<qA_ZMCRzi8fB~Ip9O7Qu z4{k{p=}R@xR%18PHZF(^119b@#>B*}iwm_?TeXV%!NfE{?BOM*ADg_KoOjRfob$iu z+>dg;%Qnso_8tbN@}R}2^BV+6(MU}u4by(AkMC$Vl?vFss$Oi4Yq<(^wzzH#9mU*z z_Ax!TbDd{q(rEwuSXE8K?5gO3s_MpCg;Bb?rZyT|7Fn@U<7d0XR}r{saE(5V-;#Ns z>-LAflevE=h8GqUI^U|=>Z)k8DB4urxU5F$+*Ei~VSQ|Qqt2i9TH_^k+umX1x&KxK z?MKFFV@yRP($EyuxNr9xk>*U?WZ~mw6c>0G7w5p`mQw>%UMP-#c7B}nIR&Pb;6?Eg zWKMJ!n8E-4JQ?mbiZeWIgv@baujJ&0wNRScW_jZj9NrkG#L^r;&Lm5V^IC^6)52cM zTV_s|daWEiMCqb#%EFoo>lyA=40Be3a`8Pw{v5}*G;?kb^ITL~`YGxx-CQWiZ7i{L zJ1;rdtV`91xpJsOQ)MWP)0Y0czoW@#`J9s>6+ThX&R9|T_<t!alwe(lY}>_ovD*oX z4dP*}3~3xA7%yHP&BcV6Kt5p#m_;G;D58>L7E;375~*h*?=XoNuds&6yeH&Frtkr; zO3|r&!|U`gjURb~vrOkQGq_DD{mkSEWeiBwXS}KWl&f^!QlqF)*=$llHmh8=rgKqr z<)b~5j$RF2BVgD0v(%-|E&g`Z{4p9Wr0@wAwk-Wqa@ZkKTSZQr$oNcJeNH($S<Eh$ zvRedyNdsT8LZq$YTh`Lf2EJ!2KS*Ym&~c%9_?m8sCfG|a9qge~yd&)6gfORtIV;S$ zxdL4f=!yjT*w1xA?{R>K0zDS!AAtsh86=^+98f+Es$q1gRN^Xw9yNk)HBw^P^vaD7 zanT-3*{OcAzes&SY**^~B}e6g$H?TkEa!yG{-n(Mlrt2aqyaQFDvcz5aTfWjOczGV cJHH|?|98jUaO^F|{>2@M8xp%KD*Lhi1wBmr-~a#s diff --git a/WebServer/bin/code/Resources.class b/WebServer/bin/code/Resources.class index 9b9406a88bd155158e7a8363dbd3fec2e5daad1e..529cb039ace458f738d3afb50c2ede06d08ff1cc 100644 GIT binary patch literal 4351 zcmai13wRV)75;DbF_UE=umzgsQB$7TK(ggwq?^7-cqEVnN&=BUp_AQ7vSG8c?9B3L zZL8H<ZGF|+N)VCSYE&vh)dfPO6e}WFwQ4KA>bojx)oMTOr#Aj~b~oKff_dDz_s+TJ zp7WpooO|co>jNhN+<?FNPz09(w+0Wq0^@u19eOCPC%QswI(m$VE#SQ_mWbIm2)N3F z8x*Jlvm$11$Vw+d3BwL`+ji12Qag-Ps9tuL?}~JDx#5EXpN28e1jcq5_BvyG+OX{P z>l(OAd9cyhNGjk=jSu5cqF}s+3GfSOg)h0>HkY>4H8ix?saT>*U}Ao`V`p}@M#V&d zaUsiyq*F#T)NS?}Ar+GaM97Cy1QblsFcs5=`Iy(Jq>N--j~D{W%CnX^s_VM-RExAb z5ix2;o6osYXp8jyDh+RvzKnmv_a?*cHlr%8CYCFgxB4&>vlPtMFb8u5#zf4h5vn)h zNh9TqdXsv}Xf<{*26GFo$~jzMPi`jI?n4k23g&5;k4nPfs9a}QW;zuyECNeo8qJ6v zU#oY~**PPq9l;$HApv*9Oms>l7id_BMFJ`(Y(18s+Np(lhJhArFUFfut>7&hmf+gq z;P19<qnB8iX}UNm>rc!Kt!0#Lx@73RHGZ<RM#FWuUf{}JeVb8dCL+4s7PGtAvur(K zbN?lU`;QLKrHJ`(BW_Z#R6{N51g>y+H{1jPB`FPxCurjc`vf<rSWb94^;lfOvr<Dn z$Z;=uqsM97utnLVs*#Z@#cB<WXcF*P$#`s(C<ixPYPE_r0!5pvq>h_4tV4@Hv6b$y za``d2yrE%)FiP?D8a7B)j<L=4NfND2x0tD=c&k*iQ5rkaN<Rb`iXzk~xFru$+K$CT zOH(O*cVo=5eb@|_)O4!`9UY`cw{9^;QPPZsqd`TKogRxh*~w1CvQ%^nl-T5VNWyMK zQn92x20hrOAg-ZTf;i3zh_jR2gbVd36Ud}`XQ88JJJFXTnRS*18)*T*lXX^-95Lz* zJ!+&Fi5aXLqm{0#46DdaW{G6Bk+3W6-ASUe8@DOAUBlaOhrm^rS3nDslFf@pU`jTS zL(bIXLiEOjgzqj5Z^t|6A04ROZOf!}mj^f1O6T6G;a#|g_*+II%B&vlou|BERd9op zyH~?|@Lqyj079)9-7Qd>ubkxgnzT(*b9v^&{dk{(_iOk7KFA82PlQ4t5_M-PW;39k z@=djJtNZbQh7Zeg!xM>{l1Vf15e*OFVJ3R7Q|+2fducpw?lc(wVEL%<7oHq7!3}=6 zut%nSrGmZ8e8-%E3R|0w#Tio{`sCsDamG7u@QPU6Smy-Ohkf{jJl5(IJR&eTFHxKB z>@;{p<fRVaQ7QEpam@vd;ACIY5+4rW(;E6^(x@y+(Z*Q9$(YY-_?(<{GwFI&JkE>^ zRmcb)((nZw7Vxn;rEE)<s{bhhxe66*SMdawRX7LKmo$7?E>js>XOW7dQm6CsxP}3l zRNlCe=(4+|-%o1z3QlrLXC5brZsiD+yR-`AkR#Dg@o4l(_a0F2)qGOZ^@cS(!i}UI zGZQMlCNOPzDrKh1WPo}4mURq+Pr=s(rstuR;4|PW%yc3;q{I(5_V|hL9%=S*+1#w) zS*GJ?sYEi=>xpPwo`dde2`Q1VH>Z0$j8v=M5hn+|yk$^Cp!~9|%3ntqN?s&dY(28A zNl!XD6ntM`=4Fh?uVpNUys;GgAP<&9$ky(Zxif2$uf;iMB?>HEL&t8Fgog=HYnnDo zw4Th~1FRA+e&WMV@uGsCNv{8#H!BB8M{g{#!`x<svRuiYdMosZZKjyUdkRCH6U-{j z;%3ciG|g@4WZ|79N4kR3WZ1%1mbwwd3s0Z?*>$OkIz1k5VPznze#u<qjV@d!ic`4? z#lDJPlgon7mjtFn;<{y(iQDh+8M~5Z$}Wo<oq9TMOS#`MQ>#K%&fiX>gX9h+(;e|x zgzql060A>1tjlb(%p~p0I*E1JTrpS0AGt8gRGFocsrh#-=naVk&pNrS!2teQVD=?I zkA$Cszp~<AUX)DCf{m+r`6}W``AyzgTzv9E&GuUyP3Kea>8UshafBU#Z?l!Jf$?m= zgXg%EqD3BNOECr3%sU08X?_O98I1K`;h&VjmCYPZ54!_yf7vn2=o7)pV<-=MD*aU% zT+@dMPhfFnz%zg_kiiWBkAGPPEBa7dDOaxwdjtGE>5eY+H_M?CP+SYcYCv_lGgzBJ zYd~eEZ2;|noDQf1*u<{q1U7FxiY;MprCXt7SShMj1MF=*Nb9TlPp9v8@fn2J=jAgH zQ2Y^R>&dQawIAa-Hk`57U9C=1<+?@AIyU?X@LwV^C*bvW9Y?GPZT*<SK_WjG%Rw?b zAO<P_j(|6VU2XFx;B3H?!JQ}X$>46jdAIb+naSWjY2%0bq0B#q2PNo54(L6Y!u}*i zXEG+TTu<Tlv)ESf<6se{VJV}vnpgK0#<K%6(9O4ZVK(l=Ts(+!{2f6dP$9-)o+#xd zdlst1LSB%U;2Kej1!5%@idDQHH}l^6UGB6PV+N_zt01W0dkPc<rP)8=U#Nc_3l#Kl zLX>DzH0?DMzlH@aJkOPGf^r%@d6j36<Z!VZI^-y?7{Et?#uMmcWIom;nonTg#(77v zKkPn%0~-VGqxfXAtJ+hU!KXHcy=TxR0sD-kfd60ypYMZ2^hgF@+&lOpdl_fW+duf+ zkU+7!+S5PybWW@f#Z=cncw~}i@8IK7*|GhDkIk2z6aJ^zwDk`@RCxvpcYL}ZcZS_0 zqyHJwupir<!Mp*Sb$IDtM#>IJjtzVBk^#@*yyQ3jzob&ALmkqgJT>1%BAjzaGdO>k z=sk@6c!W4kVDAvl;1ta`pBrD`^CDistJ$$ABI<{DFv{lzmK#2WTWF#Lr$rHaaz4wV zbNmJZzi1R(ixMW>1YA%4+(@3>M2^(*Z5`h%LmQSepH?EukAf~V@OHbJ7t}`VL=$eq z8r+Muw5uI^nQHs7g_dr{qqqeJv6Ysr!(sC9Nwm`Hc05Cwvy?ecnP(~UJm)W9J$}S1 z{Y%{GB4u8t%qx_6l`{XJ%plrm^+w@FI}7M0p<xTX*(@gT9v{F~F%7pmEbYgnK^jh$ zX35#7;DCaC%*ubuZ`4w)q~xENs?;ht-KgNqf8_V{8P3az;z5GqE?f!0X-DStWo2F% zB%Re^D?vzK07lU(3+n|Z2tTCTtQf4JKW1|L!fAiyw7+rM-#YE@o%Rp-6J>prdl`Qr HJc0iL(zACs delta 2228 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 diff --git a/WebServer/bin/code/Server$1.class b/WebServer/bin/code/Server$1.class new file mode 100644 index 0000000000000000000000000000000000000000..8a95613b4cd86c2f97bbaee3d062e54c890f425c GIT binary patch literal 1371 zcma)6+g8&+6x~xQfjSD_K)g}!DFq_lwTPEmL~Uy|EFSbJhOtE3q$`=a@I(9tpY@@x z<%1vKN4eaS;sOO+<{_CgbIv~J?Aa$jet!E7U;%Cp84Os+O6<X)fbB<ZC+UVxsI;@D zbth5rdlfrNW?7EHH$k%-dpe2*2Iqq?&<g@5?dn_ay|<pmBuUG0-6~zRTGyq*N)AI9 zwvdz93n{SAk5-lArl{xUXg8JK^cOf`7j{R>VLwJJj7l89L4l*Yr4<<QW94Z@<Vx5K zLM3o~C*b~JDTl*2Vqr{T97hE%{ELK!7kh1`Rh$SMNR+NCwOVckD%AJ8dQBi}zcfuB z!*L5IBu?U#!1%U8e^)ie_A8<Hx<!znv!-IV8)!x7BX;3cN`%w$!lvWuI0&0*p?QhZ zIKvj1{Lh#%dxwyIG3O-Cn@SFC=4-@}j{K;VnC>r1*alP*bj!hhOi2_mEihs3soUv9 zu~w_3bt?^%J5jsokXAh_;oy?MC=>h@p5H+~TcQgq7A~`L!(pF{%DS&QI*7tyT*WmD z*ClS?Cb2hN+z*LXZGnNPt4U^`$slqXq*0Sh<+V#gxJ_9sdI8DL>nPusOnzy3x#8wb zqdCmuj)et@ySVqef<Hk7td4<fh33k(UzlNk4i6;Cc*rYDeO>MO@0MfFrz!{R!U{E0 z=1}msN~PAj?bj+^Hj)q+_BTe3>!Mx#KV5R@I9F+wn%CJt%DGWD_SGVr71-OKzgfc< z(^f*i6(!VHP3g60)k2*vTjo@vVYHELdjZ=Vs;fjVMG1M8kHb*K<(8KuDnXu;p5b2w z>6^b32vlgDqHXpEr;1-8K653oXl#Cgdwf5_(uVIxdhX%w{8SHCZMuhj_2NJehl(>j zO!P2mzGr*5z>~u5Y;hvn!^|g)*1q7%!CO6)xPSk1id)1ina`w|E<+NtLgYo{m~Djl z#_<@FsB$c7RQL;eKchk$RMK;l;PMo(kO?i!No4VaW(H3g09rLVKTmgR3<W{S3%`7R E0cs9hX8-^I literal 0 HcmV?d00001 diff --git a/WebServer/bin/code/Server.class b/WebServer/bin/code/Server.class index f8d51543157c6a911b93c8b6ffcfe507b7334403..9a5bb2dca954bb0b713a13fab23299c0e70e94dc 100644 GIT binary patch literal 3969 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 delta 1045 zcmY+C-ES0S6vlsVKXzuPqm<I7$_836Ca4W_0R^SDU{^kBOZg}kE1*uNFWqgoJKLGr z3Vu~U5x=dkdTY2QT$GE}w1mXOE4eW7!o*7w{R6x=#xvaz-Av}Z=RD^*&zbX{xzcsD z-TC>SwR^w--z__TDYe7=t#a*SI$F??A`?W~Pqboi*NFL1Z8b+4y7IMTpG~h~i#HQ{ zel;oRa#9TZq!^Yxi~Wj6gK$cFr*#}wqd><F`)G9VIN;L9^X7hLesMrpX?ddODkbR> zdp3s@&0Y|v?qKRhf?B+&cw|FwXwIM3BI=N*(dMXPvlr{28tEyo5YFjT&Spr_Ru9({ zhwJdgl%ML`98bTbPRHVeBD>M^nD87%(|)HF_Cub<8Aa;`<HTg*7t3eDSzUG*W89^g zv(jtV$VPftU(T08f41+bahnN+@*K`_-nO{l@*1z3QTt-XcbOzGYxe$}cDYDKrjHXp zO0pCvTFki2QZjC~H&b>AshFeLy)6;3MdDIr!CcRFFD-YfadRu%tKK#bvVN<=IeaP5 zm2@payk=&dft{^`VVJ~8<X4XCq!3QUn=*Xt@Clz<e3nXoZhm)uYWh;qZEm)7beF=w zFBQT#IiM8oP`Rw5e94bvEs9?&o-_k3oyK!p)i>sld+_9&TtabKeyIlDqEY;2GGgBm zWSg8y&gQ3AQOn{e-W8jsp`9%6u_$FiRg+TIDCnQ&7q@@0r)}>#`zBU-c7^B8_O$ia zMF;Dm7uLxO^KgxMq%L=?E_$hsIkL{E)Sax=omyvX;+a)mPDAPc%Kzh@A9!_zH+oi> zy2JDxI@Xwj73P;^lFe+DL31)kI@>rMVsnCS6TDmOc6qwk$qsh&1pTt!VTw#J!?dip zN{MTtwnUllWf`}raCZ;$+$ZK&5`GiPA1v^`$XYa9u*fxWMS>>jeHEJzYS(SHZ+dLc hf4AEyxA~#48o16!a@xYaA@3J_C6OcE5{7Si{9mS{^=beB diff --git a/WebServer/gencert.bash b/WebServer/gencert.bash old mode 100644 new mode 100755 diff --git a/WebServer/src/code/Helper.java b/WebServer/src/code/Helper.java index 85699ce..fb2dee8 100644 --- a/WebServer/src/code/Helper.java +++ b/WebServer/src/code/Helper.java @@ -7,19 +7,20 @@ import java.io.OutputStream; import org.json.JSONException; import org.json.JSONObject; -import com.sun.net.httpserver.HttpExchange; +// import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpsExchange; public class Helper { - - public static void sendResponse(String response, HttpExchange exchange) throws IOException { + + public static void sendResponse(String response, HttpsExchange exchange) throws IOException { System.out.println(response); exchange.sendResponseHeaders(200, response.getBytes().length); OutputStream os = exchange.getResponseBody(); os.write(response.getBytes()); os.close(); } - - public static void badRequest(HttpExchange exchange) throws IOException { + + public static void badRequest(HttpsExchange exchange) throws IOException { System.out.println("Errors in the request!"); // exchange.getResponseHeaders().remove("content-type"); String response = "{\"message\":\"Errors in the request!\"}"; @@ -28,8 +29,8 @@ public class Helper { os.write(response.getBytes()); os.close(); } - - public static void pageNotFound(HttpExchange exchange) throws IOException { + + public static void pageNotFound(HttpsExchange exchange) throws IOException { System.out.println("Page not found!"); // exchange.getResponseHeaders().remove("content-type"); String response = "{\"message\":\"Page not found!\"}"; @@ -38,8 +39,8 @@ public class Helper { os.write(response.getBytes()); os.close(); } - - public static void methodNotAllowed(HttpExchange exchange) throws IOException { + + public static void methodNotAllowed(HttpsExchange exchange) throws IOException { System.out.println("Method not allowed!"); // exchange.getResponseHeaders().remove("content-type"); String response = "{\"message\":\"Method not allowed!\"}"; @@ -48,7 +49,7 @@ public class Helper { os.write(response.getBytes()); os.close(); } - + public static boolean compareText(String a, String b){ return a.compareToIgnoreCase(b) == 0; } @@ -64,7 +65,7 @@ public class Helper { } return sb.toString(); } - + public static boolean checkJSON(String body) { try { new JSONObject(body); diff --git a/WebServer/src/code/Home.java b/WebServer/src/code/Home.java index aba69c7..7fe310e 100644 --- a/WebServer/src/code/Home.java +++ b/WebServer/src/code/Home.java @@ -5,7 +5,6 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; -import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -14,11 +13,13 @@ import org.json.JSONObject; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpsExchange; public class Home implements HttpHandler { @Override - public void handle(HttpExchange exchange) throws IOException { + public void handle(HttpExchange ex) throws IOException { + HttpsExchange exchange = (HttpsExchange) ex; String requestMethod = exchange.getRequestMethod(); if (Helper.compareText(requestMethod, "GET")) { List<String> strlist = new ArrayList<>(); diff --git a/WebServer/src/code/ImageRes.java b/WebServer/src/code/ImageRes.java index 31a7ed2..122d268 100644 --- a/WebServer/src/code/ImageRes.java +++ b/WebServer/src/code/ImageRes.java @@ -5,19 +5,20 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStream; -import java.net.URI; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpsExchange; import com.sun.net.httpserver.HttpHandler; public class ImageRes implements HttpHandler { @Override - public void handle(HttpExchange exchange) throws IOException { + public void handle(HttpExchange ex) throws IOException { + HttpsExchange exchange = (HttpsExchange) ex; String requestURI = exchange.getRequestURI().toASCIIString().replace("/secured/home/", "/"); String requestMethod = exchange.getRequestMethod(); diff --git a/WebServer/src/code/MissingPage.java b/WebServer/src/code/MissingPage.java deleted file mode 100644 index 854ed4f..0000000 --- a/WebServer/src/code/MissingPage.java +++ /dev/null @@ -1,15 +0,0 @@ -package code; - -import java.io.IOException; - -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; - -public class MissingPage implements HttpHandler { - - @Override - public void handle(HttpExchange exchange) throws IOException { - Helper.pageNotFound(exchange); - } - -} diff --git a/WebServer/src/code/ObtainToken.java b/WebServer/src/code/ObtainToken.java index bd1a5dd..a22b4c1 100644 --- a/WebServer/src/code/ObtainToken.java +++ b/WebServer/src/code/ObtainToken.java @@ -22,6 +22,7 @@ import javax.net.ssl.HttpsURLConnection; import org.apache.commons.codec.binary.Base64; import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpsExchange; import com.sun.net.httpserver.HttpHandler; public class ObtainToken implements HttpHandler{ @@ -33,7 +34,8 @@ public class ObtainToken implements HttpHandler{ } @Override - public void handle(HttpExchange exchange) throws IOException { + public void handle(HttpExchange ex) throws IOException { + HttpsExchange exchange = (HttpsExchange) ex; URI requestURI = exchange.getRequestURI(); String stringURI = requestURI.toString(); boolean wantsRedirectPage = Helper.compareText(stringURI,URI.create("/").toString()); diff --git a/WebServer/src/code/Resources.java b/WebServer/src/code/Resources.java index a056167..ca68770 100644 --- a/WebServer/src/code/Resources.java +++ b/WebServer/src/code/Resources.java @@ -10,18 +10,22 @@ import java.util.ArrayList; import java.util.List; import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpsExchange; import com.sun.net.httpserver.HttpHandler; public class Resources implements HttpHandler { @Override - public void handle(HttpExchange exchange) throws IOException { + public void handle(HttpExchange ex) throws IOException { + HttpsExchange exchange = (HttpsExchange) ex; String requestURI = exchange.getRequestURI().toASCIIString().replace("/secured/home/","/"); String requestMethod = exchange.getRequestMethod(); if (Helper.compareText(requestMethod, "GET")) { String response = getLocalPage(requestURI); + if(requestURI.contains("conf")) + System.out.println("URI: " + requestURI+"\tresponse: "+response); if(response.equals("fail")){ //nel caso in cui non ci sia il file (perche non stato scaricato), allora creo un file fittizzio per non far crashare tutto il resto String[] requestedPath = requestURI.split("/"); diff --git a/WebServer/src/code/Server.java b/WebServer/src/code/Server.java index 81806bf..7a484be 100644 --- a/WebServer/src/code/Server.java +++ b/WebServer/src/code/Server.java @@ -1,6 +1,7 @@ package code; -/*import java.io.FileInputStream; +import java.io.FileInputStream; +import java.io.FileInputStream; import java.security.KeyStore; import javax.net.ssl.KeyManagerFactory; @@ -11,11 +12,17 @@ import javax.net.ssl.TrustManagerFactory; import com.sun.net.httpserver.HttpsConfigurator; import com.sun.net.httpserver.HttpsParameters; -import com.sun.net.httpserver.HttpsServer;*/ +import com.sun.net.httpserver.HttpsServer; import java.io.IOException; import java.net.InetSocketAddress; +import java.security.KeyStore; import java.util.concurrent.Executors; -import com.sun.net.httpserver.HttpServer; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLParameters; +import javax.net.ssl.TrustManagerFactory; public class Server { @@ -31,17 +38,17 @@ public class Server { e.printStackTrace(); } KeyCloak kcs = new KeyCloak(CLIENT_PATH + "/keycloak.json", CLIENT_PATH + "/params.json"); -// HttpsServer server = HttpsServer.create(new InetSocketAddress(port), 0); - HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); + HttpsServer server = HttpsServer.create(new InetSocketAddress(port), 0); + // HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); // initialise the HTTPS server - /*try { + try { SSLContext sslContext = SSLContext.getInstance("TLS"); // initialise the keystore - char[] password = "simulator".toCharArray(); + char[] password = "miapasswd".toCharArray(); KeyStore ks = KeyStore.getInstance("JKS"); - FileInputStream fis = new FileInputStream("testkey.jks"); + FileInputStream fis = new FileInputStream("../lig.keystore"); ks.load(fis, password); // setup the key manager factory @@ -71,50 +78,46 @@ public class Server { } catch (Exception ex) { System.out.println("Failed to create HTTPS port"); + ex.printStackTrace(); } } }); //API del server - server.createContext("/js/",new Resources()); - server.createContext("/css/",new Resources()); - server.createContext("/res/",new ImageRes()); - server.createContext("/",new Home()); + server.createContext("/js/authentication/",new Resources()); + server.createContext("/js/templates/",new Resources()); + server.createContext("/css/",new Resources()); + server.createContext("/conf/",new Resources()); + server.createContext("/res/",new ImageRes()); + server.createContext("/secured/home/js/",new Resources()); + server.createContext("/secured/home/css/",new Resources()); + server.createContext("/secured/home/res/",new ImageRes()); + server.createContext("/secured/home/",new Home()); + server.createContext("/secured",new ObtainToken(kcs)); + server.createContext("/",new ObtainToken(kcs)); -// server.setExecutor(Executors.newFixedThreadPool(11)); server.setExecutor(Executors.newCachedThreadPool()); server.start(); - System.out.println("webserver running on localhost:"+port); + System.out.println("webserver running on https://localhost:"+port); } catch (Exception e) { System.out.println("Failed to create HTTPS server on port " + port + " of localhost"); e.printStackTrace(); - }*/ + } //API del server -// server.createContext("/api/luci/",new Luci());//post, get [put, delete] {luogo e stato di tutte luci} -// server.createContext("/api/luci/stato/",new Luci());//put {aggiorna lo stato di una luce} -// server.createContext("/api/scenari/",new Scenari());//get {nome e data di tutti gli scenari} -// server.createContext("/api/scenari/attiva/",new Scenari());//put {attiva/disattiva} -// server.createContext("/api/scenari/registra/",new Scenari());//put {registra/termina} -// server.createContext("/api/scenari/salva/",new Scenari());//post {conferma salvataggio, altrimenti cancella dopo timer; ritorna i valori dello scenario} -// server.createContext("/api/antifurto/",new Antifurto());//get {stato, allarme, attenzione, soglia, sensori} -// server.createContext("/api/antifurto/stato/",new Antifurto());//get, put {se l'antifurto e' attivo + aggiornamento} -// server.createContext("/api/antifurto/allarme/",new Antifurto());//get, put {se l'allarme sta suonando + aggiornamento} -// server.createContext("/api/antifurto/attenzione/",new Antifurto());//put {valore della progress bar} -// server.createContext("/api/antifurto/soglia/",new Antifurto());//put {valore scelto dall'utente per la soglia} - server.createContext("/js/authentication/",new Resources()); - server.createContext("/js/templates/",new Resources()); - server.createContext("/css/",new Resources()); - server.createContext("/res/",new ImageRes()); - server.createContext("/secured/home/js/",new Resources()); - server.createContext("/secured/home/css/",new Resources()); - server.createContext("/secured/home/res/",new ImageRes()); - server.createContext("/secured/home/",new Home()); - server.createContext("/secured",new ObtainToken(kcs)); - server.createContext("/",new ObtainToken(kcs)); - - server.setExecutor(Executors.newCachedThreadPool()); - server.start(); - System.out.println("webserver running on localhost:"+port); + // server.createContext("/js/authentication/",new Resources()); + // server.createContext("/js/templates/",new Resources()); + // server.createContext("/css/",new Resources()); + // server.createContext("/res/",new ImageRes()); + // server.createContext("/secured/home/js/",new Resources()); + // server.createContext("/secured/home/css/",new Resources()); + // server.createContext("/secured/home/res/",new ImageRes()); + // server.createContext("/secured/home/",new Home()); + // server.createContext("/secured",new ObtainToken(kcs)); + // server.createContext("/",new ObtainToken(kcs)); + + // server.setExecutor(Executors.newCachedThreadPool()); + // server.start(); + // System.out.println("webserver running on http://localhost:"+port); } } diff --git a/WebServer/testcert.pem b/WebServer/testcert.pem new file mode 100644 index 0000000..ee1bd41 --- /dev/null +++ b/WebServer/testcert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEMELchTANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQGEwJJ +VDELMAkGA1UECBMCQUwxFDASBgNVBAcTC0FsZXNzYW5kcmlhMQ8wDQYDVQQKEwZV +TklVUE8xDjAMBgNVBAsTBURJU0lUMRkwFwYDVQQDExBhdHRpbGlvIGdpb3JkYW5h +MB4XDTIxMTIyMDIxMDI0NFoXDTIyMDMyMDIxMDI0NFowbDELMAkGA1UEBhMCSVQx +CzAJBgNVBAgTAkFMMRQwEgYDVQQHEwtBbGVzc2FuZHJpYTEPMA0GA1UEChMGVU5J +VVBPMQ4wDAYDVQQLEwVESVNJVDEZMBcGA1UEAxMQYXR0aWxpbyBnaW9yZGFuYTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIzW4E3AvS/9rpyOCmuxIuA2 +g4Dc6f1DxVzAsuHSglUSW+dI/WZB8AhgFnL42VDBqtRieOLzBmdL+iBcK5ZaRJRK +i7ya68OOKT3L+gcq1lY2HRly54DX+tjw1KVJ6Dh+MzUjL8Y4k872SLpyu2FQGgH+ +iXufrqSCDHWidPDCDA+O2iZ6+5NoGb92jFUPQm7GZz5l9WBorxOR8VqDWNw56ipi +D6Ly7wkn/57SUotcHo6ZlaCh0dRGwLjtgfR2kHlhZ+151MSzeHDCul91QjS23XKf +eEQjxK1uiABUnUj0WC8FJp7MYwwFS4sPA5S5HTali+1C+ROk0zkorH+mYHPv0J8C +AwEAAaMhMB8wHQYDVR0OBBYEFHlvC8ECltT2lXei3X96D2MWikpVMA0GCSqGSIb3 +DQEBCwUAA4IBAQBUmE1aB5ofz0/AQanNg22oAq9gy5G4xOOUbYDhUmuimq7QkrpT +L/3Y4uGDflk2IM3Dj5piBipLJ0EgK6qSudSLWbfM1OcTU112NBf/OUBxa88Yv9II +/zVI1Sw9g1hX88C7stpqKNTtqAAFffmfwUJkxtTUoG9XXrsIY792FX/5YvL0mdgb +HIBEWK21F+38SvaLi/cInnC2BrnwPfOioGXvK/LAGhXV+Rsp/Iq94f6mE1bT2aCD ++rnIPgLkCY0/Px+xpc9rg6q0mfKPXxF/neiURNhcXpWvyfC1W0sZ4eq+3AqIrj2q +sgUc4uC/WGqomJXd/KB4Q+raFuu8QTQgkBdQ +-----END CERTIFICATE----- diff --git a/antifurto/bin/code/Antifurto.class b/antifurto/bin/code/Antifurto.class index 33727972cc17c243c1b19ce2e66030c8aa9b5d45..43b851c415891f675e6187c84cf73694cd7bc082 100644 GIT binary patch literal 10000 zcmb7K34B~t)&HMtZ}Re*wi9R>y3m#a*#}yXGQmolwvdvvv6Hr>wc^X<HJx@cZ+P>j z5L6UIKiqIfK?DV*?n<$f*ocBF;_|tEel92~?(2suiq`+VZ)P%+q%>cD&D-ud=bn4^ zbMHL*@8h2Yu)gYa6IG}-P-CGMb%F&4?Zb97Wv54?+lLN1313imX)>Mk*9)qfTXq=; z2^uv}&QGSIn{3}PVW7Gm4X_N%v(Sk71WCBVPIN=sPwvlozALC1CM4<iR^oOk<b@W( zXc8DBjz5qbB^amLYT|S(GO*af8Hf}o)tvRZ=@CK5cjLa7RF9`OZ*2((>+#@oSC}hY zVqqzk2^Npqhn#LVov{7gN&f(!vc8@6vx0M*XJXDmOs(%M3oEdaGbd6>C++tP3&Jyz zLpYlpb#_KQCmZeFzHLi1;imU@9?ZIFMdTa{=PDxgYUt`MJ-wUN*JcYXXr-|2obQg> zf_c4x1odl|fp$TY>y1PendsK|_HBWBOmre@;Cu@gsAV>2q$`|M#_>2s${86+Zb_!7 zqBg8mD!xz&YbMVvyFz#t7nbo{-%YqF1;5V1C5mP}wGv1)gf4P8<hh3&FN9}PsTtSv z73^~?T!sxCBy3NbMl<UqJz)sCl}0uRE}4amnT++EL={^sT&|@UaI@1(h0r4~N3Zey zO%z~K%lb+SJy;n+ALXe=;<=&W(%^OreOPJWxs>dbQEu=&d#pE^<+Az%s~)hh6T2t} z-_0ZwS<>M00#3CHlrXwNxQZh1-Kd?S1pBea!d^U&)@%>cR4POgXs@efk4fb}-@?^+ z0kucz^^wg1&!G>T);!DF!*tgrAtXqy+`_JR)3&y-5Qu3d)4t<*Ip23ZM_Jd11qUm` zs76vr|Da&qoTNVs10kg7#aSnvb-iStdzkK;_FZKIX$vkgoSmys2CC&EXr5)Jmfi|e z){tF_QO`maG#{fd0i`e-sENb4*1&ZZ#&A8Ia3(eCA?2h;`~y0c^eBWES$HvS;5+$K z+NdzCf<BapUaCZN<0(Z{)Zk2;4dG=pskA%lY|r_boL`E9YK1Si@G@nR|3!7XdN`hQ z)2<qNrG-~1n_gV5zJP>=38Mx}!gOL@>afJX>jW)o=?>#jChJ5q_5n8<#HOe+_rq(W z%AC4&v@-ApuIUuu3>#V6ezeaSb-l6v;LS-V7(iZ+Y7@8O%_@q#MX+xcwayfUR^FW0 zE1RpUWtS4iTP?f|w-<amSc9N#?iA^cZx=AVyhCuoDb}sU<fhY1c-u36lG(w;ooc~% z;++=Wg?j|^vkoQc*y*^F%@TsquX&G(o9`xzsazu2nQ{|0{r)~2G4Ngs@5B2m@@X+y zg_sU}1}Ns9CFMfwK45!s=bD@nHv>ZmAEfip$rFypEShBIVm=vi?2(i+<fffy!oJ+g zWisxX&V=WO@L@swGeK)3sKEH>{|DocGZw;8m7{}6m1sU@;h4%O4HV7JtmAF7N1YJH znMd~L($`Z)wvxujEgZ)rp?p^@u@Dw&np^gED<ThC_#{3R5b3wG*=t>o!Lqh_Z?`go zhw*6xpRw>+e6CWMV_DxBr8CoqO5r%^M*CS1sBGofqs;#XmY8@1Uo`Njg)b>qgGgTq z$VFuoS}JXFzOPvLD*l_=b*@X2bPeOgF2(29Eqp_LZ{%W?x$IKT;S!|*-?H#+{15qK zWQn_pLyo`2PB8Y42@aNPxKNkO;wDp7*GXZ5SbSYH?fB7bHWiJ>dn@K*C3PqM*TQ%4 zJsqH@bFwtxBp^_Usmi(^6lJ3;sLj_U9PI}tzK<VT_>rm&=W8j&eLHbzz_SyMfgcMN z>579%F`Mv`LrynS-w**zJdU5LQ1OJ|aC4!SDOQ7B!FzvhD3#0}aJ;TLNkmVyIqM`? z5_wL6#)hCinn^$@?N<EU!Y}a4z_^O63C?exQxqvIh2cn%`n84M;J36Dy03~8f@jT* zOhs7H#QO1j3xB{L=_pAiYMbk!AdBf<7Zp8)?_CXe5`QxAXA6J9UzzHrDwQG#Svp{6 zw>j65CDzS*6vp2zJcWPIdei!IWhqg}T*`8vw(u|Q7OYSPRCzPtmQ<-0eZpb{rQ6hJ ziwfpfsj{S6YREn9U1JH>&tm66mOn-G*Z5tA(7syd5TyGUeC-jYqx&ReNxhf>7aPYI z9F?=S?A>TetynZYnWw|ZMygNd%K}3dS`rqv8O?K;r?4y|6WFNW1#?n%fxWIdEq#-d zN*;E+u>sc8X}WKNoNmb?<!KFUPCP%ZV;ntD&afn+3Ph6vFH8|eh$Vn5Wxb^xqi^iF zIVb0svV`rNoJAV?bKoDQELX{_K~^cbusvB&bjiSd7y#s)V$)V~OH)?Mc?zLfu(E(q zn5O7`C687V*uDg9U&%>LX_0nCp+j(4fkKIVfyOk7C--MVqLhGMm1+__Q#$1WMSP85 zRdY{I5L8NY7g;Q>P%ZyLOD+=jIe~nOHO1Kl&ZeVIajHycwXCz`5~ZD5tsS+tb&7{| zVbmkZ3RBiw@*KI0UdW<vTH#x&7M1OldbptQHDse;jT#tobLqrb!p{0BCwef!iq2z& zJ?wbVje4Y8kMtKlnzDgfmCdrnkjpK(Lf8N;((yqBNiXS-MdO7BE}0%)M4T!-N`S?o zu9hA{u4E0W=`c^K?y)D$1qDgfl&x56$TpHFLTt?K-|u+Na0OJK^efe{w>qN`8Az)P zf^je;amw<l&Wp~!#FU*v1KMrLRWc|zr*aXh0E%``RY9fXs`{lK-N+}{^>ob|g62f3 z%alIZYsvFeH&M?WkYvgpV%JQzo^Q$3Lf2~=andSOJ7tUrE<VZPf_zkx?(`Kf-m!^X zH4AT7Q5t147{Xd;)eO^cGwi=u1N3k1>$g2tUWV*1=7xgKb~rZe#uNu@O-Ts*zFJ}5 z*EGd&0HG2R$5WP!s)S*(avBbd)ex6){iJgrOxVgow<a8NvB^nzV;SbLq8)9_B~yC- zv@+4Oc$Q>^PEk9g1_WzWeW$Z<h0T{OYz9dR?eJ`VQp71SWRsyQoiXn5FuF32nvz3x zNLY<kZS3ZYywH*t$%|DOaQq^}f-7dVpHr`Y`gG*;C9JGZib(D@r?t48VY1n8C&}Rr za-$_T2^+`8;Xsy!A;GR7^UPgN&n(vhU7CDOUT(=Ngq^6$E2a6E%Abk%B7R|Spk(94 z?}ofmaP}N1D6@ODC9lyTHIZ_&^tW5(b%wm&k~gSqH!YTNg1D;uC?c}E$=Pq`QvSeL zMx(t+g^o8<?6WGd($R{9D1uw%HcQ?rZ)53@a&6k>nN$8z9<5X}5|TSqg0nl6Hy0W* zMd40M-XV9<wN!&RHMBYHs|MhrSr|H1bWn4>lPsxVV9GsmuOaVN>w6FLuv*Gg6ENWA zvVNbPW=Z6g!eTKfmG6a4?;d7Bq&V)8BbK~Z-p9Gsp6@Jqq9i-T;|ElgF}325e25>| zBpha#>^S6%neq|&s3G@Ta#S8*mo`HU%Ju{6W8bE*1WSu$aLKR=L!6nObxg3ll8j=Y zJUb|rj9W4x9}gUycm-8ld1_UtN%nT{J+*>NnUqf$@}MQ3RHk}XrCLa4x>A@wiZ;6; zHNw3!|G=ms@{m&O!?WATbfwK8OO;K^XOzl5D_B-oUP*8S*ABxKDQ$h8jlw{0{O|>x zYfO1WzG%p!YVI#FMOSjq&XTdy*PTP>EHazU))c(v=PQ<cRaB!K1eJmySe-9pb*?2l zWxrD^($@ENOTHoB3>xWj3nlVdGm*<7i2jItTS<a_`0nOsm}mM>1(j)vkE`;@*<q)- zYpfIHBf<{*+wxsian2%!%C?%NL_9f?wtdpzPF+B|a?AMA;A6R`uIC>6Jj!36PwcW& zIpPLq1$(%sO3&=($qJkC-elU@mKz;%ya83K5Gk%Y^FBLMcsEN;eAbYkGMuWITq-?F zgNFR9*!rsyZF||kFA8bw6fIl{gFF=ar9Q_$;4++^H;ehqTyo1UE=%p%t1h_UeB~lh z<7U=(GeJibM2vW_1+7qmgjZTxP*oF(C2s)b81jFDj%P|rGs+F($K9Nla8w0MYcB2L zb}Db7jc#;ZKkIvTCRl8Cex3Z)l)uT}4S9-N$iixBwGLH!DarI<wt3NDdxz@fc3vr9 zzpY$K1;Bvl6*Rq+lU?2Gx`%R^u9>1M`%;0Z^5QJu<-#qsBr}*)J0)@MOmv0hX&Rq& zu>0?zW<&CC#t?}`qY{%)6=;QCCJ~h=Ptt;OzED*ajbOj$j`HhBh6Y8r8isxzij;vx zv+hVLX@{!VO`Vb8=~(5U)~pk%;!)$$X^7ltbxN8DRk8g)ZD;yW+PyZtLZ1YsSLD3Z z3Qo$6i)EWV&-G#}#N6TNmW^kHE3&$&?(FOgRW-6xV^7Hrx`#VDUU!PSk51O8T3GBr z$`v=8K8&iSVmdl0C=Vh6<zXfFTdH^@*$7jeUGb?(oyzDt_x<&qM+3Z@>JUWVdGG|0 z@2N5QKH+(`s^NGHsqZ{9)OT)_^KPosE`8_07Vlwo(n$OtXqZ(zMSZO7eTe+9AeXaA z`-hyMhTEkzfDE^eLs}<c434Az7|hnzkHO4i!30h_jx)h6-{r00RmZTpwe1+rn?&1S zc+~_t#<8ZaJ$z9f7q^FF`g&;|>yKk2@BlWqhp*tb2e7q0+^Zk9O`@L@?05k2qlkxh z=P|gO4-?pT95$d{HR+)O>DKn}FcFVoe*i_M_8-TA0J1%ND38$xa8334Wk+#M9=UsP zRshG>WqG{tI9?Kf-drt5PCQ0xH)(1&m#E!bqQ=2j=)qe`gSV6hgHOlt>VRDF^);2R zuMJ))#ajoDVl$atK8e?Jy>A@Hn~veO`;|uIN4$DGYy#F%@*UJ|CsyGiH1puK16_#W zQVihP*oXDlkLMtRZXS4T!7bGDTd);(qZdc99TX+Lfal^d-hWDr-(jZ!yT#;r<TC7) zcI=Zb*lgX0B!OXhoHH&$)d@U^8Uqc6EH}_bjDO%9`7y^r^oyU!6Y_J~4);p}`;ZsX zzD$mODSXGa@Ex%l{?$(6PA=-MSY4#9I*+@#)bPD|yyteT3V&c*_(KHxNUSze7rsA_ z2YAcpF_Fh7j^Om8c!<Eq@p&bvFVsxn%aOXeJigWusfpBv@0h?hV@9MdV&w6iBQRs3 zNGOlTD8}0+@%UhCyV5@YZfWD?JpSE0j-TZ5Gd|rGA(>xMEqVM-p?w^T{I}x__4GHv zL%1(i-x{gU<DW-PJaIoA;CVc?^tj6%sAGsfHULI=40wR<kfe(o!f8m+?niMB(o~I$ zb}Hh0;#^EO-Nb{%9k`ZmdOa!KK&+P#;wFy1lrDTD)paxOz$<VsmG&@RiAV7&E&fi_ zoglKI#ouDcY6JHb|KABL+-u<bb^qd_zJVv7!g8&a8mfaTQ9HJQO2|=_4k`6&;ca>R zTiKOpyHdaF0C#XhJS9{*Eg;J;<yQsd7{Afqab|!lvaMrMY6si%VvI{eUK)2#QEQ|? zfH!iZ>rIH@&1Dqp<=65X&dCTu0R-$UnUK?tU~w;%+?JQc$AwXYS|)>!DT#x`>Piwn zlh43U`0W>bdV&l78IAMjl=!c-qzqJTp)i_Ys=d(y@9*Q2K{RJlmJE)|vMUSs-bq=` z_Z5AUXc%lCmzCQlW%XcN$GDsutC^IR!AMPOdj}0?T-s>8(mA+rai%I#OVIOUbsdq~ zNKIbWs>{WZ+PuVQOwu(ahBdG_>F+7jKVSj=NLzW50rgL`h(FU!|H9uB{EfdA_&fG+ z_x)<R(=h(2MK$G6_3~S?9*8SKTI!!nO~4_(o0Kzu5KsVHtu+Z)N3r!NwjGyCfsZOQ zt>*w^9<%iC<o5-PrCP|;IfLJH$c2Rb0}Uu(K^c%zNIfB2^YZL6m1_f%)A@U!MRa?f zZv~>SN^$i~oPFP<Y@n#SCuGxZQNrCi*g7t~N~(Q>k=k+D9;<7T9TPI3JUK6W?m{@C zpY}Z@cC6;eiQg(nh1W(r4KMWAnV=yJnjom7bUHFF2V(VfVL22tCnZfLG94<g$ThKs zNy+j3+9tU!FW1Mci21PGa61-9`1Fw65TRMWG%q*D<{iQO;M*<wRZ)A@guHe_-WY3) zG>YWqEs@41xm}sU+neO>33*p+eq?^6F)#NO;1)y{1aJ$Q<o%3K^7aUyJ{Xyomk%p` zY95r24OT}&@x0_G<oJYqDz-4PFtQ-v_0vuAxe56~EF1|(7Ut#4k@<P~8mIkMB%GJ; zD6Itn=?>;_$Wm@zpM^$Qi8Evse_wPq<MlaME9YXPv?4BT{DDe4o-Z93l?(VIhc$S) zti@~PLLSv$gu5BT-!1ESpd7<7W`YUcACmR>vRsC*OE<nNoA9`7#;;`yo|Mb+6nB6{ zdL_hN(J=RV+qsV$m43NUc5s7xr(7<(WH(#K$I0bB70B8UDh4kd#l$vbt08@c>|~~S z8cl}Si%u|5&N~?x0Srmd*A4lj!TmZst@6@Gih+jFqFSERLiv;YnfLV!2Y;av|5IQ8 mrLQN{wMz80T3>7R)zH^^eQnU!c~z>6G6}t)DqM9MBL4v!t|IyX literal 11726 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 diff --git a/antifurto/bin/code/Automa.class b/antifurto/bin/code/Automa.class index 9ee24747ba7dfbd2afb48f9cf9bbb09b3eade611..c606cfee341329883be8d41f4f90d6a9e3bc4d65 100644 GIT binary patch literal 4342 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 T{E`2E#VrwtcV*ncUG)ARn*8#& literal 4088 zcmZ`+`*##)8GdFjnaySr$dZJH1X==wWOG?4O3Otwg+!KScZCg5qAi_lCYuSHoiIBa zL9N=V^-{G~yoFY!c!_OMsgg~#9#7BFpZp8_UqtcwzL~wUoSZY4_j|whd*0`L-gh?t z`rlvw4&Y<>AdG`BRV=Bv5<)JFW#q%~!D@vcD`8%)ii;gWAp}Pli(+|IIDTF{T@%aK zReT|gPME^siy?eTti05QFXJoX@>LZthtZE$gwNN+<?AZGAuO*7$8W0mRv3@N4B^}2 z{vC07Erjoi#qWub-w)w+asNRGZ-nr}FdoB=5PlTGk3;y00Ps_B`I(9}1>vQFl~2tr z85u`G_q1haW5N<UlTIaF^Dzb5ypePCw2?1Zwkh0}^i@4pbj)1rv|d<r^tqftx7M_o z&FfClHWVCh=HnT2dOjOVJGPn69&_EKC7ySTtYIHJAx<nfx?@c^PEpS>ni5ygDNVx3 zwu_EqiBlpq+r5BHNjj#BR^C$3HWi<qygYG!CY6{_(0<a&b2aZ=&~ruZ56ji`%*0HJ z!Q{)S$?2Ji%jwBvI(3exwj4L}rgK7pe`xrEg1|{@p8K{;n|UKyT%I%R8Ie3AO<v0w zD~`$dDsHNHQ$eU;IBBLq#sWjLVs|@VGglJ&irhpQF_LW>%PXd!(KEh9qdq@>s*duW zp@%b#i;$tL;Ye4OrHRilQ`no)a~UhACyUmqB>-88LUziwmg~7}x}7KN(6d?7vh#Ya z`=m$j&PT<T>lCtr?U_Z^+mHv>h9KeP$a2k#*ujM4`$W;PmUT%ylj!isw94kdkj%fU z>|P(bYiRgk!dQT^w|7`i-TRDPG^X@if#qbiXBG69m&?H^x*De~6q316w53qZRjN(Z zb2;5!W`Nd=m0vY%id7UQ-V{wZZ58c|F=Yw?wYiCni`LRGfoBwKYtoH$%us@{G7XXO z@tAECV!C8&T=cGrpKJI9ekr1)H9Uz!8crjwVOj+3^fnZP5Tw6?pnTErG>&Mvg|{`_ z#;-K|8fP`kNF+@fUgJFcxPn11-pN#QDporu64t7@Y~;N|H2em?Rq>XFbuho*;T;8A zWz?E!py6G-ClK7x@O%7$V5=UY1e^{U{)kx(ckw=zRb6$P|Cyqhn-`4xGt2WD{)9hk zxQ7?me^${spkYIhaul2|!f;T-aq$cVJ}a-GgiQrK#wsy$JS1Fk8fhz=GbzKa%7U4v z49aG|wXmS!oFMu<(senNr)p1K87p&w^_BQdD;7`HSR>LZhijbjVU?JWTlCXLZbhWm znlspwu5JdKb$v7K`&Wt_@zEykRA(K;%G?hZGPb$u9mJi@ydFMEjHMQK4l72YuNc=0 zq_y0Sb$O9|bx|)QjcdX)FK_joTY;jkiiw?C5TWY2$<qZxJzblcx3LDDXQ}PPN_0Qr zQp!yNG<6S|l`n{xDAjMJg5la2-Y4l%^tR|LD@J}^!C2Exk5D%=4LO|S;`2!<$Pwi} zw-{IXxg^_lqr9B=EOzs&e~`apLj0k?slX?n=wa&ruzY@s?;HX0nO!39>=52};1j$n zI3aBT^x~5>?_s`ws^+~5+vv*?#&{>WV+sMj1G}P|P@*5gcPSG10KrYPY(S0rHxc4O z>-+RjaEjL+1bOY^u5Mm?7=1f-@;XUt3u8{<(-;sV&5OUxy!>2yQicw@p%Z;;=pK!< zMeji?p*=!#$2!`hG?lPr16s6%t>R3dJaY#lgQv7(7k_X)fj!uZF$|Kg{W!ywR`~8? zkBVno>tOiAQ1xKkAP50G&J;T@Z6dOPZ4yzJi)ebJgzm)XU(lmq4g2`8UBO3qEIBep zM27=Jx^1kR%=DJ9<Kp^*e^=2B@_b+fZ5ZW`xpCr*5!(U&9mG?t<s_?lnza;2HTeFE zokXf45v>EOAc+(?7Bz`_oOOs(NBX@(t2GcmCc)V4RD^=h;H<ZAKkZ^=i`-X2-$&># zVdov1+~T$H4$5Uf3`LKb+bpGE<~eRsYe|S#Nf1lqVb{?>Z$Ora2JII1MtcJv;&IaX zL}Ygf1LSa^ggssf1Jus?gL{ocoub4iS;i^!Q7ZdL%^`{<MS5mfuZu`{MEUO{M3(-8 zXMJ@<?G|4>5BnP=DnRUU5Bv0pSHPoua0{3aOQXb|9IHXTJvtWITf)8#4DxBed>UGR z@Q+5YX9@Nk!KMjzhN?TynqFWxT_mJSggz_5@)x@c_P7gGbkr0{=10c^`Zod<8h$=9 zoEV8v-6Lygjf^JN(GnSx5XpRU%tL>K4=(znLU?L#KyV-I4c253iS`DWmTVT6>3>$i zAEq>b7kKDpO72BOFvoVCr!);pbAd@@`FUL=c#~-@F_j!X$A5!_L^~0@kBEv3>?xH6 zIMzu2#R~mrn4J(*KS2(9S!vP8_$FfOXpKfVIbu~%5m~CM1Y{G8Lq?18zyN&R!G;n) zS7B~|X9!KVL`ODpKtyw;?DoJlO80uh-b<{C+ebTj7x;q2r!{uLOB}hMW!A21^_V`6 zpT=We<}t6(|9NuyaOlCi6;y76y-L^1O<ji?U0<W?i_mLO2*6<i9+HGMqJEwJb4~r- z0yO&Hpns;~f5a=;)|!F^19$vlmpf`Zs2OkqYPg9GyeSLhhtk0?^G(CJFxSv5%q@m_ vn_+HO!zfhXf|u<f-bHD{eK*+#<98!b!A>oXcPN>6q2j%A0F_&^(rNMk!}x!b diff --git a/antifurto/bin/code/Esecutore.class b/antifurto/bin/code/Esecutore.class index c3f83b6e06715b453d4252fa25bf721976f07159..5a9a55bbfcd00494cc875ff88c33a56c0e9f1e4b 100644 GIT binary patch literal 4293 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 K{1g8|_5T2E#b50J literal 4605 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 Uf*qbX9{(mP#MJ+AUWFI_3-Qu(e*gdg diff --git a/antifurto/bin/code/Helper.class b/antifurto/bin/code/Helper.class index cbfca13d4240a1884a93c6cbb7ccbb591b612e09..27eb86ed7d768ec518afd3d2d023d10e0143c0aa 100644 GIT binary patch literal 1449 zcmaJ>+fvg|6kUh5q=aCh+(B*?ut1@RH>8L{1p!-_u?$Sdr;r{>AS9h6p!|mq{(-Oh z0y8k<qYr+JpCInjv`{2tGtD{Kd!2RG+UN4?&&3Y_3)qlRhk%5jf)MH%nh(?yHEF13 zF}b;Wz%`eleqJ|qcYz@gAKR7?X6Pt`bSt@Zytl_~Uf8j9m)jC#hG;dnq8r?c%V>Zi z_?sBo<C&Woa;~kL#njlg3<(i|Xl7`wAc)=@Ud~6+Dxpn5J30tr*~R36W0}eI+~!7A zXV|qoLWZ{Z*xhNwBwY%+g^bWgp;$zE72FrbLz-bZJdAz@iVpr`<ULml+?Fu_MZyE0 z3RD3xj0hj2w|scXvX2<z3dV$quuYs9-Q-bPhzSJ=OfqyHsfRpmnVRbE=<YuC99K16 zhhf&IaCbfW+K!=D!ZbspW)*mHl^Z2)GX&H0#Sjq^Hja;WxxJ<C8WfQo&DKwJv3?BW z@r+NgQ$90q)5zsd8ZWszsh04ZN>JSkYn#^@h6aNdixv7&A6Gse7@BgfsvTz4Qdy*g z`CD7Hy6$q$I<__LNpJL=P6-i&Ua~CLac#Af<?g;!a3b|sl(B@ggg2u4%M8OeTT?er ztV5pkh`j|_Q8m}HPZ_?{imm`X(pA+g7~C1oSk~cj$)`#+b-Oii>$Jpu;2&!6-ZoFw zR;NOdRt+OZ+c_1+TZTHu7?d^B<aXLn9f#9etTT+<@#ZI4LWZIL|4_OSJbxHMl5P+2 z3xG}#>goN6zWS)8V}#K7IoNmVFwD?fqye%0AL9uP6wpN)7NEB85>oyW4f%<4G@j#L zHZgvNmNRrF&d_s15k-)|5j4}&g%&!xQ9Pwckf@&#@ho0ch(8l;h%z(LzU(Ci@+4(w z;}Ws_<T-}tg5AM0Jj`c);$C9n0^>mT>(y@&oJxG7QFUd({d5xm9mLd0vb(6)jY0Ha zg65qjmvfX&pzewiAqgo$rz8wWhyhn<E62*A>u8PE0A7~oS->l5!=(Q;{a3I`Uo!R9 J@D5pY{{`$OVOIbE literal 1106 zcmZuwT~pIQ6g}HEYze_a3oZ2n@eAA1Hhv%~1r!iRofc-SqtnNbE}dXaI%$gj8y|hu zmv+X^_~?Uw!~Y@PO<F-{lD*m7yZ79)=Wc%e`ThgIGImtVVv*xEM@B^$SrsAVR4gGc zX9a1BQRp0ZRH(>u+*P6Bo;3G4mQ}>CD9r<DC`Ut)V};`(!`PZ-TiymkIFo(L5ZQL> zf+1G6Y_Z$<urJ&<#(tALYTI<JBkQ>(KXRF}<2LlewqxtBs(ZV8`-j5xO65c2$k3aH z-O#I^YuSyGgj9DvnWE)cj@{;X#4z3zjm7|IF*73Pyo+J7>KW$yiqZ1va6G2H(l!ab z>U3OF1iU6*h-OQ;Mae@$5-EnH&&hK1t<J%La7F!{Yk9(Dhz|oYHE_z5RcT5bYZ}(E zq2Y=2Je5c|lk-{_bqRE?LJ*KRn;N!2+NRD5v(>Shl&oPJ&lo055?v3tGfbT<4s>Nm z47tAC`zPjq3j?_sW=H8sJxC1vq(iV(zcYyuO=O6A&Jb=UlO5Fz<)hS)K{1<7o8G6; zgT4FcQI`ag=ZFrO(P|01&QKV|?_7z2Iwf4g44r&=g-LztC)qjrx<YSi2$Wn8>>EuO z(qzYcr-m#p;u8H6a_J@%N~V-PLbX1^wWS^+Jt&oYu8XlQc)pA12}B$bS{%a^-E)}6 zWyEQKyo{=5F^{VQ;LilBP-HzmUg<-v5tWJEKD1h)hso7QI?~03TKOl^eZ*=#Oi`Wb zB^q7CD_@R(%XlLHl>kCM_jz!dCkZq~zvmpy(paE<tWfz9m0qA|9-(6jD4c|$!Ev4A V25?NAq;L2H-cz(0Zu)g@{RJL2@pb?J diff --git a/antifurto/bin/code/MyQueue.class b/antifurto/bin/code/MyQueue.class index 50ac71d1e9f4ea9afa31bd320196bcda41a7245b..9801fb6cbdbcc4c4617ce10657e8202676670f8f 100644 GIT binary patch delta 671 zcmY*WyKWOf6g@NRc)Xjj;|C52uXu3)dkwJ@9!Vf1m=FmhB18dEpjzxD+Q`_JSp%-9 zkZ4!iz!#)J;vv{bAR*CGQBv>&d;l%sj%|Tx=FWYcbMC#*^=JCZ*WVvM16anI0S-+d zA~Av}Lvq`GWS1LubE|yg-nLWo7@|vV)Ag1av_kQ=K#U>d+Zoe<fTm*<QXnpoz!-z9 zwdziJy?3+gbRGXzuBeJq5@}=@g!^#qLEG!~f$peGR$?6c$+zqNkBJJ!I3^_yC?R^Y z<+=BJ)kec0j+9CrmN=qPk;k^{3FLw=%#7<eioC$I#4#KXw)kuzh5|$OTGMknoo?H6 z>N)30&1rjXt7*VON#LZ!Da-^f_=2HiR3v6G7kuMpTDfN=&MKObTEnqBez)Ymp7g(O z1as`}RhT4()8-hxG&0$9<Z;Z?`ltm_dKV~Cfkr<dY3+hppCC4Op?`q!w%@xLRJH6= z+RCsxM^;tGtoJZNBwr1x=v8<?oOsXU0`Vy98L~=4LRFVS?Ax$HObn4#oVbA$blQ8I zI0g!r2;(AMe1PGC&-X#{)O+wH#>pJo+52_<9nAEJ5XGInp9)?JQGP=j1kIhm6tye{ uGLqk1A%+<7tP4zy4jC>HL-p?lrvIPm^gn&-mY`Zer{lxk%UGot$CW?CVq+u# literal 1160 zcmZ`&*-{fx5IvJ^vP=@fs;CHpItfZpaU(H`2vt-Cmr6=Y--hH$T}&o%GK1z*`~qHl zP)kFVR`~(`i67vrdTx>eS$w(O)A#i0?$dXE{QmkKzyemINWs*Rj=~2sf&pZdH>-|I z>h5xsF@B~nrz0D|Jg$UsHHvFkP?+oLxS`{wj$0anuRY-j4I{-ZYun0tuB>I39LH)G zWy{TJh?L}}ZMmL9%=mGbe7T$}5E#l!Te<}eelz`4Ltwd4WlFLrZSl~nZwRMsZPXai zWoxD0blY9v3j$lhuCl(_Bd=NZX7<s>mZ-Qn#S=2guN>VG6(P6DFl?reVl~7|u2p%p zZZ*4wI5~$i)6C`&j;J@b#Zs-N!OWKzkER!nhBQP=4bQ2FRjK+m*4s~%RC7uv1EUzz zFm#M&1_m)?U>v6m+{U7T9L5af6?~!#?@qX8yTWn2rYou|Z!4nd%7(4uj)4O1QjCAD zC&m8#Jp)U)Z(tb@46G<hqe7Xp{nj)L>{sY%NR_SX|Kz3m5xe2am+h`Hfj5?P4{(&) zEmzdZ(eQZDe<HGxee6ivExC@c>QuL<!oe{2)l{IGeQ34JlJ;hAwY{w<z}m4J4OVKx zaxlf`oZ{2h_-?5!?J&Q57(tLe7s2xcBlGan0|qj?&@$iPd%g?*7X&_bb5HV25CMb{ zKm<udiRPO6*^{&?JDmB9KnKD1ds(4wJkCB&;|%MnT645M+Jr*Sb`W}&=|DeRDaAU2 zh_mNj#}ni@i^)ER>~l;rHT({vG?AS@zlxs_8#FqI@BI0x*!>+OKClHHF%F=9UNy=D zzro>kwiDwJ2}Y9~XN>+h+nnNUnB%VNI2Y@epJsGsPp+AR11I;JS2aK^Q|a|uKaUHH H`Ec<seKzU} diff --git a/antifurto/bin/code/Pair.class b/antifurto/bin/code/Pair.class index 86b1dcf26b53593f2adc887c6453e5aa817d353f..63c21e1fcc5b31b57a8ebe1d164faa30bbad0c41 100644 GIT binary patch literal 899 zcmaJ<+iufP5S){n9mj6cq!$XbB)!nYDfI)7L4Dz>Ds7Px74hh}mgUgek>emfD@Zhz zK;i@VD8!sNG(aO{dG~m|J3F&`e*FCU9l#MR4Jo7*WOQVa6DalVkG6Gb2cC7->$^@Y zkbC9_etaa5t~bu}P?1-l=_o)K$UEVMYrVDoNFW=B1K$xSx91q0IPwFpC99Tn6lF>J zYUn9g7N~@gXZ43+U>$ePPLpmLN=U0HNWZFM4eKlzjL4!@zYF_EBq?t-+6zEiDvBBz z+}H5{4+Zo%JZ9V9`qt}<t0adl9gk2IP~$L>BCx{rI|3DK3#|Rs`{gIc9mIYZXsBUV z$DSN-alm=Ro!E9hbR*kw1@`~1Yc{~fxj^PQXHAH<AGoKZtDYNm?cOCLs^`YtWcE28 zPlld=cH4d^U`!jH*n?St)(J<E<G%7`bzW}oP%0u%mA3(WQ*yo26L&_R1^0``wEO&e zD(?(^(Y%2$o7YgxgKHR{84{?|mXV<?(CWy;z!D#U2C6fFO?ttMtoa4X__i!J4KCA~ z3sa4MQ&*YFm6DF6^@5}%{pvTA-rw*ZHp>;+V1ku*&GJ1Sjp=cYlJMM+cLNn7Z4s+U zgbZ<Oe7SpCiT#>hVi(N`HYV5{x0@5}h%v)}LVy~7&!x*rZd3XW#qZ&OIn?$>nSwsy IR|<!}08ApMk^lez literal 902 zcmaJ<ZEw<06n-uR3Z<h^HgV3mu@?sgR}=j<;}>7Eu+0Rb@nh*4Qrucnit%S*;#i`I zKfoVld~TT|$}~;Sx%b@XKIc5=+#f%`eh2Uv4>c4~%VP;!(rl~P(U3+h2SfVZ9LgHw z_vL0!MO{My4HcG(ra&eRhrTOdwg=8f$3Am{zTJr<Kj<F_DCeWTK=z3r`0-PLz4{_( zG17P|kbV}PdICn<54_{?dC!ZwPVbD7T;Gekvy992#^PmWBjQM=)#LDR6b2`~f#=2o zRl>ulZx0x=4?8EvvjbMCz4+vM!`Kgl5fjAWtbBo`PVBfJj+|kVo5Bh0gyYEdUiz|@ z{2RxQ_N8ncCR#cSlysC)5~$peNyh{1>sZAd9d}U`xb+9<x(FRMT4Z<G0$ZjKD9wBO zTaHqfeNu*FN;~*}U$2DzOTIDWwBkf-H*#DLH4eMTmyzN}Ny&<;=riD;QK4Pt?h(%w zdc(Seu$mW0S*;5wpBWNZp*8tnz{iq?4*9Z*{3sjMD}r@;K}5#-g4E>tS~dxmX>Z>M zRsM#q5X!c)99h<L7L}sk{D$=VOJv$jGb<BJp}uRHIWCoCIcJ&Gxr!V)Dp<ok&S#Ab zY4R5Mb6T{L`xU+9HmoV~Q)rWRa|&Hd7zR`l6nH$BUSnj7(zhvo7wg1O+iR5x1U9%! GVe=O}d#4ou diff --git a/antifurto/bin/code/Publisher.class b/antifurto/bin/code/Publisher.class index dca9fa9c1be2a8ae0466cd03d57b3b89df74dbad..7f601d48df6a54254ba827d30fb5fe762a636eca 100644 GIT binary patch literal 1042 zcmZuv*>2N76g`uqapE{h(+#=-1xmBE2FmWL5~|=SDMg7Y@i=h?XG&@ZXI#M-^%;q# z5=e+=K7tS7fpQ&3Z3D>i%-rqVGk4C9-(S7~*v6KQ7~&cd1}2bXm^|P|-0X7KF`FG< z@HRtoOS)2RGsKIf{WMZYYtRj3U@+utuPw~Ipw*TAj_?^0<lyA54FmO$uLBVXE3C>H z$YYY=?5-59qE=DPb63f?fv-GE!xTe0LgdodQNT<{YnEZHSi2zBP`-2>>t9c4U&j?( z)i7^h0gDXAWfnxPFI>9N>}9Z5tpi~zD=J+!a1GZPG+)?49tnn-V(C(!QF6#^#lTJ6 zVn{hcHNBp+|IQt;40Bfv+zE4&lw0pRI*KT1C>yARcZ+6tJ_d$tFPdjvsE*gxu+C8R ze8&_txn5tGJ>K!mXo}|Hd!>#x%{px_KG>qCr043W!ZdI<e9wH3W~Ca6+wYn_x9LXd zhICx60-w%{W6!h|S$i~lYujR2DUOA$$T}xVGoz92kN~JnO}b(?IBW^O$y;6WY>XF= zWB(5+&mBhwt|NE6L+-Xc(wiT+G>swoI`55u^@bPtws<MSF1d5*ZG`&33JEPn!j92L z0tLgpp>>~ZQXie;<eR`I*$>DH_c-nO@+nxkassVfJwf&pxfmYOI)wzSI;|O`2{4E3 z2=WnSJjN`o5l~{7IsFxdH<jusrgzJqp{)-vcLA0g_L?NP0s&7^=@TSJ00G59CaYoD z088IdsL?T78Q=!}w+C1|Myg&NVB`4gClzH#;>+~Xu_4a|0s@IYgL(2VQDlLnyhs{d d##4&S5%?MTV;WK#wPzZtzlbrzGm6Gw{Q=VW<JABF literal 1355 zcmb7D+iuf95IviOx=q{*Nh!A$C{Re!P;<Yf6iT_gBwW<05|6ICI18z59J_-5;2(HK zf*^r}c;+K`<TEH|?GPH^1zBG2%$%9CXLkJc$H&hAF5<p{jKG-VZ%XS?ywO&jmJAK# z1SX!@+qTuVJ=a=mh0@*>$Ps1}-ALfgSC3;E%euhGs&YL$ibE-Icp$i#T90fM)|ZGJ za@tCI5v!+xWiL`s<1q4dY*BeCS`wHo57emt39YOPEDT}>dH$7<TcN}}vY0SYz+QoD zxw1Y2fs%<m7}C3aCPt7K7;h*~K8UwAWVmK;v?;3C@EyCoZih<SJ!dXzsZL)>zj;(L zH3)wd{7M<OU021Pt5*Ci+uQU7PL~_M`@9;3%5&>~dn)S&j<C<^HL;m_%;1<7GM&e9 zoHTGkz}$T+CgyO8H`b9JFK*v%mWLb9q!ZP37xzSdpd795uS2jwTOC(G1OkP$p~)@M zAI6?$T`*zctbh?pN2+bMX|i0|Rj9|Kk9yw31zZ#uc4f4dQVwE!$~E?~i7OgAL~OI; z=5Y;m1J{2IX@6o&EMi(<G)SkmDWjIZna2`t8MrA>^F!B?9Jin&t-x;iRyumt){7|G zzF;-^x%<+QL8N@o#IhcV@qqo0RwLVaz82aJ6$!ozjsGdd>mN-jH0_`_DEU=C4jp+< z=}{W%56Xh>Ic7O{S^kO{KAb~ZMq&-q<}`AjrLO>!b{ZMQ7`@MF>%8&m2fp*~QLNV9 zWAbg1FvYcq9M?S80t=Z;8pVEkj-_chfP=JHphv5BnlOVy^qM41W5e9>x5hMAP3*9u zu3Y+rnJ4qL4><au`VPf2UCe6o3^e&zLNdW}dwGyzLR?ML`otxiMmeD=p~78;=n+&g zpD3;|GbMaYTPvN@G+mtef|&-llk;7i<9n%#t8aF`H)~zoc(e13Nd+pH;UHv_qfAjB zcz^=+9^!L^T8=aFyBBl4BNgb=^n#ciZexW<y2IQOzdO{QF(3?9=CVZ4U4}Ba_Y-#X BBANgI diff --git a/antifurto/bin/code/SubscribeCallback.class b/antifurto/bin/code/SubscribeCallback.class index 5853d9d9be62175292d7c385314bdc632a7bab33..1d482a3ae71725639e0a6261a65cf3d1aa32831e 100644 GIT binary patch literal 8241 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 literal 9255 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 diff --git a/antifurto/bin/code/Timer.class b/antifurto/bin/code/Timer.class index 453e7f52694373063e3dfdbee7b4c29d1ec4ba84..2edff9f10d2659030c9ea4fad254d1e005b90b87 100644 GIT binary patch delta 561 zcmXAlO-~b16o#MMkGXcZQ>%PKLFz|sr$Rwd(IN?(CMvFI*cmgn6Rj57)MDbQD|c?l zBqsg>))HEc3x9xn6ZS6r4Q{Mw#>GAFeb0H%=b81>>i_ur?K`l=1DhCeO~R1GQe<9v zZ@qHMJ9ts9z3lp4Lt$+;51PF#MZ8elOL2~r#x{&$6n4Gc@XNL4zTZ_O8-B}sr%(?= zRoZYqlvv{Jd5=Ta1;a(g6^Wy#)2pFl(lEueXuQK-d*4$yJ5j;yh*oT7nbXW0vMdB2 zRNk?<#F8dwxXhK{MCG&L{MQV5uFC*#TE5?r`h`cuJxwvFsGO6c#0|}|VTE$=Tdhfv zHEwEd8P>TS%)~a1K34nAZqKW~e&Tg%-t(3(o9(s_yLG?Xj7YTMN_ZP`GIvaFmk=vA zkY6lZG(y=fLRl(88Hqb6?h31lE-5(YenGkO1GJkR;JC{JGVW|YF<|1egcTd12uo~A zn%H8;NK1op9JxnY6!#?hzi3B_hQpNHQznMYd>Z|cUq+rYWKlrB|H{?l(XX8o+|rQM k<I$O<PO`uf1xXE?EusnX@$A%nAzGZzw8Rt@p)of90pmVfc>n+a delta 501 zcmXYtPfrt36vcmUI_;z5s~`%}Qj`kTb}AJ7i-IhhsJNnG!G;X&1V%?_YBe!&>j!9N z<<4D~Mq{gS;nIbB6Lv2A6l|<_8W-=LdvfnNIq&{Touqbu{{8kHxW%SJhRbOT^KmJ} z<w{%@92U9iP~=*?Qqq*uxKtdjv!q$pR29jlA9}A9>Y*YfeaCy;eUt0H&!&ZM1V=$< zGy1J+dx=tcN0Hg?c#UUIyjI=Y4}CFIINQfB+YP@Kguak^@Z4`NKlNUDhADD}vy2-i z;&P5j!+9=fRt&4$(A+c<|F+={ccXPxSkbH*?r~qUZrI>~_%)83esyH3n22qwp?7pp ztsl01ui5=k?4B0K<r6PL-)|}G(xdWD6sXmxr`Gl<$PqGfBO5EuA)OUR8KI;Zp#&PC zlDN|-E()v3UQ#gUenGjjeJnTMC*dyjvE8iQC;3sPikawxRoKds`>$(>&XP&R{Y-K| z>fP{EI$K_1fEKXcer2pT{Im55r!wG7Z+IfoDdw0bEz+4NpIDfl6$>qFPm`DNoKTBP F{{Us4R?`3g diff --git a/antifurto/res/stato.json b/antifurto/res/stato.json index f2d5b92..2eb08bd 100644 --- a/antifurto/res/stato.json +++ b/antifurto/res/stato.json @@ -1 +1 @@ -{"soglia":32,"stato":0,"valore":0,"tempoAllarme":"2022-09-12T17:55:30.663368"} \ No newline at end of file +{"soglia":32,"stato":0,"valore":0} \ No newline at end of file diff --git a/antifurto/src/code/Antifurto.java b/antifurto/src/code/Antifurto.java index ab9c2a5..9337c69 100644 --- a/antifurto/src/code/Antifurto.java +++ b/antifurto/src/code/Antifurto.java @@ -221,7 +221,7 @@ public class Antifurto { public static void main(String args[]) { - while(true) { + // while(true) { try { startSystem(); } @@ -229,7 +229,7 @@ public class Antifurto { System.out.println("Error: "+ e.getMessage() + "\nRestarting system..."); e.printStackTrace(); } - } + // } } diff --git a/webapp/public/conf/conf.json b/webapp/public/conf/conf.json new file mode 100644 index 0000000..589ec44 --- /dev/null +++ b/webapp/public/conf/conf.json @@ -0,0 +1,10 @@ +{ + "self-server-url": "https://localhost:3000/", + "keycloak": { + "realm": "test00", + "base-server-url": "http://localhost:8080/" + }, + "domain": { + "base-server-url": "http://localhost:3001/" + } +} \ No newline at end of file diff --git a/webapp/public/js/authentication/configuration.js b/webapp/public/js/authentication/configuration.js new file mode 100644 index 0000000..45d85cb --- /dev/null +++ b/webapp/public/js/authentication/configuration.js @@ -0,0 +1,27 @@ +"use strict"; + +import conf from '../../conf/conf.json'; + +class Configuration { + static getMyURL() { + return conf["self-server-url"]; + } + + static getKeycloakInfo() { + return conf.keycloak; + } + + static getKeycloakRealm() { + return conf.keycloak.realm; + } + + static getKeycloakURL() { + return conf.keycloak["base-server-url"]; + } + + static getDomainURL() { + return conf.domain["base-domain-url"]; + } +} + +export default Configuration; \ No newline at end of file diff --git a/webapp/public/js/authentication/requests-to-domain.js b/webapp/public/js/authentication/requests-to-domain.js index dfec455..6c83e31 100644 --- a/webapp/public/js/authentication/requests-to-domain.js +++ b/webapp/public/js/authentication/requests-to-domain.js @@ -2,6 +2,9 @@ import {getToken} from "./script.js"; import Domain from "./domain.js"; +import Configuration from "./configuration.js"; +const configuration = new Configuration(); + class RequestToDomain { constructor() { @@ -13,22 +16,7 @@ class RequestToDomain { * sui domini dell'utente che ha effettuato il login */ static async getMyDomains() { - /*const div = document.createElement('div'); - div.innerHTML = "cliccami per avere info"; - div.addEventListener('click', async () => { - const responseDomain = await fetch('http://localhost:8080/realms/test00/protocol/openid-connect/userinfo', { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager - method: 'GET', - headers: { - 'Authorization': `Bearer ${await getToken()}` - } - }) ; - const domainsJson = await responseDomain.json(); - if(responseDomain.ok) { - console.log(domainsJson); - } - }); - document.getElementsByTagName('body')[0].appendChild(div);*/ - const responseDomain = await fetch('http://localhost:3001/secured/domains/', { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager + const responseDomain = await fetch(`${configuration.getDomainURL()}secured/domains/`, { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager method: 'GET', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -54,7 +42,7 @@ class RequestToDomain { * false altrimenti. */ static async createNewDomain(json) { - const response = await fetch('http://localhost:3001/install/', { + const response = await fetch(`${configuration.getDomainURL()}install/`, { method: 'POST', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -75,7 +63,7 @@ class RequestToDomain { * disponibili. */ static async getAllServices() { - const responseDomain = await fetch('http://localhost:3001/secured/services', { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager + const responseDomain = await fetch(`${configuration.getDomainURL()}secured/services`, { // DA FARE: controllare che l'uri che ho specificato qui coincida con quello specificato dal domain manager method: 'GET', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -96,7 +84,7 @@ class RequestToDomain { * @returns */ static async getUsedServices(domain) { - const response = await fetch(`http://localhost:3001/secured/services?domain=${domain}`, { + const response = await fetch(`${configuration.getDomainURL()}secured/services?domain=${domain}`, { method: 'GET', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -117,7 +105,7 @@ class RequestToDomain { * false altrimenti. */ static async startDomain(d) { - const response = await fetch('http://localhost:3001/start/', { + const response = await fetch(`${configuration.getDomainURL()}start/`, { method: 'POST', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -140,7 +128,7 @@ class RequestToDomain { * false altrimenti. */ static async stopDomain(d) { - const response = await fetch('http://localhost:3001/stop/', { + const response = await fetch(`${configuration.getDomainURL()}stop/`, { method: 'POST', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -163,7 +151,7 @@ class RequestToDomain { * false altrimenti. */ static async deleteDomain(d) { - const response = await fetch('http://localhost:3001/delete/', { + const response = await fetch(`${configuration.getDomainURL()}delete/`, { method: 'POST', headers: { 'Authorization': `Bearer ${await getToken()}` @@ -183,7 +171,7 @@ class RequestToDomain { * @returns */ static async getUserPriviledges(domain) { - const response = await fetch(`http://localhost:3001/secured/priviledges?domain=${domain}`, { + const response = await fetch(`${configuration.getDomainURL()}secured/priviledges?domain=${domain}`, { method: 'GET', headers: { 'Authorization': `Bearer ${await getToken()}` diff --git a/webapp/public/js/authentication/script.js b/webapp/public/js/authentication/script.js index e031192..169cb37 100644 --- a/webapp/public/js/authentication/script.js +++ b/webapp/public/js/authentication/script.js @@ -4,6 +4,8 @@ import App from './app.js'; import RequestToDomain from './requests-to-domain.js'; // import * as jose from 'jose'; // per la gestione del token +import Configuration from './configuration.js'; +const configuration = new Configuration(); const mySecure = new Secure(); @@ -13,29 +15,29 @@ let alreadyRefreshed = false; // true se ho appena fatto la richiesta del token let oldTimeout = null; const uri = window.location.toString(); -if(!uri.includes('#') && !uri.includes("/secured/home/")) { +if(!uri.includes(`#`) && !uri.includes("/secured/home/")) { const a = document.getElementById("my-link"); a.href = a.href.replace("$MY_CODE_CHALLENGE", mySecure.codeChallenge).replace("$MY_STATE", mySecure.state); - sessionStorage.setItem("stateSent", mySecure.state); // state inviato durante la richiesta dell'authcode + sessionStorage.setItem("stateSent", mySecure.state); // state inviato durante la richiesta dell`authcode sessionStorage.setItem("codeVerifier", mySecure.codeVerifier); //automatically redirect to the login page window.location.href = a.href; } else if(uri.includes("#")){ - // l'uri e' del tipo localhost:3000/secured# seguito da parametri - const uriSplit = uri.split('#'); - const params = uriSplit[1].split('&'); + // l`uri e` del tipo localhost:3000/secured# seguito da parametri + const uriSplit = uri.split(`#`); + const params = uriSplit[1].split(`&`); const uriState = queryStringGetValue(params[0]); const uriAuthCode = queryStringGetValue(params[2]); if(!sessionStorage.stateSent || sessionStorage.stateSent !== uriState) { // get the body element - const body = document.getElementsByTagName('body')[0]; + const body = document.getElementsByTagName(`body`)[0]; body.innerHTML = `Errors in the request!`; } else { await requestFirstToken(uriAuthCode); // post per la richiesta del token if(token !== null) { - expirationTime = moment().add(token.expires_in,'s'); + expirationTime = moment().add(token.expires_in,`s`); sessionStorage.setItem("expirationTime", expirationTime.toJSON()); const myDomains = await RequestToDomain.getMyDomains(); @@ -49,12 +51,12 @@ else if(uri.includes("#")){ // {nome: "casa4", stato:"on", admin: false} // ]; - const app = new App(myDomains); + const app = new App(myDomains,configuration); } } -} else if(uri.includes('/secured/home/')) { - token = JSON.parse(sessionStorage.getItem('token')); - expirationTime = moment(sessionStorage.getItem('expirationTime')); +} else if(uri.includes(`/secured/home/`)) { + token = JSON.parse(sessionStorage.getItem(`token`)); + expirationTime = moment(sessionStorage.getItem(`expirationTime`)); oldTimeout = timeoutRefresh(); } @@ -64,7 +66,7 @@ else if(uri.includes("#")){ * @returns il valore associato al parametro. */ function queryStringGetValue(queryString) { - const arr = queryString.split('='); + const arr = queryString.split(`=`); return arr[1]; } @@ -75,18 +77,18 @@ function queryStringGetValue(queryString) { */ async function requestFirstToken(uriAuthCode) { - const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token'; + const url = `${configuration.getKeycloakURL()}realms/${configuration.getKeycloakRealm()}/protocol/openid-connect/token`; const response = await fetch(url, { - method: 'POST', + method: `POST`, headers: { - 'Content-type':'application/x-www-form-urlencoded' + 'Content-type':`application/x-www-form-urlencoded` }, body: new URLSearchParams({ - grant_type: 'authorization_code', - client_id: 'myclient', + grant_type: `authorization_code`, + client_id: `myclient`, code_verifier: sessionStorage.getItem("codeVerifier"), code: uriAuthCode, - redirect_uri: 'http://localhost:3000/secured' + redirect_uri: `${configuration.getMyURL()}secured` }) }); token = await response.json(); @@ -113,15 +115,15 @@ async function getToken() { * Post per la richiesta del token usando il refresh token. */ async function requestUsingRefreshToken() { - const url = 'http://localhost:8080/realms/test00/protocol/openid-connect/token'; + const url = `${configuration.getKeycloakURL()}realms/${configuration.getKeycloakRealm()}/protocol/openid-connect/token`; const response = await fetch(url, { - method: 'POST', + method: `POST`, headers: { - 'Content-type':'application/x-www-form-urlencoded' + 'Content-type':`application/x-www-form-urlencoded` }, body: new URLSearchParams({ - grant_type: 'refresh_token', - client_id: 'myclient', + grant_type: `refresh_token`, + client_id: `myclient`, refresh_token: `${token.refresh_token}` }) }); @@ -129,7 +131,7 @@ async function getToken() { if(response.ok) { alreadyRefreshed = true; sessionStorage.setItem("token", JSON.stringify(token)); - expirationTime = moment().add(token.expires_in,'s'); + expirationTime = moment().add(token.expires_in,`s`); sessionStorage.setItem("expirationTime", expirationTime.toJSON()); oldTimeout = timeoutRefresh(); } @@ -163,7 +165,7 @@ async function logoutKeycloak() { if(token == null) return; clearTimeout(oldTimeout); // DA FARE: funziona, ma vedere se fare il redirect alla pagina iniziale. - window.location.href = `http://localhost:8080/realms/test00/protocol/openid-connect/logout?id_token_hint=${await getIdToken()}`; + window.location.href = `${configuration.getKeycloakURL()}realms/${configuration.getKeycloakRealm()}/protocol/openid-connect/logout?id_token_hint=${await getIdToken()}`; } diff --git a/webapp/public/js/scriptIndex.js b/webapp/public/js/scriptIndex.js index eb6474b..6895400 100644 --- a/webapp/public/js/scriptIndex.js +++ b/webapp/public/js/scriptIndex.js @@ -7,7 +7,6 @@ import Scenari from "./scenari.js"; import Luci from './luci.js'; import Admin from './adminControls.js'; - const logout = document.getElementById("button-logout"); logout.addEventListener('click', () => { logoutKeycloak(); -- GitLab