KontrolPack-3.0.0/000755 001750 001750 00000000000 11444436350 012145 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/000755 001750 001750 00000000000 11432774313 014475 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/kontrolPack.ico000644 001750 001750 00000276436 11426532116 017476 0ustar00000000 000000  ( 00hh6  f00" h0 5  >00 %NO (t( `f[JǝHtbHաwslfV8 ÀGf $ݫ"Mv"".F N//".̌..Ȉ. L NDFD tJԤ`(0 ݥx\N9ոjypatN@4#b;!jjf`g{zfK軦k`h<<̨`ʈv|33<<̞3=33< =3D%vwwxwwwg6T3=Wwwwwwvs3Cvwwxxwwg>5D33gwwwuc3T@ =3WwxxxwwW=d@3=fwwxwwwV-ݵ@M3;ewwvm;D336gxuk=P3ugxvg=d 3VWxweݴ ;;VvɜwVc437Ufxəwec56Uwx̙weS=45Ugxəwe[635VWxəwV[=635UuəwU[=Ի35Ugxəvu[=35UUx̙eU[345UuxəuU[3=5Ufx̙fU[34 6UVxəuU[34 1UUx̜eUk31UUh))ə(UUk=>eUh"̜*(eU3@Uh"),)eV3@6U[",̓"wU[4U["""""vU[3eV33<=<22++U3D5U<=3##UV3 Uc=3#US;0 ?V332e[3;@ec>3U3 1U;ec;@[33fV?; Ue[1;@eUkӰӰ?3333????(  ]B{{yʿURMvR1[R(\F&.UF2im W3ԪkbbaLjvG.4-$LUE*kkkkyrh3" oi?Ȁڃa9K/ pom_L0>dddSoBYWU{{{lT2g[6Ettt֜~O!OWK,v¿.'hG9"@<8q5(Ʊggg}Q0YO4gJ؝D\6uTh V3MmcSȿpB5- TA&Lpppurn/"Sb9Ҁ ܏B5#s6#¬rF*VNӑ-Kȑ~~~а~Y5n aU:T.rngXG/.hhhS_T0{ǷnAt3Rsl]}hBƏ1Oo\EjX)cU9HDN.:ǵJV!Ő-"̄+=<?FudՕLWMͣxpG֯`nrZq@ќ7;ɫIe y/*8CP_z%wS¾^($&#4|0 mKv6Y5 fg,Q2 {A> aTi[ k'b~(0@ޞ&)~QA&xիِΉ_,$rCʤE>91d;.i?1MJ{ВbA<4ptFvodT2·  aL*ɧsrokoم F,uVk@/___>qB7'YþՌf-RRRa*ɼX4ztjLHg {jF*soeXQ2!l?0Q5 R2~~~iii4oAXлpppE. ؎sޱmXK8zxv#ƶV4vqgyIœbcϚw-fgggQ4j>%h<B(?&Q0a:޾$Q?$<$Tfd_hF,ʃiا]C@<\7[6vvvOA,V)(&g~qD*ske]Q8"D9(`9P0?%C'0! E)Hz{{{z3z/*zx;lBBGxկhw_009oBzxvr90},,,Eklzxv$_Ecmc,E_BzH[_ cNNNCmcE0?laviffK_hA- R^ )ԃ${x[}>\F&&J|ʥ-7"i'J=@&1<7~"p'4FuJ><7ZцdSgqR)ѠB"djguuSdyZ勍LjTi͓W-.M+:(:Tn6~.D82ODo.͓PA.bO]]8a~b26/7XO-7QPa7La( @Nۧb:,W4ەb`^hS2ޮa]\ZhځeleZR7!֩5h>ĺ/P}}}pyd-&FoJьT2,H3R|q݆ L.Ǘ~VIW?E)$oXܺO/vWRLQ}ytk;Z9$U4ϕSRQuncYH/Xf$oR. ǹ+D80FigbGɲښ ^CoGnCc|ӏӐ^ ڝGGUZb###R®#H^no_) -\X ^Gy¬X `Az Go}f`\ᛘ-їBڣy#_ᘆiii O yb1 Ȇt>KKt ȄE*IOtdddd%>i 1b^Gߜ 󀴆Kd8QQQQQxxd%>-_L`ŸtP[Y[.P#c*1O>P.lll[Ps_yӳ>P[qlPUL9WJrvlYP8O1_3LBpwvJrqY.98OŒ_MLʳƶ2׿?q8sj#L&swTg2קJvT.8j/LBކw0TgW׿?vTwjMLߺFs$0(T"2?JrgT(0e&})e(a"2r?r"T(0esh԰jF)", WrW""a(@eF_4LpF {{N,], ,@@ XFӜ;_& {NN]]]N{@ F&_Z}Gyә&6kkAI_p_3o&_6ͅkkkҗ_B4Lʒ۷A˙hyLp&ZL_&#_&}n٩H&۳_&pb3yLº¡ðGyٹL??(0` W<Ź.O@8+/+$bߥMStw]<$rז/ʨ)Rlkkrqqjͩq |yu~<oB5 mO=!դS2+qBڄ{{{amAA@KHBU2%L;%aemcTw^Yd ;98ONKQ-ɴQYqR"`_^w>pkdL.nHw·G+V4.wGR7O0δL.U5rD+V3F*;u)|IJ,g=%[7ɻ@&R0* 9"k@&B'2Y5wa:!R23C)$d<keQ3| ʘُusoOs vvvponqEՇڋ{HB9)lA:#[6A&'IoI'"ϊ_N'&&d&d&d'<I&z᳐2222tKe'ϊo%؆PʴPPِ'ϊ_DPŲ7Ӽ7ǴPٳtd'knP:88jYyYj7ŴPٳe_"ř7Y|ȡ>ȉY8PY&_n78QY|>>5j9P',Ų8Y||>ͦ//µ|5:ŴtI28|>ͦSSSS/µ|7ʆ'ϊPǙ{۫|¦ f$$$ff SSƼdžt"k2Q5|¦S fLLL$$$$ff Sղeo_sPP5|œf$mmmL$f ˠ7&IY/ LmVVccccVVm$ ”PzϷ?25|>¦S$mVcc(((((cccmf/͵|T+N,PYT>$m (( LStIsP0| XX*rrrr**XuC(0ų_趐ɫ| uX*R #MMMg##***uHP%NٳP0˂/ uX*####*XXu(S|0Y'> uX*##q#*uuH|5os5>FM..vv.#FXuHS|T2sTCaRM..Б.]#gFXuS|ɢP趐2AmCFg𑧧6gaCS|ɄP&足ِ0Aa q.Ч6ԧv.gFCS|@YP&趃P0|/CaFg].ԧ.gFHS>@Y2Ų%!P@0˚/CFM].Чԧv.#RaCCȁt2Ų&Pǃ@ R4Чԧv. RH>˥@Y&s̄r4v6ԧv. r @Yos7@0 GBv6.4  >0YoUmpbG44.B.Б4b V|̢YNZμ@0-WbG44BBv44GV• YUl))xx߿44GG--V@s@TyW)))xBxxbWl-y|âtPtTyW)))݀݀===x))l--yy0UUt3_âYWݖ=======݌))WWlyۈUt탰,tUU0jjj)lyۢkKU5[iQQhhhijjY5t,Y[iQQQ[jYU􃳳`ϊs^UUQQ{{:::{{Q[jUUK3_{::777::{Qi[UtكEKUQ:{Q[5+Ptt988899:ƃYUP7E^^Yt9889UtYYt U8Y t^s^^Os^7s????(  @ -pppkkkhhh{{{9صgggܞcauTkttt~~~¿]BGOOKnAT2vddd2_L0Y5oBSUVTNi?U:rU}F*pBRgm n h _LW3\F&_XG/a9ڃ(KS>WT0mcSܱF2b9Dq. [V3G9"뫫6#\6Ҁ !hEYQ0/ 𱱱3" R1Ȁ4sT܏SK,/"껻s5(E*.MoUӑ-~OA&5- rng.lа~ȑ֜؝LjԪkLgJ.bbaR{Ʊ¬ǷiB5#.'A@<8yrhʿȿv4-$YWU pomurnURM⬬uب񿿿{{yC(0 ` Oxlllbbbeeevvv^4 #xiiivvv鈈gggSSSfffL ~~~񹹹vvvXXXT.rU\@S3U4T3dJ ggg膆y afP/Q0a:k@sFvGsEj?\7P0r_Bzzzu 1G*W4lA}LRSQOLuFi?U2H0 mmmㆆyƭB'Y5i>LUWYZYVQMi?Q0D,fff*򬫩^N5I,`9qCQ]bf h e`XQpCX4E)|kU|{qb<$a:guېՌِؐՍے za[6@* ddd˔D2B(pAڀ!1DG=( hh;?%ypbzzz&4F*tC} =^xM'kk>B(OA,Otnf2C'rA{)Ys8 ok?B'7(Yke]0@&oA|.d? ׄ pg=?&0! Ukf^.?&m?z7lF!ۇ pb:=$. 6|xt(8"\7w ٔ*HqV3Ռc^850$}}} ਨ$.M/4ӜH[nsV<Ɖ-a Q1,70$|||Ö-%#C- cΦh|Ӎ؏ׇvdϛLBh'D*"JGB9rqm8'yũغȖΛ٦עЙ‰Ԯv`Pd47#! kkk!έB@=ŶǶòȽ~ziD9(LKI]|uižɼɼõ~q-"yyy4֗yskºG?4CTNLKEA;qlf*&bbaD<;;('%## )(&JII‘ ( @  $Okwwwjjjbbbccckkk}}}^BJ{{{iiippp߁򉉉vvv```SSS]]]x8 0ixxxœyyySSShhhM%¸ĻlllJJJƓlĸrUfM&S4T3U4T3W9 nV0XXXU hxR7 R2X5`9c<e=d<_8W4Q3aH!ttt^^^5 ý[F%G+U3c<pCwHMOOM{ItEj?a:S2N4 ```eZ~nVG*R1a:qD}LPSSQPM~KuFmA_9O.H0 mmmiii MK8H+Y5d;tEOUVXYZZXUQOtFc;Q0E)wiSuuuv=$N/`9l@}JU]`d g h f c_XS|Ji?X4K-G1WWW0ȗdT=B(\7wEMZhr w tvvun n ibW~Ig=U2@&wkYmmm䮮QU\N9:#L.T{(./+" ݁i{HH*7!~~~D2<$P/Vڀ !+;FGB3#h~HK,9"ypbuuuω7#>%R1U}/=Udg_I2 hHN-;#bVDxxx>\TF3?%Q0Qz߇ ,LgT1 oKP/=$@1}xoOJ?/2=$P.P{ވ 2Yyb8$߅oKO/<$7(oi_Y<0 0;"L-R|8dn?)ԁp}JK-9"0! `ZOU:0 .9"J,Rzފ DlvF+ׄpvFH+7!. \VLJ=4&,6 G*Qx׉0QuQ4}htEH+4/! [VMSOI%.=%yJ|ӗ:KYqpWC0ƃaf=?%,4*`]Y eda$)8!sI 4̗DS]nnVCӓ3&a `:9"(70$dca& %2pMQ̝V߯csՂߊ|lZߥJʑ:1eW54#>80lkjD?8%kS-oģpҮu㾃Ɍΐӑߠߞ٘ŀvثdɛSFBf-O3*ZYW/Ʒrqm&dP0y~ϱݾȖ̙ѝ٥עԞɑ⾅ԮvǠgXKd4E- "(#kkk06,úĵǷƵò÷s|raD9("lllï,*&#|uiɼ̿ɼƸƼ|vm_-"DB@ꡡE=1þø]UI/-ܟA@>kf^ľ?90'$ +tss*'#_ZTqlf@;4! 4+*)52.VRM}pmf@<7$"EDC-5ޫ񰰰 ]F(0` % ,G`o}zzzuuuuuuzzz{p[B.(Jd|||hhh```YYYWWWSSSSSSSSSUUUZZZjjj}fC" 3duuuiiiqqqjjjTTTNNNUUUvvv[6 6sqqq韟{{{XXXHHHcccf,&Wzzz```IIIrrr[ 5배Ķ|`kJkJsTvƼMMMNNNs( @ƺtXaI"O2Q1S2U3X5X5X5V4R2P2X=~jKpppIII/ ~ﺺs_@N3M0S2X5\7^9`;a:`:^9Z6V4Q0O2\BVVVYYYV "|￿r_CK0N/V4\7c;i@lAoCrErErEoCk@f=`:X5S2L.YA___[[[e￿{fF,I,S1[7d=kAsEyI|KMNNM}KyHtEnBg>a:X5N/F+bN/XXXXXXSZjX>B(M.U3_9i?rEyIORSSSQPNMKzIsEmAd=[6O/G*N7___ggg9 /»S? B'L.W4_9j?tF~LPSTTTSSRRQPN~LyIpDf>Z6R1F*M6}RRRΈw-#WE*@&I,U3`9h>sD}KQTUVWWXXXWVTSQO{KpDe<[6O/C(=&YYYe|paL=$H+Q0\7g=pB{IPVY]``b d d c b`^ZVSOxHlAb:V3J,A'C0¼aaafff0M;>%K-T2_9l@uFMT[_dg i k l l k h f da[WQ|KoBe<Z5M.D):$wwwUUUED響xm\:$D)T2mAIRXbltz Ɂ ~y|}||vqq w rme\TLqCY4J,>%F3cccߍr@-=$I,e=`nu} ݒ֍ҍߖ "!ޕ ޕ ۂxhsDO/C(7!vgjjj+̘OA+5 @'M/l@dy ',2542,% |i}IU2G*:#@/___H:3!7!C)Q0qBd{ "-:AKOOKB6-! ހhHW3I,=$2pfXiiiڛdo{tj09"E*S1tDax $/?P]ippk]L>.  iHZ4K-?&3J<'񄄄{K@.1:"F*S1tC\v .`uӅ +GYhtN5$܋π |jtFT3D)8"-&`\U &'.9#D)^9asчܕ(8JXj{W=1!ЅvdqCW4?&4*%a^Z~,"&-7!A(Z6_rЌ"ژ2:HTcvrU>5)Јvbl@S1=$2(&b`\pw=7."(2<$R2\wј?ٞCQZckylnXI;ږ/ˊ&yae<L.8!.$*gfe󰰰OAROK$-6!K/\ 4ȕEϙGT\`g|~njVGۜ<̏2,y"b^9F+2)!4,!ggg2eee" (1F-b!W͡`Ҥ^kẁֈߋߊ߇wkj]NҙDŎ:6}1gU5A',$?;5ppp1+""*C- i3dǣlˤgڲtɇύד֎֌ф}yshץW̚NED~=h*P4<$')"NMKzzzYJONL#$>+j=päwţmѭw۷Ŋː͏Бޡޡݟڝɇ{r׫gɜUICEy?f-P4=$ :85```& 9726&|d>zƭѶڿƚ˞ѢԥեبקդԡϜɔĎݺӱ|˨tj`V|Nc8=) $#RRRvvvꨨj VUS .! eT9°˸ѾåǨʫ˫̪ͬʨȦàԽηƯzpf|[sSiV82" +(#fgf}}}:2/+!A6%Żɿ³ŴƵƴŲ°ȼµzovevkZJ?-"MMMc(!)sl`ļ¶ƺʽ̾ʼǺƸĺx{llcU3(:::fqqp=4(ýļǼú}ujJA4 ,+*(̨ssr LD9ýǾ{D=0"MMMI ؂++*71({¾xA:0 iii.׃ZZY&"[UNb\T-( EED+%ihh*&![WOTOG1,%:::q ֞sss+(#GC>[WOlhbupjsoimjc\YQEA91,'AAA2'YYYAA@)))$##555RRRxxx躺p Kھl!lÖ>  (XuގݛٕۛՃ`=(  &,:@GSYekow{}}}{{{xxxwwwuuuuuuuuuvvvwwwyyy|||~~~{xulf[UOB;.(" &,:@GSYekow{}}}{{{xxxwwwuuuuuuuuuvvvwwwyyy|||~~~{xulf[UOB;.("  (8AJ[du||||pppllldddaaa```[[[ZZZXXXXXXWWWVVVTTTSSSSSSSSSSSSSSSRRRSSSSSSUUUWWWYYY\\\aaajjjooouuu}vf]UC:2"  &0DOZp{}}}oooiiibbb```^^^```bbbfffhhhjjjooorrruuuuuuvvvyyyxxxvvvvvvtttqqqooolllfffbbb\\\YYYVVVPPPNNNLLLLLLNNNSSSWWWbbbjjjqqq|rhRG2(   &0DOZp{}}}oooiiibbb```^^^```bbbfffhhhjjjooorrruuuuuuvvvyyyxxxvvvvvvtttqqqooolllfffbbb\\\YYYVVVPPPNNNLLLLLLNNNSSSWWWbbbjjjqqq|rhRG2(  (3?Wd{{{uuullliiiiiimmmqqqyyy~~~򄄄~~~vvvjjjeee^^^TTTQQQNNNNNNNNNUUU[[[bbbvvv~g[N6+ 2>Yhwxxxsssrrrtttyyyۂ눈񎎎|||mmmeee___SSSNNNLLLMMMTTTeeeooo{{{j]A4(2>Yhwxxxsssrrrtttyyyۂ눈񎎎|||mmmeee___SSSNNNLLLMMMTTTeeeooo{{{j]A4( )6Dcsuuuqqqqqq}}}℄铓{{{rrriiiXXXOOOHHHHHHPPPcccmmmvfW9,  )7Xkxxxvvv剉xxxaaaVVVNNNIIIJJJZZZgggsssl[;-! )7Xkxxxvvv剉xxxaaaVVVNNNIIIJJJZZZgggsssl[;-! &4Wmzzz}}}̋땕xxx```UUUHHHIIIMMMcccrrrl[I) >Rf~~~{{{瑑eeeWWWLLLDDDLLLcccqqq{VC" 5Fw}}}디󧧧¶rhuXqRmMjHjHkJlKoOy[clƼʼvvvVVVMMMHHHNNNZZZzzzsK9(  5Fw}}}디󧧧¶rhuXqRmMjHjHkJlKoOy[clƼʼvvvVVVMMMHHHNNNZZZzzzsK9(  )=m̊ߔ󨨨¶zfpSpY6hO*Z?U9S7 R4R3R3R3R3R3R3R3S3S3R3R4R4S6U8 ]BdK#kT.jIxZĺrrrWWWKKKIIIUUUaaa{fR.! @VxڝƺptXkU1aI"U9R5 O2P1P1R1S1S2T3U3V4W4X5X5X5X5X5X5W4V4V4U3T2R2Q2Q2P2Q4X=]DfN)~jK|aú}}}ppp___LLLIII\\\nnnVB/  @VxڝƺptXkU1aI"U9R5 O2P1P1R1S1S2T3U3V4W4X5X5X5X5X5X5W4V4V4U3T2R2Q2Q2P2Q4X=]DfN)~jK|aú}}}ppp___LLLIII\\\nnnVB/  +B~—xsXs_@Y@Q6 N3L0M0P0Q1S2V4W4Y5[6\7]8^9_9_:`;a;a;a:a:`:`:`:_9]8\7Z6Y5X5U3T2Q0O0N0O2P4 \BjS1yeGfffVVVIIIQQQYYY~~~kV. A[ƒ曛񯯯pUo[h?h?i@j@j@j@j@i?h?h?g>f=e<c;a:`:]8[7X5W4U3Q1P0M/M0M1Y@gP.uaC}}}[[[RRRKKKZZZlllT? A[ƒ曛񯯯pUo[h?h?i@j@j@j@j@i?h?h?g>f=e<c;a:`:]8[7X5W4U3Q1P0M/M0M1Y@gP.uaC}}}[[[RRRKKKZZZlllT?  ";|Ġ着w_r_C^H'M3 K0K-L.N/R1U3V4Z6\7`9a:c;f=g>j@kAlAnBoCpDqDrErErErErErEqDpDoCnBmAk@i?h?e<c;`:_9\8X5W4S2Q0O/L.L/L0YAiT4oƿnnn___LLLSSS[[[|e9%JtÖ砠񳳳rZfQ3L3 I/G+J-L.Q0S2U3Y5[7]8b;d<h>i?k@nCoCrEtFuFwGxHyJyJzJzJzJzJzJzJyIyIxHvGuGsEqDpCmBkAg>f=d<`:^9Z6X4V3Q1O/M.I,I.Q:YD"q_Cȿ\\\RRRJJJ___ttt]E1JtÖ砠񳳳rZfQ3L3 I/G+J-L.Q0S2U3Y5[7]8b;d<h>i?k@nCoCrEtFuFwGxHyJyJzJzJzJzJzJzJyIyIxHvGuGsEqDpCmBkAg>f=d<`:^9Z6X4V3Q1O/M.I,I.Q:YD"q_Cȿ\\\RRRJJJ___ttt]E1)>﫫{fp^CN6F,G+I,L-P0S1W4Y6[7`:b<d=i?kAoCqDsEvGwHzI{J|K~LMNNNNNNNMLL~K|J{JyHwGvFsEqDnBmBkAg>e=a:_8]7X5U3S2N/K-G+F+J1 bN/wfLjjjXXXKKKXXX}}}lS) -T{ڡ봴x^J+J3F.E*G+L.N/Q1W4Y5]8`:b;g>j@lApDrEvGxH{J}L~MNOOPQRRRRQQQPONMLL}K|J{IyHwGtEsEqDmAk@h>e<c;^8[6Y5T3Q1L-J,G*F,G/ cO2u^|||UUUPPP^^^nnnxG/ ZʩjX>WB#C*B(D)J,M.R1U3X5]8_9d<g>i?nBpDrEwHyI~LMOQQRSSSSSSSSRQQPOONNNMLL~K|JzIyIwGsErDmAk@i?d=b;`9[6X4R1O/L-G*E)B)N7ZE&sss___PPPSSSgggiP# ZʩjX>WB#C*B(D)J,M.R1U3X5]8_9d<g>i?nBpDrEwHyI~LMOQQRSSSSSSSSRQQPOONNNMLL~K|JzIyIwGsErDmAk@i?d=b;`9[6X4R1O/L-G*E)B)N7ZE&sss___PPPSSSgggiP#  +BӦlfT:D,C*D)G+J,O/R1X5Z6]8b;e=j@mBoCtFwHyI}LMPPQSSTTTSSSSSSRRRQQQPOOONNMML~L|KyHwGsEqDoCj@g>e=`:]8X4U3R1L-J,D)C)C)YE&zjR}}}XXXJJJSSSuuur>+ ^»dS9S? C+B'D(I,L.N/T2W4\8_9b:g>j?oCrEtFyI|K~LOPRRSTTTTTTTTSSSSSSRRRRQQQPPPONNM~L}KyIwHuGpDmBkAf>c<]8Z6W4R1O/I,F*D(C*M6xhQ}qqq\\\RRR\\\nnn]E- ^»dS9S? C+B'D(I,L.N/T2W4\8_9b:g>j?oCrEtFyI|K~LOPRRSTTTTTTTTSSSSSSRRRRQQQPPPONNM~L}KyIwHuGpDmBkAf>c<]8Z6W4R1O/I,F*D(C*M6xhQ}qqq\\\RRR\\\nnn]E-?ٵſodT;@+?(?&E)H+N.Q0S2X5[7a:c;f=lAoBtEwGyI~LNOQSSSTTTUUUUUUTTTTTUUUUTTTSRRRQQQPON~L|K{JvGsEpDkAh?b;_9\7W4T2N/K-H+B'A'J5TB$wjSeeeRRRVVV}bG#:sӯWE*?* =%@&C(I,L.R1U3W4]7`9e=h>k@pCsDxH{J}KNPQSTUUUVVVWWWWWWXXXXXXXXWWWVUUTTSRQQQONM{KxIuGpDmBh>e<a:[6X5R1O/L-F*C(>&=&K7ub[[[NNNggg~e2! #:sӯWE*?* =%@&C(I,L.R1U3W4]7`9e=h>k@pCsDxH{J}KNPQSTUUUVVVWWWWWWXXXXXXXXWWWVUUTTSRQQQONM{KxIuGpDmBh>e<a:[6X5R1O/L-F*C(>&=&K7ub[[[NNNggg~e2! Hvﻻ~saaR:@+ <%B'D(G*M.P0U3X5[6`9c;i>l@oBtEwF|JLMPRSUVWWXYYZZZ[\\\]]]]]]\\\[[ZYYXWUUTSSQPOM|KzJuFqDk@i>e<_9\7V4S2P0J,G*A'>%>'TB&j[Dsss]]]TTTiii~~~K4 $|ٸpaLM:D/=$?%E)H+K-Q0S2Y5\7^8d;g=mApBsDxG{IMOPSUVXY\\]^_```ab c c d d d d d c ccbaa`__]\ZYXVUSRQOM}KxHuFoClAi?b:_8Z5V3S1M.J,D)A'>&?*C0xkX¼xxxPPPZZZfffdJM鲲󶶶}lM;<&<%>%A'H+K-N/T2V4\7_9b;h>l@rDuFxH}KMPRTWY[^_bcdffh i i j k l l l l l l l k j i h g g f eecba`^[ZWUTQON|KxHrDoBl@e<b:]7Z5W4Q0M.G+D)A'<$:$K9pbM```WWWUUU|`/M鲲󶶶}lM;<&<%>%A'H+K-N/T2V4\7_9b;h>l@rDuFxH}KMPRTWY[^_bcdffh i i j k l l l l l l l k j i h g g f eecba`^[ZWUTQON|KxHrDoBl@e<b:]7Z5W4Q0M.G+D)A'<$:$K9pbM```WWWUUU|`/ >~ܴ|q`_P9>( 9"<$A'D)K-O/S2\7_9f<i>l?rCuF|I~JLRSWY[_acfhlm o q q p o o pqrrrqqqqpoonl k i h h h gfeda`][ZVTSOLyGvErCk?h=b:^8[6T2Q0J,G+D)>%<$<'O>"cU?zzzbbbSSSmmmwB) rﵵxm\RB*E3:$<$>%D)H,N/T2[6mArC{GIKORVXZ_bgjlqstx z  ǀ Ɂ ʃƀ{xy{|}}}}}|||{zxutqpo t v w v urpmkjeca\ZVTQLJvFqClA`8Y4N.J,G*A'>%:#@+ F3{lyyyccc\\\tttV;'  rﵵxm\RB*E3:$<$>%D)H,N/T2[6mArC{GIKORVXZ_bgjlqstx z  ǀ Ɂ ʃƀ{xy{|}}}}}|||{zxutqpo t v w v urpmkjeca\ZVTQLJvFqClA`8Y4N.J,G*A'>%:#@+ F3{lyyyccc\\\tttV;' .ʯUE-;' 9$;$>&A'G+J-R1^8j?UX\^_bdhknvzՁ؄نڊی ٌ Ԋ щ ՌՌՌ֍҉ɃŁȃ·щԋӋӋҋҊщщЉ͇ˆˆ͆Άʃǁχ֍ޔ ߔ ܒ َ ؍ڋىه~zvtsqpmgd_[WwFh=S1M-I+C(@&;#:$9%ZL5xixxxYYYhhhiM5 -Oɰ⫫peS@-5 7!=$@&C(I,M/U4e=uF`elnpsuy}ނ ߔݒܒُҋϊҍْݕ !!"""!!ߖ ܔۓܔߕߕݓ ރۂxumhcOsDX4O/K-E)C(=$:"7!A0`S=vg```bbb}aF  -Oɰ⫫peS@-5 7!=$@&C(I,M/U4e=uF`elnpsuy}ނ ߔݒܒُҋϊҍْݕ !!"""!!ߖ ܔۓܔߕߕݓ ރۂxumhcOsDX4O/K-E)C(=$:"7!A0`S=vg```bbb}aF Fv櫫򢢢odSSE.7#6 9"?&B(E*L.O0X5h?yIcirvy~ۀ !ߗ#$&'))*++*)('&$!  ܀yvoidRyG]6R1N.G*E)>&;$8"7"H6YK6nnndddvvvrV%)eOA+A05 7!:#@'D)G+M/Q1[6l@}Jdjuy} #%)+,/1345554430/-*)%#! |xoidS}Ia8U2P/I+G*@'=%:#5 :' @/{o}}}kkkkkk|||e0)eOA+A05 7!:#@'D)G+M/Q1[6l@}Jdjuy} #%)+,/1345554430/-*)%#! |xoidS}Ia8U2P/I+G*@'=%:#5 :' @/{o}}}kkkkkk|||e0E̥}ui=,8% 6 9"<$B(F*I,O/S1^7oAKelw{ۀ !#&+-246:;:842-*(#  ~yohbR~Hb8V2R/K,H+B(>&;$5 5!5#cWFuuuufffooot<" h쟟w^SB3!3 7!:#=%C)G+J-Q0T2`8qBMdjv{ڀ "(*-36%7"4 2<,\Q>fff```vvvS6Ş~~~phZG:$028!<#?%E)I,L-R1U3b9sCNbhsx}߅ %(/26<@GKNTW\]^``_^\WTQKG@<92.'$! |ohaRHd9Y4T1M-K,E)A'>%7"4 2<,\Q>fff```vvvS6)ٝ{tjXM<6&039"<$?&E*I-L.S1V3c:tDNagsx~ !$+/6:?GKTY]dglnpqqpomheaYULGC:6.+'  ~qibRHe9Z4U2N.K-E*B(?&9"6 33!J<'ymmm```ooo]?;ҝ蛛bXJH;'/039"<$?&F*J-M.S1V3d:uDN_erx~ "%)15>CHSXbhluyyvqhcYTOD>40,%" ۀrjcSIf:[5V3O/L-F+C(@&9"6 30?/wpdvvvcccmmmeG;ҝ蛛bXJH;'/039"<$?&F*J-M.S1V3d:uDN_erx~ "%)15>CHSXbhluyyvqhcYTOD>40,%" ۀrjcSIf:[5V3O/L-F+C(@&9"6 30?/wpdvvvcccmmmeG-S噙򘘘K@.<.-14:"=$@&F*I,L.S1V3d:tCM\bov| &*.72-%! ݂wpjVKe<[7W4P0M.G+C)@':"7 4..J?,f_S|vvvmmmxWLpja+++139!<#>$D'G)J+Q/U1d:rBJY_mt{ۄ ܇  $(16DRZkt~wm[SL>8,($Ղ Ҁ }{uojVKb;W5T3M.J,D*A'>%8!52-+5(A7'e_WyyyɈ\YsoiTLA()*/27 :"<#A&D(G)M-Q0`8pAK\cpv|ۆ ߊ $(-8>DRZkt~wm[SL>8,($Ղ Ҁ }{uojVKb;W5T3M.J,D*A'>%8!52-+5(A7'e_WyyyɈ\YrmgSK@()*/16 9"<#A&D(G)M-P/_8pBL\cpw}܆ $).9?ES[mvxn]UM?9-($މӁ  ~|zuojVKa:V4R2L.J,D*@'=%7!42,*4'@6&d^Vyyyɉ~[YnjdOI='().169!;"@&C(F)L-O/^7oAK^dqw|څ ވ $).8>DS[luwn\TL>8,($܈ ن مցxrmV|J^8U3Q1K-I,B)?&<$7!41+)3'?5$`[R{{{ȋ|YYnjdOI='().169!;"@&C(F)L-O/^7oAK^dqw|څ ވ $).8>DS[luwn\TL>8,($܈ ن مցxrmV|J^8U3Q1K-I,B)?&<$7!41+)3'?5$`[R{{{ȋ|YWmicOI=&'(-/58!;#@&C(F)K,N.\5n@K_eqv{׃ ܇ &,2>DJV]pyyqaYQA:-($މ ۆ څւwqkTwGZ6R2O0I,G+A(>&;$5 2/*(2&>4%_YQ|||ŎyUTnjeQJA%&',.47!:#?&B(D)J,M.Y4l?K_epuyс ׆ !/7>JOT_ez{oh^I?2-(؅ ք փҀ}uoiRuFY6Q1N/H+F*@&<$9#41.)'3&@6(_YR􍍍|||tQTnjeQJA%&',.47!:#?&B(D)J,M.Y4l?K_epuyс ׆ !/7>JOT_ez{oh^I?2-(؅ ք փҀ}uoiRuFY6Q1N/H+F*@&<$9#41.)'3&@6(_YR􍍍|||tQNpmiTOF$%&*-25 7"=%@'C(H+K-V3h>{I`fqux΀ Ӆ ݍ#+;CGPTYch}tncNC50,$܋׆Ё π π|ypjeQtF[7T3P0H+D)>%;#8"30-(&4)C;.`\U򋋋}}}nK FtrnXTM$$%)+146 ;$>&A'F*I,R1b;sFagquy΁ Ԇۍߒ"-4BHKRV[ejwqgRG94/)%!ۍ׉Ѓ ́ ~wtlfaOtE^8Y5S1G*A'<$9"6!1.+&%6+G@5`]W~~~fC 95531)&֎Јʁvrhb\|Jl@W4S1N.C(=$7!42-*($&<5)QNGb`\||| ɅP1#Cߛ﨨jhe5, + !$&*-/5 8":#?&B(H-U4c<]cm ryȉ(В2י9ڛ;ݞ>BFMPQUX\bds{zrjopmjcVPD@<853-ݖ+ԏ$΋ Ȅwr ha[xHh>S1O/J,@&:#52/+(&#( C=3ZWReca{z{؂C'#Cߛ﨨jhe5, + !$&*-/5 8":#?&B(H-U4c<]cm ryȉ(В2י9ڛ;ݞ>BFMPQUX\bds{zrjopmjcVPD@<853-ݖ+ԏ$΋ Ȅwr ha[xHh>S1O/J,@&:#52/+(&#( C=3ZWReca{z{؂C'*ŝᥥrrr=7./&!"$(+-25 7!<$?&E*R2`;\bpw#ʐ6ј?֜AٞCݡEMQWZZ]`cikxyqjopnkdXSID@;74ږ/ה-Ў)ˊ&ń yshaZvFe<P0L.G+=$8!30.)&$"*IC=_]\gfe{zzʅx6 ΡxxxGD=5.#$ "&(+025 :"<$B(O0\9[c t}&/Ǒ>͗DҚE՜GٟIQTZ]\]^afhtz|uqpljbVQFA=:ߜ7ۙ4ӑ0Џ/ʊ,Ƈ*%xth aZsEb;M.I,D):"5/-+'$"".%KHB]\[fee{{{񉉉f* ΡxxxGD=5.#$ "&(+025 :"<$B(O0\9[c t}&/Ǒ>͗DҚE՜GٟIQTZ]\]^afhtz|uqpljbVQFA=:ߜ7ۙ4ӑ0Џ/ʊ,Ƈ*%xth aZsEb;M.I,D):"5/-+'$"".%KHB]\[fee{{{񉉉f* vROK>8/+" $&(-026!9">&K/Y8\ fz*49đBȕE͗FϙGҜIܥQTY\\]^`egrw|~wpmljhaVQGC?ۜ<י9Ԗ7̏2ɍ1É.,(y"v jbZ oC^9J-F+A(7!2-+)%#!& 4,!PMJ]]\ggg}}}挌tS LYXVEA<2+""$&*-/36 ;$H-V7^k#:EHŗNɚP̛NΝOѠQ۩Y߬\begkmotv~قކ{tmllifbZVKGܠCכ@Ә=Е;Ɏ6ƍ531.|+y*n d[i@Y6F*C)?&5/*(&"! *!93+TRP___kkkՕ[?+peeePNK<81"  "$(*,139#F-T7 b!r1LWZɞ^͡`Ϣ]Ҥ^է_ްgkruw|~̀Ӆֈ݌ߎ݈ۆߊ܃ـwpjlljgd]ZNۢJמFҙDϖA̔>Ŏ:Ì9764}1{1q(g]e@U5C(A'<$2,(&$ 1+!?;5YXWeedpppꔔoE. +peeePNK<81"  "$(*,139#F-T7 b!r1LWZɞ^͡`Ϣ]Ҥ^է_ްgkruw|~̀Ӆֈ݌ߎ݈ۆߊ܃ـwpjlljgd]ZNۢJמFҙDϖA̔>Ŏ:Ì9764}1{1q(g]e@U5C(A'<$2,(&$ 1+!?;5YXWeedpppꔔoE. KfecGDA(" !%')-06"D- S8f+v%9"/)%#! " :6/GD@`__lllvvvՕU1.WXWU1+"'"$&*,4!C- R9i3yD]dfàjǣlɣgˤgΦhׯqڲtz}ăDžɇ͋ύԐՑדٔבԋӉ֌ޔޒܐ֊΁~}{zywsqnheץWӡSϝO̚NɗLƕJEEEDB~={;q4h*_!`? P4>&<$7!,'#!# )"B@=NMKgffssszzz=!.WXWU1+"'"$&*,4!C- R9i3yD]dfàjǣlɣgˤgΦhׯqڲtz}ăDžɇ͋ύԐՑדٔבԋӉ֌ޔޒܐ֊΁~}{zywsqnheץWӡSϝO̚NɗLƕJEEEDB~={;q4h*_!`? P4>&<$7!,'#!# )"B@=NMKgffssszzz=!0vvu<94/)! "#')2 A- Q:j9{KcjlpŤrȢjɣjʥkҭtհwܶ|߹⼁ĆŇɊˌΏБғԔӒӐӏ֒ܚܗٔӍ˃Ȁ~}zwromޯg۬dРV˛RǗNĕMKJDEFFD|?y=p6g-^$^?O3=&;$5 *$  )"2.&JIHWVVnnnyyyꛛh'  ONL<95# $'.>+N8j={OipruäwĢmţmǤmΪtѭwֳ|ٵ۷༃㾄ÉŊȍɎː͎͍͑͐Б؛ݡߢߢߢޡޠݟݟ۞יՖώƄÁ~}yvr߳pݱm׫gԨdɜUėPKIHGCDEECy?v=o6f-]%^?P4?&=$6 ' %/+$:85SSS```vvv~~~瘘ҪiG  ONL<95# $'.>+N8j={OipruäwĢmţmǤmΪtѭwֳ|ٵ۷༃㾄ÉŊȍɎː͎͍͑͐Б؛ݡߢߢߢޡޠݟݟ۞יՖώƄÁ~}yvr߳pݱm׫gԨdɜUėPKIHGCDEECy?v=o6f-]%^?P4?&=$6 ' %/+$:85SSS```vvv~~~瘘ҪiG IonoRQO+' !#,;)J6h?zSnuw{~tãsŤs̫yή{ӳֵطܺ޼ྉÍŏǐɒʒʒʑʑ͕՞ڣۥۥۥۤڢ٠٠؟֜Ԛї̑ʏnjŊĈ侁}޷{ܵy֯sӬoɠ_ěZUSQPMLIH~FxAu?n9e0~\'[=M2=%:#3%-)"862DCBaaakkk{{{󘘘͖A+ Zuut972)%" (6&E3|d>xTrz|ëƭɯϴѶջؽڿ×řƚɝ˞ΠϡѢңӤԥԥեקببببצ֥դդԢӠҟН͚̘ɔǒƐŒῊݺ۸ضӱ|Ѯz˨tȥqŢnjgd`]XVS|NyLoDc8tX-M6=) ($! #641DCARRRpppvvvחj&Zuut972)%" (6&E3|d>xTrz|ëƭɯϴѶջؽڿ×řƚɝ˞ΠϡѢңӤԥԥեקببببצ֥դդԢӠҟН͚̘ɔǒƐŒῊݺ۸ضӱ|Ѯz˨tȥqŢnjgd`]XVS|NyLoDc8tX-M6=) ($! #641DCARRRpppvvvחj&'VUS752,'! #.! 9+eT9zjQt°Ǵɶ˸λнѾåŦƧǨɪɪʫ˫˫̬̪ͬͬͫͫ˩ʨʨɧǤƣġԽһѹ̵ʳƯĭªzwupmkfc^|[yXsSoQvcFiV8]I+=+2" " #+(#DDCUUTfgf{{{}}}񜜜m: NXXWB@=# &."NB0dYIr¶÷ƺȼʾʿ¯ðððððïï®̿ʽʼȺŷĶ|zurpk|hvbt`}q]vjWsgTbVCSG4E8%-! '#.*'976[[[iiixxx晙вcB! ;ȁjih2/+" !' A6%WM=xk¸ĺŻȾɿ³ĴĴŴƵƵƵƵƴƳƳIJñ°°˿ʾɽƺŸµ~zwtolygve~sbvkZqfVZO=J?-;/( "-+)=<;MMMtttzzz¢4";ȁjih2/+" !' A6%WM=xk¸ĺŻȾɿ³ĴĴŴƵƵƵƵƴƳƳIJñ°°˿ʾɽƺŸµ~zwtolygve~sbvkZqfVZO=J?-;/( "-+)=<;MMMtttzzz¢4" BRQP21.'$ !5*H=.ri\uļƾǿ³ôĶŷƸǹǹȺɺɺɺɺɹɸɸǷƶĵĵô±ɿǼƻø~{ysq{lxi~tesiZlbSMC3?4$1&! &$ BBAWWWmmmߢPk]]\CB@! )7-\TGsl`uûļǿ¶Ÿƺȼɼʽ˾˿̿̿̾˽˽ʼɻǺǺƹŶĵ³Ⱦǽĺ¸}xu~o{l~uglcU`WH?4%3(' -,*:::kkk{{{ߚJ$ k]]\CB@! )7-\TGsl`uûļǿ¶Ÿƺȼɼʽ˾˿̿̿̾˽˽ʼɻǺǺƹŶĵ³Ⱦǽĺ¸}xu~o{l~uglcU`WH?4%3(' -,*:::kkk{{{ߚJ$ "@~~~875"  (E==-+*   ( 7/#^WLwpfžɿȾĺǿü|unce]RRJ>3*'"!FEEa`aǤ90̨ssrGGF  #<4)LD9{vlÿýǾżûſý{zsiWPDD=06/""  110MMM茌ִqIB}PPP887 $,%JC9a[Ryskǿ»ſjdZWPE7/$*""  ((&777uuuڙ|&B}PPP887 $,%JC9a[Ryskǿ»ſjdZWPE7/$*""  ((&777uuuڙ|& +؂ָFFF++*" )#71(F@6pkb{ſü¾xtnec\SA:04.#!  #" JJJiii鈈٬Y. /Qڄ``_-,*% <7.MH@tng}zxrjVPGGA882)#" KJJhhhܗ2 /Qڄ``_-,*% <7.MH@tng}zxrjVPGGA882)#" KJJhhhܗ2 -׃ӹ~ZZY&%#&"<70JD=[UNzt}vb\TSMED?6-( $ 10/EEDgggꇇٯ~T+ %BtihhIHI$$""*&!?;4LH@[WO{vpÿ~zspkdTOGGB:1,%($ :::VVVᠠq!%BtihhIHI$$""*&!?;4LH@[WO{vpÿ~zspkdTOGGB:1,%($ :::VVVᠠq!^ڌghg877&%$ &$84/B=8XTMc_Yokf}½|}yric]]XRHC=>9350+%"==:383.*&!#!AAA```甔d2  g֞sss;;;$$#%"+(#951@<7NJDUQJ[WOeaYie^pkfrmhtpjvqkupjsoiroiolfif_fb[a]VVSKQMFEA9>:383.*&!#!AAA```甔d2 "@֮^^^DDD'&'  #!%# )'")'#*($+)%*($)(#)(#('"&$$"" ,,,676NON⏏ηqG'OܟpppdddPPPHHHAA@443...%%%""" ! '&&+**0//<<.  *:_tޞܱ½řɅoH6  *:_tޞܱ½řɅoH6   (ALbmuބފޓޖޚݝܜۛۛژؑ׎ֈ{s`UJ1'   KontrolPack-3.0.0/kontrolpack/kontrolpack.pro000644 001750 001750 00000010632 11444226142 017543 0ustar00000000 000000 # Copyright (C) 2007-2010 by Thomas Thelliez aka jblud # Contact : # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2.0 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this program; if not, write to # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA win32 { INCLUDEPATH += C:\\sqlite3\\include C:\\OpenSSL\\include C:\\libxml2\\lib\\include\\libxml2 ..\\libsecuretcp LIBS += -LC:\\sqlite3 -lsqlite3.dll -L..\\bin -lsecuretcp0 -LC:\libxml2\lib\lib -lxml2 -LC:\\OpenSSL\\lib\\MinGW -leay32 -LC:\Qt\2010.02.1\mingw\lib -lws2_32 -lwsock32 } linux-g++ { INCLUDEPATH += /usr/include/openssl ../libsecuretcp /usr/include/libxml2 LIBS += -L/usr/lib -lssl -L../bin -lsecuretcp -lxml2 -lsqlite3 } macx { INCLUDEPATH += /usr/include/openssl ../libsecuretcp /usr/include/libxml2 LIBS += -L/usr/lib -lcrypto -F../bin -framework securetcp -lxml2 -lsqlite3 } QT += core network xml TARGET = kontrolpack CONFIG += qt thread RESOURCES = resources.qrc win32:RC_FILE = KontrolPack.rc macx:ICON = KontrolPack.icns SOURCES += main.cpp \ commons/startup/startup_dialog.cpp \ commons/startup/update_manager.cpp \ commons/startup/user_mode.cpp \ commons/win32/qtwin.cpp \ commons/sql/database.cpp \ commons/about_dialog.cpp \ commons/logger.cpp \ server/ui/server_central_window.cpp \ server/ui/server_main_window.cpp \ server/core/network/connection_controller.cpp \ server/core/network/file_manager_server.cpp \ server/core/shell/exec_thread.cpp \ commons/cd/change_dir.cpp \ server/core/xml/xml_creator_server.cpp \ server/core/xml/xml_parser_server.cpp \ server/core/bean/document.cpp \ client/ui/client_home.cpp \ client/ui/client_central_window.cpp \ client/ui/client_main_window.cpp \ client/ui/tab_dialog.cpp \ client/ui/remote_computer.cpp \ client/ui/dns/dns_resolver.cpp \ client/ui/tabui/share_files.cpp \ client/ui/tabui/identity_client.cpp \ client/ui/tabui/exec_shell.cpp \ client/ui/tabui/defined_command.cpp \ client/ui/extend/drop_list_view.cpp \ client/core/network/socket_controller.cpp \ client/core/network/file_manager.cpp \ client/core/xml/xml_creator_client.cpp \ client/core/xml/xml_parser_client.cpp \ client/core/bean/os_characteristic.cpp \ client/core/bean/remote_computer_info.cpp \ client/core/bean/command.cpp \ client/core/bean/folder.cpp \ client/core/bean/file.cpp HEADERS += commons/startup/startup_dialog.h \ commons/startup/update_manager.h \ commons/startup/user_mode.h \ commons/win32/qtwin.h \ commons/constants.h \ commons/sql/database.h \ commons/about_dialog.h \ commons/logger.h \ server/ui/server_central_window.h \ server/ui/server_main_window.h \ server/core/network/connection_controller.h \ server/core/network/file_manager_server.h \ server/core/shell/exec_thread.h \ commons/cd/change_dir.h \ server/core/xml/xml_creator_server.h \ server/core/xml/xml_parser_server.h \ server/core/bean/document.h \ client/ui/client_home.h \ client/ui/client_central_window.h \ client/ui/client_main_window.h \ client/ui/remote_computer.h \ client/ui/dns/dns_resolver.h \ client/ui/tab_dialog.h \ client/ui/tabui/share_files.h \ client/ui/tabui/identity_client.h \ client/ui/tabui/exec_shell.h \ client/ui/tabui/defined_command.h \ client/ui/extend/drop_list_view.h \ client/core/network/socket_controller.h \ client/core/network/file_manager.h \ client/core/xml/xml_creator_client.h \ client/core/xml/xml_parser_client.h \ client/core/bean/os_characteristic.h \ client/core/bean/remote_computer_info.h \ client/core/bean/command.h \ client/core/bean/folder.h \ client/core/bean/file.h CONFIG(debug, debug|release) { DESTDIR = ../bin RCC_DIR = ../tmp OBJECTS_DIR = ../tmp MOC_DIR = ../tmp } CONFIG(release, debug|release) { DESTDIR = ../bin RCC_DIR = ../tmp OBJECTS_DIR = ../tmp MOC_DIR = ../tmp } KontrolPack-3.0.0/kontrolpack/server/000755 001750 001750 00000000000 11432774446 016012 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/000755 001750 001750 00000000000 11432774460 016736 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/bean/000755 001750 001750 00000000000 11432306344 017633 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/bean/document.h000644 001750 001750 00000003262 11426532120 021621 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef DOCUMENT_H #define DOCUMENT_H #include #include class Document : public QObject { Q_OBJECT public: Document(); QString name; QString newName; QString from; QString to; QString path; QString doc; }; #endif KontrolPack-3.0.0/kontrolpack/server/core/bean/document.cpp000644 001750 001750 00000002756 11426532120 022163 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "document.h" Document::Document() { } KontrolPack-3.0.0/kontrolpack/server/core/shell/000755 001750 001750 00000000000 11432306344 020035 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/shell/exec_thread.h000644 001750 001750 00000003555 11426532120 022465 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include class Exec : public QThread { Q_OBJECT public: Exec(QString cmd, int client_nbr); char buf[1024]; FILE* cmd; QString str; QString command; int nbr; QString str_nbr; protected: void run(); signals: void result_signal( const QString & str, const QString & client_nbr); }; KontrolPack-3.0.0/kontrolpack/server/core/shell/exec_thread.cpp000644 001750 001750 00000003625 11426532120 023016 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "exec_thread.h" Exec::Exec(QString cmd, int client_nbr) : command(cmd), nbr(client_nbr) { str_nbr = QString::number(nbr); } void Exec::run() { cmd = popen (command.toUtf8().data(), "r"); while (fgets(buf, sizeof(buf), cmd)) { str.append(QByteArray(buf)); //emit( result_signal(QString(buf), str_nbr)); } pclose(cmd); // str.append(QByteArray("END")); emit( result_signal(str, str_nbr) ); } KontrolPack-3.0.0/kontrolpack/server/core/network/000755 001750 001750 00000000000 11432306344 020417 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/network/file_manager_server.cpp000644 001750 001750 00000006411 11444236215 025126 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "file_manager_server.h" FileManagerServer::FileManagerServer(auth_server *file_tcp_server, QObject *parent) : tcp_server(file_tcp_server), QObject(parent) { #ifdef WIN32 slash = QString("\\"); #else slash = QString("/"); #endif file_queue_list = new QMap; } /** Receive document from remote client. */ void FileManagerServer::received_stream_files_slot(QString message, int client_nbr) { QByteArray file_array = QByteArray::fromBase64(message.toUtf8()); if (file_queue_list->contains(client_nbr)) { QFile *file = new QFile(file_queue_list->value(client_nbr)); if (file->open(QIODevice::WriteOnly)) { file->write(file_array); emit tell_client_transfer_state(1, client_nbr); }else { qDebug("File not opened"); emit tell_client_transfer_state(0, client_nbr); } file->close(); file_queue_list->remove(client_nbr); } } /** Send document to remote client. */ int FileManagerServer::send_document(QString name, QString path, int client_nbr) { if (!tcp_server->client_list->contains(client_nbr)) return 0; QString file_path = path + slash + name; QFile *file = new QFile(file_path); if (file->exists()) { if (file->open(QIODevice::ReadOnly)) { if (file->isReadable()) { while (!file->atEnd()) { tcp_server->write_encrypted_data_to_socket(file->readAll().toBase64().data(), client_nbr); } file->close(); delete file; return 1; } else { qDebug("File unreadable"); return 0; } } else { qDebug("File not opened"); return 0; } } else { qDebug("File does not exist."); return 0; } } KontrolPack-3.0.0/kontrolpack/server/core/network/connection_controller.cpp000644 001750 001750 00000035013 11444417365 025540 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "connection_controller.h" ConnectionController::ConnectionController(QObject *parent) : QObject(parent) { path = QDir::homePath(); #ifdef WIN32 slash = QString("\\"); path.replace(QString("/"), QString("\\")); Logger::setFileName(QDir::toNativeSeparators(QDir::homePath()) + "\\" + QString(LOG_FILENAME)); #else Logger::setFileName(QDir::toNativeSeparators(QDir::homePath()) + "/" + QString(LOG_FILENAME)); slash = QString("/"); #endif xml_creator = new XmlCreatorServer(this); settings = new QSettings("OpenNetwork", "KontrolPack", this); exec = new Exec("", 0); m_logger = new Logger(this); } int ConnectionController::start_server(QString password, QString ip, int port, int f_port) { master_server = new auth_server(password); if (!master_server->listen(QHostAddress(ip), port)) { return 0; } file_server = new auth_server(password); if (!file_server->listen(QHostAddress(ip), f_port)) { master_server->stop_server(); return 0; } file_manager = new FileManagerServer(file_server, this); QObject::connect(file_manager, SIGNAL(tell_client_transfer_state(int, int)), this, SLOT(tell_client_transfer_state_slot(int, int))); QObject::connect(master_server, SIGNAL(signals_state(int, int)), this, SLOT(tcp_state(int, int))); QObject::connect(master_server, SIGNAL(auth_succeeded(int)), this, SLOT(auth_succeeded_slots(int))); QObject::connect(master_server, SIGNAL(received_stream_signal(QString, int)), this, SLOT(received_stream_slot(QString, int))); QObject::connect(file_server, SIGNAL(signals_state(int, int)), this, SLOT(tcp_state(int, int))); QObject::connect(file_server, SIGNAL(received_stream_signal(QString, int)), file_manager, SLOT(received_stream_files_slot(QString, int))); QObject::connect(master_server, SIGNAL(emit_error(int)), this, SLOT(master_client_error_slot(int))); QObject::connect(file_server, SIGNAL(emit_error(int)), this, SLOT(file_client_error_slot(int))); m_logger->info("Server started : " + ip + " " + QString::number(port) + " " + QString::number(f_port)); return 1; } void ConnectionController::stop_server() { master_server->stop_server(); file_server->stop_server(); m_logger->info("Server stopped"); } /* #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_EXCHANGE 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 */ void ConnectionController::tcp_state(int state, int client_nbr) { switch (state) { case TOKEN_WELCOME : { emit signals_state(state, client_nbr); m_logger->debug("TOKEN WELCOME : " + QString::number(client_nbr)); break; } case RSA_PUBLIC_KEY_RECEPTION : { emit signals_state(state, client_nbr); m_logger->debug("RSA PUBLIC KEY RECEPTION : " + QString::number(client_nbr)); break; } case PASSWORD_VALIDATION : { emit signals_state(state, client_nbr); m_logger->debug("PASSWORD VALIDATION : " + QString::number(client_nbr)); break; } case AES_KEY_RECEPTION : { emit signals_state(state, client_nbr); m_logger->debug("AES KEY RECEPTION : " + QString::number(client_nbr)); break; } case AUTH_SUCCESS : { emit signals_state(state, client_nbr); m_logger->debug("AUTH SUCCESS : " + QString::number(client_nbr)); break; } case 5 : { emit signals_state(state, client_nbr); break; } default: ; } } /* Connect the app to the received_stream_signalis not opened to be aware of reception and handle streams. */ void ConnectionController::received_stream_slot(QString message, int client_nbr) { // Stop thread to not saturate sockets. stop_shell_thread(); // Send parameters : first connexion if (message.contains(ASK_PARAMETERS, Qt::CaseInsensitive)) { QStringList *list = new QStringList; QList interface_list = QNetworkInterface::allInterfaces(); for (int k = 0; k < interface_list.size(); k++) { if (interface_list.at(k).flags().testFlag(QNetworkInterface::IsRunning)) foreach (QNetworkAddressEntry entry, interface_list.at(k).addressEntries()) { if ( interface_list.at(k).hardwareAddress() != "00:00:00:00:00:00" && entry.ip().toString().contains(".")) { list->append(entry.ip().toString()); } } } QString homePath = QDir::homePath(); #ifdef WIN32 homePath.replace(QString("/"), QString("\\")); #endif QString xml = xml_creator->createXmlParameters(homePath, list); master_server->write_encrypted_data_to_socket(xml.toUtf8().data(), client_nbr); delete list; m_logger->info("Remote client number " + QString::number(client_nbr) + " asking parameters to this server."); } // Ask info for download file. if (message.startsWith(QString(XML_DOCTYPE) + QString(XML_FILE_DOWNLOAD_INFO) + ">", Qt::CaseInsensitive)) { shootScreen(); Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; QString filePath = document->path + slash + document->name; QString xml = xml_creator->getFileInfo(filePath, document->path, QString(XML_FILE_DOWNLOAD_INFO)); master_server->write_encrypted_data_to_socket(xml.toUtf8().data(), client_nbr); m_logger->info("Remote client number " + QString::number(client_nbr) + " asking information before downloading file : " + document->name + " from : " + document->path ); } // Receive info for upload file. if (message.startsWith(QString(XML_DOCTYPE) + QString(XML_FILE_UPLOAD_INFO) + ">", Qt::CaseInsensitive)) { Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; QString filePath = document->path + document->name; QDir *dirInfo = new QDir(document->path); if (dirInfo->exists()) { QFile *file = new QFile(filePath); if (file->open(QIODevice::WriteOnly)) { if (file->isWritable()) { master_server->write_encrypted_data_to_socket(QString(UPLOAD_OK).toUtf8().data(), client_nbr); file_manager->file_queue_list->insert(client_nbr, filePath); file->close(); delete file; } else { master_server->write_encrypted_data_to_socket(QString(UPLOAD_KO).toUtf8().data(), client_nbr); delete file; } } else { master_server->write_encrypted_data_to_socket(QString(UPLOAD_KO).toUtf8().data(), client_nbr); delete file; } } else { master_server->write_encrypted_data_to_socket(QString(UPLOAD_KO).toUtf8().data(), client_nbr); } delete dirInfo; m_logger->info("Remote client number " + QString::number(client_nbr) + " sending informations to upload file : " + document->name + " to " + document->path ); } //Send file. if (message.startsWith(QString(XML_DOCTYPE) + QString(XML_DOWNLOAD) + ">", Qt::CaseInsensitive)) { Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; if (file_manager->send_document(document->name, document->path, client_nbr) == 0) { master_server->disconnect_client(client_nbr); } m_logger->info("Sending file " + document->name + " from " + document->path + " to remote client number " + QString::number(client_nbr) + "."); } // Change dir command. if (message.startsWith(QString(XML_DOCTYPE) + QString(FOLDER) + ">", Qt::CaseSensitive)) { Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; ChangeDir *changeDir = new ChangeDir(document->name, document->path); path = changeDir->cd_Handling(document->path); path.replace("//", "/"); path.replace("\\\\", "\\"); QString xml = xml_creator->getFoldersParameters(path); master_server->write_encrypted_data_to_socket(xml.toUtf8().data(), client_nbr); delete document; delete changeDir; m_logger->info("Receiving change dir command for " + path + " remote client number " + QString::number(client_nbr) + "."); // File Info command. } else if (message.startsWith(QString(XML_DOCTYPE) + QString(FILE_XML) + ">", Qt::CaseSensitive)) { Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; QString filePath = document->path + slash + document->name; QString xml = xml_creator->getFileInfo(filePath, document->path, QString(XML_FILE_INFO)); master_server->write_encrypted_data_to_socket(xml.toUtf8().data(), client_nbr); delete document; m_logger->info("Remote client number " + QString::number(client_nbr) + " asking file information : " + filePath); // Execute shell command. } else if (message.startsWith(QString(XML_DOCTYPE) + QString(XML_COMMAND) + ">", Qt::CaseSensitive)) { Document *document = XmlParserServer::getDocumentInformation(message); if (document->path.isEmpty() || document->name.isEmpty()) return; stop_shell_thread(); #ifdef WIN32 exec = new Exec("cd " +document->path + " & " + document->name, client_nbr); #else exec = new Exec("cd '" +document->path + "' && " + document->name, client_nbr); #endif Exec::connect( ((QObject*)exec), SIGNAL( result_signal( const QString & , const QString & ) ), this, SLOT( tell_client_command_result( const QString & , const QString & ) ) ); ((QThread*)exec)->start(); m_logger->info("Remote client number " + QString::number(client_nbr) + " executing shell command : " + document->name + " to : " + document->path); } emit received_stream_signal(message); } /* Connect to the auth_succeeded to be aware of new client authentication state. */ void ConnectionController::auth_succeeded_slots(int client_nbr) { emit auth_succeeded(client_nbr); auth_session *client = master_server->get_client_list()->value(client_nbr); QTcpSocket *inet_sock = client->get_socket(); QHostAddress address = inet_sock->localAddress(); m_logger->info("Authentication succeeded for client number : " + QString::number(client_nbr) + " IP : " + address.toString()); } void ConnectionController::tell_client_transfer_state_slot(int state, int client_nbr) { if (state == 1) master_server->write_encrypted_data_to_socket(QString(UPLOAD_SUCCESS).toUtf8().data(), client_nbr); if (state == 0) master_server->write_encrypted_data_to_socket(QString(UPLOAD_FAILED).toUtf8().data(), client_nbr); } void ConnectionController::tell_client_command_result(const QString & str, const QString & client_nbr) { master_server->write_encrypted_data_to_socket(QString(QString(XML_COMMAND_BEGIN) + QString(str) + QString(XML_COMMAND_END)).toUtf8().data(), client_nbr.toInt()); } void ConnectionController::stop_shell_thread() { if (exec != NULL) { if (exec->isRunning()) { exec->terminate(); exec->quit(); } } } void ConnectionController::shootScreen() { QString is_cli = settings->value("ui/cli", "false").toString(); if (is_cli.contains("false")) { screenshotPixmap = QPixmap::grabWindow(QApplication::desktop()->winId()); QString format = "png"; QString filePath; #ifdef WIN32 filePath = QDir::toNativeSeparators(QDir::homePath()) + "\\" + KP_DIRECTORY + "\\" + REMOTE_DESKTOP_PNG; #elif defined (linux) filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/" + REMOTE_DESKTOP_PNG; #elif defined __APPLE__ filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/" + REMOTE_DESKTOP_PNG; #else filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/" + REMOTE_DESKTOP_PNG; #endif screenshotPixmap.save(filePath, format.toAscii()); } } void ConnectionController::file_client_error_slot(int client_nbr) { master_server->disconnect_client(client_nbr); m_logger->error("Remote client number " + QString::number(client_nbr) + " file error."); } void ConnectionController::master_client_error_slot(int client_nbr) { file_server->disconnect_client(client_nbr); m_logger->error("Remote client number " + QString::number(client_nbr) + " file error."); } KontrolPack-3.0.0/kontrolpack/server/core/network/file_manager_server.h000644 001750 001750 00000004223 11444231500 024562 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FILE_MANAGER_SERVER_H #define FILE_MANAGER_SERVER_H #include #include #include #include #include "auth/auth_server.h" #include "../../../commons/constants.h" #include "../../../commons/logger.h" class FileManagerServer : public QObject { Q_OBJECT public: FileManagerServer(auth_server *file_tcp_server, QObject *parent); QMap* file_queue_list; public slots: int send_document(QString name, QString path, int client_nbr); void received_stream_files_slot(QString message, int client_nbr); signals: void tell_client_transfer_state(int state, int client_nbr); private: auth_server *tcp_server; QString slash; Logger *m_logger; }; #endif KontrolPack-3.0.0/kontrolpack/server/core/network/connection_controller.h000644 001750 001750 00000005740 11444231471 025201 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef CONNECTIONCONTROLLER_H #define CONNECTIONCONTROLLER_H #include #include #include #include #include #include #include "auth/auth_server.h" #include "../../../commons/cd/change_dir.h" #include "../../../commons/logger.h" #include "file_manager_server.h" #include "../shell/exec_thread.h" #include "../xml/xml_creator_server.h" #include "../xml/xml_parser_server.h" class ConnectionController : public QObject { Q_OBJECT public: ConnectionController(QObject *parent = 0); int start_server(QString password, QString ip, int port, int f_port); void stop_server(); void stop_shell_thread(); public slots: void received_stream_slot(QString message, int client_nbr); void tcp_state(int state, int client_nbr); void auth_succeeded_slots(int client_nbr); void tell_client_transfer_state_slot(int state, int client_nbr); void tell_client_command_result(const QString & str, const QString & client_nbr); void master_client_error_slot(int client_nbr); void file_client_error_slot(int client_nbr); private slots: signals: void received_stream_signal(QString message); void signals_state(int state, int client_nbr); void auth_succeeded(int client_nbr); private: void shootScreen(); QPixmap screenshotPixmap; QString path; QString slash; auth_server *master_server; auth_server *file_server; XmlCreatorServer *xml_creator; FileManagerServer *file_manager; Exec *exec; QSettings *settings; Logger *m_logger; }; #endif KontrolPack-3.0.0/kontrolpack/server/core/xml/000755 001750 001750 00000000000 11432306344 017526 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/core/xml/xml_creator_server.cpp000644 001750 001750 00000031237 11431216704 024144 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "xml_creator_server.h" XmlCreatorServer::XmlCreatorServer(QObject *parent) : QObject(parent) { xmlDoctype = QString(XML_DOCTYPE); xmlOpening = QString(XML_OPENING); xmlClosing = QString(XML_CLOSING); xmlEnding = QString(XML_ENDING); xmlParametersDocument = QString(xmlDoctype + XML_PARAMETERS + xmlEnding); xmlKontrolPackElement = QString(KONTROLPACK); xmlHostnameElement = QString(HOSTNAME); xmlSystemElement = QString(SYSTEM); xmlPathElement = QString(PATH); xmlFolderListElement = QString(FOLDER_LIST); xmlFileListElement = QString(FILE_LIST); xmlFolderElement = QString(FOLDER); xmlFileElement = QString(FILE_XML); xmlIpListElement = QString(IP_LIST); xmlIpElement = QString(IP); } QString XmlCreatorServer::createXmlParameters(QString path, QStringList *ipList) { QString xmlDocument = QString(""); xmlDocument.append(xmlParametersDocument); xmlDocument.append(xmlOpening + xmlKontrolPackElement + xmlEnding); xmlDocument.append(xmlOpening + xmlHostnameElement + xmlEnding); QString temp(QHostInfo::localHostName()); xmlDocument.append(temp); xmlDocument.append(xmlClosing + xmlHostnameElement + xmlEnding); xmlDocument.append(xmlOpening + xmlSystemElement + xmlEnding); #ifdef WIN32 xmlDocument.append(WINDOWS); #elif defined (linux) xmlDocument.append(LINUX); #elif defined __APPLE__ xmlDocument.append(MACOSX); #else xmlDocument.append(LINUX); #endif xmlDocument.append(xmlClosing + xmlSystemElement + xmlEnding); xmlDocument.append(xmlOpening + xmlPathElement + xmlEnding); xmlDocument.append(path); xmlDocument.append(xmlClosing + xmlPathElement + xmlEnding); appendFolderAndFileInfo(xmlDocument, path); xmlDocument.append(xmlOpening + xmlIpListElement + xmlEnding); for (int j = 0; j < ipList->size(); ++j) { xmlDocument.append(xmlOpening + xmlIpElement + xmlEnding); xmlDocument.append(ipList->at(j)); xmlDocument.append(xmlClosing + xmlIpElement + xmlEnding); } xmlDocument.append(xmlClosing + xmlIpListElement + xmlEnding); xmlDocument.append(xmlClosing + xmlKontrolPackElement + xmlEnding); return xmlDocument; } void XmlCreatorServer::appendFolderAndFileInfo(QString &xmlDocument, QString path ) { QDir currentDir = QDir(path); QStringList documentList = currentDir.entryList(QDir::AllEntries, QDir::Name); xmlDocument.append( xmlOpening + xmlFolderListElement + xmlEnding ); int cptBack = 0; #ifdef WIN32 QFileInfoList drivesInfo = QDir::drives(); if (QString::compare(path, QString(CONTENT_DRIVE), Qt::CaseInsensitive) == 0) { for( int k = 0; k < drivesInfo.size(); k++ ) { QFileInfo driveName = drivesInfo.at(k); if (!driveName.filePath().contains("..")) { xmlDocument.append( xmlOpening + xmlFolderElement + xmlEnding ); xmlDocument.append(driveName.filePath().replace("/","\\", Qt::CaseInsensitive)); xmlDocument.append( xmlClosing + xmlFolderElement + xmlEnding ); } } } if (path.size() <= 3 && path.contains(":")) { xmlDocument.append(xmlOpening + xmlFolderElement + xmlEnding ); xmlDocument.append(".."); xmlDocument.append(xmlClosing + xmlFolderElement + xmlEnding ); cptBack = 1; } #endif for( int j = 0; j < documentList.size(); j++ ) { #ifdef WIN32 QFileInfo documentInfo(QDir::toNativeSeparators(currentDir.absolutePath() + "\\" + documentList.at(j))); #else QFileInfo documentInfo(QDir::toNativeSeparators(currentDir.absolutePath() + "/" + documentList.at(j))); #endif QString folderName = documentList.at(j); if (QString::compare(folderName, QString("."), Qt::CaseInsensitive) != 0) { if (QString::compare(folderName, QString(".."), Qt::CaseInsensitive) == 0) { if (QString::compare(path, QString("/"), Qt::CaseInsensitive) != 0) { if (cptBack == 0) { if (!documentInfo.isBundle() && documentInfo.isDir()) { xmlDocument.append(xmlOpening + xmlFolderElement + xmlEnding ); xmlDocument.append(folderName); xmlDocument.append(xmlClosing + xmlFolderElement + xmlEnding ); } } } } else { if (!documentInfo.isBundle() && documentInfo.isDir()) { xmlDocument.append(xmlOpening + xmlFolderElement + xmlEnding ); xmlDocument.append(folderName); xmlDocument.append(xmlClosing + xmlFolderElement + xmlEnding ); } } } } xmlDocument.append( xmlClosing + xmlFolderListElement + xmlEnding ); xmlDocument.append( xmlOpening + xmlFileListElement + xmlEnding ); for( int j = 0; j < documentList.size(); j++ ) { #ifdef WIN32 QFileInfo documentInfo(QDir::toNativeSeparators(currentDir.absolutePath() + "\\" + documentList.at(j))); #else QFileInfo documentInfo(QDir::toNativeSeparators(currentDir.absolutePath() + "/" + documentList.at(j))); #endif if (documentInfo.isBundle() || documentInfo.isFile()) { xmlDocument.append( xmlOpening + xmlFileElement + xmlEnding ); QString fileName = documentList.at(j); xmlDocument.append( fileName ); xmlDocument.append( xmlClosing + xmlFileElement + xmlEnding ); } } xmlDocument.append( xmlClosing + xmlFileListElement + xmlEnding ); } QString XmlCreatorServer::getFoldersParameters(QString path) { QString xmlDoctype = QString(XML_DOCTYPE); QString xmlOpening = QString(XML_OPENING); QString xmlClosing = QString(XML_CLOSING); QString xmlEnding = QString(XML_ENDING); QString xmlPathElement = QString(PATH); QString xmlParametersDocument = QString(xmlDoctype + XML_FOLDERS + xmlEnding); QString xmlKontrolPackElement = QString(KONTROLPACK); QString xmlHostnameElement = QString(HOSTNAME); QString xmlSystemElement = QString(SYSTEM); QString drive = QString(DRIVE); QString drives = QString(DRIVES); QFileInfoList drivesInfo = QDir::drives(); QString xmlDocument = QString(""); xmlDocument.append(xmlParametersDocument); xmlDocument.append(xmlOpening + xmlKontrolPackElement + xmlEnding); xmlDocument.append(xmlOpening + xmlHostnameElement + xmlEnding); xmlDocument.append(QHostInfo::localHostName()); xmlDocument.append(xmlClosing + xmlHostnameElement + xmlEnding); xmlDocument.append(xmlOpening + xmlSystemElement + xmlEnding); #ifdef WIN32 xmlDocument.append(WINDOWS); #elif defined (linux) xmlDocument.append(LINUX); #elif defined __APPLE__ xmlDocument.append(MACOSX); #elif defined (__FreeBSD__) xmlDocument.append(FREEBSD); #else xmlDocument.append(LINUX); #endif xmlDocument.append(xmlClosing + xmlSystemElement + xmlEnding); xmlDocument.append(xmlOpening + xmlPathElement + xmlEnding); xmlDocument.append(path); xmlDocument.append(xmlClosing + xmlPathElement + xmlEnding); appendFolderAndFileInfo(xmlDocument, path); xmlDocument.append( xmlOpening + drives + xmlEnding ); for( int k = 0; k < drivesInfo.size(); k++ ) { xmlDocument.append( xmlOpening + drive + xmlEnding ); QFileInfo driveName = drivesInfo.at(k); xmlDocument.append(driveName.filePath()); xmlDocument.append( xmlClosing + drive + xmlEnding ); } xmlDocument.append( xmlClosing + drives + xmlEnding ); xmlDocument.append(xmlClosing + xmlKontrolPackElement + xmlEnding); return xmlDocument; } QString XmlCreatorServer::getFileInfo(QString filePath, QString path, QString header) { QString xmlDoctype = QString(XML_DOCTYPE); QString xmlOpening = QString(XML_OPENING); QString xmlClosing = QString(XML_CLOSING); QString xmlEnding = QString(XML_ENDING); QString fileNameElement = QString(FILE_NAME); QString fileSizeElement = QString(FILE_SIZE); QString fileExecutableElement = QString(FILE_EXECECUTABLE); QString fileReadableElement = QString(FILE_READABLE); QString fileOwnerElement = QString(FILE_OWNER); QString fileExtensionElement = QString(FILE_EXTENSION); QString fileDirectoryDateElement = QString(FILE_DIRECTORY); QString fileCreationDateElement = QString(FILE_CREATION_DATE); QString fileModifiedDateElement = QString(FILE_MODIFIED_DATE); QString xmlParametersDocument = QString(xmlDoctype + header + xmlEnding); QString xmlKontrolPackElement = QString(KONTROLPACK); QFileInfo fileInfo(filePath); QDateTime created = fileInfo.created(); QDateTime lastModified = fileInfo.lastModified(); bool exec = fileInfo.isExecutable(); bool read = fileInfo.isReadable(); QString executable = (exec) ? "true" : "false"; QString readable = (read) ? "true" : "false"; QString size = QString::number(fileInfo.size()); // bytes QString fileName = fileInfo.fileName(); QString owner = fileInfo.owner(); QString extension = fileInfo.completeSuffix(); QString directory = path; QString dateModified = lastModified.toString("dd.MM.yyyy"); QString dateCreated = created.toString("dd.MM.yyyy"); QString xmlDocument = QString(""); xmlDocument.append(xmlParametersDocument); xmlDocument.append(xmlOpening + xmlKontrolPackElement + xmlEnding); xmlDocument.append(xmlOpening + fileNameElement + xmlEnding); xmlDocument.append(fileName); xmlDocument.append(xmlClosing + fileNameElement + xmlEnding); xmlDocument.append(xmlOpening + fileSizeElement + xmlEnding); xmlDocument.append(size); xmlDocument.append(xmlClosing + fileSizeElement + xmlEnding); xmlDocument.append(xmlOpening + fileExecutableElement + xmlEnding); xmlDocument.append(executable); xmlDocument.append(xmlClosing + fileExecutableElement + xmlEnding); xmlDocument.append(xmlOpening + fileReadableElement + xmlEnding); xmlDocument.append(readable); xmlDocument.append(xmlClosing + fileReadableElement + xmlEnding); xmlDocument.append(xmlOpening + fileOwnerElement + xmlEnding); xmlDocument.append(owner); xmlDocument.append(xmlClosing + fileOwnerElement + xmlEnding); xmlDocument.append(xmlOpening + fileExtensionElement + xmlEnding); xmlDocument.append(extension); xmlDocument.append(xmlClosing + fileExtensionElement + xmlEnding); xmlDocument.append(xmlOpening + fileDirectoryDateElement + xmlEnding); xmlDocument.append(directory); xmlDocument.append(xmlClosing + fileDirectoryDateElement + xmlEnding); xmlDocument.append(xmlOpening + fileCreationDateElement + xmlEnding); xmlDocument.append(dateCreated); xmlDocument.append(xmlClosing + fileCreationDateElement + xmlEnding); xmlDocument.append(xmlOpening + fileModifiedDateElement + xmlEnding); xmlDocument.append(dateModified); xmlDocument.append(xmlClosing + fileModifiedDateElement + xmlEnding); xmlDocument.append(xmlClosing + xmlKontrolPackElement + xmlEnding); return xmlDocument; } KontrolPack-3.0.0/kontrolpack/server/core/xml/xml_parser_server.h000644 001750 001750 00000003421 11426532120 023435 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef XML_PARSER_SERVER_H #define XML_PARSER_SERVER_H #include #include #include #include "../../../commons/constants.h" #include "../bean/document.h" class XmlParserServer : public QObject { Q_OBJECT public: XmlParserServer(QObject *parent); static Document* getDocumentInformation(QString xml); }; #endif KontrolPack-3.0.0/kontrolpack/server/core/xml/xml_creator_server.h000644 001750 001750 00000005060 11426532120 023601 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef XML_CREATOR_SERVER_H #define XML_CREATOR_SERVER_H #include #include #include #include #include #include #include "../../../commons/constants.h" #include class XmlCreatorServer : public QObject { Q_OBJECT public: XmlCreatorServer(QObject *parent); QString getFoldersParameters(QString path); QString getConnectionParameters(QString path); QString getFileInfo(QString filePath, QString path, QString header); QString createXmlParameters(QString path, QStringList *ipList); void appendFolderAndFileInfo(QString &xmlDocument, QString path ); QString xmlOpening; QString xmlClosing; QString xmlEnding; QString xmlDoctype; QString xmlParametersDocument; QString xmlContextDocument; QString xmlContextFileDocument; QString xmlKontrolPackElement; QString xmlHostnameElement; QString xmlSystemElement; QString xmlPathElement; QString xmlFolderListElement; QString xmlFileListElement; QString xmlFolderElement; QString xmlFileElement; QString xmlIpListElement; QString xmlIpElement; }; #endif KontrolPack-3.0.0/kontrolpack/server/core/xml/xml_parser_server.cpp000644 001750 001750 00000005040 11426532120 023767 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "xml_parser_server.h" XmlParserServer::XmlParserServer(QObject *parent) : QObject(parent) { } Document* XmlParserServer::getDocumentInformation(QString xml) { Document *document = new Document; QDomDocument doc; doc.setContent(xml); QDomElement root = doc.documentElement(); QDomElement child = root.firstChild().toElement(); while(!child.isNull()) { if (child.tagName() == DOC_XML) { document->doc = child.text(); } if (child.tagName() == FILE_XML) { document->name = child.text(); } if (child.tagName() == FILE_NEW_XML) { document->newName = child.text(); } if (child.tagName() == PATH) { document->path = child.text(); } if (child.tagName() == FROM_XML) { document->from = child.text(); } if (child.tagName() == TO_XML) { document->to = child.text(); } child = child.nextSibling().toElement(); } return document; } KontrolPack-3.0.0/kontrolpack/server/ui/000755 001750 001750 00000000000 11432774524 016424 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/server/ui/server_main_window.cpp000644 001750 001750 00000017522 11430753166 023035 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "server_main_window.h" ServerMainWindow::ServerMainWindow(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/images/kontrolpack.png")); QString title = tr("KontrolPack ") + QString(VERSION) + tr(" : Secure remote access [TCP/IP server mode] "); setWindowTitle(title); #ifdef WIN32 QFont font("Arial", 8, true); #elif defined __APPLE__ QFont font = QFont(); #else QFont font("Arial", 10, true); #endif setUnifiedTitleAndToolBarOnMac(true); // Menus creation QMenu *menu = new QMenu; switchModeAction = menu->addAction(tr("&Switch KontrolPack Mode Client/Server")); switchModeAction->setShortcut(QKeySequence("Ctrl+S")); switchModeAction->setIcon(QIcon(":/images/go-jump.png")); menu->addSeparator(); QAction *userModeAction = menu->addAction(tr("&User mode")); userModeAction->setShortcut(QKeySequence("Ctrl+M")); userModeAction->setIcon(QIcon(":/images/go-jump.png")); menu->addSeparator(); aboutAction = menu->addAction(tr("&About KontrolPack")); aboutAction->setShortcut(QKeySequence("Ctrl+A")); aboutAction->setIcon(QIcon(":/images/about.png")); menu->addSeparator(); updateAction = menu->addAction(tr("&Check for updates")); updateAction->setShortcut(QKeySequence("Ctrl+U")); updateAction->setIcon(QIcon(":/images/update.png")); menu->addSeparator(); quitAction = menu->addAction(tr("&Quit")); quitAction->setShortcut(QKeySequence("Ctrl+Q")); quitAction->setIcon(QIcon(":/images/exit.png")); QToolButton *menuButton = new QToolButton; menuButton->setToolTip(tr("Menu settings")); menuButton->setPopupMode(QToolButton::InstantPopup); menuButton->setContextMenuPolicy(Qt::DefaultContextMenu); menuButton->setIcon(QIcon(":/images/settings.png")); menuButton->setMenu(menu); // Main toolBar QToolBar *fileToolBar = addToolBar(tr("Shell")); fileToolBar->addWidget(menuButton); //StatusBar creation toolBar = statusBar(); toolBar->setFont(font); toolBar->showMessage(tr("RSA | AES encryption over TCP/IP")); QLabel *security = new QLabel(this); security->setPixmap(QPixmap(":/images/security.png")); toolBar->addWidget(security); // Central zone creation centralWindow = new ServerCentralWindow; setCentralWidget(centralWindow); centerOnScreen(); // Tray icon createActions(); createTrayIcon(); trayIcon->setIcon(QIcon(":/images/kontrolpack.png")); trayIcon->setToolTip(tr("KontrolPack : Secure remote access.")); trayIcon->show(); //Initialisation aboutDialog = new AboutDialog(); setFixedSize(570, 370); //signals and slots connections QObject::connect(switchModeAction, SIGNAL(triggered()), this, SLOT(switchMode())); QObject::connect(userModeAction, SIGNAL(triggered()), this, SLOT(switchUserMode())); QObject::connect(updateAction, SIGNAL(triggered()), this, SLOT(displayUpdateManager())); QObject::connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); QObject::connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); QObject::connect(aboutAction, SIGNAL(triggered()), this, SLOT(displayAbout())); QObject::connect(centralWindow, SIGNAL(showMessage(QString,QString, int)), this, SLOT(showMessage(QString,QString, int))); } void ServerMainWindow::createActions() { minimizeAction = new QAction(tr("Mi&nimize KontrolPack"), this); connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); maximizeAction = new QAction(tr("Restore KontrolPack"), this); connect(maximizeAction, SIGNAL(triggered()), this, SLOT(show())); } void ServerMainWindow::showMessage(QString title, QString content, int duration) { trayIcon->showMessage(title, content, QSystemTrayIcon::Information, duration); } void ServerMainWindow::createTrayIcon() { trayIconMenu = new QMenu(this); trayIconMenu->addAction(minimizeAction); trayIconMenu->addAction(maximizeAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(switchModeAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(aboutAction); trayIconMenu->addAction(updateAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(quitAction); trayIcon = new QSystemTrayIcon(this); trayIcon->setContextMenu(trayIconMenu); } void ServerMainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: if (this->isVisible()) { hide(); showMessage(tr("Welcome"), tr("KontrolPack : Access securely any remote computer."), 3000); } else { show(); } break; case QSystemTrayIcon::DoubleClick: break; case QSystemTrayIcon::MiddleClick: QMessageBox::information(this, tr("About KontrolPack"), tr("KontrolPack : Secure remote access.")); break; default: ; } } void ServerMainWindow::closeEvent(QCloseEvent *event) { if (trayIcon->isVisible()) { showMessage(tr("Information"), tr("KontrolPack will keep running into the " "system tray. To terminate the program, " "choose \"Quit\" in the context menu " "that pops up when clicking this program's " "entry in the system tray."), 3000); hide(); event->ignore(); } else { trayIcon->hide(); trayIcon->setVisible(false); } } void ServerMainWindow::centerOnScreen() { QDesktopWidget screen; QRect screenGeom = screen.screenGeometry(this); int screenCenterX = screenGeom.center().x(); int screenCenterY = screenGeom.center().y(); move(screenCenterX - width () / 2, screenCenterY - height() / 2); } void ServerMainWindow::switchMode() { QSettings settings("OpenNetwork", "KontrolPack"); settings.setValue("startup/mode", "NONE"); showMessage(tr("Switch KontrolPack Mode warning"), tr("Please, restart KontrolPack in order to choose another mode."), 3000); } void ServerMainWindow::displayAbout() { aboutDialog->exec(); } void ServerMainWindow::displayUpdateManager() { UpdateManager *updateManager = new UpdateManager(); updateManager->updateManager(); } void ServerMainWindow::switchUserMode() { UserModeWidGet *mode_widget = new UserModeWidGet; mode_widget->exec(); } KontrolPack-3.0.0/kontrolpack/server/ui/server_central_window.h000644 001750 001750 00000005314 11426532120 023170 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../core/network/connection_controller.h" class ServerCentralWindow : public QWidget { Q_OBJECT public: ServerCentralWindow(QWidget *parent = 0); public slots: int start_server(); void stop_server(); void tcp_state(int state, int client_nbr); void auth_succeeded(int client_nbr); signals: void showMessage(QString title, QString content, int duration); private: QList addresses; QLabel *image; QGroupBox *groupBox; QPushButton *startButton; QPushButton *stopButton; QLabel *statusLabel; QLabel *hostLabel; QLabel *passwordLabel; QLabel *portLabel; QLabel *portFileLabel; QComboBox *ipCombo; QLineEdit *hostLineEdit; QLineEdit *passwordLineEdit; QLineEdit *portLineEdit; QLineEdit *portFileLineEdit; QSettings *settings; ConnectionController *controller; }; KontrolPack-3.0.0/kontrolpack/server/ui/server_main_window.h000644 001750 001750 00000005722 11426532120 022467 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef HEADER_SERVERMAINWINDOW #define HEADER_SERVERMAINWINDOW #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../commons/startup/update_manager.h" #include "../../commons/startup/user_mode.h" #include "../../commons/win32/qtwin.h" #include "server_central_window.h" #include "../../commons/constants.h" #include "../../commons/about_dialog.h" class ServerMainWindow : public QMainWindow { Q_OBJECT public: ServerMainWindow(QWidget *parent = 0); void centerOnScreen(); ServerCentralWindow *centralWindow; void createActions(); void createTrayIcon(); private: QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; QAction *minimizeAction; QAction *maximizeAction; QAction *restoreAction; QAction *switchModeAction; QAction *quitAction; QAction *aboutAction; QAction *updateAction; QStatusBar *toolBar; AboutDialog *aboutDialog; public slots: void switchMode(); void displayUpdateManager(); void iconActivated(QSystemTrayIcon::ActivationReason reason); void displayAbout(); void showMessage(QString title, QString content, int duration); void switchUserMode(); protected: void closeEvent(QCloseEvent *event); }; #endif KontrolPack-3.0.0/kontrolpack/server/ui/server_central_window.cpp000644 001750 001750 00000025415 11431276714 023541 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "server_central_window.h" ServerCentralWindow::ServerCentralWindow(QWidget *parent) : QWidget(parent) { settings = new QSettings("OpenNetwork", "KontrolPack", this); controller = new ConnectionController(this); image = new QLabel(this); groupBox = new QGroupBox(this); QGridLayout *gridBox = new QGridLayout; ipCombo = new QComboBox(this); ipCombo->setEditable(false); passwordLineEdit = new QLineEdit(""); portLineEdit = new QLineEdit(settings->value("parameters/port", "17984").toString()); portFileLineEdit = new QLineEdit(settings->value("parameters/port-file", "17985").toString()); passwordLineEdit->setEchoMode(QLineEdit::Password); ipCombo->setMinimumWidth(25); portLineEdit->setMinimumWidth(25); portLineEdit->setValidator(new QIntValidator(1, 65535, this)); portFileLineEdit->setMinimumWidth(25); portFileLineEdit->setMinimumWidth(25); portFileLineEdit->setValidator(new QIntValidator(1, 65535, this)); #ifdef WIN32 image->setPixmap(QPixmap(":/images/windows-computer.png")); QFont font("Arial", 8, true); QString os = QString("Microsoft Windows"); #elif defined __APPLE__ image->setPixmap(QPixmap(":/images/mac-computer.png")); QFont font = QFont(); QString os = QString("Mac OS X"); #else image->setPixmap(QPixmap(":/images/linux-computer.png")); QFont font("Arial", 10, true); QString os = QString("GNU/Linux based OS"); #endif int cpt = 2; QList interface_list = QNetworkInterface::allInterfaces(); for (int k = 0; k < interface_list.size(); k++) { if (interface_list.at(k).flags().testFlag(QNetworkInterface::IsRunning)) { foreach (QNetworkAddressEntry entry, interface_list.at(k).addressEntries()) { if ( interface_list.at(k).hardwareAddress() != "00:00:00:00:00:00" && entry.ip().toString().contains(".")) { cpt ++; #ifdef WIN32 QLabel *adressLabel = new QLabel(entry.ip().toString()); #else QLabel *adressLabel = new QLabel(interface_list.at(k).name() + " : " + entry.ip().toString()); #endif adressLabel->setFont(font); gridBox->addWidget(adressLabel, cpt, 0); if (!entry.ip().toString().startsWith(QString(LOOPBACK), Qt::CaseInsensitive)) ipCombo->addItem(entry.ip().toString(), entry.ip().toString()); } } } } ipCombo->addItem(QString(LOOPBACK), QString(LOOPBACK)); QLabel *os_label = new QLabel(os); os_label->setFont(font); gridBox->addWidget(image, 0, 0); gridBox->addWidget(os_label, 1, 0); groupBox->setLayout(gridBox); statusLabel = new QLabel(tr("Status : Server stopped"), this); statusLabel->setFont(font); QLabel *label = new QLabel(tr("KontrolPack Server : Remote access over secure network"), this); label->setFont(font); QLabel *authLabel = new QLabel(tr("Choose a password to secure authentication mechanism"), this); authLabel->setFont(font); startButton = new QPushButton(QIcon(":/images/start.png"), tr("Start server"), this); stopButton = new QPushButton(QIcon(":/images/stop.png"), tr("Stop server"), this); startButton->setFont(font); stopButton->setFont(font); label->setOpenExternalLinks(true); stopButton->setDisabled(true); hostLabel = new QLabel(tr("&Server IP address :")); passwordLabel = new QLabel(tr("KontrolPack Master Password :")); portLabel = new QLabel(tr("S&erver port :")); portFileLabel = new QLabel(tr("S&erver File port :")); hostLabel->setFont(font); passwordLabel->setFont(font); portLabel->setFont(font); portFileLabel->setFont(font); hostLabel->setBuddy(ipCombo); portLabel->setBuddy(portLineEdit); portFileLabel->setBuddy(portFileLineEdit); passwordLabel->setBuddy(passwordLineEdit); QFrame *upFrame = new QFrame( this ); upFrame->setFrameStyle( QFrame::HLine | QFrame::Sunken ); QFrame *passwordFrame = new QFrame( this ); passwordFrame->setFrameStyle( QFrame::HLine | QFrame::Sunken ); QFrame *downFrame = new QFrame( this ); downFrame->setFrameStyle( QFrame::HLine | QFrame::Sunken ); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(groupBox, 0, 0, 9, 1); mainLayout->addWidget(label, 0, 1, 1, 2); setWindowFlags(Qt::Dialog); mainLayout->addWidget(upFrame, 1, 1, 1, 2); mainLayout->addWidget(authLabel, 2, 1, 1, 2); mainLayout->addWidget(passwordLabel, 3, 1); mainLayout->addWidget(passwordLineEdit, 3, 2); mainLayout->addWidget(passwordFrame, 4, 1, 1, 2); mainLayout->addWidget(hostLabel, 5, 1); mainLayout->addWidget(ipCombo, 5, 2); mainLayout->addWidget(portLabel, 6, 1); mainLayout->addWidget(portLineEdit, 6, 2); mainLayout->addWidget(portFileLabel, 7, 1); mainLayout->addWidget(portFileLineEdit, 7, 2); mainLayout->addWidget(downFrame, 8, 1, 1, 2); mainLayout->addWidget(statusLabel, 9, 1, 1, 2); mainLayout->addWidget(startButton, 10, 1); mainLayout->addWidget(stopButton, 10, 2); setLayout(mainLayout); ipCombo->setFocus(); QObject::connect(controller, SIGNAL(signals_state(int, int)), this, SLOT(tcp_state(int, int))); QObject::connect(controller, SIGNAL(auth_succeeded(int)), this, SLOT(auth_succeeded(int))); QObject::connect(startButton, SIGNAL(clicked()), this, SLOT(start_server())); QObject::connect(stopButton, SIGNAL(clicked()), this, SLOT(stop_server())); QObject::connect(passwordLineEdit, SIGNAL(returnPressed()), this, SLOT(start_server())); } int ServerCentralWindow::start_server() { if (ipCombo->itemText(ipCombo->currentIndex()) != "") { if (portLineEdit->text() != "") { if (portFileLineEdit->text() != "") { if (passwordLineEdit->text().size() > 7) { if (passwordLineEdit->text().size() < 30) { int start = controller->start_server(passwordLineEdit->text(), ipCombo->itemText(ipCombo->currentIndex()), portLineEdit->text().toInt(), portFileLineEdit->text().toInt()); if (start == 1 ) { settings->setValue("parameters/ip", ipCombo->itemText(ipCombo->currentIndex())); settings->setValue("parameters/port", portLineEdit->text()); settings->setValue("parameters/port-file", portFileLineEdit->text()); startButton->setDisabled(true); stopButton->setDisabled(false); this->parentWidget()->hide(); statusLabel->setText(tr("Status : Server started")); emit showMessage("Information", "Server started...", 3000); } else { statusLabel->setText(tr("Status : Error : Server stopped")); emit showMessage("Information", "Error starting server : Server stopped...", 3000); return 0; } } else { QMessageBox::information(this, tr("Warning"), tr("Password length must be smaller than 30 characters.")); } } else { QMessageBox::information(this, tr("Warning"), tr("For security reason, password length must be at least 8.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Please, fill in the port file field.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Please, fill in the port field.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Please, fill in the IP address field.")); } } void ServerCentralWindow::stop_server() { controller->stop_server(); startButton->setDisabled(false); stopButton->setDisabled(true); statusLabel->setText(tr("Status : Server stopped")); emit showMessage("Information", "Server stopped...", 3000); } /* #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_EXCHANGE 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 */ void ServerCentralWindow::tcp_state(int state, int client_nbr) { switch (state) { case TOKEN_WELCOME : { qDebug("Server notification : Status TOKEN_WELCOME"); emit showMessage("Information", "A remote computer is trying to connect...", 3000); break; } case RSA_PUBLIC_KEY_RECEPTION : { qDebug("Server notification : Status RSA_PUBLIC_KEY_EXCHANGE"); break; } case PASSWORD_VALIDATION : { qDebug("Server notification : Status PASSWORD_VALIDATION"); break; } case AES_KEY_RECEPTION : { qDebug("Server notification : Status AES_KEY_RECEPTION"); break; } case AUTH_SUCCESS : { qDebug("Server notification : Status 4"); break; } case 5 : { qDebug("Server notification : Status 5"); break; } default: ; } } /* Connect to the auth_succeeded to be aware of new client authentification state. */ void ServerCentralWindow::auth_succeeded(int client_nbr) { emit showMessage("Information", "A remote computer is connected to this computer. Authentification succeeded...", 3000); } KontrolPack-3.0.0/kontrolpack/main.cpp000644 001750 001750 00000020122 11444230360 016112 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "auth/auth_tcp_client.h" #include "auth/auth_server.h" #include "commons/constants.h" #include "client/ui/client_main_window.h" #include "server/ui/server_main_window.h" #include "commons/startup/startup_dialog.h" #include "commons/startup/update_manager.h" #include "commons/startup/user_mode.h" #include #include #include #include #include "server/core/network/connection_controller.h" int consoleMode(int argc, char *argv[]) { // Console mode QCoreApplication app(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); printf("\n---------------------------------------------------------"); printf("\nKontrolPack Server Mode [Access securely your computer] \n"); printf("--------------------------------------------------------- \n"); printf(" ## ## ###### \n" " ## ## ## ## \n" " ## ## ## ## ## ## ## ## \n" " #### #### ## ## ## # ## ## \n" " ## ## ##### ###### ## #### ##### ## ###### ##### ##### #### \n" " ## ## # # ## ## ## ## # # ## ## ## ## # ## ## \n" " ## ## ##### ## ## ## ## ##### ## ## ##### ##### ## ## \n" " \n" " ################################################################# \n" " ################################################################# \n\n\n"); QString password_qstring = ""; char password[200] = ""; printf("Choose server master password :\n"); fgets(password, sizeof password, stdin); password_qstring = QString(password); password_qstring = password_qstring.mid(0, password_qstring.length() - 1); if (password_qstring.length() < 8 || password_qstring.length() > 30) { printf("For security reason, password length must be between 8 an 30 digits.\n"); exit(0); return 0; } QSettings settings("OpenNetwork", "KontrolPack"); settings.setValue("ui/cli", "true"); ConnectionController *controller = new ConnectionController; int start = controller->start_server(QString(password_qstring), QString(argv[2]), QString(argv[3]).toInt(), QString(argv[4]).toInt()); if (start == 1 ) { printf("Server successfully started.\n"); } else { printf("Server failed to start.\n"); exit(0); return 0; } return app.exec(); } bool processArgs(int argc, char **argv) { if (argc >= 2) { QString arg1(argv[1]); if (arg1 == QLatin1String("-c") || arg1 == QLatin1String("-console")) { QString ip; QString port; QString port_file; if (argc > 2) ip = argv[2]; if (argc > 4) { port = argv[3]; port_file = argv[4]; consoleMode(argc, argv); } else { printf("\n\n\tIp or ports parameters missing.\n\n"); printf("kontrolpack -c SERVER_IP SERVER_PORT\n\n" "\t-c(console)\t: Run KontrolPack client in console mode\nn\n"); } return true; } } printf("\n\n\tIp or ports parameters missing.\n\n"); printf("kontrolpack -c SERVER_IP SERVER_PORT\n\n" "\t-c(console)\t: Run KontrolPack client in console mode\nn\n"); return false; } int main(int argc, char *argv[]) { if (argc >= 2) { bool running = processArgs(argc, argv); if (running) return 0; } Q_INIT_RESOURCE(resources); QSettings settings("OpenNetwork", "KontrolPack"); settings.setValue("ui/cli", "false"); QApplication app(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QString user_mode = settings.value("user/mode", "NONE").toString(); app.setApplicationName("KontrolPack"); app.setApplicationVersion(VERSION); app.setOrganizationName("Thomas THELLIEZ"); QString locale = QLocale::system().name().section('_', 0, 0); QTranslator translator; translator.load( QString( ":/langs/kontrolpack_%1" ).arg(locale)); app.installTranslator(&translator); QTranslator qtTranslator; qtTranslator.load(QString("qt_") + locale, QLibraryInfo::location( QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); QString update = settings.value("startup/update", "false").toString(); if (update.startsWith("false", Qt::CaseInsensitive)) { UpdateManager *updateManager = new UpdateManager(); QTimer::singleShot(10000, updateManager, SLOT(autoUpdateManager())); } QString mode = settings.value("startup/mode", "NONE").toString(); if (mode.startsWith("NONE", Qt::CaseSensitive)) { StartUpDialog *startup_dialog = new StartUpDialog(); startup_dialog->setWindowFlags(Qt::FramelessWindowHint); #ifdef WIN32 startup_dialog->setAttribute( Qt::WA_TranslucentBackground, true); #elif defined __APPLE__ startup_dialog->setAttribute( Qt::WA_TranslucentBackground, true); #endif startup_dialog->show(); } else if (mode.startsWith("SERVER", Qt::CaseSensitive)) { settings.setValue("startup/mode", "SERVER"); ServerMainWindow *window = new ServerMainWindow; if (QtWin::isCompositionEnabled()) { QtWin::extendFrameIntoClientArea(window); window->setContentsMargins(0, 0, 0, 0); } window->show(); } else if (mode.startsWith("CLIENT", Qt::CaseSensitive)) { settings.setValue("startup/mode", "CLIENT"); ClientMainWindow *window = new ClientMainWindow; if (QtWin::isCompositionEnabled()) { QtWin::extendFrameIntoClientArea(window); window->setContentsMargins(0, 0, 0, 0); } window->show(); } if (user_mode.startsWith("NONE", Qt::CaseInsensitive)) { UserModeWidGet *mode_widget = new UserModeWidGet; mode_widget->exec(); } return app.exec(); } KontrolPack-3.0.0/kontrolpack/client/000755 001750 001750 00000000000 11444437517 015760 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/core/000755 001750 001750 00000000000 11432774551 016707 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/core/bean/000755 001750 001750 00000000000 11432306342 017601 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/core/bean/command.cpp000644 001750 001750 00000003021 11426532122 021717 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "command.h" Command::Command(QObject *parent) : QObject(parent) { } KontrolPack-3.0.0/kontrolpack/client/core/bean/folder.cpp000644 001750 001750 00000003016 11426532122 021560 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "folder.h" Folder::Folder(QObject *parent) : QObject(parent) { } KontrolPack-3.0.0/kontrolpack/client/core/bean/remote_computer_info.h000644 001750 001750 00000003375 11426532122 024206 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef OS_INFO_H #define OS_INFO_H #include #include #include class RemoteComputerInfo : public QObject { Q_OBJECT public: RemoteComputerInfo(QObject *parent); int id; QString hostname; QString system; QString home_path; QString ip; int port; int port_file; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/bean/file.h000644 001750 001750 00000003532 11426532122 020674 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef FILE_H #define FILE_H #include #include #include class File : public QObject { Q_OBJECT public: File(QObject *parent); QString name; QString size; QString to; QString from; bool is_upload; QString executable; QString readable; QString owner; QString extension; QString directory; QString creationDate; QString modifiedDate; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/bean/command.h000644 001750 001750 00000003267 11426532122 021400 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef COMMAND_H #define COMMAND_H #include #include #include class Command : public QObject { Q_OBJECT public: Command(QObject *parent); int id_command; int id_server; QString command; QString date; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/bean/remote_computer_info.cpp000644 001750 001750 00000003064 11426532122 024534 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "remote_computer_info.h" RemoteComputerInfo::RemoteComputerInfo(QObject *parent) : QObject(parent) { } KontrolPack-3.0.0/kontrolpack/client/core/bean/file.cpp000644 001750 001750 00000003010 11426532122 021216 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "file.h" File::File(QObject *parent) : QObject(parent) { } KontrolPack-3.0.0/kontrolpack/client/core/bean/folder.h000644 001750 001750 00000003316 11426532122 021230 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef FOLDER_H #define FOLDER_H #include #include #include class Folder : public QObject { Q_OBJECT public: Folder(QObject *parent); QString path; QStringList *folder_list; QStringList *file_list; QStringList *drive_list; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/bean/os_characteristic.cpp000644 001750 001750 00000003055 11426532122 024001 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "os_characteristic.h" OsCharacteristic::OsCharacteristic(QObject *parent) : QObject(parent) { } KontrolPack-3.0.0/kontrolpack/client/core/bean/os_characteristic.h000644 001750 001750 00000003444 11426532122 023450 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef OS_CHARACTERISTIC_H #define OS_CHARACTERISTIC_H #include #include #include class OsCharacteristic : public QObject { Q_OBJECT public: OsCharacteristic(QObject *parent); QString hostname; QString system; QString home_path; QStringList *folder_list; QStringList *file_list; QStringList *ip_list; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/network/000755 001750 001750 00000000000 11432306342 020365 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/core/network/socket_controller.h000644 001750 001750 00000006057 11426532122 024301 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef SOCKETCONTROLLER_H #define SOCKETCONTROLLER_H #include #include #include #include "auth/auth_tcp_client.h" #include "file_manager.h" #include "../../../commons/constants.h" #include "../xml/xml_creator_client.h" #include "../xml/xml_parser_client.h" class SocketController : public QObject { Q_OBJECT public: SocketController(char* ip, int port,int f_port, QString password); FileManager *file_manager; void connect_to_server(char* ip, int port, int f_port, QString password); auth_tcp_client *master_tcp_client; auth_tcp_client *file_tcp_client; void error_message_dequeue(QString message); QQueue *file_queue; public slots: void auth_succeeded_slot(); void received_stream_slot(QString message); void send_to_server(QString msg); void ask_file_to_server(QString to, QString from, QString file_name); void send_file_to_server(QString to, QString from, QString file_name); void executeCommand(QString command, QString path); void process_queue(); signals: void client_characteristics(OsCharacteristic *characteristics); void refresh_directory_view(Folder *folder); void showMessage(QString title, QString content, int duration); void showLabelSignal(QString label); void remove_from_view(QString file_name, bool is_local); void file_uploaded(File *file); void update_percent(int current, int total); void command_results(QString str); private: XmlParserClient *xml_parser; QString slash; char* server_ip; int server_port; int server_port_file; QString server_password; QString filePath; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/network/file_manager.cpp000644 001750 001750 00000007277 11432224546 023524 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "file_manager.h" FileManager::FileManager(auth_tcp_client *file_tcp_client, QObject *parent) : tcp_client(file_tcp_client), QObject(parent) { #ifdef WIN32 slash = QString("\\"); #else slash = QString("/"); #endif file_queue = new QQueue; } void FileManager::received_stream_slot_files(QString message) { QApplication::processEvents(); QByteArray file_array = QByteArray::fromBase64(message.toUtf8()); QApplication::processEvents(); if (!file_queue->isEmpty()) { current_file = file_queue->dequeue(); emit showLabelSignal(tr("Decrypting and Writing ") + current_file->name + tr(" to ") + current_file->to + tr(", please wait...")); QApplication::processEvents(); QFile *file = new QFile(current_file->to + current_file->name); if(file->isOpen()==false) { if(!file->open(QIODevice::WriteOnly)) { emit showMessage(tr("File error"),tr("An error occured while getting remote file : The local file is not correctly opened."), 4000); return; } } QApplication::processEvents(); file->write(file_array); file->close(); emit file_received(current_file); current_file = NULL; } } void FileManager::append_file(File* file) { file_queue->enqueue(file); } /** Send document to remote client. */ int FileManager::send_document(QString name, QString path) { emit update_percent(100, 0); QApplication::processEvents(); QString file_path = path + slash + name; QFile *file = new QFile(file_path); if (file->exists()) { if (file->open(QIODevice::ReadOnly)) { if (file->isReadable()) { while (!file->atEnd()) { // Envoyer packet par packet... tcp_client->write_encrypted_data_to_socket(file->readAll().toBase64()); QApplication::processEvents(); } file->close(); delete file; return 1; } else { qDebug("File unreadable"); return 0; } } else { qDebug("File not opened"); return 0; } } else { qDebug("File does not exist."); return 0; } } KontrolPack-3.0.0/kontrolpack/client/core/network/file_manager.h000644 001750 001750 00000004346 11432215654 023163 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef FILEMANAGER_H #define FILEMANAGER_H #include #include #include #include "auth/auth_tcp_client.h" #include "../../../commons/constants.h" #include "../xml/xml_parser_client.h" class FileManager : public QObject { Q_OBJECT public: FileManager(auth_tcp_client *file_tcp_client, QObject *parent); QQueue *file_queue; void append_file(File* file); int send_document(QString name, QString path); public slots: void received_stream_slot_files(QString message); signals: void file_received(File *file); void update_percent(int current, int total); void showMessage(QString title, QString content, int duration); void showLabelSignal(QString label); private: File *current_file; QString slash; auth_tcp_client *tcp_client; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/network/socket_controller.cpp000644 001750 001750 00000026206 11432217726 024641 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "socket_controller.h" SocketController::SocketController(char* ip, int port,int f_port, QString password) : server_ip(ip), server_port(port), server_port_file(f_port), server_password(password) { #ifdef WIN32 filePath = QDir::toNativeSeparators(QDir::homePath()) + "\\" + KP_DIRECTORY + "\\"; slash = QString("\\"); #elif defined (linux) filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; slash = QString("/"); #elif defined __APPLE__ filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; slash = QString("/"); #else filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; slash = QString("/"); #endif file_queue = new QQueue; xml_parser = new XmlParserClient(this); connect_to_server(server_ip, server_port, server_port_file, server_password); } void SocketController::connect_to_server(char* ip, int port,int f_port, QString password) { master_tcp_client = new auth_tcp_client(password, NULL); file_tcp_client = new auth_tcp_client(password, NULL); master_tcp_client->connect_to_server(ip, port); file_tcp_client->connect_to_server(ip, f_port); file_manager = new FileManager(file_tcp_client, this); QObject::connect(master_tcp_client, SIGNAL(auth_suceeded()), this, SLOT(auth_succeeded_slot())); QObject::connect(master_tcp_client, SIGNAL(received_stream(QString)), this, SLOT(received_stream_slot(QString))); QObject::connect(file_tcp_client, SIGNAL(received_stream(QString)), file_manager, SLOT(received_stream_slot_files(QString))); } void SocketController::auth_succeeded_slot() { send_to_server(QString(ASK_PARAMETERS)); } void SocketController::send_to_server(QString msg) { master_tcp_client->write_encrypted_data_to_socket(msg); } /* Connect the app to the received_stream_signal to be aware of reception and handle messages. */ void SocketController::received_stream_slot(QString message) { emit update_percent(0, 0); if (message.contains(XML_PARAMETERS, Qt::CaseInsensitive)) { OsCharacteristic *osCharacteristic = xml_parser->getClientParametersFromXml(message); emit client_characteristics(osCharacteristic); if (osCharacteristic->system.contains(QString(WINDOWS), Qt::CaseSensitive)) ask_file_to_server(filePath, osCharacteristic->home_path + "\\" + KP_DIRECTORY, QString(REMOTE_DESKTOP_PNG)); else ask_file_to_server(filePath, osCharacteristic->home_path + "/" + KP_DIRECTORY, QString(REMOTE_DESKTOP_PNG)); } else if (message.startsWith(QString(QString(XML_DOCTYPE) + QString(XML_FOLDERS) + ">"), Qt::CaseSensitive)) { Folder *folderInfo = xml_parser->getDirectoryContent(message); QApplication::processEvents(); emit refresh_directory_view(folderInfo); } else if (message.startsWith(QString(QString(XML_DOCTYPE) + QString(XML_FILE_INFO) + ">"), Qt::CaseSensitive)) { File *fileInfo = xml_parser->getFileInfo(message); QApplication::processEvents(); emit showMessage(fileInfo->name + tr(" information"), tr("Name : ") + fileInfo->name + tr(" \nExecutable : ") + fileInfo->executable + tr(" \nReadable : ") + fileInfo->readable + tr(" \nSize : ") + fileInfo->size + tr(" \nOwner : ") + fileInfo->owner + tr(" \nExtension : ") + fileInfo->extension + tr(" \nCreation date : ") + fileInfo->creationDate + tr(" \nModification date : ") + fileInfo->modifiedDate, 5000); delete fileInfo; } else if (message.startsWith(QString(UPLOAD_KO), Qt::CaseSensitive)) { // Don't send file. File *file = file_queue->dequeue(); emit remove_from_view(file->name, false); process_queue(); emit showMessage(tr("File error"),tr("Remote computer does not have permissions to receive ") + file->name, 4000); delete file; emit showLabelSignal(tr("")); } else if (message.startsWith(QString(UPLOAD_OK), Qt::CaseSensitive)) { // Send file. File *file = file_queue->head(); emit showLabelSignal(tr("Encrypting ") + file->name + tr(", preparing to upload...")); int result = file_manager->send_document(file->name, file->from); if (result == 0) { File *file = file_queue->dequeue(); emit remove_from_view(file->name, false); process_queue(); emit showMessage(tr("Error sending file"), file->name + tr(" did not open correctly."), 4000); emit showLabelSignal(tr("")); delete file; } } else if (message.startsWith(QString(UPLOAD_SUCCESS), Qt::CaseSensitive)) { File *file = file_queue->dequeue(); emit showMessage(tr("File uploaded"), file->name + tr(" has been uploaded successfully."), 4000); emit showLabelSignal(tr("")); if (file_queue->isEmpty()) emit file_uploaded(file); process_queue(); delete file; } else if (message.startsWith(QString(UPLOAD_FAILED), Qt::CaseSensitive)) { File *file = file_queue->dequeue(); emit remove_from_view(file->name, false); emit showMessage(tr("File uploaded"),file->name + tr(" upload failed.") + file->name, 4000); process_queue(); delete file; emit showLabelSignal(tr("")); } else if (message.startsWith(QString(QString(XML_DOCTYPE) + QString(XML_FILE_DOWNLOAD_INFO) + ">"), Qt::CaseSensitive)) { File *fileInfo = xml_parser->getFileInfo(message); QApplication::processEvents(); fileInfo->to = filePath; if (fileInfo->readable.startsWith("true")) { if (fileInfo->size.toInt() < FILE_SIZE_LIMIT) { // ~ 60Mo if (fileInfo->size.toInt() != 0) { emit showLabelSignal(tr("Downloading ") + fileInfo->name + tr(" please wait...")); send_to_server(XmlCreatorClient::create_xml_question(fileInfo->directory, fileInfo->name, QString(XML_DOWNLOAD))); file_manager->append_file(fileInfo); } else { error_message_dequeue("Remote file size is 0. Nothing to download."); emit remove_from_view(fileInfo->name, true); delete fileInfo; } } else { error_message_dequeue("Please, choose a file smaller than 55MB."); emit remove_from_view(fileInfo->name, true); delete fileInfo; } } else { error_message_dequeue("Remote file is not readable."); emit remove_from_view(fileInfo->name, true); delete fileInfo; } } else if (message.startsWith(QString(XML_COMMAND_BEGIN), Qt::CaseSensitive)) { QString result = message.replace(QString(XML_COMMAND_BEGIN), ""); result = result.replace(QString(XML_COMMAND_END), ""); result = result.replace(QString(""), ""); emit command_results(result); } } void SocketController::ask_file_to_server(QString to, QString from, QString file_name) { File *file = new File(this); file->name = file_name; file->is_upload = false; file->to = to; file->from = from; emit showLabelSignal(tr("Queueing ") + file->name + tr(" into file manager's queue...")); // If files queue is empty, process queue right after enqueuing. // If files queue is not empty. It means a file is currently being downloaded. if (file_queue->isEmpty()) { file_queue->enqueue(file); process_queue(); } else file_queue->enqueue(file); } void SocketController::send_file_to_server(QString to, QString from, QString file_name) { File *file = new File(this); file->name =file_name; file->to = to; file->is_upload = true; file->from = from; QFileInfo *fileInfo = new QFileInfo(file->from + slash + file->name); // Check if file is uploadable. if (fileInfo->size() < FILE_SIZE_LIMIT) { if (fileInfo->size() != 0) { emit showLabelSignal(tr("Queueing ") + file->name + tr(" into file manager's queue...")); // If files queue is empty, process queue right after enqueuing. // If files queue is not empty. It means a file is currently being downloaded. if (file_queue->isEmpty()) { file_queue->enqueue(file); process_queue(); } else file_queue->enqueue(file); } else { emit showMessage(tr("File error"),tr("File size is 0. Nothing to download."), 4000); emit remove_from_view(file->name, false); delete fileInfo; } } else { emit showMessage(tr("File error"),tr("Please, choose a file smaller than 55MB."), 4000); emit remove_from_view(file->name, false); delete fileInfo; } } void SocketController::process_queue() { if (!file_queue->isEmpty()) { File *file = file_queue->head(); filePath = file->to; if (file->is_upload == false) { emit showLabelSignal(tr("Asking ") + file->name + tr(" to remote computer...")); send_to_server(XmlCreatorClient::create_xml_question(file->from, file->name, QString(XML_FILE_DOWNLOAD_INFO))); } else { emit showLabelSignal(tr("Telling remote computer ") + file->name + tr(" is coming...")); send_to_server(XmlCreatorClient::create_xml_question(file->to, file->name, QString(XML_FILE_UPLOAD_INFO))); } } } void SocketController::executeCommand(QString command, QString path) { send_to_server(XmlCreatorClient::create_xml_question(path, command, QString(XML_COMMAND))); emit update_percent(50, 100); } void SocketController::error_message_dequeue(QString message) { emit showMessage(tr("File error"),message, 4000); emit showLabelSignal(tr("")); file_queue->dequeue(); process_queue(); } KontrolPack-3.0.0/kontrolpack/client/core/xml/000755 001750 001750 00000000000 11432306342 017474 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/core/xml/xml_creator_client.h000644 001750 001750 00000003426 11426532122 023527 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef HEADER_XMLCREATOR #define HEADER_XMLCREATOR #include #include #include #include "../../../commons/constants.h" class XmlCreatorClient : public QObject { Q_OBJECT public: XmlCreatorClient(QObject *parent); static QString create_xml_question(QString filePath, QString documentName, QString header); }; #endif KontrolPack-3.0.0/kontrolpack/client/core/xml/xml_parser_client.cpp000644 001750 001750 00000016457 11426532122 023727 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "xml_parser_client.h" XmlParserClient::XmlParserClient(QObject *parent) : QObject(parent) { } OsCharacteristic* XmlParserClient::getClientParametersFromXml(QString buffer) { OsCharacteristic *osCharacteristic = new OsCharacteristic(this); QStringList *folderList = new QStringList; QStringList *fileList = new QStringList; QStringList *ipList = new QStringList; QDomDocument doc; doc.setContent(buffer); QDomElement root = doc.documentElement(); QDomElement child = root.firstChild().toElement(); while(!child.isNull()) { if (child.tagName() == HOSTNAME) { osCharacteristic->hostname = child.text(); } else if (child.tagName() == SYSTEM) { osCharacteristic->system = child.text(); } if (child.tagName() == PATH) { QString pathName = child.text(); osCharacteristic->home_path = pathName; } else if (child.tagName() == FOLDER_LIST) { QDomElement folderChild = child.firstChild().toElement(); while(!folderChild.isNull()) { if (folderChild.tagName() == FOLDER) { QString folderName = folderChild.text(); folderList->append(folderName); } folderChild = folderChild.nextSibling().toElement(); } } else if (child.tagName() == FILE_LIST) { QDomElement fileChild = child.firstChild().toElement(); while(!fileChild.isNull()) { if (fileChild.tagName() == FILE_XML) { QString fileName = fileChild.text(); fileList->append(fileName); } fileChild = fileChild.nextSibling().toElement(); } } else if (child.tagName() == IP_LIST) { QDomElement ipChild = child.firstChild().toElement(); while(!ipChild.isNull()) { if (ipChild.tagName() == IP) { ipList->append(ipChild.text()); } ipChild = ipChild.nextSibling().toElement(); } } child = child.nextSibling().toElement(); } osCharacteristic->folder_list = folderList; osCharacteristic->file_list = fileList; osCharacteristic->ip_list = ipList; return osCharacteristic; } Folder* XmlParserClient::getDirectoryContent(QString buffer) { Folder *folder = new Folder(this); QStringList *folderList = new QStringList; QStringList *fileList = new QStringList; QStringList *driveList = new QStringList; QDomDocument doc; doc.setContent(buffer); QDomElement root = doc.documentElement(); QDomElement child = root.firstChild().toElement(); while(!child.isNull()) { if (child.tagName() == PATH) { QString pathName = child.text(); folder->path = pathName; } else if (child.tagName() == FOLDER_LIST) { QDomElement folderChild = child.firstChild().toElement(); while(!folderChild.isNull()) { if (folderChild.tagName() == FOLDER) { QString folderName = folderChild.text(); folderList->append(folderName); } folderChild = folderChild.nextSibling().toElement(); } } else if (child.tagName() == FILE_LIST) { QDomElement fileChild = child.firstChild().toElement(); while(!fileChild.isNull()) { if (fileChild.tagName() == FILE_XML) { QString fileName = fileChild.text(); fileList->append(fileName); } fileChild = fileChild.nextSibling().toElement(); } } else if (child.tagName() == DRIVES) { QDomElement driveChild = child.firstChild().toElement(); while(!driveChild.isNull()) { if (driveChild.tagName() == DRIVE) { driveList->append(driveChild.text()); } driveChild = driveChild.nextSibling().toElement(); } } child = child.nextSibling().toElement(); } folder->folder_list = folderList; folder->file_list = fileList; folder->drive_list = driveList; return folder; } File* XmlParserClient::getFileInfo(QString buffer) { File *file = new File(this); QDomDocument doc; doc.setContent(buffer); QDomElement root = doc.documentElement(); QDomElement child = root.firstChild().toElement(); while(!child.isNull()) { if (child.tagName() == FILE_NAME) { QString name = child.text(); file->name = name; } else if (child.tagName() == FILE_SIZE) { QString size = child.text(); file->size = size; } else if (child.tagName() == FILE_EXECECUTABLE) { QString exec = child.text(); file->executable = exec; } else if (child.tagName() == FILE_READABLE) { QString readable = child.text(); file->readable = readable; } else if (child.tagName() == FILE_OWNER) { QString owner = child.text(); file->owner = owner; } else if (child.tagName() == FILE_EXTENSION) { QString extension = child.text(); file->extension = extension; } else if (child.tagName() == FILE_DIRECTORY) { QString directory = child.text(); file->directory = directory; } else if (child.tagName() == FILE_CREATION_DATE) { QString date = child.text(); file->creationDate = date; } else if (child.tagName() == FILE_MODIFIED_DATE) { QString date = child.text(); file->modifiedDate = date; } child = child.nextSibling().toElement(); } return file; } KontrolPack-3.0.0/kontrolpack/client/core/xml/xml_parser_client.h000644 001750 001750 00000004032 11426532122 023356 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef HEADER_XMLRESULTSPARSER #define HEADER_XMLRESULTSPARSER #include #include #include #include #include "../../../commons/constants.h" #include "../bean/os_characteristic.h" #include "../bean/folder.h" #include "../bean/file.h" class XmlParserClient : public QObject { Q_OBJECT public: XmlParserClient(QObject *parent); OsCharacteristic* getClientParametersFromXml(QString buffer); Folder* getDirectoryContent(QString buffer); File* getFileInfo(QString buffer); void setList(QStringList list); QStringList getList(); QStringList parameters; }; #endif KontrolPack-3.0.0/kontrolpack/client/core/xml/xml_creator_client.cpp000644 001750 001750 00000004722 11426532122 024062 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "xml_creator_client.h" XmlCreatorClient::XmlCreatorClient(QObject *parent) : QObject(parent) { } QString XmlCreatorClient::create_xml_question(QString filePath, QString documentName, QString header) { QString xmlDoctype = QString(XML_DOCTYPE); QString xmlOpening = QString(XML_OPENING); QString xmlClosing = QString(XML_CLOSING); QString xmlEnding = QString(XML_ENDING); QString xmlParametersDocument = QString(xmlDoctype + header + xmlEnding); QString xmlKontrolPackElement = QString(KONTROLPACK); QString xmlDocument = QString(""); xmlDocument.append(xmlParametersDocument); xmlDocument.append(xmlOpening + xmlKontrolPackElement + xmlEnding); xmlDocument.append(xmlOpening + QString(FILE_XML) + xmlEnding); xmlDocument.append(documentName); xmlDocument.append(xmlClosing + QString(FILE_XML) + xmlEnding); xmlDocument.append(xmlOpening + QString(PATH)+ xmlEnding); xmlDocument.append(filePath); xmlDocument.append(xmlClosing + QString(PATH) + xmlEnding); return xmlDocument; } KontrolPack-3.0.0/kontrolpack/client/ui/000755 001750 001750 00000000000 11432306342 016361 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/ui/client_home.cpp000644 001750 001750 00000014522 11426731252 021364 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "client_home.h" ClientHome::ClientHome(QTextEdit *textBrowser, QList clientsList) : textEdit(textBrowser), remote_info_list(clientsList) { image = new QLabel(this); resolver = new DnsResolver(); this->setAttribute( Qt::WA_TranslucentBackground, false); groupBox = new QGroupBox(tr("Host information"), this); QGridLayout *gridBox = new QGridLayout; #ifdef WIN32 QFont font("Arial", 8, true); image->setPixmap(QPixmap(":/images/windows-computer.png")); QString os = QString("Microsoft Windows"); #elif defined __APPLE__ QFont font = QFont(); image->setPixmap(QPixmap(":/images/mac-computer.png")); QString os = QString("Mac OS X"); #else QFont font("Arial", 10, true); image->setPixmap(QPixmap(":/images/linux-computer.png")); QString os = QString("GNU/Linux based OS"); #endif groupBox->setFont(font); int cpt = 1; foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces()) { if (interface.flags().testFlag(QNetworkInterface::IsRunning)) foreach (QNetworkAddressEntry entry, interface.addressEntries()) { if ( interface.hardwareAddress() != "00:00:00:00:00:00" && entry.ip().toString().contains(".")) { cpt ++; QLabel *adressLabel = new QLabel(interface.name() + " : " + entry.ip().toString()); adressLabel->setFont(font); gridBox->addWidget(adressLabel, cpt, 0); } } } textEdit->resize(QSize(250, 300)); QPushButton *dnsButton = new QPushButton(tr("DNS Resolver")); dnsButton->setIcon(QIcon(":/images/dns.png")); dnsButton->setMinimumHeight(40); addComputerButton = new QPushButton(tr("Connect computer")); addComputerButton->setIcon(QIcon(":/images/add.png")); addComputerButton->setMinimumHeight(40); QLabel *os_label = new QLabel(os); os_label->setFont(font); gridBox->addWidget(image, 0, 0); gridBox->addWidget(os_label, 1, 0); gridBox->addWidget(new QLabel("", this), cpt++, 0); gridBox->addWidget(addComputerButton, cpt++, 0); gridBox->addWidget(dnsButton, cpt++, 0); gridBox->addWidget(new QLabel("", this), cpt++, 0); gridBox->addWidget(new QLabel("", this), cpt++, 0); gridBox->addWidget(new QLabel("", this), cpt++, 0); groupBox->setLayout(gridBox); list = new QListView; this->refreshCLientsList(remote_info_list); QSplitter *splitter_left = new QSplitter(this); splitter_left->addWidget(textEdit); splitter_left->addWidget(list); splitter_left->setOrientation(Qt::Vertical); splitter_left->setStretchFactor(1, 75); QSplitter *splitter = new QSplitter(this); splitter->addWidget(groupBox); splitter->addWidget(splitter_left); splitter->setStretchFactor(1, 25); QGridLayout *layout = new QGridLayout; layout->addWidget(splitter); setLayout(layout); connect(list, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClicSelection())); connect(dnsButton, SIGNAL(clicked()), this, SLOT(showDNSResolver())); } void ClientHome::showDNSResolver() { resolver->exec(); } void ClientHome::doubleClicSelection() { QItemSelectionModel *selection = list->selectionModel(); QModelIndex indexElementSelectionne = selection->currentIndex(); QStringListModel *listModel = (QStringListModel*)list->model(); QVariant elementSelectionne = listModel->data(indexElementSelectionne, Qt::DisplayRole); QString selectedDocument = elementSelectionne.toString(); QStringList list = selectedDocument.split(DELIMITER_DATABASE); if (list.size() == 4) emit connect_remote_clients(list.at(1), list.at(2), list.at(3)); } void ClientHome::refreshCLientsList(QList remote_info_list) { QStandardItemModel *model = new QStandardItemModel(this); for (int k = 0; k < remote_info_list.size(); k++) { RemoteComputerInfo *remoteInfo = remote_info_list.at(k); QStandardItem *item = new QStandardItem(remoteInfo->hostname + " " + remoteInfo->ip + " " + QString::number(remoteInfo->port) + " " + QString::number(remoteInfo->port_file)); if (remoteInfo->system.startsWith(QString(LINUX), Qt::CaseSensitive)) { item->setIcon(QIcon(":/images/linux.png")); } else if (remoteInfo->system.startsWith(WINDOWS, Qt::CaseSensitive)) { item->setIcon(QIcon(":/images/windows.png")); } else if (remoteInfo->system.startsWith(MACOSX, Qt::CaseSensitive)) { item->setIcon(QIcon(":/images/finder.png")); } else { item->setIcon(QIcon(":/images/linux.png")); } item->setEditable(false); model->appendRow(item); } if (remote_info_list.isEmpty()) { QStandardItem *item = new QStandardItem(tr("Any remote computer in the database")); item->setEditable(false); model->appendRow(item); } list->setModel(model); list->setIconSize(QSize(22, 22)); } KontrolPack-3.0.0/kontrolpack/client/ui/client_main_window.cpp000644 001750 001750 00000023241 11430753142 022742 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "client_main_window.h" ClientMainWindow::ClientMainWindow(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/images/kontrolpack.png")); settings = new QSettings("OpenNetwork", "KontrolPack"); int width = settings->value("startup/width", QString::number(this->size().width())).toInt(); int height = settings->value("startup/height", QString::number(this->size().height())).toInt(); this->resize(QSize(width, height)); QString title = tr("KontrolPack ") + QString(VERSION) + tr(" : Secure remote access [TCP/IP client mode] "); setWindowTitle(title); #ifdef WIN32 QFont font("Arial", 8, true); #elif defined __APPLE__ QFont font = QFont(); #else QFont font("Arial", 10, true); #endif setUnifiedTitleAndToolBarOnMac(true); // Menus creation QMenu *menu = new QMenu; addComputerAction = menu->addAction(tr("&Connect to remote computer")); addComputerAction->setShortcut(QKeySequence("Ctrl+A")); addComputerAction->setIcon(QIcon(":/images/add.png")); menu->addSeparator(); switchModeAction = menu->addAction(tr("&Switch KontrolPack Mode Client/Server")); switchModeAction->setShortcut(QKeySequence("Ctrl+S")); switchModeAction->setIcon(QIcon(":/images/go-jump.png")); menu->addSeparator(); QAction *dropListAction = menu->addAction(tr("&Empty computers database")); menu->addSeparator(); updateAction = menu->addAction(tr("&Check for updates")); updateAction->setShortcut(QKeySequence("Ctrl+U")); updateAction->setIcon(QIcon(":/images/update.png")); menu->addSeparator(); QAction *userModeAction = menu->addAction(tr("&User mode")); userModeAction->setShortcut(QKeySequence("Ctrl+M")); userModeAction->setIcon(QIcon(":/images/go-jump.png")); menu->addSeparator(); QAction *fullScreenAction = menu->addAction(tr("&Full Screen")); fullScreenAction->setShortcut(QKeySequence("Ctrl+Shift+F11")); fullScreenAction->setIcon(QIcon(":/images/video-display.png")); menu->addSeparator(); aboutAction = menu->addAction(tr("&About KontrolPack")); aboutAction->setIcon(QIcon(":/images/about.png")); menu->addSeparator(); quitAction = menu->addAction(tr("&Quit")); quitAction->setShortcut(QKeySequence("Ctrl+Q")); quitAction->setIcon(QIcon(":/images/exit.png")); QToolButton *menuButton = new QToolButton; menuButton->setToolTip(tr("Menu settings")); menuButton->setPopupMode(QToolButton::InstantPopup); menuButton->setContextMenuPolicy(Qt::DefaultContextMenu); menuButton->setIcon(QIcon(":/images/settings.png")); menuButton->setMenu(menu); #ifdef __APPLE__ // Main toolBar QToolBar *fileToolBar = addToolBar(tr("Shell")); fileToolBar->addAction(addComputerAction); fileToolBar->addAction(switchModeAction); fileToolBar->addAction(aboutAction); fileToolBar->addAction(updateAction); fileToolBar->addAction(quitAction); #endif //StatusBar creation toolBar = statusBar(); toolBar->setFont(font); toolBar->setAttribute(Qt::WA_TranslucentBackground, true); toolBar->showMessage(tr("RSA | AES encryption over TCP/IP")); QLabel *security = new QLabel(this); security->setPixmap(QPixmap(":/images/security.png")); toolBar->addWidget(security); // Central zone creation centralWindow = new ClientCentralWindow(menuButton); centralWindow->setAttribute(Qt::WA_TranslucentBackground, false); centralWindow->setAttribute(Qt::WA_NoSystemBackground, false); setCentralWidget(centralWindow); centerOnScreen(); // Tray icon createActions(); createTrayIcon(); trayIcon->setIcon(QIcon(":/images/kontrolpack.png")); trayIcon->setToolTip(tr("KontrolPack : Secure remote access.")); trayIcon->show(); //Initialisation aboutDialog = new AboutDialog(); //signals and slots connections QObject::connect(addComputerAction, SIGNAL(triggered()), centralWindow, SLOT(show_connect_dialog())); QObject::connect(userModeAction, SIGNAL(triggered()), this, SLOT(switchUserMode())); QObject::connect(switchModeAction, SIGNAL(triggered()), this, SLOT(switchMode())); QObject::connect(dropListAction, SIGNAL(triggered()), centralWindow, SLOT(drop_database())); QObject::connect(updateAction, SIGNAL(triggered()), this, SLOT(displayUpdateManager())); QObject::connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); QObject::connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); QObject::connect(aboutAction, SIGNAL(triggered()), this, SLOT(displayAbout())); QObject::connect(centralWindow, SIGNAL(showMessage(QString,QString,int)), this, SLOT(showMessage(QString,QString,int))); QObject::connect(fullScreenAction, SIGNAL(triggered()), this, SLOT(fullScreenMode())); } void ClientMainWindow::createActions() { minimizeAction = new QAction(tr("Mi&nimize KontrolPack"), this); connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); maximizeAction = new QAction(tr("Ma&ximize KontrolPack"), this); connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized())); } void ClientMainWindow::createTrayIcon() { trayIconMenu = new QMenu(this); trayIconMenu->addAction(addComputerAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(switchModeAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(minimizeAction); trayIconMenu->addAction(maximizeAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(updateAction); trayIconMenu->addAction(aboutAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(quitAction); trayIcon = new QSystemTrayIcon(this); trayIcon->setContextMenu(trayIconMenu); } void ClientMainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: if (this->isVisible()) { hide(); } else { show(); } break; case QSystemTrayIcon::DoubleClick: break; case QSystemTrayIcon::MiddleClick: QMessageBox::information(this, tr("About KontrolPack"), tr("KontrolPack : Secure remote access.")); break; default: ; } } void ClientMainWindow::closeEvent(QCloseEvent *event) { if (trayIcon->isVisible()) { showMessage(tr("Information"), tr("KontrolPack will keep running into the " "system tray. To terminate the program, " "choose \"Quit\" in the context menu " "that pops up when clicking this program's " "entry in the system tray."), 4000); hide(); event->ignore(); } else { // Free ressources centralWindow->database->freeDatabase(); trayIcon->hide(); trayIcon->setVisible(false); } } void ClientMainWindow::centerOnScreen() { QDesktopWidget screen; QRect screenGeom = screen.screenGeometry(this); int screenCenterX = screenGeom.center().x(); int screenCenterY = screenGeom.center().y(); move(screenCenterX - width () / 2, screenCenterY - height() / 2); } void ClientMainWindow::switchMode() { settings->setValue("startup/mode", "NONE"); showMessage(tr("Switch KontrolPack Mode warning"), tr("Please, restart KontrolPack in order to choose another mode."), 4000); } void ClientMainWindow::displayAbout() { aboutDialog->exec(); } void ClientMainWindow::showMessage(QString title, QString content, int duration) { trayIcon->showMessage(title, content, QSystemTrayIcon::Information, duration); } void ClientMainWindow::displayUpdateManager() { UpdateManager *updateManager = new UpdateManager(); updateManager->updateManager(); } void ClientMainWindow::resizeEvent(QResizeEvent* event) { settings->setValue("startup/width", QString::number(this->size().width())); settings->setValue("startup/height", QString::number(this->size().height())); } void ClientMainWindow::fullScreenMode() { if (this->windowState() != Qt::WindowFullScreen) showFullScreen(); else showMaximized(); } void ClientMainWindow::switchUserMode() { UserModeWidGet *mode_widget = new UserModeWidGet; mode_widget->exec(); } KontrolPack-3.0.0/kontrolpack/client/ui/tabui/000755 001750 001750 00000000000 11432306342 017465 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/ui/tabui/exec_shell.h000644 001750 001750 00000005437 11426741304 021766 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "defined_command.h" #include "../../core/bean/os_characteristic.h" #include "../../core/bean/folder.h" #include "../../core/bean/command.h" #include "../../../commons/constants.h" class ExecShell : public QFrame { Q_OBJECT public: ExecShell(int clientNbr, OsCharacteristic *characteristics, QWidget *parent); void set_remote_path(QString remote_path); QTextEdit *textBrowser; int id_server; void set_commands_list(QList *commands_list); void save_command(QString command); public slots: void executeDefinedCommand(QString command); void execute(); void set_command_results(QString result); void clic_command(); void double_clic_command(); signals: void sendCommand(QString command, QString path); void add_command_to_database(Command *command); private: OsCharacteristic *osInfo; QLineEdit *commandLineEdit; QCompleter *completer; QLabel *path; QListView *list; QStandardItemModel *command_list_model; QString remote_path; QList *commands_list; int nbr; }; KontrolPack-3.0.0/kontrolpack/client/ui/tabui/identity_client.h000644 001750 001750 00000004430 11426741300 023026 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../core/bean/os_characteristic.h" #include "../../../commons/constants.h" class IdentityClient : public QFrame { Q_OBJECT public: IdentityClient(int clientNbr, QLabel *pict, OsCharacteristic *characteristics, QWidget *parent); int nbr; QLabel *image; QTextBrowser *textBrowser; OsCharacteristic *osCharacteristics; QLabel *screenshotLabel; bool blocked; public slots: void refreshScreenshot(); signals: void refreshScreenshotSignal(QString to, QString from, QString file_name); private: QString filePath; }; KontrolPack-3.0.0/kontrolpack/client/ui/tabui/share_files.cpp000644 001750 001750 00000047213 11431276432 022471 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "share_files.h" ShareFiles::ShareFiles(int clientNbr, OsCharacteristic *characteristics, QWidget *parent) :nbr(clientNbr), osInfo(characteristics), QFrame(parent) { #ifdef WIN32 slash = QString("\\"); #else slash = QString("/"); #endif this->setAttribute( Qt::WA_TranslucentBackground, false); remoteFilesIconList = new QList(); QGroupBox *remoteGroupBox = new QGroupBox(tr("Remote available files"), this); QGroupBox *localGroupBox = new QGroupBox(tr("Local available files"), this); QGridLayout *remoteGridBox = new QGridLayout; QGridLayout *localGridBox = new QGridLayout; QLabel *serverHowTo = new QLabel(tr("Drag and Drop to transfer files from local to remote computer.")); remotePath = new QLabel("" + osInfo->home_path, this); remoteStringPath = osInfo->home_path; QPushButton *refreshRemoteFoldersButton = new QPushButton(tr(""), this); refreshRemoteFoldersButton->setIcon(QIcon(":/images/refresh.png")); refreshRemoteFoldersButton->setToolTip(tr("Refresh remote files and folders.")); QDir filesDir(QDir::toNativeSeparators(QDir::homePath())); localPath = new QLabel("" + QDir::toNativeSeparators(QDir::homePath()) ); localStringPath = QDir::toNativeSeparators(QDir::homePath()); localFilesList = filesDir.entryList(QDir::Files, QDir::Name); localFoldersList = filesDir.entryList(QDir::Dirs, QDir::Name); remoteFilesList = characteristics->file_list; remoteFoldersList = characteristics->folder_list; remoteList = new DropListView; remoteList->setSelectionMode(QAbstractItemView::SingleSelection); remoteList->setDragEnabled(true); remoteList->setAcceptDrops(true); remoteList->setDropIndicatorShown(true); remoteList->setDragDropMode(QAbstractItemView::DragDrop); localList = new DropListView; localList->setSelectionMode(QAbstractItemView::SingleSelection); localList->setDragEnabled(true); localList->setAcceptDrops(true); localList->setDropIndicatorShown(true); localList->setDragDropMode(QAbstractItemView::DragDrop); remoteGridBox->addWidget(refreshRemoteFoldersButton, 0, 0); remoteGridBox->addWidget(remotePath, 1, 0); remoteGridBox->addWidget(remoteList, 2, 0); localGridBox->addWidget(serverHowTo, 0, 0); localGridBox->addWidget(localPath, 1, 0); localGridBox->addWidget(localList, 2, 0); localGroupBox->setLayout(localGridBox); remoteGroupBox->setLayout(remoteGridBox); QSplitter *splitter = new QSplitter(this); splitter->addWidget(localGroupBox); splitter->addWidget(remoteGroupBox); QGridLayout *layout = new QGridLayout; layout->addWidget(splitter); setLayout(layout); // Init views. if (localFoldersList.contains(".")) localFoldersList.removeOne("."); this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); this->displayLocalDirectoryContent(localFoldersList, localFilesList); QObject::connect(refreshRemoteFoldersButton, SIGNAL(clicked()), this, SLOT(refresh())); QObject::connect(localList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClicLocalFolder())); QObject::connect(remoteList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(doubleClicRemoteFolder())); QObject::connect(remoteList, SIGNAL(drop_signal()), this, SLOT(drop_remote())); QObject::connect(localList, SIGNAL(drop_signal()), this, SLOT(drop_local())); } void ShareFiles::drop_remote() { int len = remoteFoldersList->count() + remoteFilesList->count() + 1; QStandardItemModel *listModel = (QStandardItemModel*)remoteList->model(); QStringList *viewList = convert_QStandardItemModel_to_QStringList(listModel, len); QStringList *previousRemoteList = new QStringList; previousRemoteList->append(*remoteFoldersList); previousRemoteList->append(*remoteFilesList); QString document = track_delta(previousRemoteList, viewList); delete previousRemoteList; delete viewList; if (remoteFoldersList->contains(document, Qt::CaseSensitive)) { this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); emit showMessage(tr("Warning"), tr("You cannot move folders."), 4000); } if (localFoldersList.contains(document, Qt::CaseSensitive)) { if (localFilesList.contains(document, Qt::CaseSensitive)) { // Ambiguous scheme. File and folder found emit showMessage(tr("Warning"), tr("Ambiguous document name. A file and a folder seems to have the exact same name."), 4000); } else emit showMessage(tr("Warning"), tr("You cannot share folders, only files. Choose a file or double click on folders to change directory."), 4000); this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); } else if (localFilesList.contains(document), Qt::CaseSensitive) { if (remoteFilesList->contains(document, Qt::CaseSensitive)) { // Already exists. emit showMessage(tr("Warning"), tr("This file already exists. Please delete it with shell commands before to transfer."), 4000); this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); } else { emit send_file_to_server(remoteStringPath + slash, localStringPath, document); remoteFilesList->append(document); } } else { this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); } qDebug(qPrintable("Transfer document : " + document)); } void ShareFiles::drop_local() { int len = localFoldersList.count() + localFilesList.count() + 1; QStandardItemModel *listModel = (QStandardItemModel*)localList->model(); QStringList *viewList = convert_QStandardItemModel_to_QStringList(listModel, len); QStringList *previousLocalList = new QStringList; previousLocalList->append(localFoldersList); previousLocalList->append(localFilesList); QString document = track_delta(previousLocalList, viewList); delete previousLocalList; delete viewList; if (localFoldersList.contains(document, Qt::CaseSensitive)) { this->displayLocalDirectoryContent(localFoldersList, localFilesList); emit showMessage(tr("Warning"), tr("You cannot move folders."), 4000); } if (remoteFoldersList->contains(document, Qt::CaseSensitive)) { if (remoteFilesList->contains(document, Qt::CaseSensitive)) { // Ambiguous scheme. File and folder found emit showMessage(tr("Warning"), tr("Ambiguous document name. A file and a folder seems to have the exact same name."), 4000); } else emit showMessage(tr("Warning"), tr("You cannot share folders, only files. Choose a file or double click on folders to change directory."), 4000); this->displayLocalDirectoryContent(localFoldersList, localFilesList); } else if (remoteFilesList->contains(document, Qt::CaseSensitive)) { if (localFilesList.contains(document, Qt::CaseSensitive)) { // Already exists. emit showMessage(tr("Warning"), tr("This file already exists. Please delete it with shell commands before to transfer."), 4000); this->displayLocalDirectoryContent(localFoldersList, localFilesList); } else { emit ask_file_to_server(localStringPath + slash, remoteStringPath, document); localFilesList.append(document); } } else { this->displayLocalDirectoryContent(localFoldersList, localFilesList); } qDebug(qPrintable("Transfer document : " + document)); } QString ShareFiles::track_delta(QStringList *previousList, QStringList *newList) { newList->sort(); previousList->sort(); int new_len = newList->size(); int old_len = previousList->size(); if (new_len == (old_len + 1)) { for (int i = 0; i < new_len; i++) { if (!previousList->contains(newList->at(i), Qt::CaseSensitive)) return newList->at(i); else { // Same list or same entries. Can't get duplicated entries. QStringList list = newList->filter(newList->at(i), Qt::CaseSensitive); // Check if contents match exactly newList->at(i) otherwise remove items. QStringList *l = new QStringList; for (int j = 0; j < list.size(); j++) { if (QString::compare(newList->at(i), list.at(j), Qt::CaseSensitive) == 0) { l->append(list.at(j)); } } if (l->size() == 2) return l->at(1); } } } else { return QString(""); } } void ShareFiles::doubleClicLocalFolder() { QItemSelectionModel *selection = localList->selectionModel(); QModelIndex indexElementSelectionne = selection->currentIndex(); QStringListModel *listModel = (QStringListModel*)localList->model(); QVariant elementSelectionne = listModel->data(indexElementSelectionne, Qt::DisplayRole); QString selectedDocument = elementSelectionne.toString(); for (int j = 0; j < localFoldersList.size(); j++) { QString folderName = localFoldersList.at(j); if (QString::compare(folderName, selectedDocument, Qt::CaseInsensitive) == 0) { ChangeDir *changeDir = new ChangeDir(folderName, localStringPath); localStringPath = changeDir->cd_Handling(localStringPath); QDir filesDir(QDir::toNativeSeparators(localStringPath)); localPath->setText("" + QDir::toNativeSeparators(localStringPath)); localFilesList = filesDir.entryList(QDir::Files, QDir::Name); localFoldersList = filesDir.entryList(QDir::Dirs, QDir::Name); if (localFoldersList.isEmpty() || (!localFoldersList.contains("..") && QString::compare(localStringPath, "/", Qt::CaseInsensitive) != 0)) localFoldersList.append(".."); if (localFoldersList.contains(".")) localFoldersList.removeOne("."); if (localFoldersList.contains("..") && QString::compare(localStringPath, "/", Qt::CaseInsensitive) == 0) localFoldersList.removeOne(".."); this->displayLocalDirectoryContent(localFoldersList, localFilesList); return; } } for (int j = 0; j < localFilesList.size(); j++) { QString fileName = localFilesList.at(j); if (QString::compare(fileName, selectedDocument, Qt::CaseInsensitive) == 0) { #ifdef WIN32 QFileInfo fileInfo(QDir::toNativeSeparators(localStringPath + "\\" + fileName)); #else QFileInfo fileInfo(QDir::toNativeSeparators(localStringPath + "/" + fileName)); #endif QDateTime created = fileInfo.created(); QDateTime lastModified = fileInfo.lastModified(); bool exec = fileInfo.isExecutable(); bool read = fileInfo.isReadable(); QString executable = (exec) ? "true" : "false"; QString readable = (read) ? "true" : "false"; QString size = QString::number(fileInfo.size()); // bytes QString owner = fileInfo.owner(); QString dateCreated = created.toString("dd.MM.yyyy"); QString dateModified = lastModified.toString("dd.MM.yyyy"); emit showMessage(fileName + tr(" information"), tr("Name : ") + fileName + tr(" \nExecutable : ") + executable + tr(" \nReadable : ") + readable + tr(" \nSize : ") + size + tr(" \nOwner : ") + owner + tr(" \nExtension : ") + fileInfo.completeSuffix() + tr(" \nCreation date : ") + dateCreated + tr(" \nModification date : ") + dateModified, 5000); return; } } } void ShareFiles::doubleClicRemoteFolder() { QItemSelectionModel *selection = remoteList->selectionModel(); QModelIndex indexElementSelectionne = selection->currentIndex(); QStringListModel *listModel = (QStringListModel*)remoteList->model(); QVariant elementSelectionne = listModel->data(indexElementSelectionne, Qt::DisplayRole); QString selectedDocument = elementSelectionne.toString(); for (int j = 0; j < remoteFoldersList->size(); j++) { QString folderName = remoteFoldersList->at(j); if (QString::compare(folderName, selectedDocument, Qt::CaseInsensitive) == 0) { QString xml = XmlCreatorClient::create_xml_question(remoteStringPath, folderName, QString(FOLDER)); emit send_to_server(xml); emit update_percent(50, 100); return; } } for (int j = 0; j < remoteFilesList->size(); j++) { QString fileName = remoteFilesList->at(j); if (QString::compare(fileName, selectedDocument, Qt::CaseInsensitive) == 0) { QString xml = XmlCreatorClient::create_xml_question(remoteStringPath, fileName, QString(FILE_XML)); emit send_to_server(xml); emit update_percent(50, 100); return; } } } void ShareFiles::displayRemoteDirectoryContent(QStringList *folders_list, QStringList *files_list) { if (folders_list->contains("..") && QString::compare(remoteStringPath, QString(CONTENT_DRIVE), Qt::CaseInsensitive) == 0) folders_list->removeOne(".."); remoteFilesIconModel = new QStandardItemModel(this); for (int l = 0; l < folders_list->size(); l++) { if (osInfo->system.startsWith(QString(LINUX), Qt::CaseSensitive)) { QStandardItem *item = new QStandardItem(QIcon(":/images/linux-folder.png") , folders_list->at(l)); item->setDropEnabled(false); item->setEditable (false); remoteFilesIconModel->appendRow(item); } else if (osInfo->system.startsWith(WINDOWS, Qt::CaseSensitive)) { QStandardItem *item = new QStandardItem(QIcon(":/images/windows-folder.png") , folders_list->at(l)); item->setDropEnabled(false); item->setEditable (false); remoteFilesIconModel->appendRow(item); } else if (osInfo->system.startsWith(MACOSX, Qt::CaseSensitive)) { QStandardItem *item = new QStandardItem(QIcon(":/images/mac-folder.png") , folders_list->at(l)); item->setDropEnabled(false); item->setEditable (false); remoteFilesIconModel->appendRow(item); } else { QStandardItem *item = new QStandardItem(QIcon(":/images/linux-folder.png") , folders_list->at(l)); item->setDropEnabled(false); item->setEditable (false); remoteFilesIconModel->appendRow(item); } } for (int j = 0; j < files_list->size(); j++) { QStandardItem *item = new QStandardItem(QIcon(":/images/file.png"), files_list->at(j)); item->setDropEnabled(false); item->setEditable (false); remoteFilesIconModel->appendRow(item); } remoteList->setModel(remoteFilesIconModel); remoteList->setIconSize(QSize(25, 25)); } void ShareFiles::displayLocalDirectoryContent(QStringList folders_list, QStringList files_list) { QStandardItemModel *fileModel = new QStandardItemModel(this); for (int l = 0; l < folders_list.size(); l++) { if (QString::compare(folders_list.at(l), QString("."), Qt::CaseInsensitive) != 0) { #ifdef WIN32 QStandardItem *item = new QStandardItem(QIcon(":/images/windows-folder.png") , folders_list.at(l)); item->setEditable (false); item->setDropEnabled(false); fileModel->appendRow(item); #elif defined (linux) QStandardItem *item = new QStandardItem(QIcon(":/images/linux-folder.png") , folders_list.at(l)); item->setEditable (false); item->setDropEnabled(false); fileModel->appendRow(item); #elif defined __APPLE__ QStandardItem *item = new QStandardItem(QIcon(":/images/mac-folder.png") , folders_list.at(l)); item->setEditable (false); item->setDropEnabled(false); fileModel->appendRow(item); #else QStandardItem *item = new QStandardItem(QIcon(":/images/linux-folder.png") , folders_list.at(l)); item->setEditable (false); item->setDropEnabled(false); fileModel->appendRow(item); #endif } } iconprovider = new QFileIconProvider(); for (int k = 0; k < files_list.size(); k++) { QStandardItem *item = new QStandardItem(QIcon(":/images/file.png") ,files_list.at(k)); item->setEditable (false); item->setDropEnabled(false); fileModel->appendRow(item); } localList->setModel(fileModel); localList->setIconSize(QSize(25, 25)); } QStringList* ShareFiles::convert_QStandardItemModel_to_QStringList(QStandardItemModel *listModel, int len_2) { QStringList *list = new QStringList; for (int i = 0; i < len_2; i++) { QStandardItem *item = listModel->item(i, 0); list->append(item->text()); } return list; } void ShareFiles::refresh_view(Folder *folder) { remoteStringPath = folder->path; remotePath->setText("" + folder->path); remoteFilesList = folder->file_list; remoteFoldersList = folder->folder_list; if (remoteFoldersList->isEmpty() || (!remoteFoldersList->contains("..") && QString::compare(folder->path, "/", Qt::CaseInsensitive) != 0)) remoteFoldersList->append(".."); this->displayRemoteDirectoryContent(remoteFoldersList, remoteFilesList); } void ShareFiles::refresh_local_view() { QDir filesDir(localStringPath); localFilesList = filesDir.entryList(QDir::Files, QDir::Name); localFoldersList = filesDir.entryList(QDir::Dirs, QDir::Name); if (localFoldersList.isEmpty() || (!localFoldersList.contains("..") && QString::compare(localStringPath, "/", Qt::CaseInsensitive) != 0)) localFoldersList.append(".."); if (localFoldersList.contains(".")) localFoldersList.removeOne("."); if (localFoldersList.contains("..") && QString::compare(localStringPath, "/", Qt::CaseInsensitive) == 0) localFoldersList.removeOne(".."); this->displayLocalDirectoryContent(localFoldersList, localFilesList); } void ShareFiles::remove_from_view(QString file_name, bool is_local) { if (is_local) { if (localFilesList.contains(file_name)) { localFilesList.removeAt(localFilesList.indexOf(file_name)); this->displayLocalDirectoryContent(localFoldersList, localFilesList); } } else { refresh(); } } void ShareFiles::refresh() { QString xml = XmlCreatorClient::create_xml_question(remoteStringPath, ".", QString(FOLDER)); emit send_to_server(xml); } KontrolPack-3.0.0/kontrolpack/client/ui/tabui/identity_client.cpp000644 001750 001750 00000011653 11426741736 023403 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "identity_client.h" IdentityClient::IdentityClient(int clientNbr,QLabel *pict, OsCharacteristic *characteristics, QWidget *parent) :nbr(clientNbr), image(pict), osCharacteristics(characteristics), QFrame(parent) { #ifdef WIN32 filePath = QDir::toNativeSeparators(QDir::homePath()) + "\\" + KP_DIRECTORY + "\\"; #elif defined (linux) filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; #elif defined __APPLE__ filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; #else filePath = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/"; #endif this->setAttribute( Qt::WA_TranslucentBackground, false); blocked = false; QPushButton *refreshScreenshotButton = new QPushButton(tr("Refresh screenshot"), this); refreshScreenshotButton->setIcon(QIcon(":/images/refresh.png")); refreshScreenshotButton->setToolTip(tr("Refresh remote desktop.")); QScrollArea *scroller = new QScrollArea(this); screenshotLabel = new QLabel; screenshotLabel->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); screenshotLabel->setAlignment(Qt::AlignJustify); screenshotLabel->setMinimumSize(1240, 1040); screenshotLabel->setText("Loading remote desktop ..."); screenshotLabel->setPixmap(QPixmap(":/images/loading.png")); // Host infos QString os = osCharacteristics->system; QGroupBox *groupBox = new QGroupBox(tr("A remote ") + os +tr(" workstation is connected."), this); QGridLayout *gridBox = new QGridLayout; gridBox->addWidget(image, 0, 0); QLabel *operatingSystem; if (os.startsWith("LINUX")) operatingSystem = new QLabel(tr("Operating system : GNU/Linux based OS")); else operatingSystem = new QLabel(tr("Operating system : ") + os); QLabel *hostName = new QLabel(tr("Host name : ") + osCharacteristics->hostname); gridBox->addWidget(operatingSystem, 1, 0); gridBox->addWidget(hostName, 2, 0); int cpt = 2; for (int i = 0; i < osCharacteristics->ip_list->size(); i++) { cpt++; gridBox->addWidget(new QLabel(tr("IP address : ") + osCharacteristics->ip_list->at(i)), cpt, 0); } gridBox->addWidget(new QLabel(tr("")), cpt+3, 0); gridBox->addWidget(new QLabel(tr("")), cpt+3, 0); gridBox->addWidget(new QLabel(tr("Visualize the remote desktop on the left.")), (cpt+4), 0); gridBox->addWidget(refreshScreenshotButton, (cpt+5), 0); // End host infos scroller->setWidget(screenshotLabel); QSplitter *verticalSplitter = new QSplitter(this); QFrame *verticalFrame = new QFrame(this); QVBoxLayout *vBox = new QVBoxLayout; groupBox->setLayout(gridBox); verticalSplitter->addWidget(scroller); verticalSplitter->addWidget(groupBox); verticalSplitter->setStretchFactor(verticalSplitter->indexOf(scroller), 1); vBox->addWidget(verticalSplitter); verticalFrame->setLayout(vBox); QGridLayout *layout = new QGridLayout; layout->addWidget(verticalFrame); setLayout(layout); connect(refreshScreenshotButton, SIGNAL(clicked()), this, SLOT(refreshScreenshot())); } void IdentityClient::refreshScreenshot() { if (!blocked) { if (osCharacteristics->system.startsWith("WINDOWS")) emit refreshScreenshotSignal(filePath, osCharacteristics->home_path + "\\" + KP_DIRECTORY, QString(REMOTE_DESKTOP_PNG)); else emit refreshScreenshotSignal(filePath, osCharacteristics->home_path + "/" + KP_DIRECTORY, QString(REMOTE_DESKTOP_PNG)); } } KontrolPack-3.0.0/kontrolpack/client/ui/tabui/defined_command.cpp000644 001750 001750 00000016060 11426532122 023270 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "defined_command.h" DefinedCommand::DefinedCommand(QString operatingSystem) : os(operatingSystem) { QGridLayout *layout = new QGridLayout(this); copyButton = new QPushButton(tr("Copy file"), this); copyButton->setIcon(QIcon(":/images/edit-cut.png")); mkDirButton = new QPushButton(tr("Create directory"), this); mkDirButton->setIcon(QIcon(":/images/folder-new.png")); setButton = new QPushButton(QIcon(":/icons/utilities-system-monitor.png"), tr("environment variables"), this); setButton->setIcon(QIcon(":/images/utilities-system-monitor.png")); delFileButton = new QPushButton(tr("delete file"), this); delFileButton->setIcon(QIcon(":/images/edit-delete.png")); delFolderButton = new QPushButton(tr("delete folder"), this); delFolderButton->setIcon(QIcon(":/images/edit-delete.png")); shutdownButton = new QPushButton(tr("Shutdown"), this); shutdownButton->setIcon(QIcon(":/images/exit.png")); ipconfigButton = new QPushButton(tr("IP configuration"), this); ipconfigButton->setIcon(QIcon(":/images/utilities-system-monitor.png")); pingButton = new QPushButton(tr("Ping"), this); pingButton->setIcon(QIcon(":/images/dns.png")); networkStatsButton = new QPushButton(tr("Network connections"), this); networkStatsButton->setIcon(QIcon(":/images/network-wireless.png")); routeTableButton = new QPushButton(tr("Routing table"), this); routeTableButton->setIcon(QIcon(":/images/network-wired.png")); layout->addWidget(copyButton, 0, 0); layout->addWidget(mkDirButton, 0, 1); layout->addWidget(setButton, 0, 2); layout->addWidget(delFileButton, 0, 3); layout->addWidget(delFolderButton, 0, 4); layout->addWidget(shutdownButton, 1, 0); layout->addWidget(ipconfigButton, 1, 1); layout->addWidget(pingButton, 1, 2); layout->addWidget(networkStatsButton, 1, 2); layout->addWidget(routeTableButton, 1, 3); connect(copyButton, SIGNAL(clicked()), this, SLOT(copyAction())); connect(mkDirButton, SIGNAL(clicked()), this, SLOT(mkDirAction())); connect(setButton, SIGNAL(clicked()), this, SLOT(setAction())); connect(delFileButton, SIGNAL(clicked()), this, SLOT(delFileAction())); connect(delFolderButton, SIGNAL(clicked()), this, SLOT(delFolderAction())); connect(shutdownButton, SIGNAL(clicked()), this, SLOT(shutdownAction())); connect(ipconfigButton, SIGNAL(clicked()), this, SLOT(ipconfigAction())); connect(pingButton, SIGNAL(clicked()), this, SLOT(pingAction())); connect(networkStatsButton, SIGNAL(clicked()), this, SLOT(networkStatsAction())); connect(routeTableButton, SIGNAL(clicked()), this, SLOT(routeTableAction())); } void DefinedCommand::copyAction() { CopyDialog *copy = new CopyDialog(os); connect(copy, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); copy->exec(); } void DefinedCommand::mkDirAction() { MkDirDialog *mkdir = new MkDirDialog(os); connect(mkdir, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); mkdir->exec(); } void DefinedCommand::setAction() { emit executeCommand("set"); } void DefinedCommand::delFileAction() { DelFileDialog *delFile = new DelFileDialog(os); connect(delFile, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); delFile->exec(); } void DefinedCommand::delFolderAction() { DelDirDialog *deldir = new DelDirDialog(os); connect(deldir, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); deldir->exec(); } void DefinedCommand::executeDefinedCommand(QString command) { emit executeCommand(command); } void DefinedCommand::shutdownAction() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("halt"); QMessageBox::information(this, tr("Warning"), tr("The remote computer is shutting down.")); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("SHUTDOWN -s"); QMessageBox::information(this, tr("Warning"), tr("The remote computer is shutting down.")); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("halt"); QMessageBox::information(this, tr("Warning"), tr("The remote computer is shutting down.")); } } void DefinedCommand::ipconfigAction() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("/sbin/ifconfig"); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("IPCONFIG"); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("/sbin/ifconfig"); } } void DefinedCommand::networkStatsAction() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("netstat"); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("netstat -a"); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("netstat"); } } void DefinedCommand::pingAction() { PingDialog *pingDialog = new PingDialog(os); connect(pingDialog, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); pingDialog->exec(); } void DefinedCommand::routeTableAction() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("netstat -r"); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("netstat -r"); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("netstat -r"); } } KontrolPack-3.0.0/kontrolpack/client/ui/tabui/share_files.h000644 001750 001750 00000007436 11426741620 022141 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../core/bean/os_characteristic.h" #include "../../core/bean/folder.h" #include "../../../commons/constants.h" #include "../extend/drop_list_view.h" #include "../../../commons/cd/change_dir.h" #include "../../core/xml/xml_creator_client.h" class ShareFiles : public QFrame { Q_OBJECT public: ShareFiles(int clientNbr, OsCharacteristic *characteristics, QWidget *parent); public slots: void doubleClicRemoteFolder(); void doubleClicLocalFolder(); void drop_local(); void drop_remote(); void refresh_view(Folder *folder); void refresh(); void refresh_local_view(); void remove_from_view(QString file_name, bool is_local); signals: void showMessage(QString title, QString content, int duration); void send_to_server(QString msg); void ask_file_to_server(QString to, QString from, QString name); void send_file_to_server(QString to, QString from, QString name); void update_percent(int current, int total); private: QLabel *localPath; QString localStringPath; QString remoteStringPath; OsCharacteristic *osInfo; QLabel *path; QLabel *remotePath; QStringListModel *remoteFilesModel; QStandardItemModel *remoteFilesIconModel; QList *remoteFilesIconList; QStringList localFilesList; QStringList localFoldersList; QStringList *remoteFilesList; QStringList *remoteFoldersList; DropListView *remoteList; DropListView *localList; QPushButton *getButton; QPushButton *sendButton; QFileIconProvider *iconprovider; QString slash; int nbr; void displayLocalDirectoryContent(QStringList folders_list, QStringList files_list); void displayRemoteDirectoryContent(QStringList *folders_list, QStringList *files_list); QStringList* convert_QStandardItemModel_to_QStringList(QStandardItemModel *listModel, int len_2); QString track_delta(QStringList *previousList, QStringList *newList); }; KontrolPack-3.0.0/kontrolpack/client/ui/tabui/defined_command.h000644 001750 001750 00000021570 11431223122 022730 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include class PingDialog : public QDialog { Q_OBJECT public: QLabel *pingLabel; QLineEdit *ping; QString os; PingDialog(QString operatingSystem) :os(operatingSystem) { pingLabel = new QLabel(tr("Host to ping : "), this); ping = new QLineEdit(this); QPushButton *button = new QPushButton(tr("Execute")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(pingLabel); layout->addWidget(ping); layout->addWidget(button); setLayout(layout); } private slots: void onClic() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("ping " + ping->text()); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("ping " + ping->text()); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("ping " + ping->text()); } hide(); } signals: void executeCommand(QString command); protected: void closeEvent(QCloseEvent *event) { hide(); event->ignore(); } }; class DelFileDialog : public QDialog { Q_OBJECT public: QLabel *fileNameLabel; QLineEdit *fileName; QString os; DelFileDialog(QString operatingSystem) :os(operatingSystem) { fileNameLabel = new QLabel(tr("File name to delete : "), this); fileName = new QLineEdit(this); QPushButton *button = new QPushButton(tr("Execute")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(fileNameLabel); layout->addWidget(fileName); layout->addWidget(button); setLayout(layout); } private slots: void onClic() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("rm " + fileName->text().replace(QString(" "), QString("\\ "))); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("DEL \"" + fileName->text() + "\""); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("rm " + fileName->text().replace(QString(" "), QString("\\ "))); } hide(); } signals: void executeCommand(QString command); protected: void closeEvent(QCloseEvent *event) { hide(); event->ignore(); } }; class DelDirDialog : public QDialog { Q_OBJECT public: QLabel *folderNameLabel; QLineEdit *folderName; QString os; DelDirDialog(QString operatingSystem) :os(operatingSystem) { folderNameLabel = new QLabel(tr("Folder name to delete : "), this); folderName = new QLineEdit(this); QPushButton *button = new QPushButton(tr("Execute")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(folderNameLabel); layout->addWidget(folderName); layout->addWidget(button); setLayout(layout); } private slots: void onClic() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("rm -rf " + folderName->text().replace(QString(" "), QString("\\ "))); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("RMDIR \"" + folderName->text() + "\""); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("rm -rf " + folderName->text().replace(QString(" "), QString("\\ "))); } hide(); } signals: void executeCommand(QString command); protected: void closeEvent(QCloseEvent *event) { hide(); event->ignore(); } }; class MkDirDialog : public QDialog { Q_OBJECT public: QLabel *folderNameLabel; QLineEdit *folderName; QString os; MkDirDialog(QString operatingSystem) :os(operatingSystem) { folderNameLabel = new QLabel(tr("Folder name : "), this); folderName = new QLineEdit(this); QPushButton *button = new QPushButton(tr("Execute")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(folderNameLabel); layout->addWidget(folderName); layout->addWidget(button); setLayout(layout); } private slots: void onClic() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("mkdir " + folderName->text().replace(QString(" "), QString("\\ "))); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("MKDIR \"" + folderName->text() + "\""); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("mkdir " + folderName->text().replace(QString(" "), QString("\\ "))); } hide(); } signals: void executeCommand(QString command); protected: void closeEvent(QCloseEvent *event) { hide(); event->ignore(); } }; class CopyDialog : public QDialog { Q_OBJECT public: QLabel *fromLabel; QLabel *toLabel; QLineEdit *from; QLineEdit *to; QString os; CopyDialog(QString operatingSystem) :os(operatingSystem) { fromLabel = new QLabel(tr("Copy From : "), this); toLabel = new QLabel(tr("To :"), this); from = new QLineEdit(this); to = new QLineEdit(this); QPushButton *button = new QPushButton(tr("Execute")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QHBoxLayout* layout = new QHBoxLayout(); layout->addWidget(fromLabel); layout->addWidget(from); layout->addWidget(toLabel); layout->addWidget(to); layout->addWidget(button); setLayout(layout); } private slots: void onClic() { if (os.startsWith(QString("LINUX"), Qt::CaseInsensitive)) { emit executeCommand("cp -a " + from->text().replace(QString(" "), QString("\\ ")) + " " + to->text().replace(QString(" "), QString("\\ "))); } else if (os.startsWith("WINDOWS", Qt::CaseInsensitive)) { emit executeCommand("COPY \"" + from->text() + "\" \"" + to->text() + "\""); } else if (os.startsWith("MACOSX", Qt::CaseInsensitive)) { emit executeCommand("cp -a " + from->text().replace(QString(" "), QString("\\ ")) + " " + to->text().replace(QString(" "), QString("\\ "))); } hide(); } signals: void executeCommand(QString command); protected: void closeEvent(QCloseEvent *event) { hide(); event->ignore(); } }; class DefinedCommand : public QWidget { Q_OBJECT public: DefinedCommand(QString operatingSystem); QString os; QPushButton *copyButton; QPushButton *mkDirButton; QPushButton *setButton; QPushButton *delFileButton; QPushButton *delFolderButton; QPushButton *shutdownButton; QPushButton *ipconfigButton; QPushButton *pingButton; QPushButton *networkStatsButton; QPushButton *routeTableButton; public slots: void copyAction(); void mkDirAction(); void setAction(); void delFileAction(); void delFolderAction(); void shutdownAction(); void ipconfigAction(); void networkStatsAction(); void pingAction(); void routeTableAction(); void executeDefinedCommand(QString command); signals: void executeCommand(QString command); private: }; KontrolPack-3.0.0/kontrolpack/client/ui/tabui/exec_shell.cpp000644 001750 001750 00000017011 11426741750 022315 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "exec_shell.h" ExecShell::ExecShell(int clientNbr, OsCharacteristic *characteristics, QWidget *parent) :nbr(clientNbr), osInfo(characteristics), QFrame(parent) { commandLineEdit = new QLineEdit(this); completer = new QCompleter(this); commandLineEdit->setCompleter(completer); textBrowser = new QTextEdit(this); commands_list = new QList; textBrowser->setReadOnly(true); textBrowser->insertHtml( QString("") + tr("This computer is now connected to the remote ") + osInfo->hostname + tr(" server.

Command results will be displayed in this text area. Input commands into the field at the bottom of this window.

") + QString("")); remote_path = osInfo->home_path; path = new QLabel("" + osInfo->home_path + "", this); QScrollArea *scroller = new QScrollArea(this); DefinedCommand *definedCommand = new DefinedCommand(osInfo->system); connect(definedCommand, SIGNAL(executeCommand(QString)), this, SLOT(executeDefinedCommand(QString))); scroller->setWidget(definedCommand); QGroupBox *commandsGroupBox = new QGroupBox(tr("Pre-defined commands"), this); QGridLayout *commandsLayout = new QGridLayout; commandsLayout->addWidget(scroller); commandsGroupBox->setLayout(commandsLayout); QSplitter *commandSplitter = new QSplitter(this); commandSplitter->addWidget(textBrowser); commandSplitter->addWidget(commandsGroupBox); commandSplitter->setOrientation(Qt::Vertical); commandSplitter->setStretchFactor(0, 5); list = new QListView(this); list->setModel(new QStandardItemModel(this)); QSplitter *splitter = new QSplitter(this); QSplitter *infoSplitter = new QSplitter(this); QFrame *leftFrame = new QFrame(this); QFrame *rightFrame = new QFrame(this); QFrame *infoBottomFrame = new QFrame(this); QVBoxLayout *infoBottomBox = new QVBoxLayout; infoBottomBox->addWidget(list); infoBottomFrame->setLayout(infoBottomBox); infoSplitter->addWidget(infoBottomFrame); infoSplitter->setOrientation(Qt::Vertical); infoSplitter->setStretchFactor(1, 0); QVBoxLayout *rightBox = new QVBoxLayout; rightBox->addWidget(path); rightBox->addWidget(commandSplitter); QVBoxLayout *leftBox = new QVBoxLayout; leftBox->addWidget(infoSplitter); rightFrame->setLayout(rightBox); leftFrame->setLayout(leftBox); splitter->addWidget(rightFrame); splitter->addWidget(leftFrame); splitter->setStretchFactor(0, 1); QGridLayout *layout = new QGridLayout; layout->addWidget(splitter); layout->addWidget(commandLineEdit); setLayout(layout); QObject::connect(commandLineEdit, SIGNAL(returnPressed()), this, SLOT(execute())); QObject::connect(list, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(double_clic_command())); QObject::connect(list, SIGNAL(clicked(QModelIndex)), this, SLOT(clic_command())); } void ExecShell::executeDefinedCommand(QString command) { save_command(command); emit sendCommand(command, remote_path); } void ExecShell::execute() { if (commandLineEdit->text() != "") { // Sending command to remote server. emit sendCommand(commandLineEdit->text(), remote_path); save_command(commandLineEdit->text()); commandLineEdit->setText(""); } } void ExecShell::set_remote_path(QString remote_path) { path->setText("" + remote_path + ""); this->remote_path = remote_path; } void ExecShell::set_command_results(QString result) { textBrowser->clear(); textBrowser->setReadOnly(true); textBrowser->ensureCursorVisible(); textBrowser->textCursor().insertText(result); } void ExecShell::set_commands_list(QList *commands_list) { this->commands_list = commands_list; if (!commands_list->isEmpty()) { this->commands_list = commands_list; command_list_model = (QStandardItemModel*)list->model(); if (command_list_model == NULL) command_list_model = new QStandardItemModel(this); for (int j = 0; j < commands_list->size(); j++) { Command *command = commands_list->at(j); QStandardItem *item = new QStandardItem(QIcon(":/images/terminal.png"), command->command); item->setDropEnabled(false); item->setEditable (false); command_list_model->appendRow(item); } list->setModel(command_list_model); completer->setModel(command_list_model); } } void ExecShell::save_command(QString command) { // Creating command bean. Command *cmd = new Command(this); cmd->command = command; cmd->id_server = this->id_server; QDateTime date = QDateTime::currentDateTime(); cmd->date = date.toString("dd/MM/yyyy"); emit add_command_to_database(cmd); // Refreshing model. QStandardItemModel *list_model = (QStandardItemModel*)list->model(); QStandardItem *item = new QStandardItem(QIcon(":/images/terminal.png"), cmd->command); item->setDropEnabled(false); item->setEditable (false); list_model->appendRow(item); list->setModel(list_model); completer->setModel(list_model); } void ExecShell::double_clic_command() { QItemSelectionModel *selection = list->selectionModel(); QModelIndex indexElementSelectionne = selection->currentIndex(); QStringListModel *listModel = (QStringListModel*)list->model(); QVariant elementSelectionne = listModel->data(indexElementSelectionne, Qt::DisplayRole); QString selectedDocument = elementSelectionne.toString(); commandLineEdit->setText(selectedDocument); execute(); } void ExecShell::clic_command() { QItemSelectionModel *selection = list->selectionModel(); QModelIndex indexElementSelectionne = selection->currentIndex(); QStringListModel *listModel = (QStringListModel*)list->model(); QVariant elementSelectionne = listModel->data(indexElementSelectionne, Qt::DisplayRole); QString selectedDocument = elementSelectionne.toString(); commandLineEdit->setText(selectedDocument); } KontrolPack-3.0.0/kontrolpack/client/ui/client_home.h000644 001750 001750 00000004754 11426731412 021035 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dns/dns_resolver.h" #include "../../commons/win32/qtwin.h" #include "../../commons/constants.h" #include "../core/bean/remote_computer_info.h" class ClientHome : public QFrame { Q_OBJECT public: ClientHome(QTextEdit *textBrowser, QList clientsList); QList addresses; QLabel *image; QTextEdit *textEdit; QGroupBox *groupBox; QLabel *path; QPushButton *addComputerButton; void refreshCLientsList(QList remote_info_list); signals: void connect_remote_clients(QString ip, QString port, QString port_file); public slots: void showDNSResolver(); void doubleClicSelection(); private: QListView *list; DnsResolver *resolver; QList remote_info_list; }; KontrolPack-3.0.0/kontrolpack/client/ui/remote_computer.cpp000644 001750 001750 00000033610 11432230766 022307 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "remote_computer.h" RemoteComputer::RemoteComputer(QString remote_ip, QString remote_port, QString remote_port_file, QString remote_password, int nbr) : ip(remote_ip), port(remote_port), portFile(remote_port_file), password(remote_password), client_nbr(nbr) { client_tab = new QTabWidget(this); settings = new QSettings("OpenNetwork", "KontrolPack", this); user_mode = settings->value("user/mode", "NONE").toString(); client_tab->hide(); client_tab->setMovable(true); isScreenshot = true; #ifdef WIN32 client_tab->setDocumentMode(true); #elif defined __APPLE__ #else client_tab->setDocumentMode(true); #endif client_tab->setTabPosition(QTabWidget::West); label = new QLabel(tr("Connecting..."), this); progress = new QProgressBar(this); progress->setMinimumHeight(150); QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(client_tab); layout->addWidget(label); layout->addWidget(progress); setLayout(layout); controller = new SocketController(ip.toUtf8().data(), port.toInt(), portFile.toInt(), password); QObject::connect(controller->master_tcp_client, SIGNAL(disconnected_client(int)), this, SLOT(disconnected(int))); QObject::connect(controller, SIGNAL(client_characteristics(OsCharacteristic*)), this, SLOT(client_characteristics_slot(OsCharacteristic*))); QObject::connect(controller->master_tcp_client, SIGNAL(emit_tcp_state(int)), this, SLOT(tcp_state(int))); QObject::connect(controller->master_tcp_client, SIGNAL(wrong_password()), this, SLOT(wrong_password_slot())); QObject::connect(controller->master_tcp_client, SIGNAL(emit_error()), this, SLOT(error())); QObject::connect(controller->file_tcp_client, SIGNAL(emit_error()), this, SLOT(error())); QObject::connect(controller->file_tcp_client, SIGNAL(disconnected_client(int)), this, SLOT(disconnected(int))); QObject::connect(controller, SIGNAL(showMessage(QString,QString,int)), this, SLOT(showMessageSlot(QString,QString,int))); QObject::connect(controller->file_manager, SIGNAL(showMessage(QString,QString,int)), this, SLOT(showMessageSlot(QString,QString,int))); QObject::connect(controller->file_manager, SIGNAL(file_received(File*)), this, SLOT(file_received_slot(File*))); QObject::connect(controller, SIGNAL(file_uploaded(File*)), this, SLOT(file_uploaded_slot(File*))); QObject::connect(controller->file_tcp_client, SIGNAL(update_progress_size(int,int)), this, SLOT(update_percent_slot(int,int))); QObject::connect(controller->file_manager, SIGNAL(update_percent(int,int)), this, SLOT(update_percent_slot(int,int))); QObject::connect(controller, SIGNAL(update_percent(int,int)), this, SLOT(update_percent_slot(int,int))); QObject::connect(controller, SIGNAL(showLabelSignal(QString)), this, SLOT(showLabel(QString))); QObject::connect(controller->file_manager, SIGNAL(showLabelSignal(QString)), this, SLOT(showLabel(QString))); } void RemoteComputer::error() { emit showMessage(tr("Error"), tr("An error occured during the authentication process. Please try again..."), 5000); emit remove_tab_signal(client_nbr); } void RemoteComputer::wrong_password_slot() { QMessageBox::information(this, tr("Wrong password"), tr("Login failed : Wrong password")); emit remove_tab_signal(client_nbr); } void RemoteComputer::client_characteristics_slot(OsCharacteristic *characteristics) { os = characteristics; QLabel *image = new QLabel(this); if (characteristics->system.startsWith(QString(LINUX), Qt::CaseSensitive)) { image->setPixmap(QPixmap(":/images/linux-computer.png")); } else if (characteristics->system.startsWith(WINDOWS, Qt::CaseSensitive)) { image->setPixmap(QPixmap(":/images/windows-computer.png")); }else if (characteristics->system.startsWith(MACOSX, Qt::CaseSensitive)) { image->setPixmap(QPixmap(":/images/mac-computer.png")); } // Instantiate 3 widgets corresponding to sub tab client widget. identity = new IdentityClient(client_nbr, image, characteristics, this); client_tab->addTab(identity, QIcon(":/images/connection.png"), tr("Identity card")); shareFiles = new ShareFiles(client_nbr, characteristics, this); client_tab->addTab(shareFiles, QIcon(":/images/explorer.png"), tr("Share files")); QString user_mode = settings->value("user/mode", "NONE").toString(); // Command shell execution only for advanced user. if (!user_mode.startsWith("END", Qt::CaseInsensitive)) { execShell = new ExecShell(client_nbr, characteristics, this); client_tab->addTab(execShell, QIcon(":/images/terminal.png"), tr("Shell command")); QObject::connect(execShell, SIGNAL(sendCommand(QString,QString)), controller, SLOT(executeCommand(QString,QString))); QObject::connect(execShell, SIGNAL(add_command_to_database(Command*)), this, SLOT(add_command_to_database_slot(Command*))); QObject::connect(controller, SIGNAL(command_results(QString)), execShell, SLOT(set_command_results(QString))); } this->setStyleSheet("QFrame {background : white}"); QObject::connect(shareFiles, SIGNAL(showMessage(QString,QString,int)), this, SLOT(showMessageSlot(QString,QString,int))); QObject::connect(shareFiles, SIGNAL(send_to_server(QString)), controller, SLOT(send_to_server(QString))); QObject::connect(shareFiles, SIGNAL(ask_file_to_server(QString,QString,QString)), controller, SLOT(ask_file_to_server(QString,QString,QString))); QObject::connect(shareFiles, SIGNAL(send_file_to_server(QString,QString,QString)), controller, SLOT(send_file_to_server(QString,QString,QString))); QObject::connect(shareFiles, SIGNAL(update_percent(int,int)), this, SLOT(update_percent_slot(int,int))); QObject::connect(controller, SIGNAL(remove_from_view(QString, bool)), shareFiles, SLOT(remove_from_view(QString, bool))); QObject::connect(this, SIGNAL(refresh_view(Folder*)), shareFiles, SLOT(refresh_view(Folder*))); QObject::connect(controller, SIGNAL(refresh_directory_view(Folder*)), this, SLOT(refresh_view_slot(Folder*))); QObject::connect(identity, SIGNAL(refreshScreenshotSignal(QString,QString,QString)), this, SLOT(ask_screenshot_to_server(QString,QString,QString))); label->hide(); progress->setMinimumHeight(30); client_tab->show(); emit update_os_information(characteristics->system, characteristics->hostname, client_nbr); } void RemoteComputer::refresh_view_slot(Folder *folder_info) { emit refresh_view(folder_info); // Command shell execution only for advanced user. if (!user_mode.startsWith("END", Qt::CaseInsensitive)) { execShell->set_remote_path(folder_info->path); } } void RemoteComputer::tcp_state(int state) { switch (state) { case TOKEN_WELCOME : { label->setText("Connecting to remote server..."); break; } case RSA_PUBLIC_KEY_RECEPTION : { label->setText("RSA asymetric encryption started..."); break; } case PASSWORD_VALIDATION : { label->setText("Password validation process..."); break; } case AES_KEY_RECEPTION : { label->setText("AES symetric encryption started..."); break; } case AUTH_SUCCESS : { label->setText("Authentification succeded. AES symetric encryption started..."); progress->hide(); label->hide(); break; } default: ; } } void RemoteComputer::disconnected(int error) { switch (error) { case QAbstractSocket::RemoteHostClosedError: emit showMessage(tr("Network error"), tr("Remote Host Closed Error"), 5000); break; case QAbstractSocket::HostNotFoundError: emit showMessage(tr("Network error"), tr("Host Not Found Error"), 5000); break; case QAbstractSocket::ConnectionRefusedError: emit showMessage(tr("Network error"), tr("Connection Refused Error"), 5000); break; case QAbstractSocket::SocketAccessError: emit showMessage(tr("Network error"), tr("Socket Access Error"), 5000); break; case QAbstractSocket::SocketResourceError: emit showMessage(tr("Network error"), tr("Socket Resource Error"), 5000); break; case QAbstractSocket::SocketTimeoutError: emit showMessage(tr("Network error"), tr("Socket Timeout Error"), 5000); break; case QAbstractSocket::DatagramTooLargeError: emit showMessage(tr("Network error"), tr("Datagram Too Large Error"), 5000); break; case QAbstractSocket::NetworkError: emit showMessage(tr("Network error"), tr("Network Error"), 5000); break; case QAbstractSocket::AddressInUseError: emit showMessage(tr("Network error"), tr("Address In Use Error"), 5000); break; case QAbstractSocket::SocketAddressNotAvailableError: emit showMessage(tr("Network error"), tr("Socket Address Not Available Error"), 5000); break; case QAbstractSocket::UnsupportedSocketOperationError: emit showMessage(tr("Network error"), tr("Unsupported Socket Operation Error"), 5000); break; case QAbstractSocket::ProxyAuthenticationRequiredError: emit showMessage(tr("Network error"), tr("Proxy Authentication Required Error"), 5000); break; case QAbstractSocket::SslHandshakeFailedError: emit showMessage(tr("Network error"), tr("Ssl Handshake Failed Error"), 5000); break; case QAbstractSocket::UnfinishedSocketOperationError: emit showMessage(tr("Network error"), tr("Unfinished Socket Operation Error"), 5000); break; case QAbstractSocket::ProxyConnectionRefusedError: emit showMessage(tr("Network error"), tr("Proxy Connection Refused Error"), 5000); break; case QAbstractSocket::ProxyConnectionClosedError: emit showMessage(tr("Network error"), tr("Proxy Connection Closed Error"), 5000); break; case QAbstractSocket::ProxyConnectionTimeoutError: emit showMessage(tr("Network error"), tr("Proxy Connection Timeout Error"), 5000); break; case QAbstractSocket::ProxyNotFoundError: emit showMessage(tr("Network error"), tr("Proxy Not Found Error"), 5000); break; case QAbstractSocket::ProxyProtocolError: emit showMessage(tr("Network error"), tr("Proxy Protocol Error"), 5000); break; case QAbstractSocket::UnknownSocketError: emit showMessage(tr("Network error"), tr("Unknown Socket Error"), 5000); break; default: ; } emit remove_tab_signal(client_nbr); } void RemoteComputer::showMessageSlot(QString title, QString content, int duration) { emit showMessage(title, content, duration); } void RemoteComputer::file_received_slot(File *file) { progress->hide(); label->hide(); if (isScreenshot) { isScreenshot = false; identity->blocked = false; if (!controller->file_queue->isEmpty()) controller->file_queue->dequeue(); identity->screenshotLabel->setPixmap(QPixmap(file->to + file->name).scaled(identity->screenshotLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); } else { emit showMessage(tr("File download"), file->name + tr(" received."), 4500); shareFiles->refresh_local_view(); } // Download next file if the file queue if not empty... if (!controller->file_queue->isEmpty()) controller->file_queue->dequeue(); controller->process_queue(); } void RemoteComputer::file_uploaded_slot(File *file) { progress->hide(); label->hide(); shareFiles->refresh(); } void RemoteComputer::update_percent_slot(int current, int total) { if (current > 0) { progress->show(); progress->setMinimum(0); progress->setMaximum(total); // Set to 0 when uploading... progress->setValue(progress->value() + current); } else if (current == 0) progress->hide(); } void RemoteComputer::ask_screenshot_to_server(QString to, QString from, QString file_name) { identity->blocked = true; isScreenshot = true; controller->ask_file_to_server(to, from, file_name); } void RemoteComputer::showLabel(QString text) { label->setText(text); label->show(); } RemoteComputer::~RemoteComputer() { delete this->controller->master_tcp_client; delete this->controller->file_tcp_client; delete this->controller->file_manager->file_queue; delete this->controller->file_manager; delete this->controller->file_queue; delete this->controller; } void RemoteComputer::add_command_to_database_slot(Command *command) { emit add_command_to_database(command); } KontrolPack-3.0.0/kontrolpack/client/ui/dns/000755 001750 001750 00000000000 11432306342 017145 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/ui/dns/dns_resolver.cpp000644 001750 001750 00000006417 11426532122 022366 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "dns_resolver.h" DnsResolver::DnsResolver() { labelDomain = new QLabel(tr("&Domain :"), this); labelIp = new QLabel(tr("&Ip :"), this); lineDomain = new QLineEdit(this); lineIp = new QLineEdit(this); closeButton = new QPushButton(tr("Close"), this); labelDomain->setBuddy(lineDomain); labelIp->setBuddy(lineIp); buttonIp = new QPushButton(tr("Resolve IP"),this); buttonDomain = new QPushButton(tr("Resolve Domain"),this); setWindowTitle(tr("Domain Name System resolver")); setWindowIcon(QIcon(":/images/kontrolpack.png")); QHBoxLayout* Layout = new QHBoxLayout(); Layout->addWidget(labelDomain); Layout->addWidget(lineDomain); Layout->addWidget(labelIp); Layout->addWidget(lineIp); Layout->addWidget(buttonDomain); Layout->addWidget(buttonIp); Layout->addWidget(closeButton); setLayout(Layout); connect(this->buttonIp, SIGNAL(clicked(bool)), this, SLOT(resolveIp(bool))); connect(this->buttonDomain, SIGNAL(clicked(bool)), this, SLOT(resolveDomain(bool))); connect(closeButton, SIGNAL(clicked()), this, SLOT(reject())); } void DnsResolver::resolveDomain(bool valid) { QHostInfo infoAdresse = QHostInfo::fromName(lineDomain->text()); QList result_adresses = infoAdresse.addresses(); QString Ip; for(int i=0; i < result_adresses.size(); i++) { Ip = Ip + result_adresses.at(i).toString() +"; "; } lineIp->setText(Ip); } void DnsResolver::resolveIp(bool valid) { QHostInfo::lookupHost(lineIp->text(),this, SLOT(resolveIpFinish(QHostInfo))); } void DnsResolver::resolveIpFinish(const QHostInfo& infoAdresse) { lineDomain->setText(infoAdresse.hostName()); } void DnsResolver::closeEvent(QCloseEvent *event) { hide(); event->ignore(); } KontrolPack-3.0.0/kontrolpack/client/ui/dns/dns_resolver.h000644 001750 001750 00000004242 11426532122 022025 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include class DnsResolver : public QDialog { Q_OBJECT QLabel* labelDomain; QLabel* labelIp; QLineEdit* lineDomain; QLineEdit* lineIp; QPushButton* buttonIp; QPushButton *closeButton; QPushButton* buttonDomain; public: DnsResolver(); public slots: void resolveDomain(bool valid); void resolveIp(bool valid); void resolveIpFinish(const QHostInfo& infoAdresse); signals: protected: void closeEvent(QCloseEvent *event); }; KontrolPack-3.0.0/kontrolpack/client/ui/remote_computer.h000644 001750 001750 00000006617 11426742700 021762 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef HEADER_REMOTECOMPUTER #define HEADER_REMOTECOMPUTER #include #include #include #include #include #include #include #include #include #include #include "../core/network/socket_controller.h" #include "../core/bean/os_characteristic.h" #include "tabui/share_files.h" #include "tabui/identity_client.h" #include "tabui/exec_shell.h" class RemoteComputer : public QFrame { Q_OBJECT public: RemoteComputer(QString remote_ip, QString remote_port, QString remote_port_file, QString remote_password, int nbr); ~RemoteComputer(); SocketController *controller; QLabel *label; QProgressBar *progress; int client_nbr; int id_server; QString ip; QString port; QString portFile; ExecShell *execShell; public slots: void disconnected(int error); void tcp_state(int state); void wrong_password_slot(); void client_characteristics_slot(OsCharacteristic *characteristics); void error(); void showMessageSlot(QString title, QString content, int duration); void showLabel(QString text); void file_received_slot(File *file); void file_uploaded_slot(File *file); void update_percent_slot(int current, int total); void ask_screenshot_to_server(QString to, QString from, QString file_name); void refresh_view_slot(Folder *folder_info); void add_command_to_database_slot(Command *command); signals: void remove_tab_signal(int client_nbr); void showMessage(QString title, QString content, int duration); void update_os_information(QString os, QString title, int client_nbr); void refresh_view(Folder *folder_info); void add_command_to_database(Command *command); private: QString password; OsCharacteristic *os; QTabWidget *client_tab; ShareFiles *shareFiles; IdentityClient *identity; QSettings *settings; QString user_mode; bool isScreenshot; }; #endif KontrolPack-3.0.0/kontrolpack/client/ui/extend/000755 001750 001750 00000000000 11432306342 017650 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/client/ui/extend/drop_list_view.h000644 001750 001750 00000003317 11426532122 023056 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef _QLISTWIDGET_H #define _QLISTWIDGET_H #include #include #include class DropListView : public QListView { Q_OBJECT public: DropListView(); signals: void drop_signal(); protected: void dropEvent(QDropEvent *event); }; #endif KontrolPack-3.0.0/kontrolpack/client/ui/extend/drop_list_view.cpp000644 001750 001750 00000003125 11426532122 023406 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "drop_list_view.h" DropListView::DropListView() { } void DropListView::dropEvent(QDropEvent *event) { QListView::dropEvent(event); emit drop_signal(); } KontrolPack-3.0.0/kontrolpack/client/ui/client_central_window.h000644 001750 001750 00000006442 11426557752 023135 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "client_home.h" #include "tab_dialog.h" #include "remote_computer.h" #include "../../commons/sql/database.h" #include "../core/bean/remote_computer_info.h" class TranslucentTabWidget : public QTabWidget { Q_OBJECT public: TranslucentTabWidget(QWidget *parent) : QTabWidget(parent) { QTabBar *bar = new QTabBar(this); #ifdef WIN32 bar->setAttribute( Qt::WA_TranslucentBackground, true); #elif defined __APPLE__ #else bar->setAttribute(Qt::WA_TranslucentBackground, true); #endif setTabBar(bar); } }; class ClientCentralWindow : public QWidget { Q_OBJECT public: ClientCentralWindow(QToolButton *menuButton); Database *database; public slots: void show_connect_dialog(); void show_connect_dialog(QString ip, QString port, QString port_file); void add_tab(QString ip, QString port, QString portFile, QString password); void remove_tab_by_index(int index); void remove_tab_by_client_nbr(int client_nbr); void showMessageSlot(QString title, QString content, int duration); void update_os_information(QString os, QString title, int client_nbr); void add_command_to_database_slot(Command *command); void drop_database(); signals: void showMessage(QString title, QString content, int duration); private: QSettings *settings; QString user_mode; QTextBrowser *textEdit; TranslucentTabWidget *tab; ClientHome *clientHome; TabDialog *tabDialog; QMap *client_map; QList remote_info_list; QToolButton *menu; int client_nbr; }; KontrolPack-3.0.0/kontrolpack/client/ui/tab_dialog.cpp000644 001750 001750 00000014355 11426532120 021160 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "tab_dialog.h" TabDialog::TabDialog(QList clientsList) : remote_info_list(clientsList) { #ifdef WIN32 QFont font("Arial", 8, true); #elif defined __APPLE__ QFont font = QFont(); #else QFont font("Arial", 10, true); #endif QLabel *label = new QLabel(tr("Connect to remote computer securely
"), this); QLabel *labelIp = new QLabel(tr("Server IP address :"), this); QLabel *labelPort = new QLabel(tr("Server port :"), this); QLabel *labelPortFile = new QLabel(tr("Server port File :"), this); QLabel *labelPassword = new QLabel(tr("Server master password :"), this); label->setFont(font); labelIp->setFont(font); labelPassword->setFont(font); labelPort->setFont(font); labelPortFile->setFont(font); QStandardItemModel *model = new QStandardItemModel(this); for (int l = 0; l < remote_info_list.size(); l++) { RemoteComputerInfo* remoteComputerInfo = remote_info_list.at(l); QStandardItem *item; if (remoteComputerInfo->system.startsWith(QString(LINUX), Qt::CaseSensitive)) { item = new QStandardItem(QIcon(":/images/linux.png"),remoteComputerInfo->ip); } else if (remoteComputerInfo->system.startsWith(WINDOWS, Qt::CaseSensitive)) { item = new QStandardItem(QIcon(":/images/windows.png"),remoteComputerInfo->ip); }else if (remoteComputerInfo->system.startsWith(MACOSX, Qt::CaseSensitive)) { item = new QStandardItem(QIcon(":/images/finder.png"),remoteComputerInfo->ip); } model->appendRow(item); } QCompleter *completer = new QCompleter(this); completer->setCompletionMode(QCompleter::UnfilteredPopupCompletion); completer->setModel(model); password = new QLineEdit(this); ipAddress = new QLineEdit(this); ipAddress->setCompleter(completer); port = new QLineEdit(this); portFile = new QLineEdit(this); ipAddress->setFont(font); port->setFont(font); portFile->setFont(font); portFile->setValidator(new QIntValidator(1, 65535, this)); port->setValidator(new QIntValidator(1, 65535, this)); password->setFont(font); password->setEchoMode(QLineEdit::Password); QPushButton *button = new QPushButton(tr("Connect to remote server")); button->setMinimumHeight(70); button->setFont(font); QFrame *upFrame = new QFrame( this ); upFrame->setFrameStyle( QFrame::HLine | QFrame::Sunken ); QFrame *downFrame = new QFrame( this ); downFrame->setFrameStyle( QFrame::HLine | QFrame::Sunken ); port->setText("17984"); portFile->setText("17985"); QGridLayout *layout = new QGridLayout; layout->addWidget(label, 0, 0, 1, 2); layout->addWidget(upFrame, 1, 0, 1, 2); layout->addWidget(labelPassword, 2, 0); layout->addWidget(password, 2, 1); layout->addWidget(labelIp, 3, 0); layout->addWidget(ipAddress, 3, 1); setWindowTitle(tr("Connect to remote computer")); setWindowIcon(QIcon(":/images/kontrolpack.png")); layout->addWidget(labelPort, 4, 0); layout->addWidget(port, 4, 1); layout->addWidget(labelPortFile, 5, 0); layout->addWidget(portFile, 5, 1); layout->addWidget(downFrame, 6, 0, 1, 2); layout->addWidget(button, 7, 0, 6, 2); setLayout(layout); connect(button, SIGNAL(clicked()), this, SLOT(hideDialogBox())); } void TabDialog::hideDialogBox() { if (ipAddress->text() != "") { if (port->text() != "") { if (portFile->text() != "") { if (password->text() != "") { if (password->text().size() < 30) { this->hide(); emit add_tab_signal(ipAddress->text(), port->text(), portFile->text(), password->text()); } else { QMessageBox::information(this, tr("Warning"), tr("Password length must be smaller than 30 digits.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Input a password in the field above to connect.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Input a port number in the field above to connect.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Input a port number in the field above to connect.")); } } else { QMessageBox::information(this, tr("Warning"), tr("Input an IP address in the field above to connect.")); } } void TabDialog::centerOnScreen() { QDesktopWidget screen; QRect screenGeom = screen.screenGeometry(this); int screenCenterX = screenGeom.center().x(); int screenCenterY = screenGeom.center().y(); move(screenCenterX - width () / 2, screenCenterY - height() / 2); } void TabDialog::closeEvent(QCloseEvent *event) { hide(); event->ignore(); } KontrolPack-3.0.0/kontrolpack/client/ui/client_central_window.cpp000644 001750 001750 00000024721 11432223402 023443 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "client_central_window.h" ClientCentralWindow::ClientCentralWindow(QToolButton *menuButton) : menu(menuButton) { settings = new QSettings("OpenNetwork", "KontrolPack", this); user_mode = settings->value("user/mode", "NONE").toString(); database = new Database; client_map = new QMap(); remote_info_list = database->getRemoteClients(); tabDialog = new TabDialog(remote_info_list); client_nbr = 0; QGridLayout *layout = new QGridLayout(this); tab = new TranslucentTabWidget(this); #ifdef WIN32 QFont font("Arial", 8, true); tab->setDocumentMode(true); #elif defined __APPLE__ QFont font = QFont(); tab->setDocumentMode(false); #else QFont font("Arial", 10, true); tab->setDocumentMode(true); #endif textEdit = new QTextBrowser(this); textEdit->setFont(font); textEdit->setReadOnly(true); textEdit->setLineWrapMode(QTextEdit::FixedColumnWidth); textEdit->setLineWrapColumnOrWidth(1000); textEdit->textCursor().insertHtml( QString(tr("") + tr("KontrolPack improves interoperability between systems by connecting remote computers regardless of their operating system.
  •    Secure encrypted tunnel over TCP/IP.
  •    Navigate through remote file systems.
  •    Handle remote shell command executions.
  •    Share files between remote computers.
  • ") + tr("
"))); clientHome = new ClientHome(textEdit, remote_info_list); clientHome->setAttribute(Qt::WA_TranslucentBackground, false); clientHome->setAttribute(Qt::WA_NoSystemBackground, false); #ifdef WIN32 this->setStyleSheet("ClientHome {background : white}"); #endif tab->setFont(font); tab->setTabsClosable(true); tab->setMovable(true); tab->addTab(clientHome, QIcon(":/images/connection.png"), tr("Information")); QObject::connect(clientHome->addComputerButton, SIGNAL(clicked()), this, SLOT(show_connect_dialog())); QObject::connect(tabDialog, SIGNAL(add_tab_signal(QString,QString,QString,QString)), this, SLOT(add_tab(QString,QString,QString,QString))); QObject::connect(tab, SIGNAL(tabCloseRequested(int)), this, SLOT(remove_tab_by_index(int))); QObject::connect(clientHome, SIGNAL(connect_remote_clients(QString,QString,QString)), this, SLOT(show_connect_dialog(QString,QString,QString))); tab->setCornerWidget(menu, Qt::TopLeftCorner); layout->addWidget(tab, 0, 0); setLayout(layout); this->setMinimumSize(800,450); } void ClientCentralWindow::show_connect_dialog() { tabDialog->ipAddress->setText(""); tabDialog->password->setText(""); tabDialog->exec(); } void ClientCentralWindow::show_connect_dialog(QString ip, QString port, QString port_file) { tabDialog->ipAddress->setText(ip.trimmed()); tabDialog->port->setText(port.trimmed()); tabDialog->password->setText(""); tabDialog->portFile->setText(port_file.trimmed()); tabDialog->exec(); } void ClientCentralWindow::add_tab(QString ip, QString port, QString portFile, QString password) { client_nbr++; RemoteComputer *remoteComputer = new RemoteComputer(ip, port, portFile, password, client_nbr); #ifdef WIN32 this->setStyleSheet("ClientHome {background : white} RemoteComputer {background : white}"); #endif tab->addTab(remoteComputer, QIcon(":/images/connection.png"), tr("Loading...")); tab->setCurrentWidget(remoteComputer); QObject::connect(remoteComputer, SIGNAL(remove_tab_signal(int)), this, SLOT(remove_tab_by_client_nbr(int))); QObject::connect(remoteComputer, SIGNAL(showMessage(QString,QString,int)), this, SLOT(showMessageSlot(QString,QString,int))); QObject::connect(remoteComputer, SIGNAL(update_os_information(QString,QString,int)), this, SLOT(update_os_information(QString,QString,int))); QObject::connect(remoteComputer, SIGNAL(add_command_to_database(Command*)), this, SLOT(add_command_to_database_slot(Command*))); client_map->insert(client_nbr, remoteComputer); } void ClientCentralWindow::remove_tab_by_index(int index) { RemoteComputer *remoteComputer; if (remoteComputer = qobject_cast (tab->widget(index))) { remoteComputer->controller->master_tcp_client->stop_client(); remoteComputer->controller->file_tcp_client->stop_client(); tab->removeTab(index); client_nbr--; client_map->remove(remoteComputer->client_nbr); delete remoteComputer; } } void ClientCentralWindow::remove_tab_by_client_nbr(int client_nbr) { if (client_map->contains(client_nbr)) { RemoteComputer *remoteComputer = client_map->take(client_nbr); remoteComputer->controller->master_tcp_client->stop_client(); remoteComputer->controller->file_tcp_client->stop_client(); tab->removeTab(tab->indexOf(remoteComputer)); client_nbr--; client_map->remove(client_nbr); } } void ClientCentralWindow::showMessageSlot(QString title, QString content, int duration) { emit showMessage(title, content, duration); } void ClientCentralWindow::update_os_information(QString os, QString title, int client_nbr) { if (client_map->contains(client_nbr)) { RemoteComputer *remoteComputer = client_map->value(client_nbr); RemoteComputerInfo *remoteInfo = new RemoteComputerInfo(this); remoteInfo->system = os; remoteInfo->hostname = title; remoteInfo->ip = remoteComputer->ip; remoteInfo->port = remoteComputer->port.toInt(); remoteInfo->port_file = remoteComputer->portFile.toInt(); QString info_string = QString(remoteInfo->hostname + DELIMITER_DATABASE + remoteInfo->ip + DELIMITER_DATABASE + QString::number(remoteInfo->port) + DELIMITER_DATABASE + QString::number(remoteInfo->port_file)); // Save remote clients bool saved = false; if (!remote_info_list.isEmpty()) { for (int k = 0; k < remote_info_list.size(); k++) { RemoteComputerInfo *remoteInfoFromList = remote_info_list.at(k); QString string = QString(remoteInfoFromList->hostname + DELIMITER_DATABASE + remoteInfoFromList->ip + DELIMITER_DATABASE + QString::number(remoteInfoFromList->port) + DELIMITER_DATABASE + QString::number(remoteInfoFromList->port_file)); if (QString::compare(string, info_string, Qt::CaseInsensitive) == 0) { remoteInfo->id = remoteInfoFromList->id; remoteComputer->id_server = remoteInfoFromList->id; if (!user_mode.startsWith("END", Qt::CaseInsensitive)) { remoteComputer->execShell->id_server = remoteInfoFromList->id; remoteComputer->execShell->set_commands_list(database->getCommandsByIdServer(remoteInfoFromList->id)); } saved = true; break; } } } if (!saved) { remote_info_list.append(remoteInfo); int id = remote_info_list.size() + 1; remoteInfo->id = id; remoteComputer->id_server = id; if (!user_mode.startsWith("END", Qt::CaseInsensitive)) { remoteComputer->execShell->id_server = id; remoteComputer->execShell->set_commands_list(database->getCommandsByIdServer(id)); } database->saveRemoteClients(remoteInfo); clientHome->refreshCLientsList(remote_info_list); } tab->setTabText(tab->indexOf(remoteComputer), title); if (os.startsWith(QString(LINUX), Qt::CaseSensitive)) { tab->setTabIcon(tab->indexOf(remoteComputer), QIcon(":/images/linux.png")); } else if (os.startsWith(WINDOWS, Qt::CaseSensitive)) { tab->setTabIcon(tab->indexOf(remoteComputer), QIcon(":/images/windows.png")); } else if (os.startsWith(MACOSX, Qt::CaseSensitive)) { tab->setTabIcon(tab->indexOf(remoteComputer), QIcon(":/images/finder.png")); } else { tab->setTabIcon(tab->indexOf(remoteComputer), QIcon(":/images/linux.png")); } } } void ClientCentralWindow::drop_database() { database->dropRemoteClients(); database->dropCommands(); for (int k = 0; k < remote_info_list.size(); k++) { remote_info_list.removeAt(k); } database->dropRemoteClients(); database->dropCommands(); clientHome->refreshCLientsList(remote_info_list); } void ClientCentralWindow::add_command_to_database_slot(Command *command) { QList *list = database->getCommandsByIdServer(command->id_server); if (list->size() == 75) for (int i = 0; i < 30; i++) { Command *cmd = list->at(i); database->delete_command(cmd->id_server, cmd->id_command, cmd->command); } command->id_command = list->size() + 1; list = database->getCommandsByIdServer(command->id_server); database->saveCommand(command); } KontrolPack-3.0.0/kontrolpack/client/ui/tab_dialog.h000644 001750 001750 00000004606 11426532120 020623 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef HEADER_TABDIALOG #define HEADER_TABDIALOG #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../commons/constants.h" #include "../core/bean/remote_computer_info.h" class TabDialog : public QDialog { Q_OBJECT public: TabDialog(QList clientsList); QLineEdit *ipAddress; QLineEdit *port; QLineEdit *portFile; QLineEdit *password; void centerOnScreen(); public slots: void hideDialogBox(); signals: void add_tab_signal(QString ip, QString port, QString portFile, QString password); protected: void closeEvent(QCloseEvent *event); QList remote_info_list; }; #endif KontrolPack-3.0.0/kontrolpack/client/ui/client_main_window.h000644 001750 001750 00000006146 11426532120 022410 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef HEADER_CLIENTMAINWINDOW #define HEADER_CLIENTMAINWINDOW #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../commons/win32/qtwin.h" #include "../../commons/startup/update_manager.h" #include "../../commons/startup/user_mode.h" #include "client_central_window.h" #include "../../commons/constants.h" #include "../../commons/about_dialog.h" class ClientMainWindow : public QMainWindow { Q_OBJECT public: ClientMainWindow(QWidget *parent = 0); void centerOnScreen(); ClientCentralWindow *centralWindow; void createActions(); void createTrayIcon(); private: QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; QAction *minimizeAction; QAction *maximizeAction; QAction *restoreAction; QAction *switchModeAction; QAction *quitAction; QAction *aboutAction; QAction *addComputerAction; QAction *updateAction; QStatusBar *toolBar; QProgressBar *progressBar; QSettings *settings; AboutDialog *aboutDialog; public slots: void switchMode(); void iconActivated(QSystemTrayIcon::ActivationReason reason); void displayAbout(); void showMessage(QString title, QString content, int duration); void displayUpdateManager(); void fullScreenMode(); void switchUserMode(); signals: protected: void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent* event); }; #endif KontrolPack-3.0.0/kontrolpack/kontrolPack.icns000644 001750 001750 00000113101 11426532120 017626 0ustar00000000 000000 icnsAit32V%$zmrmÿsvxq706hwqAq ' #^XZɿxO77  U˺zN. OxϺvH |~a5SM ֿsM+ ~+Įuf\WVW[cp˱pR) 7է~\=* %7TrԻr]5 <Vz軀L' !+4:@CBA?92* @p¨xd;?|٬r8 %6J^oxgWE2$ *]«~lP/ >sڤg24Mhôx^E/'Uëo]3A$Jnn33QuõgH.'Y׾r_1 A֓J )Ho#ľ`?% 6yϻsb>oq32[&¾rN- %Yȱ~td; HlX"8hÿ|Y1 >~}u_( lK 9mց(¿Y1 2pvX"AA 6kт'¾xV--eyQg? .`˃(pM&(as:TcE  !N{uc?,ffU\U 9l}wqjR.5iQ':f& $R2}ysmh\> =l=%3ځ44g2~zsnjd]I' #Fpm"'`JCt)ztpje`ZN1/TvL )Pe(  Oxztokf`ZVN8;-1Rl}88{m/ 3B\chgdjry}~{wvwtmh]QMKEDD@;7*"HdyS3O"38T_dcafnv{zolqngaWLHD>=<961#<\tk }U>2*FSXWV\ekquy~qimjc\RGC?9761/*  0Vn* vz~o3 2 3BHIIOW]`bfkq{tlmjbXND?<631+' %Pj~= q y\'2#5AEFMSZ\Z_dkw{pnmbUKA;830.'   Ig|R )xQ1*=DELT[]^dipwoqodVMC<71/,$ BizeMxԐG0 2=?EMTWZafm~miqocWMC<71-( 9izw# Q{Ɓ90!08:>GMPW]izvospdUG;75/)"  ,c|2 T}ټz-2!/37AHMU`p|~xkVD742*"  `Œ> Uͱt&1 "-6CLQZduѾ{kTB5/* ^ȜH W©n 1 "0AKR[cs©weO=1*" [ʤP~ Zj2 %6DNWaqêtcK:/& WʩU~ [g0 )8EOZkvhXE5*"  T˫X~ ]f1 $/:FTcvҾn]M?2(   Sͮ[~ _j1 $.8DSdun\L>3(   Wͮ[~ `m1 $.9EScun\M?3(   ZͬY~ `q1 $-7CQasμlZK>2(   ]ͫX~ ^{!0 #+5AO^oƵ{hWI<0& f˥R~ Z(2 !)3>KYizɻtcSE8-$ rɝK U31 '0:FTbrĹ|k[M@4+" ~ŕB OB1 $,5@MZhvqcTG;0(  ,‹8GZ/  (1:EP]jwreXL@5,$  @ν~-7w. $,4=HS^it}zpeZOB8/(  Zʹm &.  &/5>IQ\elswz{zvqi`XMD:2*# sʩZvy~E. ").6>ENU\behhgd_YRJB93+$ +ŘD {e|l, "(/4;BGMRUWXWTPKE>81+$ Hν1 H~& "',37;@DGHFB?:4.)# gʯo 0}J  $)-158:;9630+&" +ßW g}s+ "%)+-/00/-,)&#  Q̺?O9 !#$&$#! "ƫr'4l  O˽Va<  #ů65x    Uʼ_ VñM   ,ï3"yʍ) jƸ^Em Nǽ3rͺW 8ƿU>ڭA&q'W۞9#=fߟ8$R(u;%»f!?A)t2RU ?z> Uýv'Y~E\ܔG5z˾K%]|< ,gż}K#Tw< .cxCF}}H" :jĻn;;oƛpK)!?dǼa/ 8 %VѱvU;- (7Llź{M26.%  qq$zmrmÿsvxq706hwqAq ' #^XZɿxO77  U˺zN. OxϺvH |~a5SM ֿsM+ ~+Įuf\WVWZbp˱pR) 7ԧ~[=*!%7SsԻr]5 Vz軀L'&19@FHE?8/%?o¨xd;?|٫q9*=Ocu~o^K9) *^«~lP/ >sڤf3%9Rnƹ}eL6#(Uëo]3A$Jnp4#:X|ǸmP7"'Y׾r_1 BA֓K0Pw·hI.7yϻsb>Foq4#~}u_( lK%Duۀ*þc="2pvX"A@"Atق'ÿb:-eyQg>9jԀՀ'ĿzY3)as:&cF/YЀр'oL+,ef(\U!#Fý(w_m='3ځ6"CtƂ0ztmY:!&Gpm")`L *Rā'|wqk_C'0TvL )Pf-5bŁ/ytndO1#>azv ) +y=!Duҁ/þyq`A#-Kl|C%PZ*#M~̀׀/{thK+";Zs}t]/='OwrgN1&!/KgzG*Q`,)Qۀ/ÿ{thN1%!%A\tn+<}C!)Q~.¾}vjP1%!6Rk}848{n4)O|ˀ%þxjP2%"+JcyS]3Q*)MwľxjP2&$!A\tk]}UA!!)Kpƿ}vhN3(&7Vn*+vz~p: "+Jj,ù{rdN6+( /Ri= *q y^2"$,Jfw+ɻyobP8-)!&Mg|R*)xU&!$&.Keq*·ymbQ9.+#Ghze*MxԐL#&)1Lfn{+ȼxmbQ;/-% @hyw#)Q{łB"$'+3Nfmw*ȻvmbS>1.'!7e{2)T}غ{8"%)+5Rgnw)ʼvndU@50)# /cŒ>(Uΰv3 #(+,7Tipx)˻~wofWC72)$"(aȜH%Wèq/"%(+-;Viqy)ƸzriZE71*&$ #`ʤP~&Zm+#'*-/=Vgqx)ʽwn^E5/+'$  ]ʩU~&[k*#'*-/?Vfqz(ǽzq`E4/,)%"[˫X~%]l)"&*-1?Ufq|'˿|sbG61.+&"\ͮ[~%_o)!"&*-2AUdp}&øzsbJ81.+'"_ͮ[~$`r* #'*-2AUcp}%ͽ~|xqaK92.+(# `ͬY~%`v-!#&).3@Sbo{%ϿxqaK93.,(# !dͫX~&^2"%&).3@R`m|(xpaK:30+($ &n˥R~%Z9!%'+.4BR_m}(¸ypaK:40,($!*xɝK)UC"%'+04AR`l{*ʾ|qaK;40-($!2ŕB)OP#&),04AT`m{*Ĺ|paK:3/,)$!>‹8)Ge"')-15CTbn|*żzm^K:3/-)%!Pν~-*7* #&+/25CVdp~,üyk\I:3/,)$!"gʹm +:"&+/15CXgs,õxk[H82/,)$!+|ʩZ*vyV"%+/15CYhs~.viZH81.,'$!?ŘD ]{e|x("%)-14BYjt˼uhYH81-*&# !Xν1 ]H~;!$(,13@YmwſͽuhZH7/-*&#,sʯo ]0}Z! $'+/3>YmvǿǶ}tj\I7/+*%"AßW, g}0#'+.1>Wkt|-ξzsj\H6/*)% %b̺?]ON !%).1ů6,5ņ6"%),08=ADHMPTZ^bgjnswyyusvwwv,uromjlnljhdb^ZVQLIC?<71-*'#+gʼ_, V÷`(#'*.269<@DGLPRVZ^adgjklmmoon,mkjhgfdc`^[XTQNJEA=973/,(%"Fï3+"y̚B#%(,/36:=@EGKNRUX[]`abdefgh,gfecda_^[XVSQNKHD@;751.*'$1zƸ^+E}4$'*-157:=ADGKORTVYZZ\]\__`,_`^]\[YWVUSQOMHFB>:52.,)$,dǽ3#rͿk,$(+/358<@CEIMPRTVXYZ+YYXWVUTRSQOMKGD?;841-*&%QƿU#>۶X'&),037:=@DGJNPSTUUVUV$WUUVSSRRQPOMKGD@=951.+(%Cq'%WݩS)'*-147:>BDHKNQRSTUUS"RRQQPOPNLJHCB>:73/,)'A=fR)(,/058:?BEGLNPRSTSRSQQRPNONLJHFD@>:63/-))CR(uU*(,.158;?ADHJMPQSSTTS%RQQPOONNMKKJGDB@=962/,)&C»f!!?[-(,.257:=@DFHKNPQRRSRQQOMKJHGFCA?;8530,))Ht2Rm8)+/0469=?ADFHJLMOPNLKJIGECC@=;7530-)1Zz> UýԊF+)-1358;=@BDFGIJLKJJHFDC@?=:643/,*:q~E \c:,,/2479:<:7630.,6T˾K#%]ȏZ:,,03568:?@CBBCB?=>;98642/,3Nż}K#T€4[;-,025789:;<=>>=<==;997631-,5P}xCF}ĒfH6/,/246879887541--3B[ûn;;oѬjN<2,+,-010/.,,0:HaǼa/  %Vپr^RIA>AFQ\mƻ{M26.%  qq$zmrmÿsvxq706hwqAq ' #^XZɿxO77  U˺zN. OxϺvH |~a5SM ֿsM+ ~&Įuf\WVWZco˱pR) 7է}[=*!%6SrԻr]5 <Vz軀M()4,+^«~lP/ >sڥf2(=XsɻjQ;'(Uëo]3A$Jno5'?]ʻsU;'(Z׾r_1 A֓K 6U|#źnN37xϻsb>op4(Bi&ÿ]=''Xȱ~td; lX#+Iv'hC*?~}u_(J lK-K{ĿjD)3pvX"JAA)J{hB)-eyQg?%Arڃ'Ŀa=%)bs:%cF 7aՀ+wU4!.ef(\U#,NՁ(ĿiF+6iQ':g+%=h҂0¿sW7#">m=&3ڂ7-O}σ0¾wdE, (Gpm")`M%"5]΁'|vjN2$ 2UvL )Pe/(CoՁ/¾}t^A+'>`yv + +y>$ /X-xY4!0Kk|C]P[, $4d¾iB1+!'<[s}t*/?$#(7h-¼pM@8%!2LgzG*Q`1"&+;l+qL=7'*B\tn)<}E(!%(->n*ƿtL<7+# $:Sl}8$8{n8" $',0>n(ĿwN=9-%"0KdyS"3R1"&+04@p(½xO?=/'$!(C]tk#}UD)!%).26Cp$Ŀ{SB?3*'##BO~"ǻdOI>62,(#$Gizw#!Q{łH$#(,06f{2!T}ٺz?!%).38>CGX"ʿmXQD;61,'!6e~Œ>Uΰw: '*/6:@EI\"q\TF=82-("2dȜHWçs8 ),27%/28=CIPYq˻aVPHC<51)2r˥R~ZD$/38?CIQ[qξaVPJC=71*7{ɝKUL$04:?DJQ[qbVPJC=72)?ŕBOY&04:?FKQZsdVPJC=72*J‹8Gl-.5:@FMSZsԾdUOIC=72.Zν~-78,59?GMS[s ҼdUOIC=613oʹm G+49?FMS[sмdUNHB=7/;ʩZvy`.29?EMSYsϺdSNHB;60LŘD {e}709>DLQYpθbRMGA;33cν1 H}J1772OßW g}@2:@GMRg"ŵ{]NIC<68l̺?,O[48?EKPc-õvXLGB;5Kƫr',4@5=BHN^ۀ-mSJD@99m˽V9a`8:@FLWp»ɀ v_OHB=8Nů6-5ǏH8>DIQ\gnv|,{smd\TLF@;?sʼ_* VĻm<;AFMTZ`eksx},{tnga\UOIB=8Vï3*"y͡T:>DIOTZ`flrw}+}wqkd^YRLE@:DŸ^+EȈG:AGLRW]chnsy-}zsmha[UNHC<@qǽ3'rx@ۻh<>DJPVZ`fkqw|"{vole^YSMGB=Uq''Wްc@AGLQV[agmsw|"~zvpkf_YUOIDAT=#fcBCHLRW]ahnqx|%{xtpje`[UOJEBXRH(ugCBHMRX]bhmquz~|zwsnje`[UOKD@X»f!!?mDBHMQX\`fkotx}%}zwuqmic_[TOJEB\t2R}OCGMQV[^dhlpuy{~|zwtrojfc^XTOJEIlz>  Uýؗ\FGKQUX\`fjmqtwxz}~}{ywurnkhd`[WSNIDP~E \vRGINRVZ^bfhkoqstvsrpnkgd`\YUPLHOh˿K %]ϜnQHJPUWZ^`dehjklnlkjhfb_^YUSMJOeż}K#T€ȚoTIJMRVY[]`bccfeddb`^[YVQLKPgxCF}˟y_QKLOTVZ\]\ZXVQNLO[qûn;;o׸~fWPKKLOQRQNLLNUbwǼa/  %VƳvld]Z]bisƻ{M26.%  qqt8mk@ '3=DIMMLJE@7+$CdöoP00Uٻf= ,Wi=2qݺL%jϊ?[{3 8` Wڄ*"xG:e Jx& Oۃ/  Pۆ1 Jڂ) :x$"g xOW6 8' d [A%|' lO4- sW,0XRw+ 0BW]!x1%CFW!gj-  9 G)S6_@iHq"Mx#P|&Q'Q΀'O͂(K˂(FȀ(=}'2y%%s#l  zߞc\ӔY=ƈN"{Auިm4 MЗ]).Mxs< OϘ`+ (鸂L `ӟl6+鼊U# Zԥs=)绍X' PϢr<"}ݳR$ 8šh5PΨ|G !mײW) 5޹f4Dq@ PâzJ!  $Xƥ~Q( )[ƦU-*XV/)Tؽ~U.'KзxO+ !@oƯpG$ 7]Һb= /Mw¬uS2 "=^ðcB& .FeîkL1 3Jf˻jP6 1G`xƺycL4 ,?Rfyƾ{iUB. "0@P`n|~qbRB2#  !(.37:<>@A@@?=:74.(" icnV BKontrolPack-3.0.0/kontrolpack/images/000755 001750 001750 00000000000 11444437620 015742 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/images/mac-folder.png000644 001750 001750 00000002360 11426532120 020451 0ustar00000000 000000 PNG  IHDR szzsRGBbKGD pHYs  tIME 2 UZpIDATXW=E}tΉ@D 3B$N8!KH p$, tHFB8p@BpY|czrjo{իuPRMd_cع̞̠:o@aٗ?/{]YIH{\xWo$^1D&>_(WGXid X[-}KRwBJNG@p F ȵrf!(D A0q^x_bw~s6:NB%AHGI `׵9թ$+ l@餍2X'N` D)x(22}@( @";n6e$B-V6e8!7(hC-̿q @i4YJ #IYvs.[yzH{PyXRA)E -R%ZN#Tɘʉ6\ @ BQdr!-}*\3z`FxE+[:YP#Hm V9*q k$D,%k-{qtc0^ח.uEx[re4N-:"ldVE"b~&F4lDY,~`Z]@!Y zq8UlԊj?`ؖhVV/Ň6\w "c]MJdThJ9}%&V9ap“;D`3M+ FiX/%6j.ɸ:^/ 17gmφEM,q%l8bԪIuþ_??n?BƤgUoffvϼϏowwkmmw{;8yGo} 7/IENDB`KontrolPack-3.0.0/kontrolpack/images/document.png000644 001750 001750 00000003663 11426532120 020265 0ustar00000000 000000 PNG  IHDR szzsBIT|djIDATXŗ}pTn6k@0 !"hXc3֑q?ڙRgNu--B:h &;޽}MH̜ys=wE\i̵wh#6Ia"p0⹾=[_ԯ|2mo؂ymӪ5`Hqʿ3Wniϙ?JH1=b[X,)R 9~F$_ ̭vumW7Q63<͊ؕӧ+IKJBCTd볽ySyr+_,17z~zW:{/)(1t_= O 9caNZ18@ߟvpp2ʶ$~)g I ڈ+~H$IJ ~kndvj,ʢg_|/TWJ)w]={';Z[٦Mvvv" 74Ɛwܶi/hmIv;wb3˖-F"͗Xd-|>mcPJ*D9wfO#+(7w\0(#u]:::l߾]^N,Z6P(RQ,)h7sv#ϞF,­sy^cqpyAmxG2dΜ93>"!V\I. 1&D,Ï6si92ϑ`g3>RJRhq]ŋcY֖ ֭^Ѐ8(H)Rrooohw` Ch(++CA.CkMPή֯_o"Q|'HljF!,[CSlJSDQ8dd2y8)%H .Å: u%222 ¶eY$I`ߜN4PQn#Dkz,_ߑRJ{R!L2dddgϢFʱ,+4ԏb1=g!8ZkL@ @8\ Z%>/oX]xIENDB`KontrolPack-3.0.0/kontrolpack/images/refresh.png000644 001750 001750 00000003750 11426532120 020102 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATXŗilT޷q ij,\5(%%QBZ〚㦊RRPFE,iIҪ qC Mc xggz7͹;w= 66O7.(;U8[9sX n#u13mǷ[SZ[[Č5~0-ݰXtM#%Lp@`ʽ|s }?EAӢ߷xSt ~]U..eD$IK)s~3@ }Cn#e!XƇE]70-m]=kad^@ q$ %A )$|t}p&_[7U8y^e].jx:0+KrKdaX!P lWr$HlI0m3=6Yͬx)w|e"y`D8S'<&"F: &x\H"خBMb߉)ronmܸ(ۋo2'q>BI˝ vq3kwRgp͖:/177 @M 0f4Iv p*/>, N]YQUmk[cO2idmxmtF.i_pjH$w0XBL }f7{G 9w> kʷ uGkª8eME"9.^%8c_GO, %F,F%Y"/uvj}#_ TGѴPw枹Ա /S֤w?ڌ""/Ep UhP{'dt!qvKA hX~ɚ.q nIoK[6`{Cۉg:9@{@ݘ&n?s퍽ͅ{QZȒEJ)eii cp$`6҆d2&cmf}_y5n̓@r{Q8{s)*[ee5zQٗB 9*׈}8t\?Y 篆L*j~w;8l"1XN~aAX`l#BL ?َ.S!F=HA^UK /x!Nѻ$k >_=ˆm2svIENDB`KontrolPack-3.0.0/kontrolpack/images/linux-computer-small.png000644 001750 001750 00000020066 11426532120 022544 0ustar00000000 000000 PNG  IHDRPPsRGBbKGD pHYs  tIME PIDATx|iu5=3='gJ(r([Mkva6 Џgq$@,`REX#[|H%Ӕ({:͏sHI#)GU}U{>Ä c쯤_p!Kuh%ds_+lOɈt0. {=jMh4rFOEQWO>>"'m1'VgϞeutol/=[-;$fi/.\ݕ?go?*mw[9fggaZ SaH) B21r $ʾU.8x*xz+[``<^{9 '裏#@y0e*BB4Z5hQ#{0>gN,JZ码?eD;Znl^0=Mh0Ti !u*#pBx0T`<]wQ,Z=@n0i9R} PدpMNC%9e#9 :QlH# #ҷaH  z!ʘc=X" 5JiB"1:Z t]6M\@pA)Bji(AE!!%CכК#/A9?Z1n Pl 3is)%cΑ(X3p޵i@DR4Rc.%PJCTƍxWPUq} Nz K Bp~ )òLrPYC ض"rl>ZcٌqpΡZ\W1:D14y-8N DR˲ɘxאMcjjf$' jM!BFHRpRD ,9Fhm`m qijZaubiM8lVۄRUܼitcTv (I):8g0"3i<0LDz,c3۶-y|ZǠ*55fw0D Q7ހiZ(T*h[h4EjkXlz|_@ MP) 5,+Va":Zв,˒TКnH?$uXFԚ0gϟ6.{NX,`{n܄PJ1>VƅCJEAqp;܎߻9KdX#k @s{XT(VVy =t(w )LAUOFՕky>r@DT0u&$Y){L  Z8u=@@4\7VT*aHZg}QOjcƀgK| Q#X֨Vw롞rm c^A7ajZ-& 6J( ! Qfww smƘcb0 'tU7jj{^o#115 ڀewq;SI"ϫL~G5Qo߯|9ض ׭:XrΓw6+Rr_F(bBApP̍e֎L9TL|ʤK]+`dz&8w)V aBi™X]]ō7Ri䐄1֗3;!Sp/i2Rhr1'E x^MD 4&(@ `fz6B ޼!85|p& 2~8BpXG&8lcI/Ŵk3}_hBH TrJŪq:NG.R2#H!WI1x@vU% !H`ROI)z tŒ&HX7JaLw@0ccZ!FQWau {)4|s"p=:zеN8HJ)#PJȾ,GljŜ.Kf!=@J  X,iL4Z*x:l&#@*hVS(n4՞16 k2u#,ӟr@D ll X6wYOkk/AŅ9ayoE|q Y A2xy:)0oDLF#b:٘02G`R}#1h-RW(hF B.$8~K71ci @vv[Kxx -Xc!J.GD8)QCR5b f= _tת(GBóP*4pơ#| @} 4_4ޯaq1 5 @A) @϶HGSs{=aH=0jGQ+7$Bw,VpxTnJKs@2J ,mr"\:^^ǍzLJpao<=4|_#GDq\ё0csqH!` bА`c͠rW;\"P/`PxyCV|lrX&aA6npB)6 C⎬HiHqn ńO|Ek;2Ơv%Ganp C؋ ФA:.mr呩0c,9=25Qxk?{P"`IJ!L GSBzJv:i H;@k-bRUJ0Ə kk.O"ā JѤnt.u@@@< c90yC;!t[VMHxqiCCI1h5TnMÐ1"/\ ^x#xEK)cCKc}z0x4FnO6@}1 |:e2ȌRpZ'vι}\ -(-sc/iw>2 aYH5N3nJ 9>看Jx~r荎`H ۶!pd>xP֫ nc (ZEj04F9I4`Ɓ^5X |TpXҮ C=+JnV)ҙ9ؖsPj1Pos>ԏ!F#\JhOQqFO<}[Uuϯ\ym.Nann Si ݷ#㍙Z1xMuD14-+M_|qm A忨Vkl3qk*3p4 r7'm1sC tZw0líƞMλ^?̇1)zׅ" SJX+iy[s(.ntoF9ga#rtA4uV# ҚHD:@uNbZZJi>-ugi뺲Z[Vu݌(AR)Ņ?[϶L3NC H)(B)pO4[za@:v.v 4,i0ͦ޺z;/h[s1Btm)e0eYL&J /Unp~4\ߚ) nB~9(BEP bKb~ȅPnw>PJT퀈V5;sl}߯APPHqʚ3亻Sm/eVi OdC*BsJ|̙30JQ˲z}>NLS  e[\RwiyiQ*50++"u:o욦{j[,+/‚z'QI2g̚,,-}ԝryyyenaY4 xA˯qel%}\LM ]e 2a6(D\v붽766N-e2'JٖeXupy 6(ډjEDQt;;;'x"8>[mynƗ2=;c.,γl6xzA~( TY3 Y~&!aJu_Rlbwgr%.#uX, ;8q8???NRT*Le2y0 pǶ~3YZ0| [$v>;a]wj!_87SI )r9 y yL,'C?:A^_EVCDZݧݲ_[o=[TopVٽޛ:ydvvvf8R%43mȊHaXn/{?|_*oG1:d2W-ޗsSYcjj m!IR(˶)ۭB<f AE a|ku4h+WW༡?^__|&rͲϚyw*۶퓆aHTh\T*?7[裏0hAXZDdahah*,6O eNY5 cʱJzS ӈZ%tǎ#؛7xOAt:jZf1s98i—RRJ0 _"ΥK~x񢘛8cgsCl>۶gZVRF4&jPfPO2ιۣxsIؓ^,ZP)Ս7cL}o3<&QO=VK/ ֿaa̗_[?+_O0<յbޔ ݎ3_7:Q)ϟWָSꩧ[V=c{B8d~4Gyd?CX, H4'Ud0{'?\W@%x ?yY "E5!/01Fټ߲̕h7)C+?`\`{a[]?P,nkkk~?>7??f,})N+?XVROj:z}tzp]l&sp'_z, 'O7yX,-˝3gdN>]*JsssKg ‰\.7V}31'1@^P 7nГ[HH:אegO:?r\~zzz1.:c84^t:ϸvww/uad8[9za(iaq]JiY jl0U;v>qEQ,oFQ{h4~n|'٘Gy;?0ZZ^Bhh6E!]a&ǩTB]a´ d2hV[]ٟ>_w}EJ^{vjC,0p7VVl&O˶ڛ] &ui%LJQ$o :,DX@:4/ctW][[[avoEi=/\ ܟJVOxɌC.xaQS)Vn c f,R4ǸVWW^* à_DKR y4WBD>mba' BnIK݆Wޥ*{UHi﬏eh4X86k췯^^[ٹ'}~L8@|c,v&.͕Pװɂt$"nf3-"7emD辿:l2NyEӄ'S.\DeYp.N5!?e2}\2 g( `*o(4R2Nߦa`yys%W>a_|GJ%z5>DִkIENDB`KontrolPack-3.0.0/kontrolpack/images/terminal.png000644 001750 001750 00000002720 11426532120 020253 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATX]E?3sv/KقH*mIȊZ5jW`b|a !"?^@ ?\kBD(Bn-l*w3gf_s=wƔ_=s3y3sOvF&JFDO^B}iqם |ͺ߼uڑU$|"^CQklKя^epxhX{,IF.Zv|s??ܘxK.9:o@tBkcL/3\a=AXhnHT$ZLLI@ /mO"BWz?v.|=Fk @n!R(?F5l4yXh q"1whm/Zq.ID:H Lq1"Y(욃>`9Kz& $f`+ ̤WU+q$bL@ i`)`XvR=f/8h4kU:KԗN1͛0hdfXBLiԫTiz>U1g-sxv0d |[oa6[/235E>ѐ6+1}ɥ9RE(j ZZ\} @DPIĘsāMח8,3CV_B00OsEG1`9WL6i!M= K81^_m;3k5 ;װyQJt,JkDDxDDeer~,} ^Uk-N1 O _z!c7lcbE#14t%ʻ}lp+HĹ 1`M y&܋{S1]W~%,@X6۴'~]1_+ثP|lYg-^X0Z#6WvHcAkݓֲHҮ Eh!HjWmW[sՆN?`=AJv DRPZ{~ wB_ĝy=_gNr4#ۯd &FYi=|0~ULM.5^K9$IZkyUɴ6]ļ44$IrO99>:$ j( ƋGg@Dֈhfqq~̮1zQJFOߵ׶߱1 "jPjYg8z>eC|pJ36}qF2`]_Ӽ``h"E0QY`v_/^t{1pܥ P;/Z2jʁ"i=sB>]']Ml}(>sU+\w/<>4Mӛ$I6ײPp%S/$IRV%_̬.%Fl(f*IENDB`KontrolPack-3.0.0/kontrolpack/images/network-wireless.png000644 001750 001750 00000002754 11426532120 021773 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATXk[G?gҦĮS PqZmJg_}4,B K!a%Av8$*!mӖ8R>\I% _f|朣sGWd2i_ȳ4T./,,qϏ9ԩSV[[ۯ,K9VdfZITrGGG =}Y_DJR}>* c 0*FSqoooWTjWgk\ӜCD6Pn¸u 7P}EMR,2]t@Z evH `WoD^}AhָaTh#4)7^kO?a#"z6_y(,-#<1<@e7ހMG$_ ce @,:G82>}wަ!@ݽC$~}D6I}{==1 M$RA<@Aeq~nF>h7Bm󲾻ww]]?cg217o"!0;_~Qss]Z,dNDFHt>6k^..׾Fɤ^R yī(ABX Lӻmý{(ÀO>;/ $$$ ax(Еa"H(ǏL"kjE2+_ooPV"8DUH0ڵk*}=HsF2-W$B- 0~yD,EPJf͢Ys@`ei"7BڐZi?:X io_[i41 $i?t|]J)/qXP_Lzټ :Z{?ђ6 Gb\ڵkok㿮V`Ǚ3g(|NֆB*̅ 8t{!J133C\&\_G@3in6m/222۷ϷK6߸qE._̱cdhhg>9EɶmΝ;I$r9N8A8P(0==MWWZJ 0mG h 몿* mH088֚;wpIFFF8|0jҫq (6{nrSڃ\.Ԋ֚>2 ea&~M)LNNr" ߿Ӆ Ƕme۶|oo ^ZZZZ:/˲R@h>Rd2_<\]% h"0!C2̭jYl*JlZIENDB`KontrolPack-3.0.0/kontrolpack/images/folder-new.png000644 001750 001750 00000002567 11426532120 020513 0ustar00000000 000000 PNG  IHDR szzsBIT|d.IDATXˎI̬{Ut1!Y$xB9&>yp],CDBJG}xA!&7T8#pDuVjU~`]I@4@ w0&Domho"S',ymbnKe@D0DƘ޻wg~cݾngv($yZo:',Tz^GaYzܤөqsc6[\p]ltc@BC7yJ sln_s$/KҬ3E;+mD]ԴHuH> 8::Z9pQ_ч?o|8鍺|[_۽Dg:jf(>aMA#vWG!sΧiJ"4jy0p`ۭisfcPqvx2L&,{pցl<3 MՄsE(ߦV2TiT&$ф1EM{}]|E[0Ш&d3w%UIIdJyD, `uol20(64| wtjT+3"PL&]w+(jƖZZräbRlaM3όhY&3^TueY& ANk"XJ5*e!8JU%mthh´/Q=&/^na%ʥp9ӬdgT!"Ye/ Qe^eYqMV/>(.(!]3Ge<+*Gk"2- $/k= pp{{"4D y8(\BNsf6"+ΟVzhr$TO8f%!wz /VPɂ3rc(. */)1F(8O^AaTύyj@ @vyp H^3rNJ/HjiIENDB`KontrolPack-3.0.0/kontrolpack/images/mac-computer.png000644 001750 001750 00000026561 11426532120 021045 0ustar00000000 000000 PNG  IHDRxx9d6sRGBbKGD pHYs  tIME x;X IDATx}ydy߯\;;{C\QD$ h'2XD;A$G@E#@˂HdI2}KHB+[km":Ņ@a;j\_lҰc~'0>_] :uq;5=p=z_o\*ltuѱ75r!EGwͣkۑj46 ` A|_,`@siOpR.֦v}e z> ](8 Wѷ "p(1ۉJ '15wJ ~KJiW)2 duDzLRpC1ֵMPT JēQz>NW,Gf*rDowl9`Y)W)pk9[J_q˭9o*Kݣ1zLNO2-0I}t] ̶1td"qhz V} `eN1^ Dp.*(+R2D@FH1(r@lь1 %dy?DE)M ! I]8L;˵#$IF6;ry1TZ dYepxBE.Ek٫ D4oT~`qLÅQ|ـ4j*tM`pamԤATU +!Z(0cH V;{ e$K+!-}$s*.%g $8\׆ ۳E1a&ޡ\4,/_x~ Ͻd*Qjk6ޤ³vyZcs#ɲLf2,CP2(4 u]N|!֭)sz0,j T j 4XؓנdEpwASŢY!4= +F86ٶ ׵`Y #5G X r *lۉBCg@:}h4@QJ 8!rB'NN8P9iOr١)uPp'x\$ L'Qٮvɲ'zfFbݝGJxJ((+(kp]\͠9=Ŧn9#!{4m<"E[ čHWI9z ZALAGPwQU,` b%R̈̿Ȏ#` Y * ĦvP%@J h۲Q!1 BepA) }cXԖ}:&d9,&8uÝK|k]S$2ɐv=*4G$I1u(bv` #C*WQh\7@݅lXS8*N8Nl N8,BbAS\RMݒ$ШwꔢI$Cv]7-^ޒ+t)>8A5.CSpJ; ס68g˱ +"ݨ hBH:Cg? Cgz}qg?阳* ]g} U!0UH(7̒{QwQ:fp[] X朧0zQ)Vx@xDeIӀ )JE-,Mh&Dž.E':öK=Cjv7`AB]ZЎ9ZcڃH,ǣHх:DݚĻOjёD@Sx;Yi9"\[H%:.͉aY6LU)RiVUOgL%RTP*عs?(df0?RT T866LS87d[-pngzx ?JVd 4.d{1O!14iV3`ZIWZA D8t}TPhZ6b9dYSOɉ;&!D fo ຯ&6Wz mD:X:EsFq܎eQ궬*\Qd2SW>, (L*J2ff{R$VVJL g h?c^؎ |c(q0\'Ƣ\sbn*mh4l4&ǍX:)@fsdY$1O౶K@U'JM"(õkKp]7fdQ4fcm&~[M,JH;:}[jmŜB8e0MTr…kY,Z8FFF@YfEQP(@>(eAB)E.7jceY;,_)@t9n];PO)\Wٌ+(p0LޜB_p(AW퐂-~F+:Fc Ν;=$'1vG8pmh4|=e(Tu+vCHvwٳ 0*R GVsR׹XDX5)`ϱV4Gt2Xf^ö0ERȒ Yn Ibqq++u}ԝaddMR!l1I077|^Gvŧ-!+]}aOah?ێS1LpνGq{Yk֢n]%9S[o]* rMkVWGq 8<VV H$r!**pǤH mwa*(a<&ZizSCp vnLIR0=}j Xo2qN09䄟\;NKIlZ<EgO7Thj8gs³0&<զSҍwd^k~,t=%GVg ъaj~ )0!+XjBy4 [Dݝa|寧mŊnN~Rtp 9Obuàޤt( c2VAZ4Z2_#a~}zuਲ਼?/" M\t1?hҍL-Y]j`MJķ(j6ip$7GT~3pѶMluwwnGou?tTwG6{,iJȢyȑ|NXc7aX7g6~\ZD)!,w{u+r{~ӓh6PiBSU0;n[w+nQx|mSQIA ^@xC/8n&- +"115mޛ ."H4sfGVJZ,:([ ?w}rh 2 b)xM~Iކ~j fm|Oz𰁁$bzs@T*@i[T '% PZUkR&6ƒ(Azޗ_~{7cۍ<j#pѫ1o9QmfJ`ȋ/60U~Kx?ǃ~ԏ{J6ŐFPu%kemmX~5W_} yw/]wǿ=\tGؘ3-K][wE֋R8˃{.ZۮBV\׽P^5 lV;{OdmoIو9F.ϒ&ny?,!`=PUj FӣHFwJhpFn& I b{S/YM OŪ"J2k 6@nt;w<7999L&̌H& 0 4M)z^;i8! !F6{,#C2ہqT54judjzՌD ;0SHetfouXZXra/Wu]|}wuѱ[$IJ+bi)JC4oCψSq4@Buײ,rߺ{Rzz~~'N @gV$ʚ6!gyF)%!gTU%333qB*Ν;WW6{lĶ˲eIHeɆaȮJ!q%ι\v]WBHB?KsedtdHD*1G@$.x @*z۵RB!Kp7*KJ-,88MFJ"b9 $n0r핕sBMq϶XRb3LJ)v$IZϿ aga+++?.IUmxWa|3n{oBB ?[QJ~_\*կ~Y$]+p'|8W/B] ~{vW۰©Sz*?䓯\zZ;gΜkYMn ~GB>U t-kmmFzpS ѶC?uaMBo|}ݞfۄ?nKC{WǏ-7uz{w3zuy}udM }y<{BGv5uŒ/Qy !k_CcccRQ Cϻ´,\p2:C*Qc-0DuiE6{bl|wy㨳?y?ut-R\.Gmۆš/M"B8xSI\t_|Gl8peYT \h!׿ݻt: .B'?!n8r.\t-:P fZJP\d{<EbX?iv_QUujT*B`#~o=0P5q@TH˶NPW1*w$KplGٿGN:g>,,=~x8>>>qEQY"p2\s;w(mSO!.^wZYZ,BedLLbMq3HR,=3o߾SSS1IRS|]^r$cOӱ#ScǏu]_]xGRoLt]wCG,/!?}?μv&rNUU;J\.H$@e1ZK.5j~s~v SJ#.70a;`UHgRóƇ3ca[n$I8DUՉ@Q9Ȋ8 (Ju4U[aٳg5 `B'8|N蚎 /b0c O**vL-yLLL,4MqRZptT/_IYSAXȀ(SrwYRzJ h57FcJ eml_>}?+o>'NgΜ}=PW.^z98p&ZJc[PQ+ȍR tTŎ3[/L&s??B+=μ=gluߧ9s3Bc+X` GQ jupldcJORPGavpPT`!#T{nTKGih@w nfd*!4LbמKattl6 1u}}paa{>q}~{ 1F co4 \veë7M ?Ǜgέ+sS!T K?糘,+sYyNH&?آ5ԇ=_4Q,V P.8(TډV}C=bq](z8eC,eseöl|_cΝ[KGUd2_UWa怵Fuߵ]g[^%L@4m|zܡGaW ~ᇙBwuA#|:6Rw3VF;ӧ^$Il`qZ/}b} Z݋VldͨOlq4L|@C=4|gqSB<"@n44udg';a[ }tu{kB.1P=v?1}v dw+WY _l?d{VdRjx;R JR=:{SOx%чŒH{ *пPJQ‚FYK6E.sz!{ ;kq䓟$_z9{'|k_s{9'5k]:F8P6e<)wa|,bݺu<pZNDZzhyV-]!`IYGO{pq:f|{m͈/,Dv x~1;HѨz0H$2hZMօBUiv3 CksF) (B+eye|flxX)o#|tPXf>(2"øy !XK8{c֭&v[ڵ+iӦՆa)%/Ϙ#Jq -xz2cB6啕o|bd&M&Bźo BpG8MӤRwj\.bl6/;fyG**`J%mo\\,hH$r@dO_n%i~R|)B/:m{a@zE}WzrE?qnX=#fm۬;׫XLII8.'!$ʩoi[(Ny}~n4>m&gn]F2l5_ %NtzC[[ۇ:::njkk2M3 vX8T*, | f(˨T*R64 pX tdpa0 0 j[ZZL&ĦT*umwwSSSg{VX1) DX<ţGw+Lfلk(߁Ry 2 y{RzBFs]&BOU*L&lmjv,epa旖Q\*4njDAsmDl7A_HF %l955E<[{f5!ްPWݤNEB0Y* -{C?9/=IRxL*4ӌmTVBz1Zmރ3_AcN.towho85 h%uy'pj q9u}D"w ي+Vb11(@T{9<3x7@@&‰cqqDqDQLnkPH%%.*eRBRB!R19t>(VZkف;Ś5kL&As 麾0N4W:z葱eY9(CTkǡM`!}&ux߾!Ji=:uСoۮmۺ?26DUW]eܹXH$"|=z9pywA>С!9_r~ _n|+k 3,ݿ{1y% 4SOB}.:^:88Hɤ4 CrU"sssSO=e ٭1\?rsc/~Q6 c\.֯_[aUWV=۶߽^} kv[򪫮oذ? 4M +yW\qo;|<͛7/#ɬ᜛KILZ5uVnh3 cibMW\qŝHd cL#BQTc^}[6nIMP-˔UQjt_-[nFЅOg$tvvr-CLfB|b+A)aT*hdz܆<܆\.Ȑ7plḭB=Q-1q(C'h[Mɰ*sCO1M pXvn:>toN LVSGNJ @$tp,39-̋dx˚x`%.՞[[(e\L4}+TRC$\ ňi"g#D7>5ڙ8SJ6J 64Y-+oXGML1!JxBBG>1Hpf;"/| $ZZZvvժU[ZZ"kx_xeX46tuucxxkVA:i/)O3 !4Fhm``CS8q$;Nbzj l<7M7ވkLd@AJci୷:f!ʰq%G)%,KE7po&ɋꕖRXuꭷzk_ڋ?U* :N= 4;Bg/ھ}cZXR+룔^<88xwc/YR*4z)=uI&[#-Lfc @w<ܼys>3ccc1qwB:|wy1D:R1v8R$B.M:j',3;;;E;8}>YxRʸeY?-ܲ-N.cJi/jGq˲QwX8 Jz!*)\gɐSp;P a*ys̚&9p7VxH5[y/㲞+V%W~v\T-N6w*A(eԔ ULemv_v/<r󱲳<NB0:o9C%XW5=R JxW_ڍ%`BFhhhT*bO<<z0#qc0֯_kVTa32նp\唋D) mY+nfT]4Bh+%P<ú\yE@&}}ntɘ;d \[SCmG(Lvoeuk-k6l(%p_2#ӃknW#B;]=>O{* ԷPE_?χRԎ?ܖJ9@)5s3%ig^;b m97m5eXxd((Tu)IH4nimkg=Q{ ;7^*7|ik e@U'J5jjuhl}7\:6dljݶ-^{-"AD*UB JI蠈B (B(A1[<==PN1Kϫf6zgǤPPKK[ַ]|H|Z~OGϝf;7,L2ߦ5KK1P|y¿˿;::| !DhYx |BtēIa%e& q!RDRV5ZBZV]T ==OD)<J ae8 ,(}sssŶmW=σB# BXr577cǎ)wkRM@ՅnY)!뮻M'Ⱦ}k<#rlҚ3Z{u\wunx<8H6ݝO X?H\jjpi_fox{=J FRMqN͸{\.uisΓ yQoo`WWWnꡇW~=L{{{&)k{~~~޽{6==mm IDATX/-ygڶ}RJuM !RʤۻH$~׳bŊh\.;͞zv\l9U.2 (8ZjuЃT4ͥ!URϞik[-90L$A)H)crVn %3_3DrJDe~v]-P#tW(ޢZjֆ5,-HQz ##J:l6#;CPKW yJUX,+l) `-\P(ub===wYfjnnB0]d5%Foڴi7u姞?O>>o߾ BH@&,Ӭ{ٝ"wtt~#رc# 6u]OS}L$s۶R+Jso577g4&Z6z{{Eav m9 e~2 R UY+Jc@KZe2WӴd-˚ꩧ<._]=G/䒦vJ$ӖZTL)U#BVr3U8BAzmeg{Co劓S1!"pfL3Pkg$=732nzmJ)"x(bL{4~&teŚ?|qys#blV^Td\_ܴbeO,V_Ld,0DzE(z14AXX###E){Bd2I{zz1dr<~СBmB232x_1fd2x<~bzzͲ5RRsssy2XR U*]SBo8NodO)5#CW,(gY !h4jiii;ڵrs*bV.ȈirnRYMi2$:ث_8TuḴ/?܉Ot̩=RVfZ:XkG4;w &LP, 3NgRD `z$AhØu*r]׬W5BtS'0n~z3eUb0f.ʘnB# PdKG)hIBk޲eJqvȰ)!&h*+kqs!>{ | "ʎ"LDچ6OHHB!JJU%DBϊV WCOլQQO~RUQ*)JUU\UQV;"#ϣ8BٲYRZ(h*ٸqG&&&%8wPY5wޗojժ9k$M7tɱcJsssulP(X,j RnR*O_aB >u ?,4M3B}E\Aǩնi n>jJ)u? Œ(XB@%ηy4x8Rzl6?;;K,AyTAH6-6#< JiKӐ˚$ ).ᙾ Y"'A 廬R.tifeJ9"=^.{z*L}4$x@*g;$xL&scWWWs=~8ߵ Ga>_-$@@)Bv  (Cj\ 4H8d 10@h5ARZ C~IE5֒<υ υz\\ׁ8p ;pm.! cS.XRq! R"g٘B$Ak8H$B׮]{+rb]\7 w,T+ ###r,qݻ:ښZn]a_\͛7}͕oE'_eYVQB!2AeQR%EdڇzH b.ؼ*!:.<ϫќj[%CƒIdKgH" #qh4|ݺu/۷og2KU@^2eyBٍX,ʧ~zGzzzZjwd2۹sӧO/,,O1gY-ʞP2JfjR-ˮ]pp!w=DY2ܔd6wtt XTa'Nk{^,% e eLp%VH+``KPFA՛TeL!Z?Z{6דp< $IS O)xJ"rمt( Cqp ;*yH)Pȕ,dsy$r9M.cg˖-׌,J 2|̌# Ї>dX-~mmmÛ&'',Йwddd[oL\$XJ)Bm]vPwwwѣhnЮʮx<p-qs|ޭ-rV`~/RMHo)'1$Yd2$g" pQ\.>|x޶J,[#cbmۺy晅ӧO 4}{{vWv%رFxXF6~Ua> f4cmkK2kZSxvlTa㤜P4aP8F(k|W.ޜy{O)/՗jI /voJ).,,Gd;T&T*VJobq犰*"ܯVWT ՠ(|W)A2 E G ǩv(\\PU.=#HH* p|ɞ(8B"WP*##4EuDBCCCV^^; i@k YU]ˆ-{9Y.h{zz~w~n=jeYСC\.7.O+&ԦM]{iꍊ-۷wqIYuřXBIK0wE:::F:;;wXc!,^?:&g1_u(UGBb@P@QE hjbf@LZY ɀZ6ee2-( ` bfk#fd`6a3A10(BCdxY2HE4;j5Ay àCCC+7lps>7w3'Å:yʼn0ؾ޲lf֭~d2={=w܉ * /;22r˧>?я T7688h=C>o7 ʅӧO|rE.xx3I/R*)|9H!icA\3\XSN} y~>}C&PJ188h>> 6l[86XtS-@@( "7Sf]C#+lQAMV۫nq+% J)fؕq~/oܱ߷{պNRP#ewvOjC#¹L/{BykAF]9ssqTl_1V]jϾuޡl~)l6cKWWJ)++UQ# C W$eBA jBS e40e&L @@- 4LHfA0ʀXYLʆ4Pj IMHbBRĀgY8N}.P8:.j5;[J;FFF6 Fmt0I1jUӧN8c?xQqL:(\E_OX,q1P8P Y (B+؊h!P0b 1Av Hs@@^2+r}]Is=S BRp p w'&8HY, @z"tRx(\/QVdYkhhhк+WB̆Cв٬yT&(@(o~͛GnRJiwww=z{}x:[om۶;Yě`$LB m!R8J)`iƪUoև>OMLL_GV"S WxV ~^ۿMcgg={ޱcǮ71 orK5aq^ZaRj`Fff+p'yJ-j,c)5 @Ͱ0>J|䏧VֶyöKRôr}+֮շWSsjXfY9f9BRI)|V0u앃3loN%OΟ*LlwowuFe(35{o.]<=|5 Oz&S,.l@d2+Mٙd2«.]/bRE ;"{@ƠW>W $rB)!```d^mD㎡OJ,`sBrFWh0Y2~@Au ><RJK %(@)OQxR"L Y/.z^赪ippppiBqܠm0>aylu׾6ly-f U?W^-|_=w)}ppp7|O6MԶm۹ȋ5|kQj:yرկvܹwW|T,!F̄ bѿtҬy^GGG|v%m׮]m׏=Z[mĒH|ٳ׾7tSmk ƬTC(̸[tM;2& {A3ffR*LR@{nЀP 2\7TB_^\|cU60Ӳ5 Pf41nH0aܩNq?VEM;ܿv.K Ud[vnZ dҤ|lxm1˲[=QBR}gϝE\A\E(ƜgfPPpPT9Pp G  ! >𔀩Lq2`p [vV+ 0r XIgџ  =-Ă$DC@N AJW@vB%_:J\Y "!twww d!u;nm$J#4.W๮[{Ǟ|N,Zf__g+=#936% iX*Wύ_V}oN:14iY5kLa 4/|A(4a HyW=jrRp8Aɓ(:D*>P OjYiRBN- `dX`HXNN')jr_Q(fl;R"xRyk```uwwph7̴m7:tHK)G !o!2J)* A8bq @b_}+M6R|R w}k><ҥ귾y{綡5euaQJ (s}*^xWx/R1L_ιLR sOy^P* bm۹hy^X,k98tPO˲r1RJJ}8 :, TnsnnnZ3?O>h\#I],LP2ǎSGX\"MN\J/]TW~mRJ(}R+Ν;Wr,yٳgvm5;vXjժ|>f^R)]vmĉ8pȑ#NXv3==?W^ye"҈!Ԕ{ĉrloF//m۶l=qu)ܹsD~+_93==]G>mӦM뺺zcWʩS.դjzz:X.TPJBNNN:]QHGݑdnnߘ8yssϩ;sƍ7 f=iRJ6k2qSO=56>>d>㏔REСC) o_ D0Q5wN*'ѹ7dn)ȠVS?~UnU{==Lw6ؠ 587]tk͞{tbmԏ'a9I:3y۰Ry~sWKcWf7<1eH犑VGw/2Y<Vvf&毞0}s'\-):j~#Oj:GdImrԫN^j_{VGE(!DBBL'lq@'`kl6m&4Vabb7JqORH086'#TNLԂ`fs,D3xt`4V1:A3I5h V_@Y0I!UB#\t5`N!x6k+:^`NƝhb@Xٰ&vp)[4LO,$bśv5_QT 0쮾e1 Fk^⺳354H){.{xnY|D)J\w1FGre®xVbM k˖-oʕ_޲e˺5k`ppmx T=FHRd&it эl6Nv#4- ;e`$ut{ z,3tՃ n4zP*2P)K\pߩ>rZ_+C PK*p_ twb! Š+rJtvvڵkO>owp%gɤ,)%R1 J,&⺮v{5?.Yf`XwCXG=z}31M 1.JΞ=[>{+(  WGJJ"~J|.@'G`~x0yA&/Y "S<*I4\qdٹ$㗰Nِil!IRҖ 1Ih_bO% Ľ,bḬˠ0 9!BR)8Z;9h$A%A|iNLԄ AY(Ci&mc2V{tdVU,bhP/d=&81f@33zM*3d:hy2ƐfYWWWm=2O%)7YY684.H@*C1Phҋ*4TROUq{&Ii5Y&z*p"3%L;I<%1biʾĄRHLɰ$h9 3)΁}O8x 8Oo\4 y"=?j҉) wpd4yMރI\rsMGU)RTeUrR1f)ꥉ<σz5׏ jC! HchX5f@d( 2 À22 `Ny9Ksi W=@ И-? GQKHI PpGBEL:Г'& i$aYd2]᮷bZr2X-~Sx~%a-ɾM&lkMaoRM3a]@ZRLw(#Fa XDl`x*E R/ yȄlf L eh4_0M&J\;q`b)̰-&g*%)$Jxida$Yvq{%ݨ ]$毤$cRRN(I0L ɱX& Rj 'n&&m*!)r9Yĉ.Vr+h+LM|CIG" 1kJI*B_7iPf,Hٔ $Xi.&P54 }@0ÄNJ iz?J$h 6H !¥63l\QI~J,q3'GN -[&;LKER~J(M2$}J[']&`(S/h21H. 4ƙ&62фBHs ac] F&); )̕f{Nf)4qɥ"Ӏv)Uhs"I hf3$Q?y$QQM6 !\hHHޝ@yE}Wgը#Br Hb£MpL!kaj"Q.7IuWUPa,DJ)%zw0 Ac Mf7ICؚ{HϚAS&fy&ej%n*& W6qdiRƽ٤k0CqM&Mp"i IDAT 6$7vLy)`<9AsG/⳿f <5B [!f ]PE!Bu0Ȉ{8{2|@ `06[.s0CkH$T+Qv+"ڀaH[ôWhT)u͞COw',˂iY0M +J (å1b-&,\\l:Zj;c^7mdk5 s~Ǒ$JY-j$z-2&r$q/[K.~c0b£<7tsz&;8("a&5B $N(Sf-:(!磲'Xp8tlB&2DN5]0*%cL4'ؖvz^r5Ry o<6[a_OxL[r@3MHYi_ϊzrK-8[MtɉY6Y\R;zOΠ=4oBAA0rcR!@V aj 61@6 @6dAf <R0^iy4JBcb@UBCoS-NJ0 AR*(@J& c B8jj~~}߻Q_ I歜m)NޭV&aˑ8,^Zrn,$ӸFu !,clRJ:Qc`p#+WԅTHRJ$[-ɯa@Dy@^@tA^u؅:p% i JQ@jVCUR!BR H!y% |$L4zgl[-uNvZm"X:B\.PWqUTf=~i PU1lºad K؜@( QKJIH)Aӑ:i@iR3F+P! |pVЩ$硃[H†8c5 tu0DjRp]nPH)#g6[$kg?ކ}yYOOɟ g>C)j5GyD}I_׳h8d `|?Jəyg<`Ye5BplٸC(_Ԑண(tk]$R P (@=@0 R$l0itsLі"=E}_K酒g^&L&GЎ;f &`:OJp()uW A) #Æf^ZZTb! 56L?i5Qc/|!Yݶ0S-XO;V y@FGGK;w<9/Z՗dHd7,^5+py|9 + e r E$a` :5Հ׀n!0B::YB(0Hh _*>|3a-C[3L kX{(Byq 5G-g=]Xzcn/ %R999YV%Z :?ɤDަSvvc9ōz~V?ޛ?yޥl6 u8qp[731[$h0 A;S: ! ? 5 A) `Y?;bU5@<3>5s\Wi3CPS) |\;JP5fVn0VazHZ 333TutG -˕s]N8qoo3!0rRJ?Ϗ̰aeN;\mOJvV7sGLMM]<!l6q ǶrJ T4b GU.t}9/;(Oi0c Ƴ`UjPsI*H7̭ v\UۺbzN:sx@A^<8cc #kRQSSSLQQ -[ض͛7op$P&'zrO) ߢR~G: o/ )Ӳwr|B1VzG|Pm\&QbV"R> RB)>3HI4B: LrH |<\5ɴsN2琁 PHB)-i() Yq*B$2nP#رy9;8B sssT!öM+= P|֒MJ(gYv8U\Ϥ6 0pjǫsssg\u]AB!~v.\!uɠ PZH㺠2HXȯנ2(P< |PzaB zV)dh@뀐= Yg$ՠ=(ie!M'e CoӞvg ߴ FJVULOOW"ڡ6rR?o @^}Տřĵ's\,6v[ gffы֭;߿#u8 .\͛7m0>3ZB&!tp_u*A23A T5TvIJ fC :S>|rtⳎ|?66vBv(U1dݟn<?q+tqGGG۲eۢ*_zϝ;iݺuLE)uqzzOz{{?h>!kL?,mnMy6m:r}N `PMx[q(\RGʫ(b6` id@ [Z6`i@ԴI h.@)$ !a)9Y,B@qeQ!{@@WT1&(wu];qª8dJ… C+ڹIg!|"?7޽{W6e2{~O=sW~?ox\.VggOȆur2&c.0n(b ak:JȎ;~R+W5k|wҥs_ bhGDT*}ѣ:99dhh7mXhib|k[nrv{!gϝ;|X3MSuuuRLOM!ox]aX c.ͲZ "U twnҩ@Jx QACv]@wA~h[B@TA ;*Bqg4*k!4t @bsnXaT*NrxQm3v{aVKVweB?2lmL>=??o}}G'.?cl#>7c`jjχ_җoơZhVaqz{{0ܧmwBVկdY0;; =zڵkNZPBYf Bkݹ_|l6{g^cr@&m{g:)eg!!N%\uI) C#~/hۧO֨P-rVbJVS$:X\  ߝsKGyaժUw:::ꉨnz|+W^Iz5#kP+B.2,GXw2MŒi0QAQQB:3 C?d(l^7}ؽc30 ATR`vvV={zĉ1u'\ Tǰ %,1 #[1>>>}fڵ[clwW# |4NZc`T!އ?!hl47>+&NdLoMLLTںug3̦m$zM4Cڂ.v{?Nt^r84Mttt ˅,n gfk:K eJ%"*~_J)yۋ2D!֏#~?޻V@JTkUpA`+Wp P"upc{"F8ؼyǎ[ys]y|gG޷o_1?cǎN<S~|߿ӟ'6ϓ2=POWW]qWrt޽}衇l6{f2@bhP !X/}%{swwb(or7'@Ν\>p]wf @n>O )R*Բ!d6;lU.gbxooiRؗ/_e__?}}}{L|wڵ7==uuw$D&mp&C03??W^5k|k׮}ٞ[c:ߟֺ{ ?dAp_ l $bjZXB6 {MLL=shWXaI<<2 w/(` (ɅR U,JZѐPa 3דt0X"_E(lX=_~C#cbzz s'O,9r8.=b7^iˤ?ce,og~YJd25CCC1MsPQ}W__|qffm{*ʵ3g|3|m ޿_|>wPxcffX2 40|-rx6>_gffD׷P(z5)Fۍq&baqE<^3.djB)UtҹgBd2yPJ111Z>p/O;y &kd_1c݋=BTKP"Z;Er\ 0Ji'ctE!b0~~@oG3pgffoQ;x/2i i#8q`dK"}{֮__y嗝p :=c]vѣG ,m۵kM/_?岈g\i'^1??۱cǎW|?r?馛;zšQGqԋ4|/_7M\l6 ٹ~߾}{ݸqㆾ>fY<1Y]}xգxFAQc!Ӱ3S 萊ȩ.,<(QX(!eé3`12Ju#}-LLLT*턵Z ܹsޏ~G`z IDAT98Ybm0)DcHA#LFkɬ6@RR |'xܹsvm??x1@JaA1/@([JSwe3 !;マ~nݺ^d DbtĹx_" Yc1 L"e!Ұo z"ti%a]{.0LMNT.#yЪ/8xr|1G+)h ߭&@%1L#M,2 DgΕJ;ٳv~~ZVnUզ~w[k<* {]zt"<4f=mỷqTill~B!*eYmsLNNP-Xb#+Eqe U74T  h۪)be 9ߏ[o[bllrst~~^]|98t#G.Q0 ]"x'#}1$^ɞd} d-XaK\JMj[10fTc H*I%/[זJۍjƍvmݹs֮];r\-!l9L#'o/S06=KRJtĘ!yYaM*N51 (0݁G;vaa%13=B,nÇϼkW.I)p) !v63ClH4wEJ1kPɐf2lreҜaHl T{naRJX,JAL&3`YV1F)`R 9%8zsFܲu#֭FdA @¸O5C) > ]{f|CW?v?>x <_8n<Z 333… +22+JN8A3m0|I KA R.yOtL4oϥrd 6f,Y]vk5BJJ|0n˲:cB(Gu](kqز~+za&(NE2[ߐb(I[׮܇_.YُZqLNMRzr)o^~_rX c!w$n?;`i!dK9¤-U--Oʔ-4(A0.+VD:]u:ܶiӦn;v:<<mò:SdĎtttY*5W'gp3F1:9y̗@X>q鼥(3gc qd%vnYM7Ěr (Jp]z'>sL/_ [esh2hl1C̀0͉&]6^`if fe.a`ɰ4֩`s{Q `avٳgwqǺuz{{{Y6eY, az e{g6/ ! !hbv;oNӎZ!Bp}ikg7!jp&?s9ō"* ʚ)3s1g0 _tsshal;p (oj٪bv,cCQPTwM' XT#d;X"B-LrĞEO4ГHQ h+ }Z^oll|Bݢ|tSE`.Boa7˲|0tNLk|ԃbR`|]UA৸e'!Rh(-p{ikIn?nx'Vun>}l6+ZjNQAe!bIP.0!3 z=}}6tf e _깎\wvi٢$IeP̃b0VC`dYdYV&$IyQs"H}cc̛s|溮 /73B \<9% z_" [4  6ת^"_Ֆ 71V< @~@|_:sk]tn1[)%i^pB@\HN&Tj\էkJ_hFv'}ފ<]t&ROiYx_91MDD}e4Պq"Ɓ[[T]jqJ_ΆFv?9 ,;?SONTEe@;J@aëߋWJgfZ\rߪ~t})rOF>d N_?~O#|LjA@!""V+2ǏXe"cSZoc;T{@;>\j[_@s)XyYկMg{kg:sr5)b<~=aф,0?wT4$`$='C;ə0D#[P,-,N?\k{蓉znoh<?=n낂RðV.٣Jr2d0kPVӣ*Jzr9y_vrASxc n(L<|@<N]F:Uɑ5fIO-kgsjB͕jbZ*,Iv]2hfI) G#Wj9N]qJƝKͲ MQ m>|v@H&yl-![̪Qqph*SA'gnVGX|K#` ɵ-Yj:,M1Šg72 !Wو=T*jnZ\F.队 Slr!C$MJg~lf7aB7eɟH(L}cJZZ B6%$Di )ʹEۀ߆K}jv/~X+ubHvJЛ&E.s.9ꡂ*~e%{+X<ĉtCB()b(>OdM`Ad!@hA _y@k?Ҫٟn|u v@JW9eq:( 2g?\ 8P,f0ӮPY̔WC(+mϘC ;*TSS ŠR1D` Hlw_PRivgZQbG(畉U%C, <HCEPGna/q< Ŧ1H0sAR; )MbSC5a1DeH0$t$Y+ oGCsHQ_ >P HQp:#d:"NJiVWxx1i8x($$ p!?@ݠ=‰!1&|)X]TQ҄~!Wvp2*BCgw(A7TD[p[dn5U,G*l==,`EBX{ZBΝŤaqB $7vBWhm:w~?AFdh% i43dPZcxD_/dFOI0(Q-1B.Cż7Xe 5"J &ϜAܠ# &IWةc#'7}=A2NݴBxp)@p󴵞Dkf3H!ct`AqU.1|SЛ0<8(0iHA[_{$gL!hh-n3qZv1 `Î9'Б=A7=R}@28% 3g& }O<ŚXKspp90h0Jݭ݅;sn݊?jlݯnI,G((r|)&ʡj@(060,`a0dDeF?$\aDu_mD#JՂ ?(E QHȃ+@da %8s 00^`v+d$I)ܞco7(-KF 4!2=^ s(%DX(D :R4yb%C00Vg} _n:)iS#w: ^E>A>.@)P ]`28FtAk .rx<,i`8vR !sT g\|w"@ N @z@| >tCP@e EՂBD9XXkDʊ%(WQ-jTJ _UMUL~PÐqdCxC~c[Ο=ܐ/r8Z0 *P"P X|,M]x 0*HIaf}alVF⡣ P=BaEPTz i @_Zo}!l)C H~p><xx EC~c30b%RAlsm}-0" *T% d:T(5P JDQx>`fL#U c8md)ߒppJr/$ܥ9Q3zqyE2aWbFַ[ - X|LL9(Lj(E3!vF6,loX c#0R`|C(\scA=VjlYY(El{p\1DBawdp d~u)4#;UtI`ؔӆ]3>1NAw[#;1{ O {eoE謁,Y- !eRXe1JWo3̅;O",}.X2(TBd’Fty _EjCR!F~AaANW#j.Xc6fA:֠cB* nPu DWNjHW!ލ-k.Xq $W ^FMbWO}m_EyYToYHh*ิq=PN,vH{O=ǔz:\J }L|a}qڋw~ >V:xyy1i)Rd6Af c`m\RRWIUnNQζ5<_57oacipκ{77r$Lewqz+d\ Q'hS.z{٫Z(MtɓHk_|cq/0z|g+>n":sE|rgsLE$D^ۺ`3Xl[6%I.U^j?Kn<a-'#NŅߏ|RLaw2Z<_N,E UU@!8( @ZUSZUfOWՍ־&' /.T1YEUBHK"}1.n\xZS≄HiI`3LЮ;$mij:s̢Vҳ 3iacO=0GZ! /4Q\I[]uЉ SvJ Li}FXE>w,okO-tN*\b֊ɣql>Dy..5X[j*$n#6UᜭS3r* ǛAsjZ'KY<̅^]_K_iVTRyΦ8w@Q2@w8Ձ(i.NxBOke;9 wEs>qk5gP>BhB!uXG(IN Z7RdIVj^A~ĀXaL||g6l6mwmaһ+&\0BdxpX 2Pj@% $)Pf̖=r\}M'0fA`?r18E6.-WVסk\JKIё @GRae0Ks dBZn~hwfK^B3g[}p.bs+o>{;?)yb)#QzL]3? >%%noC m^Pkd؂%VQ(UJ";͖NG`u pGU < :Sۍ=lRw`y#5A@  HuNfhgGTuv*qԮE5\Ja#QRٜEZ’SsMH$ ljnYV3ĉp*$xE1ňtDQDry3:;v@뇶 3 I?@\W4z b0!$U@hBVkIAC@" d)7RxX&[ _hhaZhSԷ+ \a[ 4gQ,e - &ALHۂ!V":K_J{>N&n%nɱAb+oW7S"% c˟<qfc0'H#ip}t9딃 [F=G3(0|PhP`X,10m5dC@prޢo@+tUCk"Bh=\(;CI T$*pX'ـ7a1v=d2yWV:pch&$AMQ[PsZ*ENٟ0Xv @6pV ktZBp(Db~3wc$$Ak1x1>&b_(_=͵;;rn1Xc`6?g-`FFW l^Z=㍍ ɴsיsqZ)_ApDuk! ۀK46W=\~=_;Lc LkX,.tp-TJR#h"sw8A1HE,ŮS`@ǁ>/4$:,^sTm{q'aRvYRRx ~xDݐ0 (ζL{t0m5B)q LU J)}8pĒ&[F4y]Tb:xb\F2H8@`E"L" ĵd qS&*BL9orc>1.lKR)J+8[.:~OyLXxȋӀ.q 6Y3 Pmp ʟBc`{[>5c\hDsy7%"笈(ڷ}B8~NΧ뗿[g+|@AKEdKh5^G^A7q/Gi1T~:  fDO"$[kGKJַ{E#l9˛fw_$` H(P+lg>|5{+ aOx!L ;zo/:}IՋ̴A"PyJӧYBbDJfܮ=vG_Zv*3H>U};poH&Jq 7Ѧyidt2^<3(OHAb^)4Z^^IW?b핢\~EGJ{2Y ҧ+kg\9{@W|c=|C\.tUk4da1ٿK@)8BjpH'E粴si~_͚[z;~A70$2yCC4r.=~ q^|uw/_}'yTYzz]Nx$VK(6Kͨ5KQO˛Oc q|c,NhES'yo⧶m?㏿*~k Jޛc=Uc=6{ @$Iرsz{Sv~SB@hNjC[ݧ ^cRCcȤ3xPX(x|ǟ\)n+0> {100lC˦%Ydw;e {gi+0]B?+Xp\sѴ@{5kZ~G>$W gs\ܶTmϋ)o9u_3:FT*ȯ N@DjT%+hۉKWbBvJQcD PT%_02iZ9ҦR e@4*wȮ k>e Z[/hJT?^x}%rp>9@!I|ieC`0NJeq6_ْURi۶p׵jɲTV4e|7Vk*[ekk7Zos= |3Bd2YDQ$q'`<(xsrTeλ]& 퉅BD zha(I~lsuCCC ]wx,M_P0Л8Wf@y@rAi8<!ZIb tS6ceGE_$I iHϿ-L W ٶ! BH[ʃ (,d~jm;QGZ.[$[ښvZM@,RssFG'iQ9t8)e B.TjSiaьD05z\!ItٵB <&'0>>H$r3g?~N޽w p < ٹߩsR|^P5 b(J! +q a!Z`|]d6odYH;vc 7{ ˪ˮi]{[ ͧJP8/`tl)p j$8ء`GZͿ{sLi.ճP 0MNv-{Pʠ( qKߌu붹_X@-)@ht])'bömخM۶mi Y=`3< :K ,zqjvBSqVNC9 |eY90ϣZ-…! G3iԬb" J5׌axtnI+h[5|޼.M94wR>YDz ŋg DHm#C$d29sBϠ\."j%7_m~nNٌ1P*P.[![4c h&dqlڣr6PJGq灹ZqdBn:v~ Qtw ݲ d2i${}Ny=zm_y7ӓD>w2*߾ρOa]:x  8,K@ھU*̣T*ۮ msج5{UUAZdgQmsƜw jҳv18W|%JƛB8v&/],`324UŮ__ l߰g6aۺa<Ӱ, s'&׮ܜ+q[Uq^6 j@XFPFXFRuVfԠdEv,ˆ͝O4U]q-'"_!+cI-R16SIR4i :y"{ݹ.ZEU7|h6j96 %/ /4.Irse'wz3ʕ (%PA\J)!w4$M hAm%)bS3ܵS|a o]|̴/xs}٬p4{nκO0y5|E]g9 ! +R{ E3D-E"48:f33hal#=JX-"]r?*^TlR1B7lĎ9P;/? G@)u">#ln#7Bj@N%}sZq.D(X4 -<8JUOE:9v܉h,lld7ۃgSضBa%ض{B~팺%( %čqYSeY=^g!S.YebxҚfnHŀa`sE,ž{!@P(P5,&i T Rb\Pa7&֮c ժ48,Bh"IAnyDOemߊhF)$bR7ْSQYp*iڻkr< YiٽAV"Dn eV*(&֬޽{13;T.\@*B"Db H5$a:LLô,( ʨN)0?*NGYjdn3҆6zk%ep r1Y([o6mFoQX$`w܁g,,DU{.CǣA>_1,`) " k>D %u1rYLLNλB_(c, U@;n0MH>ȊS۰wMGoo/"J$-B۱eV$rqV팁h4)۶ZL/I 4)V5C3  3 *2L;y+L4 ?$UPJi*==[}}}fqF"t.I"VmpAnPZ RG],z~ǮVj:FXvZdX!:,B7 MW[OB %%۶bÆ bll 'N 1fKՃ}RB2)7[7L$why[EӍK"ur5PGM_r?Bab i\ɉqzfö-ؖa[ Nmxn\@smcI-$셂\E{ !"`'\6E {]”JBqOz!`6e#B@bI.B,}#S[;Y"6q6nEqf%Eu! v-Y=shZ((3I ei-{7W1==݈ǣ0M+Fl Z@,"6% H\6>3d}ɅhVsҴ$wѨ[)(Qp801+f8}Z0< g}".N3-ҭ-bjuЅ;:0E֤4#+_$QN㮍3MN =Xk׍;׾g)4E$QȌBfvHD`r. T1!.CyИ6 tkwN VSZ)R7KWFmauFgA#z4L`"PIjB/Z;Q-գo@ꂩ49$a*`/@i%p2 ΁s@@t;x 9jh`!o4U%WB`,+P(ZPdCBkIԶ-P-"j@UDBlF&Fmک(dtTN1J-PH <@Kl|w__Z7v#N|Z=[P:k p҉PjFCJbhn6:M躓[SA4<9~;n@lf@R 3Jd OF'* [5@T 2k!)r' ܚP Y)]#?O'hEve<'5Bð}KX,UgUM*ÉODs F"/mIP^i<_g85Adm@6ψ+x5xIT Ez, dfKp=5I&I`Qp4M;r4p.P!_pkۀiZ,8抈WIV@Cf0Ep4&6muk!2f3=~Ͽt -ǁ( `(.( ùcX &]9kzpRu1'l4qveY0Ģ=\BfK0-ˆiڡ۳7,/4zʎe]L0 ( H8Nq/Ic .6FSH Z j cN yn#Nde͵9dKՃ7=!Y=G X~kK١gmr-sD6{"xބ.0ޟG2^@o F 8E X 8FF ,Q %ZjV,ȪӛOoGL17 e۶PX~zvYv-TO\3}k|%Q0} 6 T<da/ n6G%}uR&MAo/C ,7RAt8C!zv sv]hiy"\,,\[):DLrYt2!̒,i{B&CEڊKgF1,!ա4d *C{18*RKqKIl0+gQQ\5; BRa"?`?+/$ϺӍPҬ# ZEa"/E\LP7!``3|\PpIvudf']/2k*~i+E,:b>N_B: ױ($DI.a{{]"xZ$3e=Sk6hZ&p!Id.oԍBJ̀ VڥAKUi?$E{ki6С`ꆝce) %mݰ J8LB%5۪rmY7k ސ_,M0pWH.vlg$ ~:k&dyn,U<|U},v'I"JA(sN݅ !܊Tw r4أ. =_'Q+w1F-N w~1? 6 >ȴے%=ŋUlڬ/nDxJP6rs?[MYZb݆޳g{ Evϋ vsfsOeɁE^׫M߉mG+nsF\(:4U~gۺ+^'uR/c+]QiwkH pCm`4 eHϦ142-X+.H0sTYC E{՗Ce{}Wgi%Mn6@PZ ^ߋpgC?BEn>rҌVfm']Ṻ𰌁؆깪|SH %Lmd ^ bQXr%iP]T))lxNqG: ²# <+Zω(m؆{v0SB}&U / c'Tgxꩧq=h-6膪E6:9\rmK`^(O{>~Ux``tQK8݃~7gVn`]gi]\kkiYVE~vd2zũ?E$UTsnAŅGNxUs->0JN[Ƨ"_{vzn2-SO=kW}ѻm(;߫ j K, !ߴ,/\AV/@:8"43@uk]77oݲKpree6,4 ##í&eiT*Uؖ YV044MP*.8tt:]}燾z@~zG%Y%zWHWȠimxxxbdlzUQ`Blۆ,qg  n"OEUB,4MRwZ՛4X-TRh|Ț["%bD"˲rnF">eS☙A__1>>joBԛoC\,=o=$ j8~ہ 0{gݓL ^ڡ!r( LTn^bJՏt$FFF0:: rTڰaweYsssϟ?+rZz}UVd ԗ:-\*S"˲V)kK.xb eՀK+DNĤX IffgaD"o]aIDAT0&''5B*ʺR4Q.+aЇzH!ٶ}X,^V(o]D,cccj*"===~ۜsTNF=]ETJ%Ku'my!3BkWz,/`}?44t? ;veZд6oل,BPDXmY>^Vy- XH0]=}nJz.:{"T*:u |,~ǑHļ{6p {IPH$R<W#4Ms6 8,BR$RT !'~ r9@.?ܳ}^pc``w}M$%I`(x-[)m{RUJ"ST$LAbLd2&?c_vׅ'xBIӻ$I:@5!~UU ⨳,Ο?_0 #9\iSxmoشaǺuhkBެA#m4!BcL <.^mUf.ϾopfnnmU!$Xa{Rb2tJ3)iId`T*|饗O<~E7>>04믗|%srǭJ?ۿg }K_^F"SSS1۶qȑeYy#;%<*l:ͽWa^x_-#1&;.ti~Ei%Zt񒭮 [|-" @Z_} L@ݧz7\٭RAկ޸qud/I=æ%!ؿnJcok-]J*[E]N,7wONN={6JԶ؄/JҎ~J)(v]Ԏ N/SO!ѲPAP<[p'e;{߸:/~񋓔OR)j&t[oB< mSHcp"N>-Bۿmc_J n7n-ΞuY ߁GCUmYSx\Rh" ===eYaX,ܹsbH) R lC@PB'믾m;3|av@$XETU(2cOdD.+麮2NU?7˿Kh!{.DN?K .̥>1D"d!_Țal6^}aeY*4cY֡\.s=qA5k)?X#7m٘Mw2s 3 $M01nl:gt| "$]4pݷW_G&ǎf2cGyŋV7E1^ 7o@\m,GL"Ov2@:@^4@BYR势E~vyuǦ E;lÇ:PqmͻUQpŮsb(.W ۷6rټ*Kb\k֎auW.ZXm}y}yOsw!Ƅ}0- sP`x'G\ a6bLXr ulzpߓJ:2,,]r'@Q=###:c;DBѩb݆u( 8jc,]Wubr:QwFXFUbu;mƍo|7 Kѣ$FQ.Wp[~vn J/]X*+Yz184XRl %k&F|8f3q[Bss`PJѓCIڽ /2b{&EjÞo7|#*Ņ;bxx |33ӫs[3(g& bw3q \zo6LÄix{/ M6N81QX<ǾǘC֮tqvQiKe3J4i׿Q.`?JܮGaS ~BymJh>d u˩{%JrT_/ۃC/I,cqZ+}bݴbɉV l+Q`6^{ޅC/Bmw+ A!R})\*'l|vBZS0:@Zl h} TO;`[|~pC7IVq]3 tbwVXH)IN߮>DKb"` ð I irϝGar>.K.Z/Jjw2W*NrGi%{UMB-Q+ٟv jiE} !M7,~]..0p`IENDB`KontrolPack-3.0.0/kontrolpack/images/mac.png000644 001750 001750 00000010660 11426532120 017202 0ustar00000000 000000 PNG  IHDRKSsRGBbKGD pHYs  tIME a DtEXtCommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality FPIDATx\{p\y]vXkdKelAm4dhoIL$< }LN: 3La&\81)a')2tj g@_FƲdY]Gؽ^[v}fܽ={Ow; R+JRMuM7tW8}!ᜣ D*! @(*UAPott=Xn.}ꩧnp^q"RJyOR"!úI)۷믏xHk}Dc#Ak cjKוR?GjϞ=Q"`W`9Rs 6hv>B*p^?kb֭ق588D;.(ەstFl0)XpR&Ikߦv^Jylk׮(Y-@X8 |ǯk \} kںukb+Ĥ zw-k``R>%1 RM3?_ ^%?˂e]veܔd~~69e6ڬKR?0˭d;s@M2P~ND,1Rnc}1V4_?`N`T3Xa fv7x#:zZfil?}zL4V֯\RVJ='T),>k~m{G1cL*4E;9n>ZQ`~؎o%*K=Voo1fMA{qho1\WAJ?SJ@Mf#ؐfq^Z7]RJqj[.T*թ֚lfـi3E1+H|}N)T&HL)u >̌1wJ)[> KO>/lH$>e6>!HDQk޷od21$XolVgf󥞞Aԫ05Nu)vZC@ZRji7LQgY~8nU~?`BUx^f])5-߾}c DA 7Mí2ƶ0ƾ߮Eu?vрuuuc_' b_c51nZ7]ĢZO?BH<nI:1 uyM&x\kB%A.CD+W8ze;ZknWPj_d2Gjb`i) *(C !@D%8pLR;wϵQ]__? ꊔ| k_̰h?ܶm 磓с*~D*\30`p`0DL |f,rn)ycLUυfe*ҐR:xΝ :o`9s#6)eٜEv>WZM1t)||vVcr4ғ:%F)_x5#Jxb糳q)e 89_P1m q.cc;v5՟UQ ,p46WK[qfR|wNx`xvc* b5MPk(|]w㨪Dt;ZBv-^s>RJdY8#{}o1 s> _h "\Ҳ2ZCGh'Ɛ8c -TǎZNw%kVsoXSJJQ[J&>B ٹ8۳gl s lv<.J#NKqcCX۩tʔ|%V F)ny~|NeAyi.z^4yYUХ V}kٲ&沊 fOC- ?+aTNkQ[[D"mx| =kjZM Vlle` H&K1ߎbKV!wQ(*&Bܓ* `0bH$ƘK;bX{cc@*hs#+}̏2ŚcԒx%KxA!aYnc^kG&R-,`suuukK'^GΟ?>5044TjsX>a{ZZZJDt[KK Wx9c.[RC&sa0Ju:uYjeGCCszтlo_b/̊.fd?*i@ u~8'N(˚jT1466b圈r1|M|p!(\+F$ǂʼn022cǎaddYxa``gΜjܝ$,=cT]ֆO/66زzj̣_2Vev+ɓޞ[膆$ c8-drŚ5`դ`m )u:kٳg166VyVP#! ~Q1TS+Nh Ç#˝*{"Z&:~x['̨{Xbl'kV.F&"pK O?0 ;2 rT::֢j-6~l:jBVDUUUMŔRZ YU)%: yjO*1~7nF";,T,"XlkVo7bR.FoH)O={t:I4&$1_p+>f] hk=c ===5=tzرcÔGy,wҥhll]T0pg"Ht[1 :EI*ɓ' OӣGbxxxRS, EQttt@q- V>}ӦMRA_gnR^d2^kTϊjժUhjj"`颀noiiU x|'. bYB! Dn`O1-{z{{OY;_GD՝͋1SyŸpr3P沥4cE oXގ7Fиf `MsCC|0cN_9rD4D#Bu^{jjje}e$7l؀ڢV:׌1>tccc<OL]Ͽ5z!ثFb'd,jkb0Fc^Hijjjb(h{>66#G3;?Z7N*8DIl4 npBo %Ӳ+w?ۀk?t?s<? P M{B!t@2 ]zp[[bJ*Kas9 h4|>?1?pKCCTZn(YMM 4aERP@$>@JDhCH@ɊE(wޗ{:wrR(Kvvvy~<3" C^k_nܸ+~6ƼwBZÇ\@[J坛7oIZ 0?;wѣG+PJejtp-5!Gh,ĥKc֞ \̄jZ?<aTnH(sd<TZeDKȍE-n/D[ZT J>D%T/l,4> SzQJ  cѿBS^/| 6kd%5J_<^TR N R8ݝ;>3$!J WToV)iR $UziU*$AX;XhbggDbpdDC$v- xxQˡLgX?515k`mZt8)\ȍ1*Kky>:a[BH `|S@ 0 ,-27+IENDB`KontrolPack-3.0.0/kontrolpack/images/mac-computer-small.png000644 001750 001750 00000017205 11426532120 022146 0ustar00000000 000000 PNG  IHDRPPsRGBbKGD pHYs  tIME' IDATx|[וz[o>d(& ;8A l?@CWX21G2 @XffXĎ#ˢ%Z|6zG>}6r0:UΪ{} ۯakŠ~DQd4z #pN)#=.>xf p aG*#m@D$0ΠD==#cL]N4"-;B >ۀe@홞eGu?xxI<2:]heh\|}, !,"rp'X¶%Z-ՀfQ`{qN&Oc`OeY,A? ^,8V =f \>$D;5dG)dAcD [, )d.`N++plضιHH`\0iH$BTvwhh[ hq,\ĿKeA X XF"IDU@n!yRpc ynaY|3:imY! 1$E)p 9(8RBk!$P)Y%EtQpNμa%9",()%hչ-2 8QCJ Zi# DQ0$Z$‰m50FCbp1q% HiNcZ5ScK[qOX6ت|4hyH) FvBiH(XxD)H m40Z *&Asx#2x%Jj$INcA嶌q,fR Dq;Ej 8s Bs~cw7Bb0jۅь'(ah6Uд~/-^R-4HӼD&L$8`a,ˊrR@ܑ+²Bϛd*Ri"k8,ۂѦ^m1%Fs^@J,#*RH G;HTR"%81.iCkܿcoOC}i#OWjMPJ!U9Y#a&/PI&#W^aD K @JO#\ XEA!u R! Ht{c*g6piQqVV Y beYv(^%9/&R|`Uv>V q4k6u3W* *ÝRZ$! Qw8+F&K . "ДoX&y9}Q "Bc2pn?p}TAi>"h KGh'^' 1(2 kp3tMwJ6d<(p_QCP**{03乄z9Ų,c<Ͻ#َ],FC PMtrҐRDm_gAEȲ Vk|ȣ v`upn=1*R0(&+˶`H52젲m%U𠟕Ur  h'ha6l۪HMq^q},BØ=y"6PxN2Y@D۲@Ef~:2 Y5~ mҙ"n.ZwVqR5]ۅjU[!<*Gs[!M%r9KX c@ZveOx@ˀU8<5tj-±QIGöu0DH _b 6< Ds¥7'DS}Ӣ+sA`pd13F*J0HϥaV|U su-/c^YZ6lAlH@B߁6Ǝ= \ m`9&QQLk]_^^fG+Byr)iXYJ鑼EƮRQ+,/q*i>lW0t)йm++-t{;27ERŽ2;HR<礔"`$Ъ*y)qͳtpXArCZmet:kۉ9eYmeaa,EbC5'E" %c m1xE⼤Mc/czxt!ǎu]؎]8DqV8|, @vlj5:u B e2s\u=9$SKm,--2cL3Er%p'oc}[kb)inQ$;qHUvP3Ɔ-@m09'a͘h)#Z5p .IʪDyPqa&cff7]K8wC3 :LƹǦ%*|{ו1gDtQ<3^kp?Voxgt>dž5#q%=M/P?6YLhJUk\í[wA}c9ô6d!c4L.OpejPfZJF1pDJ$cF) Ĵ)%(^'iW&G&K/գ(:89 n-z$:y.a,,,`|M4MumܼysPA%UU4 @'ɈEkn"Mdi^./p̺ғab1kp]gV; )%p/?}tmmRw1JJNE74'"Jwcwz^h4_|QV2Eri^-j^|Oڪs1j(BfJ+_͸fҁ F֕X빰, [wEK˗/_hzk6u۶ks$1βEve;R,aeo M[YYxӟ]^ZzrumZ6l6 yQ+=t];cW vK@kJ}<.`~߻˲ ?ZYYi_k6FI˲-eDDJ(˲,QMeGJC!ĵ7va^h_X\Zv ~lbeefXVR~;..y${ .j[ZZZ1F|'/U=wz4lFc%e[8e9k2[|Iԩu,,{'?9sFq|iiiV,ˢ`p,˾K/] _rqv.<}qT`Y4Wo#[sO۟z{iij5<1%IqRћ_җz ~l6wye[]Y9%,IF˲:U4bBee%m瞠;I ˲0 {Z,|߸q#do兟LX6{6zeq7͞<Ǩ\Q.ADh!#H):A|vz8uZyw߾vڿw޵$I2z9Gk|c40@oC3幯=Cū,G 5#Vs4ɰѭ~ƍ7n Gy)`lg>c Kڱ5f6$ǁzq[ұchGմH4ٞCYQ94Ňe|uumr;P K| 8ǝ:spOG\O=sǷ!*5{4ƒ;>Q[5<\?k^XHaXH_r6|sݕ O= m4j ˲j5WC+H#xE3!zLd֎ w}^?y{ ;;;7KSHwN<-,AISOB /իW ]B*YduUk p fkEaiCˈ4;3 %.۶ ZIWzPg]0Qf>y81|pcv:j8~sU)6lxґ2Z뜈w|'xz-]tI}V2v ~IENDB`KontrolPack-3.0.0/kontrolpack/images/network.png000644 001750 001750 00000002326 11426532120 020133 0ustar00000000 000000 PNG  IHDR szzbKGD pHYs  ~tIMEʍZ>tEXtCommentCreated with The GIMP (c) 2003 Jakub 'jimmac' Steiner'3XIDATXOHcG?/L%ƬVlPjeH].^SAqɲT%A\ThTbc v($ϛ$D eߛ;35lOߵU<}c |b39\πe}i|I:\X@?wΙ>88jM\4\.חxg!IJJA }`۟M@Jy6ݾ>66IP]]/.i5T?Is (BFSugoH)4-a^/`0mvtt011@8P(zzz!S!$RJcqqFoo/lud >l`0VMMNNOOOo]<YiÅ ~*thA4|>&A-HD8>>6$@}}}W@ h<\Ӵ_Gcj}ڐ *QZZJaaab$*++mgnngφ?eNڐTVVvimmj"dss3mRQPPཬ62"zR׆thkkKTVV"DQ$yys!666N8>>d2 OY=} 0==( <=()0Hgu%{B_W~#?߂ٜX,UZ|p8`Hk㨫FAqq1a0IMM-;!~ÖDdJ$|| < (JZ}&y^/o{qᄍD"* ǖ>\__x_?7vBh4*#HZ+v]7UkoA0`@ Čcj;wOIENDB`KontrolPack-3.0.0/kontrolpack/images/windows-folder.png000644 001750 001750 00000002507 11426532120 021406 0ustar00000000 000000 PNG  IHDR ^8sRGBbKGD pHYs  tIME 1w4IDATHǵKsǃ? ~AB`ذDl6($XegME$@"R,P%lƲy1{3==8簸k.nsgI{~z'_>k+&gaK=HI9\QlkFZ/˖򢘗,|C6I1G]2E:Kh.teE!#AVȊ#ᒈ|Av|önEs\dVVaUI!PV=@&x_g޸A^_4JY[%dp$"+j_{7jfi9#x.,.af`}a3дFj8{;}q*~Scy &;-`~&Pכy`=,DxT/ NqEjX.ᆷxKq]'%1â%4u03"=NhP"UC&z&TSM .N{]DU :"6J~|X%:?%jfw?u48/jE^<[ݻxu_|}AI(ZdYzEm[RRL=}wd:PgxP4NF2ֿQrjfnU51nmOw=!*PQQ#S d "& *ꪢ,;/a_mkDzʼnAJ[jFcqeuk9UUMs+{bp孁5m;8ZTWemh9ӹ n;==w^8kPٝsӽ3z!܎և0 6ֹ/|0XF6{w+WhvwȑsɩQpX}+,][cyO_z߿}^zV>t/>9u-)? E%.IENDB`KontrolPack-3.0.0/kontrolpack/images/linux.png000644 001750 001750 00000003024 11426532120 017575 0ustar00000000 000000 PNG  IHDR_xusRGBgAMA a cHRMz&u0`:pQ<tIME 'tEXtSoftwarePaint.NET v3.30@G[IDATHK{PU}٘Xf؈6L@0#͐8N$(C@r4 %DX2rQU^ ދΜ=7u >ѡR9;;3mE Oڃe cdd}V&qzy!5:B^^} mOyOh}9x{iQ~e "VVP-\66쿇>@{{oBVV"##ѤC(,,tCȈpo?,2Ȝ9s' Y#q)A,BTl eF'.鞈 qQڹ諟e0<44N" ^\ Q.BU,߶P/hACNРwhsK6 A <܉l1h>/ᴧ1-2e"bvauxXeҋGuK4">GMV;t6ZNx95|řtu=Aa'TP托P]B Sw54}C^5>"j牾)BݔwpR)o7 E|Vmz}?)8}:+W {GQzP^Ϗ Տ^o_&! b3 x,u(@η߻s( 9EiᱫL,ig|2:fמނ+J3u䤏`<!0O^c { R#4[#u pI{w%XcG *|/)p˸teZGX8~B$'0- 8>{{XY`KfT*E!ctS7a$s"5wqaA\ AT*f ??JZ] yɀqP?B\1p@Lhu8(mϜN(ıB:L`$)  xBD1 #ec @ 9#C i?(C)fsGVr~ .B)AB^3o kcf0Dhz OBDJ)YJJIM".j3K/\~򩧟Z{sxo+s=_?;;j: UjT,g|Tz/ĥRf?UX__G\6`u܏`4#IVsjrҷ6i66d"PwwV !Ӟ|tx[fp(S69#[ݽ?_ظsKWVWW.q<3;nnwNOvM d du+´4 YzROHI8"[SD22Y)}:Y2 iS=`=Lg‚6϶OSTMiIENDB`KontrolPack-3.0.0/kontrolpack/images/settings.png000644 001750 001750 00000000640 11426532120 020277 0ustar00000000 000000 PNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<BIDATxėQ @aWJHJ@B%T6 s>0Vr~!yЀޫ2tfۦOi`S[ojPs3R">S2Ɂ u 0{$(~f q  *i?B|W}qMC+ZBڹj\@W ^G4dDd^W\ +iGTïU_3RIaa]M~Ce"\r$!\3,Hp.¶m߇nt3J~3ңo3`o#%IENDB`KontrolPack-3.0.0/kontrolpack/images/about-logo.png000644 001750 001750 00000117654 11426532120 020525 0ustar00000000 000000 PNG  IHDR{hrsRGBbKGD pHYs  tIME+m t"tEXtCommentCreated with GIMP on a MacwC IDATxy}?{{z} I !DgH%>?r$!8qq2ĉA,fB i FTսQݭcD}tL[n8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p8p_g8p{W4M$ʲLu]Is!rd2"NB4O$__C8psx@RťdYneRZO)S+˲R !$ι 4BPrl67 c4 eفd29JRC2,B܏SǑH$m6y睧Ά p-`Μ9eyeaΝ}vg?s$_K&fxkΏK_Th|]X!gϓBAϏđ>,p׾c}OSzUU}5x/DZluK\.|vU])4MdYN(;wc'O~ꩧZ(;˜|>]ק9(x<͛1v(1`Sx g?g0MT#`===8\Ey=n((!-PBV)a AU@sy!Pbw@y8sG 7x|ݻwFRt4s\.7nV\s5|e 7_D I@"tR1lDBq_f{uٱ1 D&SYJ"Y>Y{/8׵b%IRl' p:bTx<Dɓ'?GT:H!I d"+*Dzj|[B4}9,?|\Īs]k?/,jXD"BP{>a)2!2og:cBJU@QP( BF]$I s0L&1>>x_PJ( n7|>B n74Mi$YU"F9#%uuuzppg)gEy"LPUsd2Yu]]]ظq#zzz 2,#G q#lEIYh2dTc#^B=?녪4 {Ůmllz}Rj̵~߿8$24rL+!(sEGG @),|uۭw]x^x" \.TUs='խ5p88Y VA'O{o;vࣾJ7 B!*ErY+P|tO2 pΠ*2/",9w V睷 4 "@Ot]wy<4|MSw5M Hi$̄ ~?nF_lIU#ÇcӦMغur?2 8Uϯe?88˲jzxM2<8cBL"4n0!'-4.]+_S+\uQ(kjJpmj t7AŔH'?Wdzi&\.b1466"r@eCGG|>u1L&~l߾/{} P(w >?|~?~?<^/\] +20MdsYdid)RId){gڵ`ܹ^!2$ɥbMӚt]ȑ#3\s01a6lPU XnnMq=?ďc>1)qhmmEgg'`y߁@xظq#*b1|Zfu]hii)D,,B.ûヒ{;w<8$2K#J|> , A,C'Y|M?' i:`uyᕈ[Y/ "I]h^iYwi46kJ ˋB<0ǎײkt_O0K$fI rF }~$!()VBQsL頻 _$**d冤>ďRC(s=G{{;˱V;;;744e{{ ---J", xk_{:d* IQ6!!444>P(@ EQ@8i/ L`tl## FFFC:Ç{‹/`c͚5XhQ___ᝐ(A4=;w3>W 6g%~Dj1b*R;jŊ曱`h6 <͛7c֭3&f\}Xz5-ZR BrmŊ+q!lٲ>`m.]˗/G$B1r9\_~9b4MP> @{{;VZ;wbӦM2aW\o-B0)@ww76oތA<8t"n&\zx걥1Q["RB. TqP$=yB0xoJJUlBTH,\ost_I8 n sѓ±i kz ;hHT8"J I=0cv?\u4!di 3ܘ; |- F&y |ݹ  F؈h4 ]!I~.hooBu,kKxyvle<|TB MMhokCWg[knF$)4P*]Μ 0! e4-9d9icI|<0~||c  !Ǿp1書 peaѢE('s/!d$IQMZc޹s &>i"ܤ|`Μ9[bŊ)qRzq}GE&9E%Kk׮EsssyL.r!/wߍ)۞?~=3%bE͛%K  AdVr/AA|{o qe! ZiXt)-Zt:T*X ]t/^\&Rx.êUpeaٲezm&qX~}9QxJuv844T3 Hl6[ Q3,&XF4@G6&EYS!) FӒu០c.TTQqJU d!ݽ۳g^=(-ea``*ox$E?Ess 0wlFk,P]t9 D(!p{(TUE}4vtu G}8r8> Rq}wK.)@ cЅ) t]|޽x@_ҊZphhhZ7iɽֆo| '(g݋gDc͚5DIjffV'@)Egg'6lIiӦ)L&&oS$2n~K.ߎC{ 6$I$vUw)QHKǦ&tvvVyr w&s&8::ZִD5eBp*! < xU\\=sȚ*!j b7 Ys6-fHn4#&|"S#M^Y3*erqb E{64 ǼڊP]C$c!k4Ne"@E110a1.*x<#G4E#0R4vz'Oȑ#Kݍ@ ˲P(P(d!D!dYEٺk׮D24MM7݄Sl6>7o1Je˖;VZU$gkllĵ^~˿˄}8qBB]R[#g~??|\r%x1444W"ϗ3L79Lӄ-܂u֡nDx&JRrtpnଖGj(LȦ!H<X'dU!tADA8y)@~ 7B44]TT8QѲRďNu1sblu!D8I6?Es.dEؾ2Ļ_?gL6o,n7:::7aq5mmmyA]]}Z2km۶ͷ,A!ڊ cD8g 8Y;bo9 p::~?^zdI}|O?f,]!σ1& !!.L;v`p00Mj&diB-_\prؽ{76oތ'|r׾˗W%’tB˯\s y+k*+rF(RDQ,][nʼn'H$ ߭F 94FFF& W#Òr=9êUpW W,8\ܤ8fiݤabjSҰ{ :g M · rQDUTV> 83A5t@]1D%( .PUxlMsCɄ\ +dhTvPH`,4wCR6]el7M>/m筅 pDvlG ?j!__ I]RSS5k֪p8;<̞=\.Jg'NW^ᅬq躎%K`ݺuhnn(Gcc#v؁͛7Gիqm㞕*ntt> ^}U md-iqr믿9s`ҥU<oyB[nq\tq, fU(6x{Bex{.8N5T6=tU 0SpG4Tf.^C;"9z(.x[йO] :ۣdP]"`ɰ~<;AeVc,B|'r ?A9+à -PWSKz4"V2ejtBQPEǕpH ώ' Ns|zzz544x*a"?_?qy܌s. ²@ %0*@)?ՌLT6i  bkM1ӪprQ~ΘۅX ÄaXG:D`I۷#5Cu\5!|X,vܹsGGG_JR#.*2 3VW 'B \lBe! S`89[;vP+W KSBТٳg_ĉwH !-eXJ;j.g|!2|GSO=UJ !UUՅh4ZU;v կsNR%e1{l\rK1zhBPn[-0 )ixWpWTe |˳DeUo4iؿ?^74 U4MWBeɧm=nҪpӄT|]$A4+bt<ƎD˿@;9F[ =j%U 0`aU-K.D0 BFX3c{9~IdUV!D^ëcF5!k^[1-%ւp}oG@:$N%X ^JĩlRUrR6)gvFi]z065KX$L 0(H2 ӂi.XK`׮( ϟ_NdcAQWccE{?x|tt( j:2i"d26Sp[U.%([~&aPk h{Wڵk+MTض6rx52,uMy1::ZpA<Gkkk BPeS5ZƸتlXy<3x駫&>E"O /7x*QY{?<=r]g8b8T;RFiF\Of8?;~uCM%I#ǎ$cG܄!*79ɩbs4{Nsp/҃Uٝ2f-$0#G`옽u[}@P=$U/aQƎ7^Dv{:R"̳>KzZZZ3P(Tl6z Olۆ}!!oqPI 5ւp8B)L ,`` JE9fH+bFR.N%pVtnP;iD~&e4L.B ds9ۻcHM cϞ=eF!1zp֬Y._/rhj*2U^/=9Q<ҍ>$ID"Bj 4ByT5|w-˚=0a92,uطo_r׋p8\/l"}lu)IhyKܤ5Z W 3sHRu!L\(in]1!'`H twA|q;^%r($GaYK@% (sb [3p夗Rm:r+Q&B\x\pl6k=ùIKu_qD .e BU qa'}5qȋ*I-b-$T*.L3E>;68G?U Rn1.#jjQr_*@`Aõc=&fh8jљP\jբkg͚3kヌ8yvݨ: .b  f9TPj7LN +a1Yvk6n;+a(fY5612H农2-&39N9V?$,\.ŋ_G抮RKa`8e-U3zׯ_wޙ|ǽdɒ9*.%u-=]tۭ* r1 xN|=hE21mw1@vΩ CsyGDq{5㉏yƨB|4sIIٹ.ŶqSn?@[ĩ9.,H]BDG:ݼl3 )`_D577JބR2ܫCG1̠8@$RIj^! YQe2$Y$0I&Q< 夫+N*^$-d,2a* 2a,Ӏi0e i4 rl,`J0R䓠֙Rya7u9FIzP!ah49o޼~eR!O3M*Jp=D*ɐRr9H^U[oUk|oPJ/.@)1gx7|ְjKY@xGJQUX+s$6-y"_ @P(DHa!+ ^zigj.!BrTCe&)' ػw/3g8GJ pΕ|>O-f I%BLا%u* ./R^[GiֽmI$'҄0MaSr$I!o#HRZd8}]@Q!T Ta*dE`H$J$JKV詎BL|vlMY0a& Ŏ[ C.*0L)0i:hz ɸM1O"0< 0J-ϟݻGp*T8dTgrsR-ƉJDqj[Vg4RzE%eY?~??~ƊLb$" X__odAL1#Eu&J~m}>Mn*PUYp/LcՓjs,K!N`AQ466N'2d2w}w{XEŤ$HHBA o9IpN!}‰-hP@I╩7Ģ=kKz{cgCLNGxtt'5ۺuڋ6c&>Da0(&P<5+t*)d25jS$xWJ`pI$Y*`s?~|#gr0dH2ar !('ȚXP5 dn?$Y,bIpbv)R{60, &8`q KXB yl,[I`% a@5\'9C&o"!H"H@U(Imhh-[Lfv"svuF[`B@jpI2( .qXOOύ,)~-zȑ#?я~Ga3B%R3u:Tɤ7]ˁaÆnKznQA^,kBib\UĕE4M\xbr3-u)tww|?JIao *KgOUAVudG۱"0ڻ/LkYQ4WU"B*!j>jN5dhnmm[iP س;Dz\  s a#@DB*EW)>.z*%3L aw(LL`d- [g`1@"2F$p"ݿE'HdHeH&|u=k9sHo/aO}EeXy!RBvtժUy`&?hU('q9%f2>˟vgtjTL3jJ '+$/-k!"1ɽ-͛\9^wWJssݻw>%3f",-  (pSpa?! D T|P.oeYQQ2vHJ7 )um2$K\\Ae*RH (;PnͿ 8 nߚ&6ݔ !!#͕xC$xcجh4zJugR"́(fX† a\\բ{SRUU^n]n,wQJ+0 c~?=Y(E,P ^Z[v#axa,LGƾ}N5k֐nvuuɓ]7[{/bi.Y%!r={[l)<|%R[[ct||\.ayn7imm4 rMӸ,"Q^(3ظqtUWcf&{wyU$׬YC.E4M$If,r9w-s=Ν;) d822"+,Ee(sΕs\~'݂3ɾ/@EA8w}򗣀PlWP!K.@]^y2:oYw;ņߺѼd9]̚2McFV5O6S_NˆkY31' ٳ#HsRbC  3tA!$ ȐJUJ2BA"P@CH. EZQ^Aء&ɓMMdSX*XE!:8,"Lb+-)\ly,v\.F[hG__XI ?C2,LNq\3NEW0h*Rh(+V|/X4mH[BÃ>ywn:'aIZW_\zѢE .NQBPJSeXW^С-[$|ABtRi卑Hd,D~b's܁+W_~y8i6_Qv>bwժUܹs`ӦM7|<+W~gѢE`0!&P!D};A?tD"M7K<( 4B\.7ܼs9n,˭B뮻;sx9۸qկ~5vmvSJ#RO0 cl$^fM}jcy,hP>jL+N+Bm9i1eK+Y^KFlYIɓ!؇XȊ4u 2UK:,e׵wȂH°QeUPb4-h3{'=4|mO?mzD5O/A;ŠJT'm AMV#hc⻟{j"3M"ɃD8$3U+P@w.|m뒢ZTVUFe72*je4QQ>ϣiZ9~1=ztQ$ 锛>A$XŽϥMB]$r*^h w^ @n9)n.`۔aRb; H(@FsCH8`QX@ AQD󧊪gLd&|@PEQ"/,e? Rc4+̙[Xz3W$Y>?mwۏ>h>L&ɋ( [d_zڵk777_j+STU5].WF/x#w}wvxxx+ϟ \ͻwɒ%P(t$IBa7 (C`*x<`p~W_}.0 ^M)mvPJ'0ԥK..Z(NSԖ8]tѲŋߢ(Jxj-JsZ']v_lٕ^ZJi'11BCCC|pp@SS;ׯD"kUUQ$RR(iZviXt3qrTsȪv:vSBH1áÇHHeaX:Hl &dn `P`PLHʐ- ] P$P܀?T168<<~Æ '8k#J8f//?Y.JiOq"wgNq"<D`j%X'@JQ%g I0d.jUOwR3αm=-2ѝkICwZ/_@MDN}l?QfOPD(e>` k[}wV8uG; $PZٷ~O=/R@H (뮻??{߾}c}6cl544855ӿ5x!333y,h!`]>"vJi @PJ3-b}~ClAX2U=*`q]7zg7MG G8X%r _B{ aۋe^f#XyOODRRRuR 8:!@"Yкo5x{驪>Pql~n}Pof Bh?%ƽb굉*bLJ?1cghe2 )bSlZfb"\O>{c|6ƘZhuCkEhB%4kƝ>V{7˭!74,BmD'RZ d8£ |xϞ=wfffZF1 )R:BRJ4‚okv)cl#uizY)E+)g8p'9wPJ߾e;=&DZ݂hznFzG⑶PIdRKy&F.RƍӎBv6;|-@/VRJ4PNMB!m ``ީ Ɉr? Fǡ*ֺ f'&( Jaܙ{vYon.ƒUivF 6fez{{?bqA٩,/w{zί\cј&k,Vbm̶a àqoVk׮iRIJ$DAEQ[F#NMHf0 j(QF"'/G-uny p\NԌd`"( h !SOsPH`R-yn*@ShyQ'88礻X, !%u;_7¼=| u;vdh4M࣏>ݦiT[_~6Z-+kh2b&yGX,nJR}ߟVG Ba]Tkmh!m޾u{?~^ RX8Sb>KV X>nm{#+ lm;֬Yaddv}gWWWϚ5k-JFG^\~9/~ OJB؞]R0uF)eJ)O)#{쬑6mI0PK)AjG88VVT@kM|7@h$"CCΡ!J{kZ)vn=P^Ai(4kNm1tn۹Ӵs@۸{E):2]ɔz2,vjӚPV4]\0&|_V os+>A^JIx8%lr q;nFY/hMeeѵf##*~\VÊ( UA`^w߁{]蹍rn$JVyמOe/c dXVlu4۶ a!<!\,5]$EJmVM h)p_"' I%A @TƈAJQb;P/kҬC2@3B0*HH8Chx2*v5Z/V9ǍCXz{{lvs7T3Rt{T, /B+WT'&&8V L+b l0l3KKK/9r¥K ڵk<<'{{{ / {{ǖ-[GmzݎY/<33/ʉ'JEٶm޽{ ()Z|ȑSO=U~kG Rrqqq^y商y|aa !lu-u=XPƘ6sj|(K)e\vm={ٛv3)z{V矿pyOkMFGGs= qϞ=wFg-g #o%Z硥W]S_:$bk_vW)c݉=fU73H8 ʠ#璤`>P`! ǃ lj yXNTc:P(SĥKth"!aDIєQ '5K6WԀ > 3q@(YPpM$f2V,{lr'{ ïosY:\5ZVvw~:==}fvv]. 7nٳgeY]VJy+|//OXoz /:=11A@qjKO'?qlrߖ-[=zt}u7,Am&,hDʍl~?fRp54eb32.fR -]>VnSJAzn3Zo-̜/^;~ԠzT+/]ݴ kM;r|jbqJ=BCp"Of㬷h9ӿTJ߹ G&5u,WOz92$J;;?v/3btо*g.~'}+%'݋M)1SknMy<׃h~h0L2:A1M8<ŰhNP481MPal fXdo"DIl#Y0AEÍgMIBJph84ID;l6Tb^'De&XbE3K.o[o"xܹs[̖-[^{3Qյϲy뺦8f}СC?cu~~>W^e/rL.ېC GER@rgX!̄@J)+`Aӯ~_}?|mYyH=222P,oKw ~ߘ:}4Bľ,zo}͛o߾G!fRJu9V*95>2$ haxMRZ/́J'ϊ[4;}n)Q[ Ӎ\h^mҕ GJ?dt~h]C)+>{ {̙T5 kPj%swqgsm9Zh!4CZ>],Pxa7ͮ۸g2q[ʗϽVmH񤍾ޔ19]R7vxP5Y"gHhJL 5M@CȘ&EA-a@ !ts,@4kBCQoP"2`rqh:\]K̀TSl61 #w MNBJ933sË'Me}}}|=ei; x㍷^zV,?2B~q /\;L(gڵåRiqnn<#jE\sݺuk J8g>vBDP!{7 /pa׮]qlllT*)%ucd)J:BJ3a8Whũz%9(yָ6}R ĄMslf"lfs=mv73ca=+I\d2ldYop-CJuϼSnND3/SG^z{f{1T''*Ӱ":YٔL >W Nӗi_PAOJ[$ͽ)RJS1 !"e?hjIB4  8b05 MbŚSr 'dkLWh'RHHO3@ưA"4X5\Fja$힢LƊ6-05: aFu/J14czdw߽ӟt}~~DC)%p'ccc]1#2~՚9sLRsV*Z->11U*b8$aY}}}Cbf'Z,..BL 9nu]ҡy0B}Ag;aȥZ< ֢hTO:ժVfYH>&­jsNrFt kZlbb_m⥹9Dj4 E0ip awZ+V/^y?|W|)ݖݖԴ,;l5ő ]nJܲYj9ʘy^kMdZ,ƬeCҁ6sWuv2*ѯw_ȡEJeR[ZtF +|ʘaQB#PA3WSЦ ky`JQ4b4K)1wbJ#d"6E;\3$JF5Ԅ &\  "Kf@S;t]EuJvn>lB46)e/jC@s3hh j}DS%.c0C[`kz"Mv|׿e˖ q㇈tuuu8p`ŋgggg[ *&d2( Thue&6)%T*V#5f a)".$ǵmFcQ>c"Qg`2#!I1QbI֬(%s^Өd0Ʋms])%RƌRv<*$JTƚ5k:#<Ж`Ѥi'/4]-aA S^hJ+{^qʙ7^<:yIg~6Zaos膵,_(PfP0 P˧xfDIa SBY20M Vmc#M<@B왊T>= Ju4)c.2nlVe\*@8%}'s39C!Dje#j!&0 {*))#-Js 25I J)|o@ 47@ 0uB* +A*B 4D9L-0ҾWN>}_/~6l >. S9gyf^4a,2:X)lL&*ݎPq}ZaGQ%4|52,EmD)E#c긌DK)վ+$%YW#|}M Ԣf㨵֮VuS pZSo&2tI5JAk-HSКj%YEFVNgW\Y<{j%PH0){G?ch;Bw7L0R2JZ)8 / 4vBH)'jvu52GZVbd]Cw{™?'0q>@羚BvK %VZErn0Z&a QE@Ba컕rLX;ȱF@`Tk<*sD IAPLe],]-4!`s~ p`-0OrgUJJ-..9x+=\hd&&&܃߷o\.c47}suUW_]\I)s=#A)L!~! <49#V.#Q8EzI{9ⲃ!u3~VK;KFݼeRʣz#M&fQkd|V,_־۬93?-24'U-[ԊuXf#mdRl9jRjVlШ5{6lnw Ib~Zi)Ba4QI0d0 7v,OJx BI Î)SʹZ3mN}vj)us Rk|߇as0WFD3iː#rގnqL!"+Ɓ$IX LjG|jE 8^p[ "IȨ+#6 nJLla(nnK<9ڌ1'etxN+%.7 JkWΝmmL&3pw/\NtАbp ={vqii)SXPZ赁R"S+"!Y^Wh!w۷Vgϖ=s B{cP(w}/bezzZ}ppؿHT꾉qDϿyZXw|Oӑu]|/`X֓"pgNͼfI9g|flP}MLZqmV!f01,x . nyO;rh>ϭLO5MS -Z9{=%Ua:olwvh +ӳLf^Y   6bQ8rL)L(+KB0:"ݍBЊMu71/`D֌~ύcD",$R@Siu̩^f""!d32sp`(JJ~[5YWbn?`>7Pqș3gZmFJ's޽{~!۶tĖfɾ}zz衝2/..^\r]WuXWh:vtS'XpR)F=p kVFqXH۶<￿ײXBg2o߾|G '{JjmBSZIu*\πտ1BY-*gmqrw рB ;5mȚbBܢk6nfܨˏ(2Zr=@JW er܅}YҚ/o8p`'ܳaÆ9+\ߘ8}ZV,Qz1HQJT BasTJCDdxxbCNNN6N> n'w5(R~O>79a"_<@:͔Fq`lvS6Hj$70j}pt`ݻeB3y>s |?İr^MRPneXc{d3 th/wW/_ w»'Ͼu^8B (l@&N[ Rj"!VJ)KEhF#jid%T2ReAvpu ,eXL0eر©{@T)@̨waݘH%Rc*`& ӄa+hA[40zHjmgf):4y淾/frs'NgΜwm6mF)YQJm}w}r;o]%۷߶m۶l+i. * /p… 9&ׂXlcQؑ&s1E**9޽{J)iPϟwQtX^M˗/{geY8fٞ}=T*򓟜~wqynqLzǴD r]j-7SBz w$6SȔn}|r?vYmڹv`#Ii:o(5+쩣6 &D>cRL@ܩcWVfos{i2h4UTR!J%\hR97L gm3YdqG\!7-gߚ* ừ{+zիWˋ'?_{衇rP,ڵ[Dܩ7=onݝ㶝%fgp{~ot-ܴifag ]PSJ~qaGj.-o蛝2d7gJ=4W,lP{ݼ4}y:}4UZM?vcݔvd(D_z0Wm,Ӈ+t @l7 sr@hA6Š2<{"!d{X.<pM 'IILg ұ I|5 Az5_BR!~pnDGh+@j}JӅ[`_8gD]j)po9>>^;vfM9笿SSSo~N>xpǎ3L_b!ml*蟮3n6'O77ϝ;Jx @RJ{ФqdBZ_ti1Ahb8hy@ÿ@ R)#eP"A|$!v=FŔ~0`f[<>j( [i֓}a 64iJ=뺭3O?kW^u4Msڵ?G^xկ~G4#R (rљAjuȑ#z꩟:t0Uz!p1IҒر+aXm2 C#܌x|a>t<?:uOobW;JY"JnJ4$昋eME+ -gצXz$x-B jՙ_M^P"XH1Ӳ{7 HNv_[x&p%cKB(%1H>8~vq~_W/sBmcFZgiΊ APr|_[͆҉sgĽLz]ryZV<ϛj0NՄ FƶR[a?Vb'R JGaE|pS^jʉ5ZKW:7  ] Ё hґ& +$W^U,"Ck uV*R*ފ @=`qQ$RZZk*$A8Zm %Z j5M^G>s܊^J)=vXҥKg}v\.SXkfsnRJYlVJ)!=k\vҫyõ-%BUV[ s{Q1 (eqTR KKKZ6mv6v<^jQ NB=z}|3Z41R !4B5UT ~\.7MVU駟?ԧ>5{]]]M3,B_mggg/+Gn4RJ/,,G$rqqqq %"j|V5%34 wh 5/O}җ׎?כ۶meYPJ%TI)sȑF^ΓQTLI`m~{v{6oܸqs__L&e"رcUƑR688h޽h,QJZ9rZT7y&S۴=Ô ! Vӓ#ԭhnىN0FMDjmll#ܿ4}V2֯.|K^yso5ZMŞLal]q#!RGsak8J*m]`nۿeXapl̗iecL V)/\N0?qRܩ9VnFvfYҽ~S4@(GbIkvҫ\9Ǣm!,,|I(!D!d5߸6YmNWcL9( Y?qƿ2MZz56n;_c P$,Z&`&`q@ nl }YZ4Le j(ЀYLX`1ŝ"}ͨC ~#,!E?%BPT @"`Ԁv\V hVK@u(_׀JR#Y*Q6G`PUFgΜ>^xF*_x'N`BKJi+2Z\YVYhJaZ.7-Z"qO"u*I۶Yoo9<L<|Ho7|yg/yX*7\E^O<?gvv6;KqITvmn/arzzڝ4zALzN>cvVsMj`ؖGxݤ#P[T|Mi xZKHgϞ={gXZ!9e 1N}RS$&29WH=cI`u'c 2{!@Xz2ޤi!RvFusPR8;T%,e5R47Ml$I<+ JL%>BzÇ=rQRʹ)!d28}zcAтjFGpTJ ,2mCCL#D@mj,-FGOh@B;.3r$BH-Ct xRBު9ܾiCcj ܜPRƾ-^@Tȍ.]w|+_YHGԑ4$*$0I*Q&1 %);D'Z5UaJhES)ߗ\tQw>uSH621R̀A@j1NդAQ fFjc:fDduB?Dĵ$SLo8V=Sܠ$]&d􌨴Qw'a_t,vG:oNMM-wl6;y}Z`lx[7YH E,ل> JLt>C)1&Ľp\()5B-P 6M $B (eBX #Gh(E} о-U#CUi/AI<<806mǑaH88*ֺ-n6ٟx ر?vZzXMW~jlv[ *tп0݇;-&*U"]?IDATN`xtl1)H&StN+Y(`uյNG:"6C#RTn8dDK[ B?/LGZ",Ri<7-a^`TU`ޮIV٠R3i~vĎɫW6NŁ\.\ET*[s0=G` $hE~[QW,(w[NRh@A>@=԰@_vQJBQE!"+T2tQ4EA /|?hHPQM pR%0Rvؽ} 6J)fbjjVMrj-V@Es96oތJ Mi0$Xֱ_usUs#A ֩~0i0D"$oN: :HHTp*`vz&Ҁ"SK!1|I=m:EtAyhĵM6z;W(HT.jMx]x$޽rRR^GI9,\,4 aB]o}~9$ER"%R6EG}_S;@ m@ )Emm;W'2Cd^"r9~p4,W>`W;3{~<\@Q*VωZP#:Hq<@xS:e UA]9JET@: I*4jZPՒp4I ( ?ycC{ RL&ܼyswkk+aZ.MщbMv0o؜2-D\4֓ кym0Vlb]]\_fbm -6gjCEN%QXFٜWhXUvu&Emv,bY]U籶V|FZMHdX@>psӆbgI675qĜDhաj'DajRLvU1p@6fΆ,¾#F@"Ae%cmGZl1F\ dM沋=ۭSB5Rk{Cņ툶WLpg7EqW'|4::zāzCQES?4=[k5VxN$P uRI_AD‰ǃE,1ZY^P#EˍATAemT(bCn^:4T=HȐ@ŁX?~:QHN[Іj4~0n]mn&lM,lǩvXԡ@lNlbf˘sHhr*#@ -v-{{V:$8uwtEeH:\G{Yϕ k?dxحAq .|"k6ٸ2`Y_'ng9Bj8yWЁ6pggxFFF,?x܁@h@6GSL簖i5:y(Zb-j3 TS-۔SAxH@Y<&rQT#UWs*{8Ϯ{Wf^<}:g;DžrI@( *rVVVyJQm)"ejR?֍w4Uw d pmܤNHl6_%ې]YjlZ2r*Q f%C E\՜C2절hFVL^ ۚ9[8Ԥ9KXm\vnG;ud(5-YagP:!iybvטrVAU ~٘y9z>b\.p8GCɆZSj*m>Z™I~^/BLĨ*-b7׏ORdY sss;00x$D"@ lD0:z}EsyT%I#, C!r34'V6U$?! ;55Ӧz#֌ P/P="4Ԡ9O(ữ>GA]oB` ?.JަKKK+Wlju Os KT - lu#iG$ '+¹-^ m6V!}ٺ3Ss':R,A@;6J԰?76n8X#aH,gYSud5HЃi6ny; aOT K~ǿv=q#o|I{*Ilhme9M]Dw@jHW u/Ԭ澣 "C}og;*ʕ2dY,F=VWW[[[nX] dx7$ae۩։!VYq67UDNFHͤߴ#t8btZc햓Z\Mܕ:R-ff5hV0 1=O/C#Dveg0hG+1mkg9XCwCCCE8CR|>;9,C}^lK~{Ԯ  9QRT>jSDDx9xÉ~;< K@.Ԑ 2j 666䙙իWE `CW37hv+Lv"s/S+vb\F #CtA"uZ[P6O*riIi̸@uPD Y}AIܵ6j\p`oPS6ʁ%$_a=Jm={P(4x^H~?:4n7?}^,Hrohsh.pZyiP5)A5hW]lOG8jڦl"v픀IA|~A 拒:}vw!6-ܛzS;?U\WdY~G}TD"IZ H?'u/Ex?xcm^!x3p\xJ]*N؞ .xPMRh(AuNSJw UCjuqƛo|=.R) Ȳ IPTMoݺUI-//Ve ulC@\ 3:,u3v 9}=Fvfsg-&q)K044x< ǃa+aT*mΞx+h4'I1H|=0'3X@ViQ'@^#DNsjYFV*^]6+GS+C) ɓx왓 BIh4 ZO.]ZV,d6/R}PW $ ^ɽD-;@]n׼^XXX?^GnNܸET]ɨED: ޮ84ZdA,TULOO?ynzTHdJiaccBH7. ,ck+bG1׋D~?5 js>G^)Z "m"ap$CS j%CDzxGoSUDXl*j|>OWVVJX\p"5h)hMuu&FXݫo6y뭷pkkkA΢v]|;NSw4Η <T*ܹs=3_גuވ/=āh.4* FsZG>\vzzzykk*,@+|TW ;!Eg P[m.iҭ[yD"Q{Nݒm7磛룓{trnuۄ%-ů?>oJQ BA|=L>?22r >9׋x<0w,fc#GMVA GbRĔjVFLj=& N3'1>* vvv%DҘϯeUU:c۵%~[` JuGa1Dnր DS^|Éx<~56k5 "wƧ0&ngvPiHPx!uRI*&9qHQU@8C;gx [m#r|B9JWVV.\H_xq5ϯQJ\pZ.sF  ܥwٳT$p!Q\?o c5` |yrr#G x<yy^aa( \Y[XIe/\o@F9)VM h䧍 #a7c8=1qh~.r|eYF^G\zƍZX\(-N@Q02d 20hH$x055aq\ZׇDi&g>0b0<6>>ԋǏ$H0xr<8qp].*uoe|;K+X\^6RyeePz`h}K yAb! P?Ga`?{*2< jZ "4o/..fgg7WVV6j:d7t"ddU댱1ܙ3gΌF(zrrJij1  72ff|B Z#^H}=Q 'P?z#Anx.ڤ]jTt[5J>l3˥E |N[b2r!1000tA066I$I Dm@>611O<ѣGy qE(sB "~?B08kV#֮cTDBRI(`P@&QnܸQO]vm^%,> -kT~/#C.1HԩSÇM"̿c"yO&ɩ'NLqo"qy<7"q(v]jTi( :j:jZ$iSlPY[[...^d2iUUM-zrn2000tH$ILNNȑ#E @09e8x H;vllhh(]>s\PLfk^dJrF}iiigii)m4Yh5zA,St]})#C@08pq$ at35k/eVessfzLAsHYyX%#C/ۍ <8z( i"L"0MJ08 h"{{{#X,F`Ptݜٍԝ ? ;;;\.Wd2l6[b\ޕ$)`F'MhY9h.Q#6Pedp.2$Ib'!Pߏ@ @ h4P(@ $FaJiT*(J(͆rJ$5!Ce$CY ]C`IENDB`KontrolPack-3.0.0/kontrolpack/images/network-wired.png000644 001750 001750 00000003325 11426532120 021243 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATX[Lg.k\ 6d FtEZ)ЗjCVڇjH]U}jPiDJza%"LVnl15YJ~ҧst3_ȳ`mEQHW @4xڵ杝wۿxV[;vzU|ABȝދE`#EQ۷o,>\O?oih AAP-zpB0uvv6P($,@Mf__v>w70 ]AQ,ܹh{UU?{nzx9\6 [0?A[P0LАI񱮮.oaqqQ~Μ9c%0j5M,E 0 q4 MMMBOO%J]> ,ߨ*xaLMMAKK P.A!MhooGXDPe'NիWA ø~-L&fBNq=gnCQ@ڸ+!ɠX,brr0 Q1?d2?|{/ `ѩT*ikۻQT:DQD<GGG1>>x| KKK܄r_Z۝pP=f;wށrڭ$vE_ Ah!DQaeY'7o>б{=)T\֒Yt>}*$DQqD"@RP((}t:)YVp,K C TUDb ][[}>"P(vVjTlRy^Q߿= Z2qT;LoJ7Wx,p$I21 QHIRyQJ+ù9UsiXRY\tyEQQa ԛPs~5Ƅ 4O]U|~m*+ƾ`_> {uk2(%ruIENDB`KontrolPack-3.0.0/kontrolpack/images/exit.png000644 001750 001750 00000003275 11426532120 017417 0ustar00000000 000000 PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<:IDATXMh\}η ƶƑT0&'Q0V`hM[ȦU7M'fM I?tQhCHƦ"""nbۖFo׽f43 =p7ͻ?̽ 5 \' D:~EѵY u]\Ƕ1 FJEw޻Q]񕟲H"" C(JGH),bիW?ZyUQ 4M,BJ^+PJ0 ǡ\0M !D P*fn88XmH)ZwĴ8CXIJڡ7 #@T]\qض *Z*ض8Q/:3iaf p'H'Y`w /1! TG$4C-4quS'mn˲zIss?oz7oR8wwߵ1 Akt7(ƍT*fggq]wrmO33;}@K#v h )_08qaFGGrܽ{y}>}a4GOh`YmI(yzЛJٳgYYYAG*?I嗠¶4"R;`z۶assjcnmNL,-", (C6 h ,Bm"Ы~zz8i4j ůfLBxf@1rgxc?@oJ%ܺu ˲r:v"g?-/G3g0 ESMCy hX>K}"O}!w|ɱ1gk>p0 D@>zbҠ$ (Xag?g* < RJn7 CÁ1 b&KKuj'=<;˽~'(W@i^1p;uhI3kyQ{.)~m--%.ׁ ( ! Cb@TJS0Mˍj?GklZo r!n'TU\%qx \t?Oŋ !{"C0 j՟7_+eVq  AG27)%<|2vɡCh6wY2c<15Aa6Zi($_Zk@H;9귔%8aZR+vY|@ZC)*JnjV;Eq!R?9m~ѵ~AΓfBc;~x7ݦ3cˍc\IENDB`KontrolPack-3.0.0/kontrolpack/images/kontrolpack.png000644 001750 001750 00000032214 11426532120 020770 0ustar00000000 000000 PNG  IHDRYYU bKGD pHYs  tIME mB IDATxYdy&.gDYYUWQk(<-@ b O~0`xx{$AEI\Yb67EIn'7"2; ){ 1(眆aH}'1(Y8h42PiázOOO9կ~yW ðl6[y,tR<9PJc ZBdiq(fYvE~o0 Fׯ_>'B~#Zv2 ]T*g0ð98RJ !1B,T2cnvoë~V߿7 nYկF1155u|bblRÕJbZV~RJO(p84{{{jww`z۽v_voo'Jefqq񑹹''''?PTV*cA<ϣR?)x$횝lkkkgkkk{{{?X__kvʕ+ ?KKK5 12yOCk4Mv؈677֮nll?w}` /s~t:zӹ<33Ź̜ ðwdY$I1>vE$@)yVh4t:@ZEC/DEv4w7olܸqC`X~񉉉/...~ann|^og\z lmmbuu onܸ-c4"c!ZfV 338y$Ο?e͡R 90DZfsh|^\վY՞t:?xWzY:OLL|ɓjee㓓J)lnn^w.~`*,!y8砜111J)ulmmmƝ;w͛o8V"wwv}qvvWDž0 i`)%.^g}>,޼!arfgg0?;9LOOjZO}S|2ZJIZ !`A /@+D/\XXSs}jzzkݜ[nChٙ)\|O~ |Gƹ3g077f0 - Sm+m_'q P19 &'j5 AƵk[o!"m4 PJE139_^o Q$Fjjee_9s#NF)xWOw_|(FPkb.^'xO~q\zA8F sb8JȁTZCiP6&R*(a쭏jVkV j qHmIQcksn.<+.0dY)%%<[j,탃~:ȿ;Sq/N:NS/Gpw9?'ܾL/-x~I[{0Ơn}RB)E ! |PJm;3">r8׾sB6#>+l6=F.J k˽i(Ud׾&ʁ RkH)!e}ƀPJ%DQci*fIa:BR9J)kzy^2Vn@g +_a.//ŋ?5;;[s.?4+aA3DKxG<|?!Wk8o*hGRVJ*C)@0!(gHE$͐ ,نSSSjB+hUV`8z1SOgggŋǏ7z=<?o\}8$ F .㑇48Rd@; 8BVF"_ I$͐LJqݝmdiٹYaXPfe? oo_z3g (N?}xm (j ssx\ 81pkbeehΣZ +8YfJ*%m[$AfH c6W VT:ATz[[[[?JP7폜>}w/_jhYE o&ȴh;8u$xy>@HtƵ12'1NOkd 2ceK@k]tzRj TEpځo`$i(Nf~PB"@))2DGıc8(s/]y !bAZ9?{KK'PV;r4v|64oocеrafQf t:nKAQ#IJ"K"FBR@0 Ƽz޽{gcO|133O|=+W駟wlv1L$  ,8+nA69cЮ)r'(CX.p"7}$QA$E1R! RdjH8^׫j _Giuպ3gL_gy/2&2pG^$:2rhC@ MAO`:E^xzܹGͷE//fѩ;v9/h3[* P 8xJgAk ʯ# =yc4`C3c R J).]gY$,6arR ) <%"2B "M!X ER`$ ыShlmVazjdYZFgffN^pcߐRڐ/;vT)x4_ĕW_nQ*M~3P⁇ux Ix>Xπq(9㠌2(`Rؤ6]levn8= D&y"@S4`)!xAh- Zd%%J(~.*:,zŋwʕ]r'x__cOMM=277W ;w^.Bi2K2PCh c(&!~) ƵmLs ((5` <0`V|R4+™#!Ұa i 1HB7ш"-|a%B2dCƫPA: F@o#+B1Fggg}яݸqht ˣ'jv~rnnnarr-IRkq6{CĉL9(@94@hT3!0  p(AQ̃> <(ƠⰍ 'ДB@$HP, 9@HC{p(bɞu4肈PdJ7J0EHJ"kZԩSϝ;wqss_IRYl4ζzz;{c01 0PAAPhPpP(0˳9%s~n )[i{3 b/LLPP Rpn[k0HMaRRÐT4w)KGA*:wiTmeRFicyI/TUOeYo]Go0Do!cUa&#  1^*Y!-4dLBO͠Ik$ѐP06 Z3$  @2{D)LX9)%!jէ+L$uqs~1 Yywn(NяS(i0Ě(XF4|b@(#SHIk *5 4B'=LQXE#$ HhhH IP9})gQYO[bZOMM-Z&z&cJ3 K֢0W2N0 24 G={,B?c p P tZH2 )'x 6@jlL $MhM]$ _Jڄ (7oa鉉9}s$y=ϣn(&,;LeeA 8%a5 BI\ZLl1G AFW >^S2mR 0Ql/.)@0MN~ H &JՓЀFcV:*7ᜓvl6ӄ1;{w1FH`%2Uq:}H/C<P<3GJ(S(B(fl^iz*G"X9oBK8!$ihf3Č0$vz uxq=m(eS vu14`rrr& v>sI*MSh0ű5ʲh% Be@q I<ԃf3c;=-0 K9/s bL[\)dJfVedca 0b`+{\$q&0cȕJ5NqW9!QJgcq5fBi4IfQaR4`s߾8 H5C_N80<}ЀAB^M>|Xg]8Nșsa|* ^'ܳhB5*D$ V0攺D Q"y=6J)|'FA@ccM)J)i8)2! Ʉbw#@4Cx>H@A6bA]cc+H'89`ĽƘUK7eBRHa=$IE $ʦҎ 06\)md-|W<ϫpJ)e5!<h)%R!݀K5G9n{qCH)( 76U99#u>)^mo(BkViDF*w'>kCQQH6m[QF 9UJ)YR@ʘC@&>$8)X"O3}}8 ;#t0,4@JSH@0i<ᮀN|Opߞ vvp"*3"s]4sXPĵ&чG3؉x޲6 F!~%@Q)%)4#06hBgY[8^qoo#0JkBQF4B<`ȭ;!r~yNkq7!6au49&oӥatV S`)q盢ܑʮ\ɥ3q;(n'y܄NeE(=%AŁ{qIۈ~me4A1wj? qR I"]H P1߹Їϛ c}WKM1q\)3N39!Gی#f\sIoqVy1P 0inHGU+1&%hcL;QZ@>nFqWS*c ݌Єf6ʶ8?ّ)AFs|2 ߯s4n>-o+AyT+*;3^,D$Z) !:.xsjvX޼K`}60@qJje\ E.J<:ID8#2Z36-}h`pRXMg=reWk!<= r5q, iju" !]890Desd.ǝߑ9 ɶJy J@KZ0;$/ݭn "g?L88p:pqHB bhGKdf4-m3"@aS yvE%ngaհ< p8B @4Mz"zתf"G4c[vC=ʋ FBH";BK-7|gr{}Pj#!$̦J;Ƽc+kqzߩc3y`0H,$vJm,7J+LOu0;vw8L.L|ych/t@ lH\7/ 0+#D84gҚEn04_6GR#hը،=`/ (2n7β, {d$J=Ƙdif)}?%m0k{J* *?S$0H~ t `N`?KF@qd,e(9.%JBKUBBqgi0~eY^'YER~-4]mZxG!B`0Ϗayq0ZS] IDATlq MA *;Pf) m`R[!pf;@~4V@ xHSЎHWr%0"ygeq)L41H{{{PkH4೾SƘuJI]YT- e9cr80(dP )fO +TjOv8㌮Y+ H MP<%mͳKQkUZZ@R)TXǣlooG~wVWW.]* < 8?󳸳 `t`4Qv/7C- GolIM5w"I.[SNjσÊ?T 4)e8Ka#H$aQat&,D%pBɉ&x;[[[hw*3̍7n{#MzSTT.Vq^v {tkբY fsa"5ǞJ.48*$_EJERvh#]JWGrٔPa kkj{8l8xww9|ʬ וRju.MSe,2nBGG Q% Z{"2K*@*8m6*K E s.0RB mKCBBk2Щt- &0IL(mPeUFaQ#mR\3P q>?08䍍$IVLVcI@L7{V-@V &L@|'gL< H &2P10>v ,Rk8_%tZ*?Q6Ԃ-Sڿuᚖ ]٩V?p'/RK)1#z`)yww7]]]|urrbZ ,%I$\>]DB=K:F{0"a> l`FU`X+ é5k aT84FTTH.@(+& _VP3a z4Vڂ, L$ ˆH#Ղ2qf88Q@ՄX#MSz=߽{w7M='9zӧ_xݮ5 d 8uz{vknխZܽxU<|hJ?<840&*a(T YBSr aZr.tC\ ,=(#L!`W$ECK% 0l6.bey{(Q7ommm~>w\4`]68}󋋋7[B^RJ[1EHϟ]^fVC&@t`ք|0ϊ^lڊ{pWfFJ)ΜXn8ES1 Hei7(#+ed =Je2 L](8S/a^G&buu5y8@N\n03==@٬rInI)17;F[kvM md%Z(K3d6;ۤUKZ:]*a ~qN`Tf6锰eJg>?r :_1B }{[/›ƘB$Ib1'η0 y|<TV1K2Ʊ3J[;5noiT-| %K9]g]<6'!>ş8:$)(W߿MohN-..&''/Z&څn5q|a<?qۤ0MRVZi PYjMA : PS<O_ΞX@؂X]]w7_R<SZBH:==tNj5VZ1`q~fm;+jτshLM90uf.3BZ1mF4ΟZėsG/Ad*6gqppp&MĚwvVNsl e;1K1lvJGk_gBَhJux9Ez)cZPc L N.K4>' R"c͛ٷ7o޼iy ߻(R FJ~\׫vBV }'sh$ |élO`ck;}ۤMJ⨩[8z쓘ۦ}|hmKpů'gQ <ɒ$Aib矿e-uqa+h${^obbbn/UUy^tEU+x llﺈVkʵ 㪡~k CC ]k)Bby ]lN N-W~S',{H( ԯJgv:xj(~q ,SSSL,5(Ѓn5BT}BK\k)KC`!ՐSBaefXY×~SD-6(*vIy7gy]cuo,z2h4ʂ @\VA|EJ`piLupag ;xq#TP2҇B:o*>7;_g%ޕ9+>Ń+K@`ss~rF37oL{Wv4:6ܐ~iF!aWVk^2,Aȅ\c*Y>?dڔ<;}b&|Kg0M8on߾=s[/htQߗt]8@l~V}Ǹl=g gWno(P o+rF P\ҿ6jB -rm>+Oᣏ_666vE*vΝ;yoz;NKwpq< `*rRJL[xE4ٲ ~Գ΁Vz売OO>SƗ>ZE{u â$yΝ;⥗^}xx'(ދQ8!$}*r J3qi,M3$M$](DZ#@RN ̶x ~ů~cploa{{Ѩ}vw:7CUZE}! `[E(nIF$;t~ϭH*m.i8ʿzܙ$+($3PrvOԧ=6lll?Ni>Vgn޼~{v\VlΣNkh{{+Мu#NM"m bfA$ ofsm\rN׻uO 5Oc=ɋ/Z-aQYC)dEzF)ֶvq&^~nbuk{]t#R&H 1B14!f:M,LaeqΞs817fZI }tby2 icssS^v/nܹsg=I57xk_ggTrONMM=#||yynYR}M QJVF 9L N2tn&6vbJy2 @^DSm9LO4P TvH|Inmm-{w\"zR!?O .%wkd'Uү) KS$iZ>^438_vmի;;;Z-\ppύ<'?N'~\o~< 3ǎx…Kϟ_Y\\LNNjʠ'''Vy6Z__O_~p,vbU \!{;E<ㄐ充.]zӋNu/*𶣔kM՝0|J)w R7J)-CH)3!DjKdI|]'YstsWZuKŸ|8yiiclIENDB`KontrolPack-3.0.0/kontrolpack/images/finder.png000644 001750 001750 00000020515 11426532120 017711 0ustar00000000 000000 PNG  IHDROO4 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FxIDATxy}?WUù8$E9"EY:,رXcEF`A.Bd `$#Aqb ıs((EV$YhrH񘙾xW5=3M-XM4x%[k{[[^or仅{4$ʑ#G1fy`}wG}Tx;7RK̛Ħ(#GmpM7N8u7pp;~/YkSN}vuuS@Ґ<~opEպ{$I">ӿ-@{]G)$u;miiszꗁ灼UǮ<.)Ev|82N<ind )n]ˬ\Wݺ;%k =ygϟ?{%`&)ś3r39,2A?2);D-r)(3fff`;EQ?SUnaBT ؆֭F39KPQ4t]ƥјqDkvRdt+Ȓŋ?Y$!3>#G3h9~JttCD:p D ;y s~` Yt٬PyC?I6/!b[yG&:Gޣ;j-΁J4LNT&͕~fF%RQ, PvRb^3|+!bȲ~=K *Nr:ImGL$/*TdR \"Vg+P+6! OY_{U^~}ԀL$5zrT&vrũQ 75 fRL#R"1ioQCDƷW#+/>3_R؜ǘӉwj|S|S v/~E kDMܦir;g0T%&33R(6 C'Ɇ=]n(?ykA+9ϼ;=`X7 (xK&33r{QցLwJ@f7"1jx9%-GU`(TZY<2z?dp'YZZnjV5DQb(FUpNPW̛-s*)13oUAm h40(ep3 HLԢ^ʰyJIj/%fBѸֳCЙ޽7eP6ivm< WvbYinM- DޤduTq2>:<m'ȳl"mi RmM`S{ܩm@p:4 ȻYUG$e._=ڂ{odqqW<2/kL Mr85/!0c 8ֶ*Esw[؉mLf$Զ0וRYGO s1c0QT2Vp/!tv&-ڲSAB>BZY.<E|ğڜ}{U!^U`G"/<stfYYy;y0njoټj5sOՠƾ'8怤V|[8ę_\>ȋ|,NQI*} vVP:P'QJ$Qes! q+3ޫY:ط Ok8_zlg<bqk<өxGWQ://"MyKE8Q'iϢ.j a9xq$ԽU`H¦E$^|/>Ag_UZ*ͯmY֓G wA W^gg|3wqs9*4, m1~Zػ"6kIB% =.;ɯ#O|/橯g)9>GVܵX<%yT*+L;aVkdSҁw10qB8TWTր/(y$X⬥]xog3*kW.(Q^}/g 9u0,Tʻ>ΞseSiE/x6> ^a~J6\f=:iwvֲ{ 527쿙pX^yfffɋ {cZG#e93>JаJM:_W 4q8d"c ,쿋`LjͺP-yT> Nm_qϓw~~~v{XiLnm&UԳ6M*3j+j8kWU*[e-Çbi%dުH(e7DQn<[: .|侞1¥Ieq|S[l5ljZsXJUF7PP/Nk;9NW%BBZQ{ޯZΆ\X=bB0p5}F}x.Ӫi TUL Άv2dũ_&.2,o1uWHBg&9η9tNh歛%vIR ΔmIjnqe׫\ՍT+Gmv) m@N˷Oo oCe8s!ScdZqTX^UFc TvT҈a slh"hUr&Slɔ(К{"Nj/(,P&-z{\dig0줨Vz9:`v9 ͋;d+#okQdbמ\9\Р5)l9jJz,<Zm2 xa8o0WOE7E$2":'gLd~B l\kY>N͸&h'q1;oq@Qzt;wbcnpΝ 2Snf[KkgGɫW+]Zw~9TWrTSyNPEKI| M'1E @7Nzt}&bL5$/fiUZƇV)>WLqW7]4YxSL&3k~4c6 rG@(`CR ~S93{"dw}>DZ5@2 CQE0"R Ģ1aT7AX Z[S(LӬTiz X37|Z{Iv]wifffSGXh8sJ( W`;6VV wѱu%HaRmv,ضuy(BH (Fkj, X:cmmm(*b14  PP5&&]q?}3~|>oNOOoz2*DQ"k c Bs LNNxw2?'϶=[0VL-u1c sX]һ~l1|ԩWB人V*]@*  uEógM#IDUQU( D#{.^U |,,=T ÀRC +W.{~sppUet]~Fۙox'n(Wm 7f_x.BUlmzT*`Qa' ob+rRJ)])բ{Oz*|^IENDB`KontrolPack-3.0.0/kontrolpack/images/edit-cut.png000644 001750 001750 00000004047 11426532120 020162 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATX{lǿ3;ww;M b40U$-U*"l7D@CMTJ64QԪ"`@0X6=vwf9dvl?]ff &ٵ0b/Gæ&v֛c9M6EƋ5fr7<^SI^S\V'w,TW\mwY8RJڝ{/}ʯJN55;Tۂ3.;lۓ]dP!$JKK5'SkJeeNW8R"7ap83%߹sg tWn0!Dzz&RL @?oHHiZXUҥĜƜ g6E8'P8@O8BJ CCAA]5SkRBSss٥) oJ-uRuuu?-`S˖L GunZ'*q~ƆÇtUR0Ŧ-$Ph25-5!!|͊S[V/DŽP hjjB %E=nOA]]:۞ʥ-w)%laD&BENi2cR"aE*7e~9XZH5ѯnթDMUU/ PUU.sıp|*=HR@uKrsX|o ! ݾ~SHt{wOg0 ,¼B,(uE"H)ii-^EEQӲk%3^xS0ݓPXgkXp9k}_ ndBL'*e +S\N'] B5?!Mѧ[7n#TQ,WФC(CDzRS^ @ڻHtFavCKw{_R !h z@nS!@ @EiHN~dNAsi $H{9@ngmmlGҎ`3@t[lRr} cÙ99ߜSͺŹv7`Yo% YV̟5K&{zA]Wcb…yӆ$`lE07Pz:1P@H.lC`$WSؖef:|>@OokkͲh`}Z12P7{Nw2SNɌ=3 gL۰r .LIJ1W~>>2bL]?K?{4HWIENDB`KontrolPack-3.0.0/kontrolpack/images/edit-delete.png000644 001750 001750 00000004001 11426532120 020617 0ustar00000000 000000 PNG  IHDR szzsBIT|dtEXtSoftwarewww.inkscape.org<IDATXW[]Wuۗ9sfN3$M&Ѧ R-xy*} R+} ->ւh*AHiSۦA3Ld.͙9s}u߇ 3әPeֿBmx(C"Rʙo;;o#PJFU`l?z0"fF3_Ms "h`fcŶ&{{ z\ Q k-fggeٶ"yFFF+O;gxZ<=6&8w=}m ODӹ:Nf_wn?8F[crC6^g]f.v3ϝnx:[ND@s։{vt>'_..1sFM(X9!7=|= 3;rFIENDB`KontrolPack-3.0.0/kontrolpack/images/go-jump.png000644 001750 001750 00000002723 11426532120 020021 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATXV[lTU]53iki+TmR@J?L5ĠclJM aL$Ah*3myX>g:<̽0SNv9}{f?7]Hx~1 9QFO5}JC' }jCQe8NtuojU)!5.ٍ*D@.$Kqҩ' /\Xbp>U L`a1<I1Bc~ $ D5esrDg)LŸ QLHEhmkS.^m@ཟ!B^ر2'QZo93`t(m5 ;ŸϋK/x^4GXՁ=kzS*?~h$Ui r͉n0;9r L* <ѣ8k=unkO~GJCZL|aZoQ.G-ߡob? s3 'm\,>HJy#3%'kḻ89Xѯ}64{KC09! 椤%5u RWs% oj%7r"٘</XOҋ\[}Ml_ %*8pg ]aXyљ VaG3!^CC$ɘ{NS# j'>yts@{c{4S}H:dlj Iԁ1g& |@t uodВJX:FDQm _|*a2#mհW$K=[)aӊ+z}$^ICtnq o}; 2ML=P\ Ӝ :U)wK:]U  BXTj&x~r\kAOuQMY2pe`Scy# ToM(Y1N{eT4V`.cc<ޜ|_#,FƜ/B yYO>u2%2,g#ڻK׭C jyS5֝`m\XpS@w\2;Hen;%/Pb )٦,g6[gKo,tP`M5U)HM9}t%2MF-i@CV@dH#miH͵ &! Zh積EOid78D:hfuXb"g"@KF-Q<_m-}mIENDB`KontrolPack-3.0.0/kontrolpack/images/dns.png000644 001750 001750 00000004640 11426532120 017227 0ustar00000000 000000 PNG  IHDR szzsBIT|d WIDATX՗m\Uu̾L;vBmK(XP1y0FjLc$jHBbbB@` c1by)l_e.mnξsۺ@!<ɹ;?'{lr|}۶}0-۾@Rʐnny3A _ؿ/W|Pt.8K Be)E.3ԙ\HӴ?㾾'+n4ˌ_Zљb:v2:!DAPB㾽y# 7??2ozv4LӲd]'/v֖(+:xd@񐤫-GGN?b۞{C(?SO;Zn|+S :$!K>"lScjfTMXc1rJT"JҖATo|+| R* $zh0CruVO:IW=C޵]":(ŚϡպGSNfJ!B) Vw ;alvzeGlro\@+cDtAsHg}a|CST"Gڠ0_AJKAB)I0-berbN߲w?9iZqBq'r8\*TjB]uWH-H)!Ղ_** Dl*gs?]~fu$P&6a$'!BH|yZJeHT ?%d)LDŽh5tbP hpL)&ܜ`6TW\4Gnr=B-׮#?19]@3L E,lKqc&#IM֠8=&ǧ3Q{X,LLOOݱc|>_\xFŬGfL+qN߲eekWumC73 >Zl-h8z"i[1&}ߟT*ErN -X¬wdbvRb>53=L OiTwvڣtL&P(T}?{;w]L āb3t=v| hiŭl6;$PRs5!‹iPs$gP*Pʋt9]d.Y9ToULGIENDB`KontrolPack-3.0.0/kontrolpack/images/add.png000644 001750 001750 00000001131 11426532120 017163 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATX햱kAH$D+AX?B[CF+AA\aai#v"B,LD"hlryMv݋Zx ;70cDU۳z?v{:d֕3vO"ae3No3A d홆9{!K|=Swz"(-g˙Z|w͛ܐOK1ђ<'!${V3K8̈́ N΁u}'l('Aq)m/Ǒp0VLq &o3 s R7~1j>,$jt mPcT&tlV%~~3# jiw] (0[@ 4w$H^wIH|4N rZc'2Se_T0/]X&΍-OV +0JOhC3o? WLvIENDB`KontrolPack-3.0.0/kontrolpack/images/update.png000644 001750 001750 00000003226 11426532120 017724 0ustar00000000 000000 PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXŖ[l̬7k/ǡ 6KJAE*BJRjQ*PQ Eyh_EZTbPZT$(RIe!4vl'ݙsq|51#}9sZkg%%:zD! 0mJ!@cf:LC.qGI¾Fڿ/=n^k,@o KK9}ue~Hnm9,n3&N<3󷇄][J;D@j2N>%ny7£D 7ܞZz'?c/ CKɝ-fń+?XZ~ =obإّAˎےGό |{ǾpZ i=8g$L@9D83LJnhuA裯(#;ޏۼ{C"a%D5[]: PG]r(D䓨o46!@/"Uapt fCqd8TZ] 6'Dǎ^ 0l(FS mfG.D<)jTo]Dnv7kim4oj_M [X\R[ǽ\:/?V%pK'n6RPᒉ?4RX_.߄Nfxo@]~Z?+mtqKB?36i[v=5Je|?O$36*ϥ^9_F/#( 8 gKAZEsmбUiJ/bhB z0_|I}!a[FʿAm/-wS5uD o" FΞJ~eBՒD]`sP \&#YWW.7c~a ؕAϋ|Z29r%V< >X5%fE :AQB;[ol`!I{nbgVꜪ{|WuvtwjL%^ꋿ}$kg~^ CڇmǺN<:Ic缾X8FϸOvtwjC>;-(UD[vtwӅW^{E*+7iYzf§ǒض@[G8zi閧ůA C04߁]0[,< q7utŸ^K--Mvp^+ic 9oGCSےx@[G1p!iϞfD@,DK8dd[J-P<|!TC`|Ufw㘻s[wBH(tRb>~#;>6'g {q%Q9(PaNDvs nv}~h?} L=QpFc&EgGܜ3p{;&IAETp~Awm b4++)pTanaT};@DXLʵƦJݚd dT7kH3طۅ\}}ShO`] &xZGfbQbM Nܽ'®TC(ʃsBm7bmU$rՖC1P]iNDCa;a*VO^g[u$-2? PUPlq:B gm,f?]Noo*`FVk9?zp7dYC*$k()P_WՕiC1 Pf)mr:V_R`DÝS*(@9dQ@nG%"#ܪ08@Ot&P;2<t8jH*2aV Xp * WyxCDӳwdh趟żSPvRjuG"siQ{zӪ9n ߖ@N"hwbɊ*rwXa.)*f"Ғ" ^Oozumtߗ3$@P@Oll<~% M EWR,ch8w{..KW9Fic:[k'bnki:MYٞK|/?~gkn<xN@2DAbf:+U*&rةamƧ'r=7B@QBNB dDd'E+hΛ_0@@-øf1/ s,n5~cHiCRY$h ekq]!nnOÍ1(n׏+?Fx~2M|"IENDB`KontrolPack-3.0.0/kontrolpack/images/windows-computer-small.png000644 001750 001750 00000020047 11426532120 023076 0ustar00000000 000000 PNG  IHDRPPsRGBbKGD pHYs  tIME"HIDATx|[יsڷxË(lYl^ :0 E`ق?db1d'X$+;kz׶^ZMREr}9CUtOHiH S螪SU_Oy_ ^xWJ9qo lnn1Qqv 8?Dψ`cv~Zk؝\,mf~N:KP+EQT{ A@yO'AgFmı[p!hO@wA4 0D#ۈF7 6C(?;CsU+J {{*FU9 !`A<@78|$RRihLm' .sC[ VQ@ $j ?^ 3ey?i{#xYlmmF^CP)*"c ՘8bC)4RXf n@v~xq4Zt=dY` K jH$ *0cFfFZ+lMB!bqapT A$(OϢ QQ |p2Bh"̂3a6Ƣ~g7~wPG[%>73s Red~fmDv|E\ u@DRTط*!@eK`w {'oQ:Xn{U0̩ ͺpJy;@2"# n klm`k9xfzR4MyH)P -DC~4n[qb"vIp$cX6jtkGրN <&#dAQA7T!^@X aḪVk(!% clN {N@\*!F  F=Sw1duS`:e` @`8VS84wxTե1lRCB*f~0 !|"J2h,5`-,f::-"TF%}NNi4$s#2bHʱ W#\z*cƈ`fdYfA&S t E[6,אR$n;/4ceKA=míK8! dCzZzdK3e~,0 ,C%vc$I(2" rDQ 󠵆 $8REvQpP'姰 D>3ꔀW#pUhm,, F I[#$I6D}$18|j8 JIPm}yjqTA4 nyh-$P'Ea8 (TCڌ@PP E[ QP!0I "h-ziPa/I@JBa-[zҤXk-R վK 3Bٗ@IV@03TߝwrGo]9dX*A`mTjQƯ`EkznݼF804t|_,#j5#M2ቱ[.dv@p\ xI_ ͡.@>OAJe&h&jǗ!:`ːRBZ`$I)e2Ck,cհ%l00 R~7@*lXSuQ톘Y} GH@¦ EcZ1q\dARwW{9ADRZ3tn@De2?NiX I8dH@ +k>i`znښ#MjY9  b*$/(~3FlE98os= pMeپKZŅAFk[r,}Ka WR:DŽ|Up@j ހrr ̯-YuV:Xc 2F%Pq%0 .$ J( 2+3M@M6pg TjpG.B(U,q<]YcpğA;k88yz֤HEɠ1Vl;'.qbKE"X@πE\A$"xf]_0YeFBݼc*9jHs A)FWF+ 53Ķ_-BcpꃇU g0&&>LBEY02YjvTx>(|*fȃ`[Ku]83hˏ2py%!KA: 0/Ћ/_pXE:v hpq׳,$ !Gv&JIj`,C!f P`Hi*_ !aXfИ1s[LCPHqa +dV"@G>u:߿;1c 䂐C8y؂wqĝ2u$йB׷@`_ $" tJbfDR em)1Zn\gu~[=d3)l!&Nn7E#v 0 O\o[\X\}Bb ** .оI,j~8'(TX۾I9q9&OCh#la:{H"j@b5] Ā$PJsikWa kmuee3OHx@ TX)c`ȳy"jŰ]w9oc`'YE&"%EvDs6#no3̶`HA1,mƵ 2jxHadN3 7K] >Ʉqsm*CXJI!:;;+{<Dp@@t1dy-tfSB6<~g!`t 搔lk#fmGB() Ov J)!Ԫ^ڗ'Ӊ'̖DHb k,yn*?xd!$\G3tY84n-xSPNd8 I=Ht i34w#R),!FGqRF1p]#P$5fjpIbxۦXY H֯o /\@S,5`ҩ[io:K`md d ZHŵIjXfHxm Kj333&bii @HY01\g@ŞIނ|p1;{4D Ra&S_ECg;[xD- hǖы7WvMץA6=*.,,PRM5!9>RJ0twM!oXΫ[5|oXYÓTCðۦ4z> !΄dp-P6##Sp#RJ*h"I]u ܽ;w'yw[1zK8~(Bw,Ҕ \_/c{N+Y 汜]JE\`&!DM9"I <9Dح_>A8^>8/E-HBƆж3ppO疒BqPxTxuuUTR/̌4ӈ"z߼wQ^/''>́~WYX'](Eİ ~0媣;MDO “p X.:97s$r@%=T*eYMJIjq+hISv1>vcsqnScz&I {># Uk $IJPQ-/1\OLƤIGc,Bs!МnBH6 qm@SDqD(V5k6DƎ*a$PH$IĪ^~wu~ޡRlEq\6$EoMwpADRq)ALL̖J&$ @(SAaz}{ޟd= PlcR.wQ_v%Xc7<{f4Mŋ}3T(:y^vF%j$<+yW11&}ca"XcE6PD5a%mk(ˢx0 aA$h7nbyy!DLD2BR=q V*HJyzuǩ2Z(ԄSg>ϞioZ#׺Z4 al8N Ju]T X]]k ?vXgaa!jg1bfnyNE74Z!kƘ7^gO?Wɤ>̥qƹp/{<SE ֘b2u=.v:P9%Q>E];wگ(ٳϟ?l6gjh4Vi"eY+,ֵW,iex~_A۹mnnnyh~aSh6=F$6E3ʶm^TR)(8 J9P`}mhmյkWkW8NR4>}8577ðh4z}. #: 1QeY緢(eeRov#לn90s@5STFss7\5Yڰp ly^5lnl"c=-o@ eMN:'O?,..Vq?"88LZ.%vf0ڝT:>58#+ձ6 {<3g5;7a [؍%#8Nzjp(Ǥ|c,R CKKb}v_DQC^+My6ZUyuw5#GvIY>}n޸\to y1`dg?{Gg8 n.&y|?JRJH)*z4‰Vk,83ިAH9 @5!;ΜܾNka0ZQ@쟔^B[wᆱ0FHkkۨ6Q۟ ]8x jX__XH_peO?w`٢ٜB{qLM5B]{W䡮WAB4xL:x6KX8PNˎd'jZW._94~uhu#-u ^NII brr$aN2ayV%m;<'/hk{(Z⣕(|GNa|ڤ}+b;.dGѝ)Zע*B0:?,9pqsz)@GvK,(0,]UPUEU(OXjm#8iRJ*+˸a$ehk{(co񋸦| cyt1lڨl//9DU˩MUJr9 aOf];o}@~[B,<}):;5|^߇(xk45F|>;>h供\(B)}U HxuM#Wƹyc#ãY,[۸B;ݓ9M64.?CU*kmr$y[!Q+8.B‚ҲgeRVײ=T.JR ׏мWʍ}EIF#6Hu*b3 XBb iKL!$U^Bu})Q?7{!B[Vs~(R骠*Plf)CKdlV( >$Ä HCH9xi)};RJlƶmTUAE29#?[0ΞːhXBrk1ԓ'1,A޴ɛ6)Sn|4,k?% Mg&}U;\Tyri7u kY)_+.qi铞^ԥ$c? 9uzRri\TNSPDq}gi2==âd%ac"=ޙ  Cyk[Q?gPQ,<`>y ^E[_KK8,K-Ew,LNz^f c:θIM2Ʈ z3333t&C8p3Yr  à<{'١CCer@m^4|"&e0B~]%Zd9.`4蘦ɅW4;#epxiYC,?~" J `C '>ZB"Xm$?H{4=/hA8> UW;5д}^]Yd"#D OX/La=}c/2Cg`\&ro -R/| /K/>(:Z?uZ[?u?>{(sʁRM }Zv;8 ۏ:1v=q^鼆q/1bk )QX(gE\ ?/| `ec0`t4\bpdYz];wa}b >Lp0<@^pBB&dMD7ڑl&u; >~6n(~XX}ҞHk?wruʻs0 2 V ( Ni-*|J)W5+rB{}iZnz4hcA{_ǿ!LL]ON%HH}kƺcU%0M!zàtNG ;|UXS#T(?>4 EԳ]Ov fm )QU#[I_qM99۲Z0M#`ё(x(YҴd\^Ue/Sp"G!0!k-]P`xf`;Y&E) F@1$d%o\c/oB(p] ɡw_a5,0 Y+ ج3)x]AJDɪTh!̗dEeEJ DZ"C+ C$/CBZkkx)[b- 1J(*p76fI I|+(%4 H!@H Q8>@tDw!!b<2 A pΠ^weqh5qK L1-cz177.XXDhpBCAcrkX4iс&4TBWD U%4p, FȐXAQY.T(Pvlj S`:TUXwv5CocJ )]P|Et^C+֣ 6hM$(S@U Ea`Ӣ=Q!@ h;5wK3ՍEZu !aa&h=cvv=`gsTMP[6n-`Ѥ dX<<P P]S % A2$TKH$plbYSHεGIն-lj/-fI=nTsWUMA8J܄a0*o|X2ZA", 䓞“`a߁l4!k`z_=y"varɂѮoP\-Dx&)W6M &Pki$ :uW]!>>$>ƂQI&y,& i"Lb)#1u !XJI~~+%)T AWoV8`q )T AiL41gMGCTV%{N Ѧ]IL*Ĝ.,D,/ J BtC*JK,||!|{2ժܐĵ_! P' R @ #Pn:TiPIɤ`P]ņeYJ8ELeK$ KD6y6("^o`|| !PBB/Sâ](ʁ1S˓D)/$q^Ŧ4&M[U)م'*DfB207䑚́&Qؔ`J5"!?hK[BhH`娇I+_ҙ* 8~nVE3J( ǹfJe:m-ݒ;@T3 lf, ?O MCQ(@.AN%`@)H-YD" Y I嚋Lå\+dHAx$PiVbQVul4 u*(<|m{]h逝xqVsY!EvhMɚ :x+ٻPoM)2 ױeC A (6$ M,I pUsPA!D舄|}lڷ#p|WeɪEUBB^DDXfA&S>cB=5VK{!";}+ZC(9T},n\PppsoE%>R]4-~8_Z"6lHcrFVjz&v"=_m T^Zt7KQ$ιZZ7 3_W9 +Zt97eQ@oC]Oluiۡ% j T1@)e&-!%p\Y4{+^gǓ fg [:1ahØ[Z¼T(h GŎcIԊg%KP{.=wSB06]"&zТ !l-Z 壑E[0:KP4(c'IFKd&ِpӓ133BM|{ ضslKbp"Q* g]ԗ%-gP͋5 y  !mL1R#J٬n߼#ym80)l]:~^*KzF:ɛYl#mʙC`KTkD>tΝ}b"_1 3Ln p\QA`SNC)[T.#Ut){b!U: Xt4kt!+B^TIu]蒴y# lf(@df*wǭ8u<>ự{rCp:u Q8wa "Pr YPf*c0{PEKZv5l9Jٲ[DÄlzWWbnc$?`(H'_!Z fA8p9(q0I(7kˀ"*%:YyJVWʍdR:: de0 K~TmPP0:{{:B.i sqcр‚> d@4MYr@P?x,B^BWFݮM+  ?:zBZY>`fzഔFiфvLڒIw:e|XMf%b4hf^ p$Ec /'GTQFBpHJ ~|W2Km fLXWY).4$U$HzLE5NQ;ࢆZe H p`Sw~[1 "zS0鑭JI8K۹{2fRlnCɪrWY{nlp;{ຮ,;neQp` d,СlE"JrJB8J*e;p .n<p6KPmB(0&4><ĩ7bp!3ߒD/5q}) ng@BS=GGgzbܑ\F'Ȑ-ۣimpn@&`E$K&{RQ CsPu{)XUvmfyi;rJ`ѡj-'Gk5ˀ@J%A؝@R'RTUs;mg"Re0 JǢ ƂC lTvl_Ȍ*!Ss07C7`&f~)vVkB6$+5(hO ^"Jժp7Y,#,aWQ0S|z蠲 cL$})%8F*..>r[LOC3AG}9,.P # 0S[P.,U.߄C/p옺u:kpnظABydØfXzSp Wm( 'jn+T,E8p)m)]``Z 4 ^=wP בy8LL PSqRYEcJd^ꩳOhrL  KqiMloifp(bsLs2 ռvk=Xt .+8FA9 E!|"uB@QPMK7]Յ^m(lv2vXNoNؿ0J!qry:DjK#Ӣ# B'\PGԟωVK;??Ts/3*44eQ`%:f 74>}h$6 -ony|kחE0Vun0:z،K8)媸 s P,kKgf28=w3&'o[8(售D9*^pҕ:1Tj8[ߖla[%P >D9T*+4yr-f7MR1-6Z:~h DmWuw?(,,Ri;&E%c$E)UyO>d庘IB/Sʗ! x[ibkuw%K54p6GT~{ac5sg܎x{';8}(% ݈P]$k ZȢuc߾|NXe5A\XIftY,5RR {V[Zw.'Ѩ7kC[nysx*&L`=R n=oZplKKX_Ęv"bD+^ʾ]-? YpET{l58~G#pg]世BGV*kf oA0BEqzэܮ]Iʲp#hɭIxjbzy w~w]J\0py~5J`Z^ Ū+c}40sQRupHJyGp[c 6mh.w;MxsGe1}d\q؆l{`4pȋ/^1 S(H$l9  T”|{U{Iv~1G_?>o7}_ľ0:2j+ ٹRv"^7Jh9m|WVb2BSo5Ko.s+x 9|$8XRl ۶RutCVj޳{ r+lRʏX0 LLWfgh4A@]U0660PP.!e7|dYV@^QfdkDP hUXet,6>>ibjV]r7 pΡ*[{)/ZlA`_+]]ed2ylذZ byCS?ClZ].HV!&7] ) aގ)`bL$t SN,"񽀮]-إ=0H$ ᆭ[`f*d2rfH$PU1((+]X+(J(.h4:ْ8wϞ9_=|HN`bOh )r!I)uMyQ/--… ۶O|WU ퟷnߺg˖-5McC,cbri@p ۱!B<cp2ff.E8nc8eU(ks^x mii魄_$|Hu255%,//ɓ5!zG~я~tq)۶m+*mfS+s!"PRBsEJH)U!r7&RMD*@ 3T: ]kJ\6)p, zr_2q[MkT*]\\<9op !!7;fSJB(6c̡:U7rV; /'x-..(p`zzZ`ѣf?OޚG?:$[џkъ~;ZL/}KU4ڵ+9Ǒ#G裏 \E!m_0YA>|-'?GfffVa6Ek~!di{߻*Ho]Ugbi@N%{Ope)%O`nvRo?SݺΠK)%Wzx۶mdY<!$#8ʀ lR;`;c%:{L򽻙@y+k-ɪ/YH)CJK-sf6W]xw.|4M{R Xr8޽{k_o>}T*˗"!sǃc3wߴVZ0e j T ZCၮ qpm{ \նog}/|0YXzw;GGG?iO' iӦL.'Ol.---;sc=V`9܈DĹ3(OZ+Be[@qqRxJUU宻ܶmd(RS|$ Bp%~EG>ǪC=6BF)%ܹs\` ؼe#Ν8k.h2bBAŚeY:ct'N|.aܾ&|PJoi8sO4ikr }.Qbll m;eY҂ſ9|:TAm C=6x]_fqº l޲F6/39=R ,qx}w㕗P(W_},zP(zȑgffJ@A|/> c؊z,O"2@@UdK䚥J !p͛6`lR±mƐM>|{#FV7Ǐ-5  LBڽD\_;5os?^zrCkFq$ĚtXS/A&V۞gޞs3zŧ9~ۥSRJp\Xbx?[^^u8$^5ml:?6hm%{i&&&RmgySǖ[P)!faĊc2"jZ oaxxdkԪu4&ܲ1pΕm۶߈k/c~λ0zSg^ ⠯7tg^626X?J(6lNR/\32t FiL_`[6` ,n{^|E$_]|MY= _ַѰj;!=ީ V"X>WB;wc+02fo~ݓO)%mt~?$IHyIsH/I]}I$W`d &ҞQKrض Eap_u}q| _ͶvE{iM@j)NB~J.Г øGJ9D_Fhͮn+roT#4;~t%lo7?c%@zIENDB`KontrolPack-3.0.0/kontrolpack/images/about.png000644 001750 001750 00000001706 11426532120 017555 0ustar00000000 000000 PNG  IHDRw=bKGD{IDATxڵO\U?΅aӁaBRjMuCJ CL4j31.7 .pν51VFڤa( 3 }skF2cƛwhjتg@58e; )@ ZA glm[ T T'NpfiDhhhHp,:'$`a^o ;Y+:׮\M>F-@6{νqJvDڎ$EGggS~ei`-rug*;t2"sTgOpfPD%⡥+@BCzZbjWid:$l?rB@0*uxkx-eK}Ʀi  G~fUϾ<dskX `Tx`J)$C#]C3}@|n70z'Wzt]7pɃRnKQ4e]ؗp2:`rtqz蚶'qBo^Or+=4nh :6 ̤bƫdPGϼ<o^,J,EH'*I k-MWV{wc-X@Y5[ RcRz O`wv6;̃T*u>bM0H`۴plUw9[&Wρ1O<lݴm@^=yd(tdڎ.¶JbX(\' w΃Z޻m6=uo^zd  a ݳ+a!Usx cwcIENDB`KontrolPack-3.0.0/kontrolpack/images/startup-logo.png000644 001750 001750 00000107645 11444241176 021124 0ustar00000000 000000 PNG  IHDR{TVsRGBbKGD pHYs  tIME %K"tEXtCommentCreated with GIMP on a MacwC IDATxw[y6r :b{cD IjdKRlNJ[v)<Dx/ؒDlɊ EQ"%rErY -K,%|vrfA{_|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|Ç>|/>|[/BEG\_E]%_GW}:_uu]0 sj&u0"PRJ8,RbQ i۶( 2͊R~x|:GS>iΑȷoJޣΨw* {Nw4M F1y缝RJ)m4-9PJ R*)r]ױm۶,X*2Z5U*sl>< Y |/R05BȂ~d2dY٠C)-B>+Wsyr׮]=>.6 gLrT*y?X5kx>c M:1b - Z%¶xv&eyF>.~šC,ٞ핱R䆻]!];/ Df {~ޥ^;H8t]  Xiښ@ 44#ahss(BRBHu8²,ϲ,7YLf*- ÅB\.w(˝LƾO>~y[ !]XS8#{ycͥ&hqܱcGpÆ + X RJRyk'ozMu][t˵~hB\ VTJMϟwyfCMrPʹJTݐv' GA]˸ܔf2ӇeG5>>.Ϡ/sY׬Ysi_p!.|>/:WTߑEݤeJ~Yni__wlBJF<^lY)wP0iG!E NtRJJ1Lw?s<.3E_!C)q98R @h(x`Eo ] wy' md2yA X: iF)5@4b1H[[-˭L&5==irrrzrrp4}3ԧ>ʛoydϞ=}H$ @ @w=YSJ3R˲kZ7߼:*IJJ9'?::w^z.7#EG)mNBx5,AR¶O?=s뭷3E@4~\cmJK=ǟj )W5oDžA '(th_ Rpªi?gַkmm}}}F"n01&DܚP(DR=111>>abbP(4^xD>;ꓵ $fVb.2mmm^WOԕ(yc~ww/@65mXtILd"Hf0n>uRʼiwy?F"roNkkk4M3 rXtqeX\.yd2J%eH)kN4MC0D$A"@<G0a0 qd2MRh46\qǢömzSR\.hu 1Azw/[SRJ[yދ??O~"K,6 aH[OZJi-::]zw|gLE4#Дgyl&N#-Bu]wx<>Up8j\099'F~`rrr( , BTɚ4a  "" XjNH$@)Hi0  h4Dn BӡPDbou7R擵sFճ_(($ /}m֭Bau8MJikdd7JR#qEυ E  H"ǩTiX,e\BE_RX,2!isF;nz,B()T_S}bR @R&/17ֶ;zV_/p_6y)\tXJIBpRLF#ѩbg|xږL&㍞t uҋعs'N?|> 4 sPM !"") eBF5p(Tk .؀[/Ņn ÀHR+OL Be@0 7w=^.]}Ƽ-$U5FSTn.HJ)+)eu:;+z=7,(ٱ^v7 c9*kDٶ}wHԍd]N~M7/u@iA=ϛK]r{lܸ]|T*sn.O1aY͛k&kMDxJ龾[صkwYx饗͛7/ˡuxh +JPw~Xooo2 >D)MQJCx\ !BC۶mݷor\mF"4ӑB)߸K!X U\wjF!<,-MLBю$Z*N5P+Yy6s.[hjypgoڌ$Z@A(qZPi1;]pdYajd=3iWn۶^I'5#(_Iz5EJ'Wb|>;$=ztjf=(v]QHD VI#khp[KPdQ irRv vVji@WWז?.HpzR( 3>g~o:| ށtGz{180twv"L  UC*#RR*!u=Xe ByOL8ɱB.;}ođ#GK/a˖-꫱n:b1 [!R0!d;c0.!ăv'kWg eMӴʕ+ß7\r%BU1E\>W~ӟb#Q7.ڞibÆ /| ۷_ٹEJiGB$9L__3ׯ?FAY&L&/ @gP"h!()8(IB  ! "τRm ;xm3q Ylz]*)gzpd&_5tuL!Jx#s?DLE?1Mpf;"$D䶾/Xbk2 կABᕝb>tDm V\ˆݍDK L|TkWD*9kM Q躎p8ֶ0?c'c8~8&'THxc\w+J8ZO)]6bz뭣Lz/퓵8$yK)eYzoooλk>ϫT²osϋ>U,Bwd-L۶m |K_:o֭D"cqJ~3cRzr}L5ܷPU,5z(uM17BcU+ٛ]mƍۿ/կ~uzttT2AvBHޯ1zBPZ)%coGRE!DwjkoV̓RF-ҫjpp|k_k$O3.&r,,k X˲!l<鹺kFJJ*=WFd)JIyg( <@p[ju^迄f+e>*@(pc_7^7hau.9v8tppҖ`N ߿?8~ē8ph EގeCXv VZޞ$Z0 1( Q0BU=uŻ՛'TeP=]ĢHZֆÇqqL#_*`7011Ç+b<σm۰m+ !975MlO>BjFn馛>ں^Ӵ@QR4o>yw@Դ$cmڴWr֭[?3XNBHEGGGlXlfU _4@)]F.+{SSStcu(ATжmX,MvuumD"bq=\>kmiicJoe2 di[S$ڶ@8t=ˏF**p%mf )%pg͌pG_xnL kfoHxT)3k=Ζ'hU{SQZ$3ak_ lӁ----\;v<^~sA(ڂv 6_$ P R R*>5[Y˅p'd}@0Ma&(F8 ǏǶm۰qFH$r !WJB>Rb';wAe{M+RDJ_|[lٹ0pXʲ={_/Y,Jz]+jUN|f_|s8^3UJRvp&!$\#5M[~7ߜ}Ww>s"4==[L BJBI)J)Y P_4W)mmmظq?:66eY;HLVbEؓB󼒔+ M)t,z2eu2RJ:?? ![]wd2:JYSbsBP(|>-mY*YK,+\uy:EP8LSƵޞ(g:ꪫR\s5htYQ+!DqL&3@"H_,4͕UB$U1M\jժ]{Sw>^(r̛ .M{T*v eiq y^OO@gggvΝ{饗~''zzz > IDAT6bWLsss{v멩)kzzz饗l!D<ӶȚRkGaR&eNu|i~rrR B|˖-ikZ !f;3̉w(DžR-a@)EZ=HU`ܵJJS=R3cm+7E;Ȣ"A)pbκx*ڶu3E47Cfl`%AP9&B{o`[*Ք@J5HDmnכJʹQY/M<9L:ss5f8q8(Y_qwZZZ˷&Eu&C%~},(׏Mc# εpϫU+B9Sqj!G]M^ū+dV1D"Q C)B!Cr0r8l ElݺPTQJzzz>%,J)yر|Np"3BVb19ywgYQU !Q ߼V4-\.Ν;c>z. n߾/d yDÑHd^nŊ]v|>oVM]=666s=oij6lko=MbyF[[[;w.,/~38 ){=۶ <,ˆ<(c̔RzL CLfP( !DX̽ ʕ+7n0 m`l6/{Ȉ"]]]krܸqm۬T*iMJ).o ܚgMPI z(ْZuA@ TBJJP0ƴ`HK Te/sJxviz|{TG8J̺cSU۽?F_}XF ִ K~@M Nox`ul]:B9_E(5NG'~~~߮ge%E習>Gx:8aZ6:~i㺮p%Brj].k{m먦Q-([*M=<=7Gqj.B#Q{QwH$kmmmٲe׶=l6_79\فG(:;;qykL&By RJ *PZ @UT dmW4M <,uժUOܕO>7PJY7(l 6O>.Q*m2l=Bu]lkE{oC<+{r9!P}o c,(|>?O<}.ʩ3ό_~o*+VlYbŁ]vM|>oՅyYC)EU08\ /ƞ WRxlǩ MFf<84jQe+?}pR6D{WvXeD%pJ3c^ , Ɍ+±䲵s\3zj0.V#LmU]Ȝ]gY%2:ᄆ+Vy~X+4֔a۶r[7)|w}˗/e֭gy-)YW?vc߄E)zgM@8׌HGOJJU 2^W mJ'֛{k&Oڷk)d/Q DIٱ [B85@@ӽF(C)V!FX7`2s$ ssG~isv.W ;sܚ\oҶ!4uJx.) ˘µMZY ^-թ)Rxvng~9ZNc8꧹5n"Q_Wx4t XTO|Ɇ#4@4CWw z  S1I<@(%T58NmKjRT*«S]).<WTn !БJb>Gdq=N\wMӰf0@)\pѓ'OP9dcԺUGpZN[43J}}}=hYܓO>y_8UGP믿x\pAS9vwwwb)KA-jYW+™RFԬbKULBٓL!L dRB@ Y5Y/jUR*0+Ee5rvZ qsRA(3@"|&eAs+޽{9G?(3bf|⋏>3E˲'k㖥Rinddp,ku%`0|Eԧ>~cxx pLfiwww15S*8-8 JRćh4]3RT:yzjk,y^9V.r4kd} [3:lFՊzZbQ/RJkFJ)P(dWd2);Ep8L&ο[lvj߾}BP{oc +JlxxYJmmmhYRapY)kR' @Q9Tu/?챝Ow)<\Rfz5 pň[@$ 3JJ:R21#hpuʅԸr]׬kd&O|,%Ɠ )- `H!tY_č1M3]F" rnƓz(E I~^G.o!BFM ;[ZZ>lٲ+Z݆ģ>=ol%GB hmmCkkt݀'$@$ @6+]e--!dLVE=9KU!n*-U*yC0(2ʎ!$l!)?(Hӵ)gPJі|||믿^.O>/Ve޽oX4VC$ǯ 9R=899Y -TD"@.JPJryfzzZTV^!'l6_5SC‚`D4+З"!q۫5qY5 'O,>|^6Ȕi0 C#n,q"BnXE-r\T4%BYXeYK^B{vv#<) {u֭BPkCCCݷv֎;r`!#McB6ZC\'RBnPHTΰdhZe4u-T)׏OURJ.lXQ, Lۯq%OI(:Dk ǹQ)D|j7!3RN9pJCI)BHWz㖊+V6&QJm݁e?s㥗XRv*+'\[k9bƚt bb`Z%WBӠV YsYB"%<ά'kքIZ]WPR BN5ͬ)Z5}k2'Ghmެoؽq&oznVF/ORvvvF8 G;pprEB0!hKAa8܀:5 k`LsH c V (Z5!Ⱥ*lU*k#G=O\\u:.\u׶2`˗A  WJd-"ChMq h[[իxW{W+ǻ*/ J@Q;w˿pkkk˚5k `ܸqg>lq޽vuHʲr7GaiF\'*0X0 5 bXmXk Cy5kUPJsтbjl9,cڶmR,F@0 γkBPȪc[R#г*%]|@ yoѰ14s]+֧Ͽx"&J ۵ٙ#Ȏ-gn1Z~j \Rm+zi3xzH #PupK)$ uAA*%R~|7h"^ jprkZW+M{¶XRD}%~<oOR\TTV,ka71ɡhfD7 $\#h:n2qU 1(㠌 iW[*Tm@ baq^UqhNe wpe6\j\Z  H.S!kƒIdeerM "qp8x͚5/ٳg*ÕO>-Yת!Oy3( 򩧞gg$cVMLxdkO<97??_8~xC*CPGkkk0mۍyd hv3H0Nrg:C7pv/iHaBB6ޑ6R$fff RE.oiiI4M˹Z:Bi%q69h*ǚqR?תza6#*@5̖Vm=M{_f,&VDAjdW&v1@&%fSjRH֔$;uf" Bם?~`.{P^8 RtݨʳJvz ,SxʨYPX%ʵjĥ,ψ믿 Tjc:;v z 3-BU̔2 Õ' J"tAʍIp.A W6OC0WknkG\O<҃'O.$<)Ȕ%J%* =@ϥp=GipxˆBV( @"[f:4M`M6]122X,W#!O>wvz衱GD"c-я~tܽޛ:==x㍖i .h+a4 'iK/FP] 8gs[[.ydDR5!*ַ,YLNRpB;B*zmDcH$e˖~zɓ!G]K;cX9ȱFX³ns'HiF81-keN7ёbʼn'1BY BΉy)LKs5z8nLhwR] g/n]BU.Ϗ ']B JB Jx~wYRDM(>랞t+LֺP.ػM=lVك=EԔW8$pA*%)dB5(ʁj(P RJddQ)@2@ ]SL&%Q<$*1PDBRIaWχVUc(8B"[,#_,!!4: ׬\rkv@wM}NPG( Bޑ]v/Jv{4Mݝp5\5Բ,rB6BԷ-yˆ \yi4F7 [&mv~~j3;;;qĉ\\Md)YnQU<),7uvՄtRqcǎeggg$BLӌ^~\veI0T  [nm+֝{=ZtϩP$a)[9)٨t,XDѺj}f"[RQ _,H<="}@q )J#5D(ldk>1܈z IDAT'ٚF҈\(QK[p$J B t>#232"#3**2+g̊ΌpUQRkZ,?cBȡto6yN]Nܶw`۾CmnW{[(nqr#eYׂ7ӬUTj3tjuJ Fpr=}~@]u)ĭKЏ9ºܽqƾF9yMLaRCdL$"8hfopp<07+@@ 8tva07y079prp<pk$ deŘD6j*UjQ! CAq]PXwڭßgٵkׁ6DZ)P'{fKI:tb؟,*?g.]TͰqb 91*Ҡ3ipyB5zo !oP)岾xb} dFƏ`<(ulRB_2}b9n=++3zKՅeHmk{纮ubkǹl:I>sS_җu̙T*86gYaghQbk%K^Xv90FfD18RAPZ1uWJc紌V8G /{xCT/O^|_Zvbm19An(БKgν /_Ux^3olT-^8?q'jM|wp΃}L&mI۰۶go۶|>uKX(@:bMaWX4*AMk_2,%?B(ՀrT# VFL&, m R\p Dy $n$@sTP 0&<Z5(J GWW744o٭suecǎ0 C8cmTÕR,"T*AaSKPMT*o|~kE-lްaУ>cccO?=#;22nq<ι`TRJAP}k_~)Mj LJaDՙ(yC[J J|>_ KR) ( RJ;vl_Kԧ6my^QpΙ(d tERp~~~RQ]\\ yo9OqʲsWr>4p۾nWW?n ʞ1ZB˵K_3eB'1fFRX9R-hV奒 ä0l?<9rbo6L|e<*=V(z9T(A#Xwښoo|M)W*B~zz:wIs $)4xH+wyVԅ {/?:}͛z)0 'N>=K/]}(X733_W^yeP(X TJӧ~??^. +ٳg .h!o,?Sٳ_I)eR)={vƍU/O~rX,s8Z)|kPM9s<|pݻ m+ ,k?>do~7&&& 8)Jcs% Sg߰ד̚t+!mP*m\ N4ZBӎQj_{fj76?}0w 1lGa5(,u/]fV*뗫g_ (UT,-VZҢvזn\{[{6nu /W`B-(Uk.͜;>6tP&sj/oӌ;͑ CV*SW|uFxzW^w8c LòBJ(,O/|#L$kXoذ >u˵jp%g `K&kK96;̅=( ZmX # #qS&׀JG\ Y4F|R*A`pfm˭s i4ՠ^6]k d"dÌ>cǬ:߸:8qFVRʜR*.c(*¦,`YP=<9(gRU^|^ z6m*K,"~LMM333~E +Ye:p4IKړY%)X!D;& 99g===l׮]-[人ιPJrԙ3g|/eo -{H!سnwӦM[nq])0 QTb099YKYc)*:4IGXaSklZW]߯Ji~JN:%@lRߵ{78K٫-̤A ;JsD͵SȱBF'߻!s &jVKsz'{4gR.U=tNTh<+q}*M o߾}tttK۱m6 #㥗^>WqerŵF2.mv>݇B }=C.zp<.x 0Suope Y~{ !P(Doo|>~CwZJVBtl Aڥs2EdpI^ fx5.Vyڮl216X"aTY5+8$ 3*R`t^Z`9H7% @sSfAJ)ዧ)B2pd'Gj~SψN@j!c^`ڻeQM LV,|3K?A #Tka\hk4Osa-1pɁyxCx6X.tP,F: tab!UH: E ,CNj3[S2)Zd+ 2q(` f]<fJj-뮄_9X68y?̈́!z Y|e<m8\QsT8EEP ٫YnخW͸6sA25rDn3o2x~st!"Ϻ<*!Y0ƅUd/0W8MK1A}00]ޱF5i׎"&:`i-&2MY˔vSd vкR3nqSMR `͛lji';z)24f`֦4K4H̘dDDbX,EqLF$)E)Q5mbR6fThRn6 `j"&0)3J1dcBlf-nJ[uf4쐰sc.`lmkm Tj{IUA}2n3J)9jXPrc;a0K=|,-IOzgVP8(_Aǀ8`i|uA4teM٤N= -4^Ѧv4֤25.X&`3/j<qV5ѪUǛP e_ :MLL;;akSs܌OU@%*5N~NePf6kRK>FQeww@2@> 6cqCyCm%ٌe[iIJ8tȵ!`Ji58W1_w#2q IDAT{=Y+Q0p8 9Y ֖֝: Qj#]g)Z5ަ{. phVlD6&7_k2XY@Jffh֬qM6u5RM4h 7Y섡uh#ìO ItrRیLpVi;6vl&mcPJ! Cj5k{u(=MMGTf .Uǃz$eH'E=;-(cVlvzDOf6]IJ}cóֱZ1MBL :7x=6Ƹ`^?͚rDN ueX4% Nkeynmnp\0 )L-['3 `=8Q'DhjSka v`8yy(ʓԮW5yr+4k HS")ttdh!CI&ĵ:)dط{;F|mB w6c `Of0Ak.x(aA%"f "Ya=R5e= J= G)L ֱ\[G( =LBo|wwk |lT*fzzTA#֝>q;{թS%fϖƍ !@۷~ _BޠBY!+0enr ׼ÿw?{xѣG_56&[bno~X,88ݜ˛6mѣG'}wZ@ky6ÇI)Kmr,[///c릍ضi#L" '|a&0 0[ [@^BooUNQ4*[e+d@ajY筆a5k#S\(0t5ӸOnƀ^ز 9ׅn& \OMM-W*%j;P3Ҩ?  `@N<~s1Siݒ}sǎ.C>BDgZlMN7 yY>1,86}dvF5;8>ϱ/| ζ\.84TLG2 ߍw To 3Ӭ/ P(P>{xwmlj.cnf(kxeckҞY"cF7jZp" s8! Fo4Ypb*[[J[YBp0(Kjfe:;la8l)PV1;;NOOjldY;i+pI_ s$}Q52,(1Ƣ;,Z ˱ `FQƘezך]K1n^t-cYPN1ccr-BNGKt\cфMik>> tݠh4'_b|}o~'mMKjݿ{Kh1fnaݭ Mxg:dN:رcPQ0ƨ??[x*Dߪpd]Ap1vGP_׬0ā;0: *t=w]7~8V`*P(60!`c( "8a! gnC75 f 5ۊ[*>(tP'}{@[*D>)=140!,X6rlْRDkﴦlFB% mxUkv?LZ9 9c9X %Og~p |'_=ԇGic"jAZuw?'cLEY;tOy4?Hۗ!+#I_LPʸ3I!#*}$  >MvP(ߤXG_t]PLPt~=Vc,CYd%㰙R{4wI9觱 My۷I(mow]X&&&*ojޑ.QE042o߇7^6iuV;GU a8UR{ar9hi 02802Bp>NA=+ l1(APl2-hFċӡ)fLEV &o"}v޶jűՕJ333ڵkybJnuZCC݅4C۴a1:޿J^xO =<@n7iе bg||^Y&nй_joױ*pF0D׊G=KK79N4йBYե"||>M:ME_%5b]1` 17:8e&nvݭ5>؋=q&>ƛ /رb>(BVCqݸL.4i(e+s0Q&< `*E/ymQ HB Va *G>x$88Mj9N!t R௴ki`|V `*TmWmƀ%o#c܎ }RZARd&&&WA0Gkr(֢uffH{$Tl `$ ?*D6F_#*ns.^ t'ۈ~6zHK D^#s:6Ram%8kZg_fc1֚~;<#44 (թ1O㲛>7Kq7.BcU!`u5>#)q_т Νܳgω t0 Gv{ o][W'L 0{p0"8y0׃vr`N޺v{yuׁvap׃4gQx` 0rB$ZJ@&qK yG0RY[)(E025 Qگ*;A3 #{> )%2fffԥKJSSS3i}wrwZӖ}mY_:Azi p?f 6, iZeZ;HsdhT6t!Xqn,rnZ$v׉:'eP;NoV]1mxF;E^Z#tE>Qw Z1w], 5;Hݟ0O㵝4}t~ǎzKD &]>3X#UX{ nG`=Э_'Mx J3Ɣc1D|/}D ?Kh]i}h/JF(˘3ϟ>}FV$uFc;-!Ki h#m`Cv7փ,5mW K&^ô mhӰ/[|l{RM#*!XGqb\ c(x#hd?[5wƘh%@,i&v=.fnŶ[rؓI@snΞ=;uo ޑy 9ѿsؿ6|O`qcg/5:2fӒ1VNRیhqF T3 knHT7œZtlS_q+;jܼOxwZR@J )eW^ _}SSSqUz|4NˢtMڭayQg-l"ml'w&l meXkSXKZY@}9kYjkŚ@9 ڳ.86y{5IDAT&L-#y pX4k:Fkol$x3%4-.f%$^~q^g90޹mh45^{of H3Ewe48֤W_}'6lܺukysjE

]>kWhmhchuc,C}Y Mv l"'w!kcy8 8x7,l~uu st|^7Z\{uԟ0-P S kcN8;v>?Olܸ18R"pqma`p5|sP*oy V 4s5Ca[u/FR*ԓlQܾw`k>ɏ>i)%0Z =ĜF?:tA<(ؾ};6 [?x_7#@-\k1X b{T$X| nU",+JJu[G~-099JRj 2N<~JӰ9 Nb:4x5- QWڡ=Μe4iͰR?Fjح g>5k]7jIZs1a_pX, !vmذAx9 8cx<^>qKՀP+mˮ- %CA +ߺq8Z]V۫uD@mqܱ c'EO$ DEV3/_;6966v])5N&˰~0u:Z\2aCө@:)A\8~]]]#B`r׮];14Ї xc6"4`@ lyUγhתQׄ":(l-#ɏ|&'&(aoŸ'S'O8 `3謩N봛o瓱/:4`S7@.//e ]]]=+r98\ץ8B`cn\e+U(j+lf%"!W?#/mQSya<? x;e ,--!"DQdK..+WDk6V*ڧOGFXwZtz:Uuu@*5˹\.\-:]ׅX7vá}c(aýjA)eVS:lE`*e*WʹǁM}xA|ǧ>vmوܸqra"彰`\ǎ277iҪgYiڱvZ׮kf\rqI)߷}AQ,81X\\DcO_~|^Edd=ISCja_%rՓkzppV#xGg&0159^ߵZ-֨ǏϾWc.@6iLuGNN봟ESZT*U痢(\n.!C9%( 8|`7ܿ;lBQ TDKڵJq.KF4tn@/c/~像7~q<=44LLL`qqq PV1;;k.]+ӤQ_5Ɯ22w::~ZKKK(8}u !cq%$kj F6^۹CȻ.8Rۥ*m,\B ˱qoaHdQa[ǻqS;Z4H)E=^rNa!l}$J&E p ٛ6fD6`xfy 3U,|^# CDQ 00 ś7o'''Lu' <藠;B/^x?6RgYXu6tm#8p ˂q?;G%.]{fs+!k)?Ai 4 0 ,+E4kx[G78xX^} բX0My) mv{y'+-o57`KY9/تN&Vxr\6r,˂eYd2n CTBX \F >t᪇#o oc!g(9nS+cow,`öel<A0-rBPdWWWIuݞcVg}n3aMDDJ`Ul><::zի=yNP(hm4Mq-mriLD>GXDTBu5gS1B}cLS(Np(޿??>>v0@?M2@34 q^oZϞ=;zVZVhaܮu]m6ϪmtIz+Ik!a oǃ @Ewy!9Mv߽{8Cn{'1k -""55[m뺾mYV-W);S*bw'l61M0 C7 CSܫ*^.qbX|gYyt:7bEDZ$$ dA쭭7Ú~mA^*]*/iE4tHmzFz$zN"^IjZFQ&Iryʇl`AVt黗c_aMDDVd1Zr`^;Nv(l Y H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME ;"IDATXŗKYQu=qhIp2F!V. (#*QtՄd7\ā,L.08 16c6mpmw۷<︨tgT*s;ϗ(O:%<xxJeo$c![R\t'Nh^cB/!Xk~?} 011QvڛVz^*Pסz):h6Z^^~رc&&&.\j;w{NNc J)J%TUT*iU,,,]^^;OrO<88;v`uuFh4Fí4M:JR,--j߸qf6ӌ?~sVC<͛7g޻w,˲699}iQڵ Ƙ=sH{92666133fgg:{ι;˵|СC>R 3kjjŋg p0IdYf;w3ӿn}w*9rzJZ66>>ͬԓ$NG֭kyyʃ~7??Okkk0ƠT*EZg+H*J)ID0Ơj?|_xAkJxVBe{!E 7zlũg>^܁(NJǀL`3&_,AЉ;/}W,x$Clۨ% ~} K;]YddItY[ڴ%m&M%vKvl@ZFVܸ8dZ~{5C E*TB)H)!f0S>G?9 ; 2wA le 'yn @l,<4,b#5$A2t\JP:L-.7)\ց Z.v~yHֱ$oS@PE /xO 3R\2 C` !AHkB`Dw u93P0<@-RRy,UBLA΂y]r-HiH ^J@"9@əHwMtot 55DqPyɃ@ 5GpBȞ˵r *Gj Q<{D!rf}Y{ xk Y!DŦy \3{ [8 P1yؚ$': u1T=Dȟ m p63Ƴ (AǐZP{*e8dƶ!pp6E { Cq)%aȫ =RH7)TۅÙ L JHՍKUT@ T(yUPrxezJь Qy"R!9 ,.%[r)UDwJi^BP0Q$T j*`Ƀ۰V9ZsB2J[q k Rn£sJ94{,ԅyI%*?IaJFuhlЛTQnJI6x* 0bDhAqNnoi7^N\}EH9! AdĒnWFc]<1/">h3ovwn^^IENDB`KontrolPack-3.0.0/kontrolpack/images/edit-copy.png000644 001750 001750 00000001323 11426532120 020333 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATX͗MkAxI~dA=-F'KтxWR-ţjU!I٤K^f<,;􁐙<8h1˅MY54fByv3/j(ES|>O=t%ʩDF5ոaPV%{˫ p`iiIy "%" a0Y"*Y!"OXqBT*AeIe tС( Dsev`px(@&,T),+ L]LjH BSU(HR璂~9BxHZ_H"D0n~$?T), DM c'a)iƘia IbJ{"~{b`{ fPi&"<|iLp4D>.k*q`n9We7;{7  I*c@O{a=?\I ڵJXup1 `6}9Y.W& TD"i҇1!}3?NP]zo.'[F񩤰nߵ1v0擕յiט{VT MIENDB`KontrolPack-3.0.0/kontrolpack/images/explorer.png000644 001750 001750 00000001233 11426532120 020276 0ustar00000000 000000 PNG  IHDR szzsBIT|dRIDATXkQ$T0AJl"KAn֥V].\_(]몈Up A\h…jdb&&d&Ѕx0w=:b.] |w ii Q>͆Rw863sl]D-Z5Dۦh.Qը2DmU!vmSZIؕu.}^9<˚(dߝ[6Ss0ǘsmg 8nL\{K-D&$>)ؑ/G6)_ <Ǟ_}hW9pƠK RX/kN&fŢW{Kkb.ZM;}@C^tvh㞐? ?T\:7wG|-pٌ]*nOޕ @(r~=E5C̈tߌ(Fv@0{2CՈ"a(ԃ>PJ(ύO#@+D4B{Dߚ vb,[w/qpBwǾ^r2]5L7qA&*LrOY*BIENDB`KontrolPack-3.0.0/kontrolpack/images/utilities-system-monitor.png000644 001750 001750 00000003536 11426532120 023470 0ustar00000000 000000 PNG  IHDR szzsBIT|dIDATXo\G?g_]qI_Si_i#  @ZUUF$ @V8qR8;N;3{0螙3 E qt.'.zW3O߼ Ν;bϟ*!c*U{\o}%·N8QR`m_ .@TXgqKi#޽83o'Cgݳc#cT~?{q6 T#|$8sO gB}. 3XkyENfdR#֚DPPESݮɾWT{P;_1,,;5{G_Y `y١$I&W+^1xruv" ;2,.9\uZ; c>Ͷ幃C|n2dt(_319f3;^=K<"B!З $9\[m-xṀ}OjyPyѡ>v>S3-+OXZi>1 `ߓPoZ>7o:A>RI{;;Ý;=FVO&3$0sT#O9gi4ssʢʟ/gYdQ1*B!12 3OZhN[sIA9:7L:ܧܙ_򠂳۳Wܜ(ꆭӎmG h q豎 >|IFA;z("0&#.,3m;a&Iߠ`!dVVVt/eP*bbrZߧX*d;X\Zi`0Yk'?낱_%N*Rax(ՑUw @=gF/1vqga\n~x2/޳"f.N_ #^ [ja$*Plbp?ѭkĹ$*9IENDB`KontrolPack-3.0.0/kontrolpack/KontrolPack.rc000644 001750 001750 00000000100 11426532116 017235 0ustar00000000 000000 IDI_ICON1 ICON DISCARDABLE "kontrolPack.ico" KontrolPack-3.0.0/kontrolpack/resources.qrc000644 001750 001750 00000003101 11426532116 017205 0ustar00000000 000000 images/startup-logo.png images/about-logo.png images/kontrolpack.png images/settings.png images/about.png images/exit.png images/loading.png images/go-jump.png images/linux-computer.png images/linux-computer-small.png images/mac-computer.png images/mac-computer-small.png images/windows-computer.png images/windows-computer-small.png images/start.png images/stop.png images/terminal.png images/explorer.png images/document.png images/network.png images/dns.png images/connection.png images/add.png images/security.png images/update.png images/windows.png images/linux.png images/mac.png images/finder.png images/refresh.png images/windows-folder.png images/mac-folder.png images/linux-folder.png images/file.png images/linux-file.png images/edit-copy.png images/edit-cut.png images/edit-delete.png images/folder-new.png images/utilities-system-monitor.png images/video-display.png images/network-wired.png images/network-wireless.png KontrolPack-3.0.0/kontrolpack/kontrolpack.png000644 001750 001750 00000032214 11426532116 017530 0ustar00000000 000000 PNG  IHDRYYU bKGD pHYs  tIME mB IDATxYdy&.gDYYUWQk(<-@ b O~0`xx{$AEI\Yb67EIn'7"2; ){ 1(眆aH}'1(Y8h42PiázOOO9կ~yW ðl6[y,tR<9PJc ZBdiq(fYvE~o0 Fׯ_>'B~#Zv2 ]T*g0ð98RJ !1B,T2cnvoë~V߿7 nYկF1155u|bblRÕJbZV~RJO(p84{{{jww`z۽v_voo'Jefqq񑹹''''?PTV*cA<ϣR?)x$횝lkkkgkkk{{{?X__kvʕ+ ?KKK5 12yOCk4Mv؈677֮nll?w}` /s~t:zӹ<33Ź̜ ðwdY$I1>vE$@)yVh4t:@ZEC/DEv4w7olܸqC`X~񉉉/...~ann|^og\z lmmbuu onܸ-c4"c!ZfV 338y$Ο?e͡R 90DZfsh|^\վY՞t:?xWzY:OLL|ɓjee㓓J)lnn^w.~`*,!y8砜111J)ulmmmƝ;w͛o8V"wwv}qvvWDž0 i`)%.^g}>,޼!arfgg0?;9LOOjZO}S|2ZJIZ !`A /@+D/\XXSs}jzzkݜ[nChٙ)\|O~ |Gƹ3g077f0 - Sm+m_'q P19 &'j5 AƵk[o!"m4 PJE139_^o Q$Fjjee_9s#NF)xWOw_|(FPkb.^'xO~q\zA8F sb8JȁTZCiP6&R*(a쭏jVkV j qHmIQcksn.<+.0dY)%%<[j,탃~:ȿ;Sq/N:NS/Gpw9?'ܾL/-x~I[{0Ơn}RB)E ! |PJm;3">r8׾sB6#>+l6=F.J k˽i(Ud׾&ʁ RkH)!e}ƀPJ%DQci*fIa:BR9J)kzy^2Vn@g +_a.//ŋ?5;;[s.?4+aA3DKxG<|?!Wk8o*hGRVJ*C)@0!(gHE$͐ ,نSSSjB+hUV`8z1SOgggŋǏ7z=<?o\}8$ F .㑇48Rd@; 8BVF"_ I$͐LJqݝmdiٹYaXPfe? oo_z3g (N?}xm (j ssx\ 81pkbeehΣZ +8YfJ*%m[$AfH c6W VT:ATz[[[[?JP7폜>}w/_jhYE o&ȴh;8u$xy>@HtƵ12'1NOkd 2ceK@k]tzRj TEpځo`$i(Nf~PB"@))2DGıc8(s/]y !bAZ9?{KK'PV;r4v|64oocеrafQf t:nKAQ#IJ"K"FBR@0 Ƽz޽{gcO|133O|=+W駟wlv1L$  ,8+nA69cЮ)r'(CX.p"7}$QA$E1R! RdjH8^׫j _Giuպ3gL_gy/2&2pG^$:2rhC@ MAO`:E^xzܹGͷE//fѩ;v9/h3[* P 8xJgAk ʯ# =yc4`C3c R J).]gY$,6arR ) <%"2B "M!X ER`$ ыShlmVazjdYZFgffN^pcߐRڐ/;vT)x4_ĕW_nQ*M~3P⁇ux Ix>Xπq(9㠌2(`Rؤ6]levn8= D&y"@S4`)!xAh- Zd%%J(~.*:,zŋwʕ]r'x__cOMM=277W ;w^.Bi2K2PCh c(&!~) ƵmLs ((5` <0`V|R4+™#!Ұa i 1HB7ш"-|a%B2dCƫPA: F@o#+B1Fggg}яݸqht ˣ'jv~rnnnarr-IRkq6{CĉL9(@94@hT3!0  p(AQ̃> <(ƠⰍ 'ДB@$HP, 9@HC{p(bɞu4肈PdJ7J0EHJ"kZԩSϝ;wqss_IRYl4ζzz;{c01 0PAAPhPpP(0˳9%s~n )[i{3 b/LLPP Rpn[k0HMaRRÐT4w)KGA*:wiTmeRFicyI/TUOeYo]Go0Do!cUa&#  1^*Y!-4dLBO͠Ik$ѐP06 Z3$  @2{D)LX9)%!jէ+L$uqs~1 Yywn(NяS(i0Ě(XF4|b@(#SHIk *5 4B'=LQXE#$ HhhH IP9})gQYO[bZOMM-Z&z&cJ3 K֢0W2N0 24 G={,B?c p P tZH2 )'x 6@jlL $MhM]$ _Jڄ (7oa鉉9}s$y=ϣn(&,;LeeA 8%a5 BI\ZLl1G AFW >^S2mR 0Ql/.)@0MN~ H &JՓЀFcV:*7ᜓvl6ӄ1;{w1FH`%2Uq:}H/C<P<3GJ(S(B(fl^iz*G"X9oBK8!$ihf3Č0$vz uxq=m(eS vu14`rrr& v>sI*MSh0ű5ʲh% Be@q I<ԃf3c;=-0 K9/s bL[\)dJfVedca 0b`+{\$q&0cȕJ5NqW9!QJgcq5fBi4IfQaR4`s߾8 H5C_N80<}ЀAB^M>|Xg]8Nșsa|* ^'ܳhB5*D$ V0攺D Q"y=6J)|'FA@ccM)J)i8)2! Ʉbw#@4Cx>H@A6bA]cc+H'89`ĽƘUK7eBRHa=$IE $ʦҎ 06\)md-|W<ϫpJ)e5!<h)%R!݀K5G9n{qCH)( 76U99#u>)^mo(BkViDF*w'>kCQQH6m[QF 9UJ)YR@ʘC@&>$8)X"O3}}8 ;#t0,4@JSH@0i<ᮀN|Opߞ vvp"*3"s]4sXPĵ&чG3؉x޲6 F!~%@Q)%)4#06hBgY[8^qoo#0JkBQF4B<`ȭ;!r~yNkq7!6au49&oӥatV S`)q盢ܑʮ\ɥ3q;(n'y܄NeE(=%AŁ{qIۈ~me4A1wj? qR I"]H P1߹Їϛ c}WKM1q\)3N39!Gی#f\sIoqVy1P 0inHGU+1&%hcL;QZ@>nFqWS*c ݌Єf6ʶ8?ّ)AFs|2 ߯s4n>-o+AyT+*;3^,D$Z) !:.xsjvX޼K`}60@qJje\ E.J<:ID8#2Z36-}h`pRXMg=reWk!<= r5q, iju" !]890Desd.ǝߑ9 ɶJy J@KZ0;$/ݭn "g?L88p:pqHB bhGKdf4-m3"@aS yvE%ngaհ< p8B @4Mz"zתf"G4c[vC=ʋ FBH";BK-7|gr{}Pj#!$̦J;Ƽc+kqzߩc3y`0H,$vJm,7J+LOu0;vw8L.L|ych/t@ lH\7/ 0+#D84gҚEn04_6GR#hը،=`/ (2n7β, {d$J=Ƙdif)}?%m0k{J* *?S$0H~ t `N`?KF@qd,e(9.%JBKUBBqgi0~eY^'YER~-4]mZxG!B`0Ϗayq0ZS] IDATlq MA *;Pf) m`R[!pf;@~4V@ xHSЎHWr%0"ygeq)L41H{{{PkH4೾SƘuJI]YT- e9cr80(dP )fO +TjOv8㌮Y+ H MP<%mͳKQkUZZ@R)TXǣlooG~wVWW.]* < 8?󳸳 `t`4Qv/7C- GolIM5w"I.[SNjσÊ?T 4)e8Ka#H$aQat&,D%pBɉ&x;[[[hw*3̍7n{#MzSTT.Vq^v {tkբY fsa"5ǞJ.48*$_EJERvh#]JWGrٔPa kkj{8l8xww9|ʬ וRju.MSe,2nBGG Q% Z{"2K*@*8m6*K E s.0RB mKCBBk2Щt- &0IL(mPeUFaQ#mR\3P q>?08䍍$IVLVcI@L7{V-@V &L@|'gL< H &2P10>v ,Rk8_%tZ*?Q6Ԃ-Sڿuᚖ ]٩V?p'/RK)1#z`)yww7]]]|urrbZ ,%I$\>]DB=K:F{0"a> l`FU`X+ é5k aT84FTTH.@(+& _VP3a z4Vڂ, L$ ˆH#Ղ2qf88Q@ՄX#MSz=߽{w7M='9zӧ_xݮ5 d 8uz{vknխZܽxU<|hJ?<840&*a(T YBSr aZr.tC\ ,=(#L!`W$ECK% 0l6.bey{(Q7ommm~>w\4`]68}󋋋7[B^RJ[1EHϟ]^fVC&@t`ք|0ϊ^lڊ{pWfFJ)ΜXn8ES1 Hei7(#+ed =Je2 L](8S/a^G&buu5y8@N\n03==@٬rInI)17;F[kvM md%Z(K3d6;ۤUKZ:]*a ~qN`Tf6锰eJg>?r :_1B }{[/›ƘB$Ib1'η0 y|<TV1K2Ʊ3J[;5noiT-| %K9]g]<6'!>ş8:$)(W߿MohN-..&''/Z&څn5q|a<?qۤ0MRVZi PYjMA : PS<O_ΞX@؂X]]w7_R<SZBH:==tNj5VZ1`q~fm;+jτshLM90uf.3BZ1mF4ΟZėsG/Ad*6gqppp&MĚwvVNsl e;1K1lvJGk_gBَhJux9Ez)cZPc L N.K4>' R"c͛ٷ7o޼iy ߻(R FJ~\׫vBV }'sh$ |élO`ck;}ۤMJ⨩[8z쓘ۦ}|hmKpů'gQ <ɒ$Aib矿e-uqa+h${^obbbn/UUy^tEU+x llﺈVkʵ 㪡~k CC ]k)Bby ]lN N-W~S',{H( ԯJgv:xj(~q ,SSSL,5(Ѓn5BT}BK\k)KC`!ՐSBaefXY×~SD-6(*vIy7gy]cuo,z2h4ʂ @\VA|EJ`piLupag ;xq#TP2҇B:o*>7;_g%ޕ9+>Ń+K@`ss~rF37oL{Wv4:6ܐ~iF!aWVk^2,Aȅ\c*Y>?dڔ<;}b&|Kg0M8on߾=s[/htQߗt]8@l~V}Ǹl=g gWno(P o+rF P\ҿ6jB -rm>+Oᣏ_666vE*vΝ;yoz;NKwpq< `*rRJL[xE4ٲ ~Գ΁Vz売OO>SƗ>ZE{u â$yΝ;⥗^}xx'(ދQ8!$}*r J3qi,M3$M$](DZ#@RN ̶x ~ů~cploa{{Ѩ}vw:7CUZE}! `[E(nIF$;t~ϭH*m.i8ʿzܙ$+($3PrvOԧ=6lll?Ni>Vgn޼~{v\VlΣNkh{{+Мu#NM"m bfA$ ofsm\rN׻uO 5Oc=ɋ/Z-aQYC)dEzF)ֶvq&^~nbuk{]t#R&H 1B14!f:M,LaeqΞs817fZI }tby2 icssS^v/nܹsg=I57xk_ggTrONMM=#||yynYR}M QJVF 9L N2tn&6vbJy2 @^DSm9LO4P TvH|Inmm-{w\"zR!?O .%wkd'Uү) KS$iZ>^438_vmի;;;Z-\ppύ<'?N'~\o~< 3ǎx…Kϟ_Y\\LNNjʠ'''Vy6Z__O_~p,vbU \!{;E<ㄐ充.]zӋNu/*𶣔kM՝0|J)w R7J)-CH)3!DjKdI|]'YstsWZuKŸ|8yiiclIENDB`KontrolPack-3.0.0/kontrolpack/kontrolpack.desktop000644 001750 001750 00000000365 11426532120 020412 0ustar00000000 000000 [Desktop Entry] Type=Application Version=1.0 Name=KontrolPack Comment=Remote shell command executor and LAN manager Exec=kontrolpack Terminal=false X-MultipleArgs=false Icon=kontrolpack Categories=Network;Qt;RemoteAccess; GenericName=KontrolPackKontrolPack-3.0.0/kontrolpack/commons/000755 001750 001750 00000000000 11456767750 016165 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/commons/startup/000755 001750 001750 00000000000 11432774402 017651 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/commons/startup/user_mode.h000644 001750 001750 00000003661 11426532120 022002 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef USERMODE_H #define USERMODE_H #include #include #include #include #include #include #include class UserModeWidGet : public QDialog { Q_OBJECT public: QLabel *label; QCommandLinkButton *advanced; QCommandLinkButton *beginner; UserModeWidGet(); void centerOnScreen(); private slots: void advancedMode(); void endUserMode(); protected: void closeEvent(QCloseEvent *event); }; #endif KontrolPack-3.0.0/kontrolpack/commons/startup/update_manager.h000644 001750 001750 00000013447 11426532120 022777 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef UPDATEDIALOG_H #define UPDATEDIALOG_H #include #include #include #include #include #include #include #include #include #include #include #include #include "../constants.h" class UpdateDialog : public QDialog { Q_OBJECT public: QLabel *label; QString versionWeb; QString descriptionWeb; QCheckBox *checkbox; QSettings *settings; UpdateDialog(QString version, QString description) :versionWeb(version), descriptionWeb(description) { settings = new QSettings("OpenNetwork", "KontrolPack", this); QString update = settings->value("startup/update", "false").toString(); label = new QLabel(tr("A new KontrolPack release : version ") + versionWeb + tr(" is now available on KontrolPack Web site."), this); QLabel *creatorLabel = new QLabel(tr("KontrolPack web site : http://www.kontrolpack.com/

"), this); creatorLabel->setOpenExternalLinks(true); QLabel *descriptionLabel = new QLabel(descriptionWeb, this); checkbox = new QCheckBox(tr("Do not tell me when a new KontrolPack version is available."), this); if (update.startsWith("true", Qt::CaseInsensitive)) checkbox->setCheckState(Qt::Checked); else checkbox->setCheckState(Qt::Unchecked); connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(checked(int))); QPushButton *button = new QPushButton(tr("Close")); this->setWindowTitle(tr("New KontrolPack available")); this->setWindowIcon(QIcon(":/images/kontrolpack.png")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(label); layout->addWidget(descriptionLabel); layout->addWidget(creatorLabel); layout->addWidget(checkbox); layout->addWidget(button); setLayout(layout); } private slots: void checked(int check) { if (checkbox->isChecked()) settings->setValue("startup/update", "true"); else settings->setValue("startup/update", "false"); check++; } void onClic() { hide(); } }; class UpdateManagerDialog : public QDialog { Q_OBJECT public: QLabel *label; QString versionWeb; QCheckBox *checkbox; QSettings *settings; UpdateManagerDialog(QString version) :versionWeb(version) { settings = new QSettings("OpenNetwork", "KontrolPack", this); QString update = settings->value("startup/update", "false").toString(); label = new QLabel(tr("You are running the last KontrolPack version. No need to update."), this); QLabel *creatorLabel = new QLabel(tr("KontrolPack web site : http://www.kontrolpack.com/

"), this); creatorLabel->setOpenExternalLinks(true); checkbox = new QCheckBox(tr("Do not tell me when a new KontrolPack version is available."), this); if (update.startsWith("true", Qt::CaseInsensitive)) checkbox->setCheckState(Qt::Checked); else checkbox->setCheckState(Qt::Unchecked); connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(checked(int))); QPushButton *button = new QPushButton(tr("Close")); this->setWindowTitle(tr("New KontrolPack available")); this->setWindowIcon(QIcon(":/images/kontrolpack.png")); connect(button, SIGNAL(clicked()), this, SLOT(onClic())); QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(label); layout->addWidget(creatorLabel); layout->addWidget(checkbox); layout->addWidget(button); setLayout(layout); } private slots: void checked(int check) { if (checkbox->isChecked()) settings->setValue("startup/update", "true"); else settings->setValue("startup/update", "false"); check++; } void onClic() { hide(); } }; class UpdateManager : public QWidget { Q_OBJECT public: UpdateManager(); QHttp *http; public slots: void readVersion(); QStringList getVersion(QString xml); void updateManager(); void autoReadVersion(); void autoUpdateManager(); protected: }; #endif KontrolPack-3.0.0/kontrolpack/commons/startup/user_mode.cpp000644 001750 001750 00000005773 11426532120 022343 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "user_mode.h" UserModeWidGet::UserModeWidGet() { this->setWindowIcon(QIcon(":/images/kontrolpack.png")); this->setWindowTitle(tr("KontrolPack mode ")); label = new QLabel(this); label->setText(tr("Please, choose a mode according to your network related skills : ")); advanced = new QCommandLinkButton(tr("Advanced user"), tr("Designed for system administrator, computer expert."), this); beginner = new QCommandLinkButton(tr("Beginner user"), tr("End user with few computer skills."), this); QVBoxLayout* layout = new QVBoxLayout(); layout->addWidget(label); layout->addWidget(advanced); layout->addWidget(beginner); setLayout(layout); this->setMinimumSize(600, 400); centerOnScreen(); QObject::connect(advanced, SIGNAL(clicked()), this, SLOT(advancedMode())); QObject::connect(beginner, SIGNAL(clicked()), this, SLOT(endUserMode())); } void UserModeWidGet::centerOnScreen() { QDesktopWidget screen; QRect screenGeom = screen.screenGeometry(this); int screenCenterX = screenGeom.center().x(); int screenCenterY = screenGeom.center().y(); move(screenCenterX - width () / 2, screenCenterY - height() / 2); } void UserModeWidGet::advancedMode() { QSettings settings("OpenNetwork", "KontrolPack"); settings.setValue("user/mode", "ADVANCED"); this->close(); } void UserModeWidGet::endUserMode() { QSettings settings("OpenNetwork", "KontrolPack"); settings.setValue("user/mode", "END"); this->close(); } void UserModeWidGet::closeEvent(QCloseEvent *event) { hide(); event->ignore(); } KontrolPack-3.0.0/kontrolpack/commons/startup/startup_dialog.h000644 001750 001750 00000004343 11426532120 023037 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "../win32/qtwin.h" #include "../../client/ui/client_main_window.h" #include "../../server/ui/server_main_window.h" class StartUpDialog : public QWidget { Q_OBJECT public: StartUpDialog(); QLinearGradient gradientBackground; QPoint clickPos; void centerOnScreen(); private: void paintEvent(QPaintEvent *event); void mouseMoveEvent( QMouseEvent *e ); void mousePressEvent( QMouseEvent *e ); QSettings *settings; public slots: void startClientMode(); void startServerMode(); private: QPushButton *serverModeButton; QPushButton *clientModeButton; }; KontrolPack-3.0.0/kontrolpack/commons/startup/startup_dialog.cpp000644 001750 001750 00000012654 11444241266 023406 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "startup_dialog.h" StartUpDialog::StartUpDialog() { QLabel *label = new QLabel(tr("Welcome to KontrolPack : http://www.kontrolpack.com/"), this); label->setOpenExternalLinks(true); settings = new QSettings("OpenNetwork", "KontrolPack", this); QString user_mode = settings->value("user/mode", "NONE").toString(); if (user_mode.startsWith("END", Qt::CaseInsensitive)) { serverModeButton = new QPushButton(tr("Start : KontrolPack in Controlled Mode")); clientModeButton = new QPushButton(tr("Start : KontrolPack in Controller Mode")); } else { serverModeButton = new QPushButton(tr("KontrolPack in Controlled Mode (Server)")); clientModeButton = new QPushButton(tr("KontrolPack in Controller Mode (Client)")); } QLabel *imageLabel = new QLabel(this); imageLabel->setPixmap(QPixmap(":/images/startup-logo.png")); clientModeButton->setMinimumHeight(60); serverModeButton->setMinimumHeight(60); QLabel *explanationLabel = new QLabel(tr("Access any remote computers securely."), this); QGridLayout *layout = new QGridLayout; layout->addWidget(label, 0, 0, 1, 6); layout->addWidget(imageLabel, 1, 0, 1, 6); layout->addWidget(explanationLabel, 2, 0, 1, 6); layout->addWidget(serverModeButton, 3, 0, 1, 3); layout->addWidget(clientModeButton, 3, 3, 1, 3); setLayout(layout); QPalette palette = this->palette(); palette.setBrush(QPalette::Base, Qt::transparent); gradientBackground.setColorAt(1.0, QColor(0, 0, 0)); gradientBackground.setColorAt(0.0, QColor(0, 0, 0)); gradientBackground.setCoordinateMode(QGradient::ObjectBoundingMode); QObject::connect(serverModeButton, SIGNAL(clicked()), this, SLOT(startServerMode())); QObject::connect(clientModeButton, SIGNAL(clicked()), this, SLOT(startClientMode())); setWindowIcon(QIcon(":/images/kontrolpack.png")); #ifdef WIN32 #elif defined (linux) centerOnScreen(); #elif defined __APPLE__ #else #endif } void StartUpDialog::mouseMoveEvent( QMouseEvent *e ) { move( e->globalPos() - clickPos); } void StartUpDialog::mousePressEvent( QMouseEvent *e ) { clickPos = e->pos() + QPoint(geometry().topLeft() - frameGeometry().topLeft()); if (e->button() == Qt::RightButton) { QColor color = QColorDialog::getColor(QColor(3, 85, 144), this); gradientBackground.setColorAt(1.0, color); gradientBackground.setColorAt(0.0, color); repaint(); } } void StartUpDialog::paintEvent(QPaintEvent *event) { QPainter p(this); p.fillRect(event->rect(), Qt::transparent); p.setPen(Qt::NoPen); p.setBrush(gradientBackground); p.setOpacity(0.8); #ifdef WIN32 p.drawRoundedRect(rect(), 05, 05); #elif defined (linux) p.drawRoundedRect(rect(), 0, 0); #elif defined __APPLE__ p.drawRoundedRect(rect(), 05, 05); #else p.drawRoundedRect(rect(), 0, 0); #endif p.end(); } void StartUpDialog::startClientMode() { this->close(); settings->setValue("startup/mode", "CLIENT"); ClientMainWindow *window = new ClientMainWindow(this); if (QtWin::isCompositionEnabled()) { QtWin::extendFrameIntoClientArea(window); window->setContentsMargins(0, 0, 0, 0); } window->show(); } void StartUpDialog::centerOnScreen() { QDesktopWidget screen; QRect screenGeom = screen.screenGeometry(this); int screenCenterX = screenGeom.center().x(); int screenCenterY = screenGeom.center().y(); move(screenCenterX - width () / 2, screenCenterY - height() / 2); } void StartUpDialog::startServerMode() { this->close(); settings->setValue("startup/mode", "SERVER"); ServerMainWindow *window = new ServerMainWindow(this); if (QtWin::isCompositionEnabled()) { QtWin::extendFrameIntoClientArea(window); window->setContentsMargins(0, 0, 0, 0); } window->show(); } KontrolPack-3.0.0/kontrolpack/commons/startup/update_manager.cpp000644 001750 001750 00000007003 11444421365 023331 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "update_manager.h" UpdateManager::UpdateManager() { } void UpdateManager::updateManager() { http = new QHttp(this); http->setHost("kontrolpack.com"); http->get("/version.xml"); connect(http, SIGNAL(done(bool)), this, SLOT(readVersion())); } void UpdateManager::autoUpdateManager() { http = new QHttp(this); http->setHost("kontrolpack.com"); http->get("/version.xml"); connect(http, SIGNAL(done(bool)), this, SLOT(autoReadVersion())); } void UpdateManager::autoReadVersion() { QByteArray versionByteArray = http->readAll(); QStringList params = this->getVersion(QString(versionByteArray)); QString version = params.at(0); QString description = params.at(1); if (!version.isEmpty()) if (QString::compare(version, QString(VERSION), Qt::CaseInsensitive) != 0) { UpdateDialog *updateDialog = new UpdateDialog(version, description); updateDialog->exec(); } } void UpdateManager::readVersion() { QByteArray versionByteArray = http->readAll(); QStringList params = this->getVersion(QString(versionByteArray)); QString version = params.at(0); QString description = params.at(1); if (!version.isEmpty()) { if (QString::compare(version, QString(VERSION), Qt::CaseInsensitive) != 0) { UpdateDialog *updateDialog = new UpdateDialog(version, description); updateDialog->exec(); } else { UpdateManagerDialog *updateDialog = new UpdateManagerDialog(version); updateDialog->exec(); } } } QStringList UpdateManager::getVersion(QString xml) { QStringList params = QStringList(); QString version = ""; QString description = ""; QDomDocument doc; doc.setContent(xml); QDomElement root = doc.documentElement(); QDomElement child = root.firstChild().toElement(); while(!child.isNull()) { if (child.tagName() == VERSION_LABEL) { version = child.text(); } child = child.nextSibling().toElement(); } params.append(version); params.append(description); return params; } KontrolPack-3.0.0/kontrolpack/commons/logger.h000644 001750 001750 00000004500 11444241474 017577 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef LOGGER_H #define LOGGER_H #include #include #include class Logger : public QObject { public: enum LogLevel{ DEBUG_LEVEL=1, INFO_LEVEL=5, WARNING_LEVEL=10, ERROR_LEVEL=15 }; private: static QFile* m_file; static int m_nbInstance; static QString m_logFileName; static LogLevel m_level; QString m_className; public: Logger(QObject* parent = 0); Logger(QString className); ~Logger(); QString className() const; void setClassName(const QString&); void debug(QString); void info(QString); void warning(QString); void error(QString); static void setFileName(const QString&); static void setLevel(Logger::LogLevel=DEBUG_LEVEL); static void setLevel(const QString&); private: void init(); void write(QString priority, QString text); }; #endif KontrolPack-3.0.0/kontrolpack/commons/win32/000755 001750 001750 00000000000 11432774417 017117 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/commons/win32/qtwin.h000644 001750 001750 00000002155 11426532120 020417 0ustar00000000 000000 /**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #ifndef QTWIN_H #define QTWIN_H #include #include /** * This is a helper class for using the Desktop Window Manager * functionality on Windows 7 and Windows Vista. On other platforms * these functions will simply not do anything. */ class WindowNotifier; class QtWin { public: static bool enableBlurBehindWindow(QWidget *widget, bool enable = true); static bool extendFrameIntoClientArea(QWidget *widget, int left = -1, int top = -1, int right = -1, int bottom = -1); static bool isCompositionEnabled(); static QColor colorizatinColor(); private: static WindowNotifier *windowNotifier(); }; #endif // QTWIN_H KontrolPack-3.0.0/kontrolpack/commons/win32/qtwin.cpp000644 001750 001750 00000015320 11426532120 020750 0ustar00000000 000000 /**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #include "qtwin.h" #include #include #include #include #include #ifdef Q_WS_WIN #include // Blur behind data structures #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified #define DWM_BB_BLURREGION 0x00000002 // hRgnBlur has been specified #define DWM_BB_TRANSITIONONMAXIMIZED 0x00000004 // fTransitionOnMaximized has been specified #define WM_DWMCOMPOSITIONCHANGED 0x031E // Composition changed window message typedef struct _DWM_BLURBEHIND { DWORD dwFlags; BOOL fEnable; HRGN hRgnBlur; BOOL fTransitionOnMaximized; } DWM_BLURBEHIND, *PDWM_BLURBEHIND; typedef struct _MARGINS { int cxLeftWidth; int cxRightWidth; int cyTopHeight; int cyBottomHeight; } MARGINS, *PMARGINS; typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled); typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset); typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend); static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0; static PtrDwmEnableBlurBehindWindow pDwmEnableBlurBehindWindow = 0; static PtrDwmExtendFrameIntoClientArea pDwmExtendFrameIntoClientArea = 0; static PtrDwmGetColorizationColor pDwmGetColorizationColor = 0; /* * Internal helper class that notifies windows if the * DWM compositing state changes and updates the widget * flags correspondingly. */ class WindowNotifier : public QWidget { public: WindowNotifier() { winId(); } void addWidget(QWidget *widget) { widgets.append(widget); } void removeWidget(QWidget *widget) { widgets.removeAll(widget); } bool winEvent(MSG *message, long *result); private: QWidgetList widgets; }; static bool resolveLibs() { if (!pDwmIsCompositionEnabled) { QLibrary dwmLib(QString::fromAscii("dwmapi")); pDwmIsCompositionEnabled =(PtrDwmIsCompositionEnabled)dwmLib.resolve("DwmIsCompositionEnabled"); pDwmExtendFrameIntoClientArea = (PtrDwmExtendFrameIntoClientArea)dwmLib.resolve("DwmExtendFrameIntoClientArea"); pDwmEnableBlurBehindWindow = (PtrDwmEnableBlurBehindWindow)dwmLib.resolve("DwmEnableBlurBehindWindow"); pDwmGetColorizationColor = (PtrDwmGetColorizationColor)dwmLib.resolve("DwmGetColorizationColor"); } return pDwmIsCompositionEnabled != 0; } #endif /*! * Chekcs and returns true if Windows DWM composition * is currently enabled on the system. * * To get live notification on the availability of * this feature, you will currently have to * reimplement winEvent() on your widget and listen * for the WM_DWMCOMPOSITIONCHANGED event to occur. * */ bool QtWin::isCompositionEnabled() { #ifdef Q_WS_WIN if (resolveLibs()) { HRESULT hr = S_OK; BOOL isEnabled = false; hr = pDwmIsCompositionEnabled(&isEnabled); if (SUCCEEDED(hr)) return isEnabled; } #endif return false; } /*! * Enables Blur behind on a Widget. * * \a enable tells if the blur should be enabled or not */ bool QtWin::enableBlurBehindWindow(QWidget *widget, bool enable) { Q_ASSERT(widget); bool result = false; #ifdef Q_WS_WIN if (resolveLibs()) { DWM_BLURBEHIND bb = {0}; HRESULT hr = S_OK; bb.fEnable = enable; bb.dwFlags = DWM_BB_ENABLE; bb.hRgnBlur = NULL; widget->setAttribute(Qt::WA_TranslucentBackground, enable); widget->setAttribute(Qt::WA_NoSystemBackground, enable); hr = pDwmEnableBlurBehindWindow(widget->winId(), &bb); if (SUCCEEDED(hr)) { result = true; windowNotifier()->addWidget(widget); } } #endif return result; } /*! * ExtendFrameIntoClientArea. * * This controls the rendering of the frame inside the window. * Note that passing margins of -1 (the default value) will completely * remove the frame from the window. * * \note you should not call enableBlurBehindWindow before calling * this functions * * \a enable tells if the blur should be enabled or not */ bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int right, int bottom) { Q_ASSERT(widget); Q_UNUSED(left); Q_UNUSED(top); Q_UNUSED(right); Q_UNUSED(bottom); bool result = false; #ifdef Q_WS_WIN if (resolveLibs()) { QLibrary dwmLib(QString::fromAscii("dwmapi")); HRESULT hr = S_OK; MARGINS m = {left, top, right, bottom}; hr = pDwmExtendFrameIntoClientArea(widget->winId(), &m); if (SUCCEEDED(hr)) { result = true; windowNotifier()->addWidget(widget); } widget->setAttribute(Qt::WA_TranslucentBackground, result); } #endif return result; } /*! * Returns the current colorizationColor for the window. * * \a enable tells if the blur should be enabled or not */ QColor QtWin::colorizatinColor() { QColor resultColor = QApplication::palette().window().color(); #ifdef Q_WS_WIN if (resolveLibs()) { DWORD color = 0; BOOL opaque = FALSE; QLibrary dwmLib(QString::fromAscii("dwmapi")); HRESULT hr = S_OK; hr = pDwmGetColorizationColor(&color, &opaque); if (SUCCEEDED(hr)) resultColor = QColor(color); } #endif return resultColor; } #ifdef Q_WS_WIN WindowNotifier *QtWin::windowNotifier() { static WindowNotifier *windowNotifierInstance = 0; if (!windowNotifierInstance) windowNotifierInstance = new WindowNotifier; return windowNotifierInstance; } /* Notify all enabled windows that the DWM state changed */ bool WindowNotifier::winEvent(MSG *message, long *result) { if (message && message->message == WM_DWMCOMPOSITIONCHANGED) { bool compositionEnabled = QtWin::isCompositionEnabled(); foreach(QWidget * widget, widgets) { if (widget) { widget->setAttribute(Qt::WA_NoSystemBackground, compositionEnabled); } widget->update(); } } return QWidget::winEvent(message, result); } #endif KontrolPack-3.0.0/kontrolpack/commons/about_dialog.h000644 001750 001750 00000003452 11426532120 020745 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef HEADER_ABOUTDIALOG #define HEADER_ABOUTDIALOG #include #include #include #include #include #include #include "constants.h" class AboutDialog : public QDialog { Q_OBJECT public: AboutDialog(); public slots: void hideDialogBox(); protected: void closeEvent(QCloseEvent *event); }; #endif KontrolPack-3.0.0/kontrolpack/commons/logger.cpp000644 001750 001750 00000007105 11444241436 020134 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "logger.h" #include #include QFile* Logger::m_file = NULL; int Logger::m_nbInstance = 0; QString m_fileName = "kontrolpack.log"; Logger::LogLevel Logger::m_level = DEBUG_LEVEL; Logger::Logger(QObject* parent) : QObject(parent) { if (parent != 0) { m_className = parent->objectName(); } m_nbInstance++; } Logger::Logger(QString className) { m_className = className; m_nbInstance++; } void Logger::init() { if (m_file == NULL) { m_file = new QFile(m_fileName); if (!m_file->open(QIODevice::WriteOnly | QIODevice::Text)) { qWarning() << "> Cannot open file " << m_fileName << " in write mode!"; } } } Logger::~Logger() { m_nbInstance--; if (m_nbInstance <= 0) { m_file->close(); delete m_file; } } QString Logger::className() const { return m_className; } void Logger::setClassName(const QString& name) { m_className = name; } void Logger::write(QString priority, QString text) { init(); QString value = priority + "[" + m_className + "][" + QTime::currentTime().toString("hh:mm:ss") + "] " + text; qDebug() << value; m_file->write(QString(value + "\n").toLatin1()); m_file->flush(); } void Logger::debug(QString text) { if (m_level <= DEBUG_LEVEL) write("DEBUG", text); } void Logger::info(QString text) { if (m_level <= INFO_LEVEL) write("INFO", text); } void Logger::warning(QString text) { if (m_level <= WARNING_LEVEL) write("WARNING", text); } void Logger::error(QString text) { if (m_level <= ERROR_LEVEL) write("ERROR", text); } void Logger::setFileName(const QString& name) { m_fileName = name; } void Logger::setLevel(Logger::LogLevel level) { m_level = level; } void Logger::setLevel(const QString& level) { if (level == "INFO") m_level = INFO_LEVEL; else if (level == "WARNING") m_level = WARNING_LEVEL; else if (level == "ERROR") m_level = ERROR_LEVEL; else m_level = DEBUG_LEVEL; } KontrolPack-3.0.0/kontrolpack/commons/cd/000755 001750 001750 00000000000 11432306344 016531 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/commons/cd/change_dir.cpp000644 001750 001750 00000010060 11426532120 021311 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #include "change_dir.h" #include #include #include #include #include ChangeDir::ChangeDir( QString document, QString path) : documentText(document), pathText(path) { #ifdef WIN32 slash = QString("\\"); #elif defined (linux) slash = QString("/"); #elif defined __APPLE__ slash = QString("/"); #else slash = QString("/"); #endif } QString ChangeDir::cd_Handling(QString pathToHandle) { #ifdef WIN32 if (pathToHandle.size() <= 3 && pathToHandle.contains(":")) { if (QString::compare(documentText, QString(".."), Qt::CaseInsensitive) == 0) { return QString(CONTENT_DRIVE); } } else if (QString::compare(pathToHandle, QString(CONTENT_DRIVE), Qt::CaseInsensitive) == 0) { return documentText; } #endif if (QString::compare(documentText, QString(".."), Qt::CaseInsensitive) == 0) { if (QString::compare(pathToHandle, QString("/"), Qt::CaseInsensitive) != 0) { QString pathShortened = cd_DotDot_Handling(pathToHandle); if (pathShortened.contains(directory)) return pathShortened; else return directory; } else return pathToHandle; } else if (QString::compare(documentText, QString("."), Qt::CaseInsensitive) == 0) { if (pathText.contains(directory)) return pathText; else return directory; } else { QString finalPath = pathText + slash + documentText; finalPath = finalPath.replace("//", "/"); if (!finalPath.contains(directory)) return directory; if (isDirectory(finalPath) == 1) return finalPath; else return pathText; } } int ChangeDir::isDirectory(QString pathToHandle) { QDir target(pathToHandle); if( target.exists() ) { return 1; } else { return 0; } } QString ChangeDir::cd_DotDot_Handling(QString qStringPathToReduce) { QString result = ""; QStringList list = qStringPathToReduce.split(slash, QString::SkipEmptyParts); list.removeLast(); #ifdef WIN32 #elif defined (linux) result.append(slash); #elif defined __APPLE__ result.append(slash); #else result.append(slash); #endif for (int i = 0; i < list.size(); ++i) { result.append(list.at(i)); if (i != (list.size() - 1)) result.append(slash); } #ifdef WIN32 if (result.size() == 2 && result.contains(":")) { result = result + "\\"; } #endif return result; } KontrolPack-3.0.0/kontrolpack/commons/cd/change_dir.h000644 001750 001750 00000003662 11426532120 020770 0ustar00000000 000000 /*************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ #ifndef CHANGE_DIR_H #define CHANGE_DIR_H #include #include #include "../constants.h" class ChangeDir : public QObject { Q_OBJECT public: ChangeDir(QString document, QString path); QString cd_DotDot_Handling(QString qStringPathToReduce); int isDirectory(QString pathToHandle); QString cd_Handling(QString pathToHandle); QString directory; QString slash; QString pathText; QString documentText; signals: private: }; #endif KontrolPack-3.0.0/kontrolpack/commons/constants.h000644 001750 001750 00000006704 11456767750 020361 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #pragma once #ifndef KP_CONSTANTS_H #define KP_CONSTANTS_H #define VERSION "3.0.0" #define KONTROLPACK "KP" #define SYSTEM "ST" #define HOSTNAME "HN" #define PATH "PATH" #define IP "IP" #define IP_LIST "IPL" #define FOLDER "FD" #define FILE_XML "F" #define FILE_NEW_XML "NF" #define FOLDER_LIST "FDL" #define FILE_LIST "FL" #define FILE_SCRIPT "SCRIPT" #define DRIVE "DRIVE" #define DRIVES "DRIVES" #define FILE_NAME "FN" #define FILE_SIZE "FS" #define FILE_PATH "FP" #define DOC_XML "DOC" #define FROM_XML "FROM" #define TO_XML "TO" #define FILE_EXECECUTABLE "EXE" #define FILE_READABLE "READ" #define FILE_OWNER "OWN" #define FILE_EXTENSION "EXT" #define FILE_CREATION_DATE "DTC" #define FILE_MODIFIED_DATE "DTM" #define FILE_DIRECTORY "DIR" #define CONTENT_DRIVE "DRIVES" #define SERIALUID "SERIALUID" #define CLIENTS "clients" #define CLIENT "client" #define OS "os" #define PORT "port" #define PORT_FILE "port_file" #define WINDOWS "WINDOWS" #define LINUX "LINUX" #define MACOSX "MACOSX" #define XML_DOCTYPE "" #define ASK_PARAMETERS "" #define UPLOAD_OK "OK" #define UPLOAD_KO "KO" #define UPLOAD_SUCCESS "OK" #define UPLOAD_FAILED "OK" #define XML_COMMAND_BEGIN "" #define XML_COMMAND_END "" #define XML_DOWNLOAD "download" #define XML_PARAMETERS "parameters" #define XML_FOLDERS "folders" #define XML_FILE_INFO "file-info" #define XML_FILE_DOWNLOAD_INFO "file-download-info" #define XML_FILE_UPLOAD_INFO "file-upload-info" #define XML_COMMAND "command-execution" #define CONTENT_DRIVE "DRIVES" #define VERSION_LABEL "version" #define LOG_FILENAME "kontrolpack.log" #define REMOTE_DESKTOP_PNG "screenshot.png" #define KP_DIRECTORY ".kontrolpack" #define CONF_DIRECTORY "conf" #define DELIMITER_DATABASE " " #define FILE_SIZE_LIMIT 60000000 // ~ 60Mo #define LOOPBACK "127.0.0.1" #endif KontrolPack-3.0.0/kontrolpack/commons/sql/000755 001750 001750 00000000000 11432306344 016742 5ustar00000000 000000 KontrolPack-3.0.0/kontrolpack/commons/sql/database.cpp000644 001750 001750 00000020103 11430273106 021203 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "database.h" Database::Database() { #ifdef WIN32 QDir kpDir(QDir::toNativeSeparators(QDir::homePath()) + "\\" + KP_DIRECTORY); db_path = QDir::toNativeSeparators(QDir::homePath()) + "\\" + KP_DIRECTORY + "\\" + "kontrolpack.db"; #else QDir kpDir(QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY); db_path = QDir::toNativeSeparators(QDir::homePath()) + "/" + KP_DIRECTORY + "/" + "kontrolpack.db"; #endif if (!kpDir.exists()) { QDir dir = QDir::home(); dir.mkdir(KP_DIRECTORY); dir.cd(KP_DIRECTORY); } zErrMsg = 0; rc = sqlite3_open(db_path.toUtf8().data(), &db); if( rc ) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } // Server related table. rc = sqlite3_exec(db, "select * from client_parameter;", NULL, 0, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); if (rc == 1) { rc = sqlite3_exec(db, "create table client_parameter(id int, ip varchar(16), os varchar(10), hostname varchar(200), port int, port_file int);", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } } // Commands historic for a specific server identified by id_server. rc = sqlite3_exec(db, "select * from commands_historic;", NULL, 0, &zErrMsg); if( rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); if (rc == 1) { rc = sqlite3_exec(db, "create table commands_historic(id_server int, id_command int, command varchar(800), date varchar(20));", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } } } void Database::saveRemoteClients(RemoteComputerInfo* data) { QString query = QString("insert into client_parameter values(\"" + QString::number(data->id) + "\", \"" + data->ip + "\", \"" + data->system + "\", \"" + data->hostname + "\", " + QString::number(data->port) + ", " + QString::number(data->port_file) + ");"); rc = sqlite3_exec(db, query.toUtf8().data(), NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } QList Database::getRemoteClients() { QList data = QList(); sqlite3_stmt* pStatement; char* acQuery = sqlite3_mprintf("select * from client_parameter;"); int nError = sqlite3_prepare_v2(db,acQuery,-1,&pStatement,NULL); while (nError == SQLITE_OK && sqlite3_step(pStatement) == SQLITE_ROW) { RemoteComputerInfo *remoteInfo = new RemoteComputerInfo(this); remoteInfo->id = QString((char*)sqlite3_column_text(pStatement, DB_ID_SERVER)).toInt(); remoteInfo->ip = QString((char*)sqlite3_column_text(pStatement, DB_IP)); remoteInfo->system = QString((char*)sqlite3_column_text(pStatement, DB_OS)); remoteInfo->hostname = QString((char*)sqlite3_column_text(pStatement, DB_HOSTNAME)); remoteInfo->port = QString((char*)sqlite3_column_text(pStatement, DB_PORT)).toInt(); remoteInfo->port_file = QString((char*)sqlite3_column_text(pStatement, DB_PORT_FILE)).toInt(); data.append(remoteInfo); } sqlite3_finalize(pStatement); sqlite3_free(acQuery); return data; } void Database::dropRemoteClients() { rc = sqlite3_exec(db, "drop table client_parameter;", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } rc = sqlite3_exec(db, "create table client_parameter(id int, ip varchar(16), os varchar(10), hostname varchar(200), port int, port_file int);", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } void Database::saveCommand(Command* data) { QString query = QString("insert into commands_historic values(\"" + QString::number(data->id_server) + "\", \"" + QString::number(data->id_command) + "\", \"" + data->command + "\", \"" + data->date + "\");"); rc = sqlite3_exec(db, query.toUtf8().data(), NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } void Database::dropCommands() { rc = sqlite3_exec(db, "drop table commands_historic;", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } rc = sqlite3_exec(db, "create table commands_historic(id_server int, id_command int, command varchar(800), date varchar(20));", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } } QList* Database::getCommandsByIdServer(int id_server) { QList *data = new QList; sqlite3_stmt* statement; char* acQuery = sqlite3_mprintf("select * from commands_historic where id_server=?;"); int nError = sqlite3_prepare_v2(db,acQuery,-1,&statement,NULL); nError = sqlite3_bind_int(statement, 1, id_server); if( SQLITE_OK == nError ) { while (nError == SQLITE_OK && sqlite3_step(statement) == SQLITE_ROW) { Command *command = new Command(this); command->id_server = QString((char*)sqlite3_column_text(statement, DB_ID_SERVER)).toInt(); command->id_command = QString((char*)sqlite3_column_text(statement, DB_ID_COMMAND)).toInt(); command->command = QString((char*)sqlite3_column_text(statement, DB_COMMAND)); command->date = QString((char*)sqlite3_column_text(statement, DB_DATE)); data->append(command); } } sqlite3_finalize(statement); sqlite3_free(acQuery); return data; } void Database::delete_command(int id_server, int id_command, QString command) { sqlite3_stmt* statement; char* acQuery = sqlite3_mprintf("delete from commands_historic where id_server=? and id_command=? and command=?;"); int nError = sqlite3_prepare_v2(db,acQuery,-1,&statement,NULL); nError = sqlite3_bind_int(statement, 1, id_server); if( SQLITE_OK == nError ) { nError = sqlite3_bind_int(statement, 2, id_command); nError = sqlite3_bind_text(statement, 3, command.toUtf8().data(), strlen(command.toUtf8().data()), NULL); } sqlite3_step(statement); sqlite3_finalize(statement); sqlite3_free(acQuery); } void Database::freeDatabase() { sqlite3_close(db); } KontrolPack-3.0.0/kontrolpack/commons/sql/database.h000644 001750 001750 00000004734 11426532120 020663 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #ifndef HEADER_XMLDATASTORE #define HEADER_XMLDATASTORE #include #include #include #include #include #include #include #include "../constants.h" #include "../../client/core/bean/remote_computer_info.h" #include "../../client/core/bean/command.h" // Column in sqlite database for the client_parameter table. #define DB_ID_SERVER 0 #define DB_IP 1 #define DB_OS 2 #define DB_HOSTNAME 3 #define DB_PORT 4 #define DB_PORT_FILE 5 #define DB_ID_COMMAND 1 #define DB_COMMAND 2 #define DB_DATE 3 class Database : public QObject { Q_OBJECT public: Database(); void saveRemoteClients(RemoteComputerInfo* data); void dropRemoteClients(); QList getRemoteClients(); void saveCommand(Command* data); void dropCommands(); QList* getCommandsByIdServer(int id_server); void delete_command(int id_server, int id_command, QString command); void freeDatabase(); private: QString db_path; sqlite3 *db; char *zErrMsg; int rc; }; #endif KontrolPack-3.0.0/kontrolpack/commons/about_dialog.cpp000644 001750 001750 00000007360 11426532120 021302 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2.0 of * * the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to * * the Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * **************************************************************************/ #include "about_dialog.h" AboutDialog::AboutDialog() { QLabel *header = new QLabel(this); // Arial, Verdana, Courrier, Time #ifdef WIN32 QFont police("Arial", 8, true); #elif defined __APPLE__ QFont police = QFont(); #else QFont police("Arial", 10, true); #endif header->setPixmap(QPixmap(":/images/about-logo.png")); QLabel *label = new QLabel(tr("KontrolPack ") + QString(VERSION) + tr(" : access securely any remote computer.
"), this); QLabel *labelLicence = new QLabel(tr("This program is free software: you can redistribute it and/or modify it under\n" "the terms of the GNU General Public License as published by the Free \n" "Software Foundation; either version 2 of the License, or (at your option)\n" "any later version."), this); label->setFont(police); labelLicence->setFont(police); setWindowTitle(tr("About KontrolPack ") + QString(VERSION)); setWindowIcon(QIcon(":/images/kontrolpack.png")); QLabel *creatorLabel = new QLabel(tr("Created by : Thomas THELLIEZ (Lead developer and administrator)

KontrolPack web site : https://www.kontrolpack.com/

This software uses Microsoft and Apple Trademarks in text :

Microsoft® software and Windows® operating system are trademarks
of Microsoft Corporation.

Mac and Mac OS are trademarks of Apple Inc., registered in the U.S. and
other countries."), this); creatorLabel->setOpenExternalLinks(true); creatorLabel->setFont(police); QPushButton *button = new QPushButton(tr("Close")); QGridLayout *layout = new QGridLayout; layout->addWidget(label, 0, 0); layout->addWidget(header, 1, 0); layout->addWidget(labelLicence, 3, 0); layout->addWidget(creatorLabel, 4, 0); layout->addWidget(button, 5, 0); setLayout(layout); #ifdef WIN32 setFixedSize(460, 450); #elif defined __APPLE__ setFixedSize(500, 500); #else setFixedSize(460, 450); #endif connect(button, SIGNAL(clicked()), this, SLOT(hideDialogBox())); } void AboutDialog::hideDialogBox() { this->hide(); } void AboutDialog::closeEvent(QCloseEvent *event) { hide(); event->ignore(); } KontrolPack-3.0.0/README000644 001750 001750 00000002314 11432770247 013030 0ustar00000000 000000 HOW TO COMPILE KONTROLPACK ON GNU/LINUX PLATFORM : 1. Be sure the GNU compiler g++ is installed on your platform. On debian based distribution : sudo apt-get install g++ 2. Some dependencies are required to compile KontrolPack. You will need : * Qt SDK. * OpenSSL devel library. * libxml2 devel library. * sqlite devel library. On debian based distribution (Ubuntu family) run the following command to install the dependencies : sudo apt-get install libqt4-dev libssl-dev libxml2-dev libsqlite3-dev On Red Hat based distribution (Fedora) run the following command to install the dependencies : yum install qt-devel qt-config qt openssl-devel libxml2-devel sqlite-devel 3. Download sources from kontrolpack.com and uncompress the tarball kontrolpack-x.x.x.tar.gz : 4. Go into the libsecuretcp bin directory cd libsecuretcp/ And run the following command : qmake Then run : make You should see the libsecuretcp binary into the bin/ directory 5. Go to the kontrolpack directory cd kontrolpack/ And run the following command : qmake Then run : make You should see the kontrolpack binary into the bin/ directory, run : ./kontrolpack 6. Have fun :-) KontrolPack-3.0.0/COPYING000644 001750 001750 00000043103 11426532116 013176 0ustar00000000 000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. KontrolPack-3.0.0/Main.pro000644 001750 001750 00000001607 11432771104 013553 0ustar00000000 000000 # Copyright (C) 2007-2010 by Thomas Thelliez aka jblud # Contact : # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2.0 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this program; if not, write to # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA TEMPLATE=subdirs CONFIG += ordered SUBDIRS+=libsecuretcp kontrolpack KontrolPack-3.0.0/tmp/000755 001750 001750 00000000000 11432307054 012740 5ustar00000000 000000 KontrolPack-3.0.0/bin/000755 001750 001750 00000000000 11432764015 012714 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/000755 001750 001750 00000000000 11432774053 014633 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/COPYING000644 001750 001750 00000016745 11432170010 015662 0ustar00000000 000000 GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. KontrolPack-3.0.0/libsecuretcp/libsecuretcp.pro000644 001750 001750 00000005225 11432776272 020052 0ustar00000000 000000 # Copyright (C) 2007-2010 by Thomas Thelliez aka jblud # Contact : # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2.0 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this program; if not, write to # the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # libsecuretcp is a cross platform and open source library (LGPLv3) # written with the C++ programming language in 2010. # # libsecuretcp provides methods and cryptographic algorithms to build # efficient and scalable authentification mechanisms with OTP (One Time Password). # Dependencies : libxml2 OpenSSL, QtCore and QtNetwork. # # libsecuretcp provides a negociation mechanism between clients and servers to exchange # asymetric and symetric keys (RSA | AES 256) # TEMPLATE = lib CONFIG += lib_bundle win32 { INCLUDEPATH += C:\\OpenSSL\\include C:\libxml2\lib\include\libxml2 LIBS += -LC:\libxml2\lib\lib -lxml2 -LC:\\OpenSSL\\lib\\MinGW -leay32 -LC:\Qt\2010.02.1\mingw\lib -lws2_32 -lwsock32 } linux-g++ { INCLUDEPATH += /usr/include/openssl /usr/include/libxml2 LIBS += -L/usr/lib -lssl -lxml2 } macx { INCLUDEPATH += /usr/include/openssl /usr/include/libxml2 LIBS += -L/usr/lib -lcrypto -lxml2 } QT += core network CONFIG *= release unix:TARGET = securetcp$(TARGET_ADD) macx:TARGET = securetcp$(TARGET_ADD) win32:TARGET = securetcp VERSION = 0.0.1 SOURCES += auth/auth_tcp_client.cpp \ auth/auth_server.cpp \ auth/auth_session.cpp \ auth/auth_commons.cpp \ crypto/rsa_utils.cpp \ crypto/sha256_utils.cpp \ crypto/aes_utils.cpp \ xml/xml.cpp \ xml/xml_parser.cpp \ utils/b64_utils.cpp HEADERS += auth/auth_tcp_client.h \ auth/auth_server.h \ auth/auth_session.h \ auth/auth_commons.h \ xml/xml.h \ xml/xml_parser.h \ crypto/rsa_utils.h \ crypto/sha256_utils.h \ crypto/aes_utils.h \ utils/utils.h \ utils/b64_utils.h \ crypto/aes_wrapper.h CONFIG(release) { DESTDIR = ../bin RCC_DIR = ../tmp OBJECTS_DIR = ../tmp MOC_DIR = ../tmp } CONFIG(release) { DESTDIR = ../bin RCC_DIR = ../tmp OBJECTS_DIR = ../tmp MOC_DIR = ../tmp } KontrolPack-3.0.0/libsecuretcp/xml/000755 001750 001750 00000000000 11432306346 015427 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/xml/xml.cpp000644 001750 001750 00000012420 11444421633 016732 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "xml.h" char* welcome_token_exchange() { // // JLKJLKJDS xmlNodePtr n; xmlNodePtr m; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "auth"); m = xmlNewNode(NULL, BAD_CAST "token"); xmlAddChild(n, m); xmlSetProp(n, (xmlChar*)"type", (xmlChar*)"token-welcome-exchange"); int i = 0; char random[21]; for (i = 0; i < 21; i++) { char c = (char)(rand() % 26+65); random[i] = c; } random[21] ='\0'; xmlNodeSetContent(m, BAD_CAST random); xmlDocSetRootElement(doc, n); xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); xmlFreeDoc(doc); return (char *) xmlbuff; } char* rsa_public_key_exchange(char* public_key) { // // dqsdqsdmqskdlkqsdlkqji xmlNodePtr n; xmlNodePtr m; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "auth"); m = xmlNewNode(NULL, BAD_CAST "key"); xmlAddChild(n, m); xmlSetProp(n, (xmlChar*)"type", (xmlChar*)"key-exchange"); xmlNodeAddContent(m, BAD_CAST public_key); xmlDocSetRootElement(doc, n); xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); xmlFreeDoc(doc); return (char *) xmlbuff; } char* password_exchange(char* hash) { // [password + // Token hash] xmlNodePtr n; xmlNodePtr m; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "auth"); m = xmlNewNode(NULL, BAD_CAST "hash"); xmlAddChild(n, m); xmlSetProp(n, (xmlChar*)"type", (xmlChar*)"password"); xmlNodeSetContent(m, BAD_CAST hash); xmlDocSetRootElement(doc, n); xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); xmlFreeDoc(doc); return (char *) xmlbuff; } char* symetric_key_exchange(char key[]) { // password-checking-aes-key-sharing : // key xmlNodePtr n, o; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "auth"); o = xmlNewNode(NULL, BAD_CAST "k"); xmlAddChild(n, o); xmlNodeSetContent(o, BAD_CAST key); xmlDocSetRootElement(doc, n); xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); xmlFreeDoc(doc); return (char *) xmlbuff; } char* authentification_status(const char* tra) { // // suceeded xmlNodePtr n; xmlNodePtr m; xmlDocPtr doc; xmlChar *xmlbuff; int buffersize; doc = xmlNewDoc(BAD_CAST "1.0"); n = xmlNewNode(NULL, BAD_CAST "auth"); m = xmlNewNode(NULL, BAD_CAST "status"); xmlAddChild(n, m); xmlSetProp(n, (xmlChar*)"type", (xmlChar*)"encryption-status"); xmlNodeSetContent(m, BAD_CAST tra); xmlDocSetRootElement(doc, n); xmlDocDumpFormatMemory(doc, &xmlbuff, &buffersize, 1); printf("%s", (char *) xmlbuff); xmlFreeDoc(doc); return (char *) xmlbuff; } char* gen_random_char(int size) { int i = 0; char random[size]; for (i = 0; i < size; i++) { char c = (char)(rand() % 26+65); random[i] = c; } random[size] ='\0'; return (char*)random; } KontrolPack-3.0.0/libsecuretcp/xml/xml_parser.h000644 001750 001750 00000003703 11432226220 017747 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #pragma once #ifndef XML_PARSER_H #define XML_PARSER_H #include #include #include #include #include #include #include "../crypto/aes_wrapper.h" #include "../utils/utils.h" char* welcome_token_exchange_parser(char* xml_to_parse); char* key_exchange_parser(char* xml_to_parse); char* password_exchange_parser(char* xml_to_parse); AES_WRAPPER* aes_key_exchange_parser(char* xml_to_parse); char* authentification_status_parser(char* xml_to_parse); #endif KontrolPack-3.0.0/libsecuretcp/xml/xml_parser.cpp000644 001750 001750 00000024355 11432170524 020315 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "xml_parser.h" char* welcome_token_exchange_parser(char* xml_to_parse) { // // JLKJLKJDS int size = strlen(xml_to_parse); printf("Xml to parse size : %d xml : %s \n", size, xml_to_parse); xmlNode *cur_node; xmlChar *token; xmlDocPtr xml_doc; xml_doc = xmlParseMemory (xml_to_parse, strlen(xml_to_parse)); if (xml_doc == NULL) fprintf (stderr, "%s:%d Token parser error.\n", __FILE__, __LINE__); /*Get the root element node */ xmlNode *root = NULL; root = xmlDocGetRootElement(xml_doc); if( !root || !root->name || xmlStrcmp(root->name,(xmlChar*)"auth") ) { xmlFreeDoc(xml_doc); return 0; } for(cur_node = root->children; cur_node != NULL; cur_node = cur_node->next) { if ( cur_node->type == XML_ELEMENT_NODE && !xmlStrcmp(cur_node->name, (const xmlChar *) "token" )) { printf("Element: %s \n", cur_node->name); token = xmlNodeGetContent(cur_node); if(token) printf("TOKEN: %s\n", token); else { /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } } } /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return (char *)token; } char* authentification_status_parser(char* xml_to_parse) { // // suceeded int size = strlen(xml_to_parse); printf("Xml to parse size : %d xml : %s \n", size, xml_to_parse); xmlNode *cur_node; xmlChar *status; xmlDocPtr xml_doc; xml_doc = xmlParseMemory (xml_to_parse, strlen(xml_to_parse)); if (xml_doc == NULL) fprintf (stderr, "%s:%d Status parser error.\n", __FILE__, __LINE__); /*Get the root element node */ xmlNode *root = NULL; root = xmlDocGetRootElement(xml_doc); if( !root || !root->name || xmlStrcmp(root->name,(xmlChar*)"auth") ) { xmlFreeDoc(xml_doc); return 0; } for(cur_node = root->children; cur_node != NULL; cur_node = cur_node->next) { if ( cur_node->type == XML_ELEMENT_NODE && !xmlStrcmp(cur_node->name, (const xmlChar *) "status" ) ) { printf("Element: %s \n", cur_node->name); status = xmlNodeGetContent(cur_node); if(status) printf("STATUS: %s\n", status); else { /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } } } /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return (char *)status; } char* key_exchange_parser(char* xml_to_parse) { // // dqsdqsdmqskdlkqsdlkqji int size = strlen(xml_to_parse); printf("Xml to parse size : %d xml : %s \n", size, xml_to_parse); xmlNode *cur_node; xmlChar *token; xmlDocPtr xml_doc; xml_doc = xmlParseMemory (xml_to_parse, strlen(xml_to_parse)); if (xml_doc == NULL) fprintf (stderr, "%s:%d key exchange parser error.\n", __FILE__, __LINE__); /*Get the root element node */ xmlNode *root = NULL; root = xmlDocGetRootElement(xml_doc); if( !root || !root->name || xmlStrcmp(root->name,(xmlChar*)"auth") ) { xmlFreeDoc(xml_doc); return 0; } for(cur_node = root->children; cur_node != NULL; cur_node = cur_node->next) { if ( cur_node->type == XML_ELEMENT_NODE && !xmlStrcmp(cur_node->name, (const xmlChar *) "key" )) { printf("Element: %s \n", cur_node->name); token = xmlNodeGetContent(cur_node); if(token) printf("Key : %s\n", token); else { /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } } } /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return (char *)token; } char* password_exchange_parser(char* xml_to_parse) { // [password + // Token hash] int size = strlen(xml_to_parse); printf("Xml to parse size : %d xml : %s \n", size, xml_to_parse); xmlNode *cur_node; xmlChar *token; xmlDocPtr xml_doc; xml_doc = xmlParseMemory (xml_to_parse, strlen(xml_to_parse)); if (xml_doc == NULL) fprintf (stderr, "%s:%d hash exchange parser error.\n", __FILE__, __LINE__); /*Get the root element node */ xmlNode *root = NULL; root = xmlDocGetRootElement(xml_doc); if( !root || !root->name || xmlStrcmp(root->name,(xmlChar*)"auth") ) { xmlFreeDoc(xml_doc); return 0; } for(cur_node = root->children; cur_node != NULL; cur_node = cur_node->next) { if ( cur_node->type == XML_ELEMENT_NODE && !xmlStrcmp(cur_node->name, (const xmlChar *) "hash" ) ) { printf("Element: %s \n", cur_node->name); token = xmlNodeGetContent(cur_node); if(token) printf("hash : %s\n", token); else { /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } } } /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return (char *)token; } AES_WRAPPER* aes_key_exchange_parser(char* xml_to_parse) { // aes-key-sharing : key int size = strlen(xml_to_parse); printf("Xml to parse size : %d xml : %s \n", size, xml_to_parse); AES_WRAPPER *wrapper = new AES_WRAPPER(); xmlNode *cur_node; xmlChar *aes_key; xmlDocPtr xml_doc; xml_doc = xmlParseMemory (xml_to_parse, strlen(xml_to_parse)); if (xml_doc == NULL) fprintf (stderr, "%s:%d AES key exchange parser error.\n", __FILE__, __LINE__); /*Get the root element node */ xmlNode *root = NULL; root = xmlDocGetRootElement(xml_doc); if( !root || !root->name || xmlStrcmp(root->name,(xmlChar*)"auth") ) { xmlFreeDoc(xml_doc); return 0; } for(cur_node = root->children; cur_node != NULL; cur_node = cur_node->next) { if ( cur_node->type == XML_ELEMENT_NODE && !xmlStrcmp(cur_node->name, (const xmlChar *) "k" ) ) { aes_key = xmlNodeGetContent(cur_node); if(aes_key) { wrapper->key = (char*) aes_key; } else { /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return 0; } } } /*free the document */ xmlFreeDoc(xml_doc); /* *Free the global variables that may *have been allocated by the parser. */ xmlCleanupParser(); return wrapper; } KontrolPack-3.0.0/libsecuretcp/xml/xml.h000644 001750 001750 00000003366 11432170450 016403 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef XML_H #define XM_H #include char* welcome_token_exchange(); char* gen_random_char(int size); char* rsa_public_key_exchange(char* public_key); char* password_exchange(char* hash); char* symetric_key_exchange(char key[]); char* authentification_status(const char* tra); #endif KontrolPack-3.0.0/libsecuretcp/utils/000755 001750 001750 00000000000 11432306346 015767 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/utils/b64_utils.h000644 001750 001750 00000003724 11432170432 017754 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef B64_UTILS_H #define B64_UTILS_H #include #include #include #include #include #include #include #include #include #include #include using namespace std; char* base64(const unsigned char *input, int length); char* unbase64(unsigned char *input, int length); // C++ implementation with stdlib string encode(string data); string decode(string data); #endif KontrolPack-3.0.0/libsecuretcp/utils/b64_utils.cpp000644 001750 001750 00000011103 11432170504 020275 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "b64_utils.h" char *base64(const unsigned char *input, int length) { BIO *bmem, *b64; BUF_MEM *bptr; b64 = BIO_new(BIO_f_base64()); bmem = BIO_new(BIO_s_mem()); b64 = BIO_push(b64, bmem); BIO_write(b64, input, length); BIO_flush(b64); BIO_get_mem_ptr(b64, &bptr); char *buff = (char *)malloc(bptr->length); memcpy(buff, bptr->data, bptr->length-1); buff[bptr->length-1] = 0; BIO_free_all(b64); return buff; } char *unbase64(unsigned char *input, int length) { BIO *b64, *bmem; char *buffer = (char *)malloc(length); memset(buffer, 0, length); b64 = BIO_new(BIO_f_base64()); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); bmem = BIO_new_mem_buf(input, length); bmem = BIO_push(b64, bmem); BIO_read(bmem, buffer, length); BIO_free_all(bmem); return buffer; } const char fillchar = '='; // 00000000001111111111222222 // 01234567890123456789012345 static std::string cvt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // 22223333333333444444444455 // 67890123456789012345678901 "abcdefghijklmnopqrstuvwxyz" // 555555556666 // 234567890123 "0123456789+/"; string encode(string data) { string::size_type i; char c; string::size_type len = data.length(); string ret; for (i = 0; i < len; ++i) { c = (data[i] >> 2) & 0x3f; ret.append(1, cvt[c]); c = (data[i] << 4) & 0x3f; if (++i < len) c |= (data[i] >> 4) & 0x0f; ret.append(1, cvt[c]); if (i < len) { c = (data[i] << 2) & 0x3f; if (++i < len) c |= (data[i] >> 6) & 0x03; ret.append(1, cvt[c]); } else { ++i; ret.append(1, fillchar); } if (i < len) { c = data[i] & 0x3f; ret.append(1, cvt[c]); } else { ret.append(1, fillchar); } } return(ret); } string decode(string data) { string::size_type i; char c; char c1; string::size_type len = data.length(); string ret; for (i = 0; i < len; ++i) { c = (char) cvt.find(data[i]); ++i; c1 = (char) cvt.find(data[i]); c = (c << 2) | ((c1 >> 4) & 0x3); ret.append(1, c); if (++i < len) { c = data[i]; if (fillchar == c) break; c = (char) cvt.find(c); c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf); ret.append(1, c1); } if (++i < len) { c1 = data[i]; if (fillchar == c1) break; c1 = (char) cvt.find(c1); c = ((c << 6) & 0xc0) | c1; ret.append(1, c); } } return(ret); } KontrolPack-3.0.0/libsecuretcp/utils/utils.h000644 001750 001750 00000004162 11432224302 017272 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #pragma once #ifndef KP_UTILS_H #define KP_UTILS_H #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_RECEPTION 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 #define AUTH_SUCCESS 4 #define AUTH_CLIENT 5 #define END_RSA_PUBLIC_KEY "-----END RSA PUBLIC KEY-----" #define RSA_KEY_SIZE 2048 #define RSA_BUFFER_LEN 255 #define TRIGGER_UPDATE_PROGRESS 10000 #define ERROR "ERRORS AUTH" #define XML_START_ELEMENT "" #define AUTH_ELEMENT "auth" #define XML_END_ELEMENT "" #define SUCCESS "SUCCESS" #define FAILED "FAILED" #define HEADER_SIZE 20 #define HEADER_PADDING 9 #define SIZE_DELIMITER "#HEAD-SIZE#" #define END_DELIMITER ";#END#;\n " #define END ";#END#;" #endif KontrolPack-3.0.0/libsecuretcp/auth/000755 001750 001750 00000000000 11445337160 015572 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/auth/auth_server.cpp000644 001750 001750 00000016040 11432214522 020616 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "auth_server.h" auth_server::auth_server( QString server_password, QObject *parent) : password(server_password), QTcpServer(parent) { client_list = new QMap(); QObject::connect(this, SIGNAL(newConnection()), this, SLOT(add_new_client())); if (server_password.length() > 30) emit wrong_password("Password too long. Password should be between 8 and 30 digits."); nbr_client = 0; } void auth_server::add_new_client() { nbr_client++; QTcpSocket *socket = this->nextPendingConnection(); auth_session *remote_client = new auth_session(socket, nbr_client, password, this); QObject::connect(socket, SIGNAL(readyRead()), remote_client, SLOT(read_results())); QObject::connect(remote_client, SIGNAL(emit_tcp_state(int,int)), this, SLOT(tcp_state(int,int))); QObject::connect(remote_client, SIGNAL(emit_error(int)), this, SLOT(auth_error_handler(int))); QObject::connect(remote_client, SIGNAL(auth_suceeded(int)), this, SLOT(auth_suceeded(int))); QObject::connect(remote_client, SIGNAL(received_stream(QString, int)), this, SLOT(received_stream_slot(QString, int))); QObject::connect(remote_client, SIGNAL(remove_client(int)), this, SLOT(remove_client(int))); client_list->insert(nbr_client, remote_client); // Start the authentification process // sending TOKEN to remote client. remote_client->handle_crypted_auth(); } int auth_server::write_encrypted_data_to_socket(char* buffer, int nbr) { if (client_list->contains (nbr)) { auth_session *client = client_list->value(nbr); if (client->auth_status == AUTH_SUCCESS) { client->write_data_to_socket(client->auth_aes_encrypt(buffer).toUtf8().data()); client->get_socket()->flush(); return 1; } } return 0; } int auth_server::write_data_to_socket(char* buffer, int nbr) { if (client_list->contains (nbr)) { auth_session *client = client_list->value(nbr); client->get_socket()->write(QString(buffer).toUtf8()); client->get_socket()->flush(); return 1; } return 0; } QString auth_server::encrypt_message(char* buffer, int nbr) { if (client_list->contains (nbr)) { auth_session *client = client_list->value(nbr); return client->auth_aes_encrypt(buffer); } } void auth_server::disconnect_client(int nbr) { if (client_list->contains(nbr)) { auth_session *client = client_list->value(nbr); client->get_socket()->close(); client->get_socket()->disconnect(); this->remove_client(nbr); } } void auth_server::remove_client(int nbr) { if (client_list->contains(nbr)) { client_list->remove(nbr); nbr_client--; } } int auth_server::stop_server() { nbr_client = 0; if (!client_list->empty()) { for (int j = 0; j <= 100; ++j) { if (client_list->contains(j)) { auth_session *client = client_list->value(j); client->get_socket()->close(); client->get_socket()->disconnect(); remove_client(j); } } } close(); this->close(); this->disconnect(); return 0; } /* #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_EXCHANGE 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 */ void auth_server::tcp_state(int state, int client_nbr) { switch (state) { case TOKEN_WELCOME : { qDebug("Server notification : Status TOKEN_WELCOME"); emit signals_state(state, client_nbr); break; } case RSA_PUBLIC_KEY_RECEPTION : { qDebug("Server notification : Status RSA_PUBLIC_KEY_EXCHANGE"); emit signals_state(state, client_nbr); break; } case PASSWORD_VALIDATION : { qDebug("Server notification : Status PASSWORD_VALIDATION"); emit signals_state(state, client_nbr); break; } case AES_KEY_RECEPTION : { qDebug("Server notification : Status AES_KEY_RECEPTION"); emit signals_state(state, client_nbr); break; } case 4 : { qDebug("Server notification : Status 4"); emit signals_state(state, client_nbr); break; } case 5 : { qDebug("Server notification : Status 5"); emit signals_state(state, client_nbr); break; } default: ; } } /* Connect the app to the received_stream_signal to be aware of reception and handle streams. */ void auth_server::received_stream_slot(QString message, int client_nbr) { emit received_stream_signal(message, client_nbr); } void auth_server::auth_error_handler(int client_nbr) { qDebug("Server notification : Auth error"); this->remove_client(client_nbr); emit emit_error(client_nbr); } /* Connect to the auth_succeeded to be aware of new client authentification state. */ void auth_server::auth_suceeded(int client_nbr) { qDebug("Server notification : Auth suceeded"); emit auth_succeeded(client_nbr); } int auth_server::get_client_number() { return client_list->size(); } QMap* auth_server::get_client_list() { return client_list; } KontrolPack-3.0.0/libsecuretcp/auth/auth_commons.h000644 001750 001750 00000003177 11432226140 020436 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef AUTH_COMMONS #define AUTH_COMMONS #include #include "../utils/utils.h" QString add_header_padding(int packet_size); int remove_header_padding(int packet_size); #endif KontrolPack-3.0.0/libsecuretcp/auth/auth_tcp_client.cpp000644 001750 001750 00000043242 11444421136 021444 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "auth_tcp_client.h" auth_tcp_client::auth_tcp_client( QString server_password, QObject *parent) : password(server_password), QObject(parent) { tcp_socket = new QTcpSocket(this); auth_status = TOKEN_WELCOME; OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); rsa_key_pair = RSA_generate_key ( RSA_KEY_SIZE, 65537, NULL, NULL ); if (rsa_key_pair == NULL) { fprintf (stderr, "%s:%d Creation of keys failed\n", __FILE__, __LINE__); } // Check key structure int valid = RSA_check_key(rsa_key_pair); if (valid == 0) { fprintf (stderr, "%s:%d Invalid RSA Key.\n", __FILE__, __LINE__); } pubk = RSA_Key_to_char_array(rsa_key_pair, PUBLIC_KEY, NULL); if (pubk == NULL) { fprintf (stderr, "%s:%d Problem converting Key.\n", __FILE__, __LINE__); } char * prvk = RSA_Key_to_char_array(rsa_key_pair, PRIVATE_KEY, NULL); if (prvk == NULL) { fprintf (stderr, "%s:%d Problem converting Key.\n", __FILE__, __LINE__); } rsa_prv = char_array_to_RSA_key(prvk, PRIVATE_KEY, NULL); if (rsa_prv == NULL) { fprintf (stderr, "%s:%d Problem converting Key.\n", __FILE__, __LINE__); } qstring_pub_key = QString(pubk); receiving = false; QObject::connect(tcp_socket, SIGNAL(readyRead()), this, SLOT(read_from_server()), Qt::DirectConnection); QObject::connect(tcp_socket, SIGNAL(disconnected()), this, SLOT(disconnected_client())); QObject::connect(tcp_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socket_error(QAbstractSocket::SocketError))); } void auth_tcp_client::read_from_server() { if (auth_status == AUTH_CLIENT) { QString data = get_data_from_socket(); if (!data.isEmpty()) { QString decrypted = auth_aes_decrypt(data); emit received_stream(decrypted); } } else { handle_crypted_auth(); } } void auth_tcp_client::connect_to_server( const char* ip_server, int port_server) { tcp_socket->connectToHost(ip_server, port_server); } void auth_tcp_client::stop_client() { if (tcp_socket->state() != QAbstractSocket::UnconnectedState && tcp_socket->state() != QAbstractSocket::ClosingState) { tcp_socket->close(); tcp_socket->abort(); } } QString auth_tcp_client::get_data_from_socket() { if (!receiving) { QString sLine = QString(""); if (tcp_socket->bytesAvailable() > HEADER_SIZE) { sLine.append(tcp_socket->read(HEADER_SIZE)); } QStringList list = sLine.split(SIZE_DELIMITER); if (list.size() > 1) { packet_size = remove_header_padding(list.at(0).toInt()); current_bytes = new QByteArray; receiving = true; current_bytes->append(QByteArray(list.at(1).toUtf8())); current_size = current_bytes->length(); } else {send_error(); return "";} } if (packet_size > current_size) { while (tcp_socket->bytesAvailable() > 0) { current_bytes->append(tcp_socket->read(10000)); current_size = current_bytes->length(); QApplication::processEvents(); emit update_progress_size(current_size, packet_size); } } if (packet_size == current_size) { QString result = QString(current_bytes->data()); delete current_bytes; receiving = false; current_bytes = NULL; current_size = 0; packet_size = 0; if (result.contains(ERROR, Qt::CaseInsensitive)) send_error(); return result; } return ""; } void auth_tcp_client::write_data_to_socket(QString data) { tcp_socket->write(QString(add_header_padding(data.length()) + QString(SIZE_DELIMITER) + data).toUtf8()); tcp_socket->flush(); } /* #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_EXCHANGE 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 #define AUTH_SUCCESS 4 */ void auth_tcp_client::handle_crypted_auth() { QString result; switch( auth_status ) { case TOKEN_WELCOME: { // decoding from base64. result = get_data_from_socket(); if (!result.isEmpty()) { if (result.contains(XML_START_ELEMENT, Qt::CaseInsensitive) && result.contains(XML_END_ELEMENT, Qt::CaseInsensitive)) { token = welcome_token_exchange_parser( result.toUtf8().data()); pub_key_final = qstring_pub_key.mid( 0, qstring_pub_key.indexOf( END_RSA_PUBLIC_KEY)); pub_key_final.append(END_RSA_PUBLIC_KEY); write_data_to_socket(QString( rsa_public_key_exchange( pub_key_final.toUtf8().data()))); emit emit_tcp_state(TOKEN_WELCOME); auth_status = AES_KEY_RECEPTION; } else { fprintf (stderr, "%s:%d TOKEN welcome XML : bad format..\n", __FILE__, __LINE__); send_error(); } } } break; case AES_KEY_RECEPTION : { result = get_data_from_socket(); if (!result.isEmpty() && !result.contains(ERROR, Qt::CaseInsensitive)) { unsigned char decrypted[2560] = { 0 }; if (RSA_private_decrypt(RSA_size(rsa_key_pair), (unsigned char *) QByteArray::fromBase64( QByteArray( result.toUtf8().data())).data(), decrypted, rsa_prv, RSA_PKCS1_PADDING)==-1) { int error = ERR_get_error(); fprintf (stderr, "%s %s:%d \n", ERR_lib_error_string( error ), __FILE__, __LINE__); fprintf (stderr, "%s %s:%d \n", ERR_func_error_string( error ), __FILE__, __LINE__); fprintf (stderr, "%s %s:%d \n", ERR_reason_error_string( error ), __FILE__, __LINE__); send_error(); } else if (strlen((char*) decrypted) == 0) { fprintf (stderr, "%s:%d Error decrypting data.\n", __FILE__, __LINE__); send_error(); } else { if (QString((char*)decrypted).contains(XML_START_ELEMENT, Qt::CaseInsensitive) && QString((char*)decrypted).contains( XML_END_ELEMENT, Qt::CaseInsensitive)) { QString message_final = QString((char*)decrypted); message_final = message_final.mid(0, message_final.indexOf( XML_END_ELEMENT)); message_final.append(XML_END_ELEMENT); aes = aes_key_exchange_parser( (char*) message_final.toUtf8().data()); // SHA1 hash of token + password. unsigned char sha1sum[SHA_DIGEST_LENGTH]; strcat(token, password.toUtf8().data()); SHA1((unsigned char*)token, strlen(token), sha1sum); b64_hashed_password = base64( (unsigned char*)sha1sum, sizeof(sha1sum)); write_data_to_socket(auth_aes_encrypt(password_exchange( b64_hashed_password))); auth_status = AUTH_SUCCESS; emit emit_tcp_state(AES_KEY_RECEPTION); } else { fprintf (stderr, "%s:%d AES key reception XML : bad format.\n", __FILE__, __LINE__); send_error(); } } } break; } case AUTH_SUCCESS : result = get_data_from_socket(); // Receiving encrypted stream with AES symetric algorithm if (!result.isEmpty()) { QString decrypted = auth_aes_decrypt(result); if (decrypted.contains(SUCCESS, Qt::CaseInsensitive)) { auth_status = AUTH_CLIENT; emit auth_suceeded(); emit emit_tcp_state(AUTH_SUCCESS); } else { tcp_socket->close(); tcp_socket->disconnect(); emit wrong_password(); } } break; } } QString auth_tcp_client::auth_aes_encrypt(char* message) { // AES Encryption + base64 encoding std::string key_encrypt((char*) aes->key); std::string std_xml((char*) message); string str = END_DELIMITER; std_xml.append(str); std::string encrypted(aes_encrypt(encode(std_xml), key_encrypt)); return QString::fromStdString(encrypted); } QString auth_tcp_client::auth_aes_decrypt(QString message) { // AES Decryption after base64 decoding std::string key_decrypt((char*) aes->key); std::string decrypted(aes_decrypt(message.toStdString(), key_decrypt)); QString message_final = QString(decode(decrypted).c_str()); message_final = message_final.mid(0, message_final.indexOf(END)); return message_final; } int auth_tcp_client::write_encrypted_data_to_socket(QString data) { if (auth_status == AUTH_CLIENT) { this->write_data_to_socket(auth_aes_encrypt(data.toUtf8().data())); return 1; } return 0; } void auth_tcp_client::send_error() { emit emit_error(); write_data_to_socket(QString(ERROR)); tcp_socket->close(); tcp_socket->disconnect(); } void auth_tcp_client::disconnected_client() { emit disconnected_socket(); } /* QAbstractSocket::ConnectionRefusedError 0 The connection was refused by the peer (or timed out). QAbstractSocket::RemoteHostClosedError 1 The remote host closed the connection. Note that the client socket (i.e., this socket) will be closed after the remote close notification has been sent. QAbstractSocket::HostNotFoundError 2 The host address was not found. QAbstractSocket::SocketAccessError 3 The socket operation failed because the application lacked the required privileges. QAbstractSocket::SocketResourceError 4 The local system ran out of resources (e.g., too many sockets). QAbstractSocket::SocketTimeoutError 5 The socket operation timed out. QAbstractSocket::DatagramTooLargeError 6 The datagram was larger than the operating system's limit (which can be as low as 8192 bytes). QAbstractSocket::NetworkError 7 An error occurred with the network (e.g., the network cable was accidentally plugged out). QAbstractSocket::AddressInUseError 8 The address specified to QUdpSocket::bind() is already in use and was set to be exclusive. QAbstractSocket::SocketAddressNotAvailableError 9 The address specified to QUdpSocket::bind() does not belong to the host. QAbstractSocket::UnsupportedSocketOperationError 10 The requested socket operation is not supported by the local operating system (e.g., lack of IPv6 support). QAbstractSocket::ProxyAuthenticationRequiredError 12 The socket is using a proxy, and the proxy requires authentication. QAbstractSocket::SslHandshakeFailedError 13 The SSL/TLS handshake failed, so the connection was closed (only used in QSslSocket) QAbstractSocket::UnfinishedSocketOperationError 11 Used by QAbstractSocketEngine only, The last operation attempted has not finished yet (still in progress in the background). QAbstractSocket::ProxyConnectionRefusedError 14 Could not contact the proxy server because the connection to that server was denied QAbstractSocket::ProxyConnectionClosedError 15 The connection to the proxy server was closed unexpectedly (before the connection to the final peer was established) QAbstractSocket::ProxyConnectionTimeoutError 16 The connection to the proxy server timed out or the proxy server stopped responding in the authentication phase. QAbstractSocket::ProxyNotFoundError 17 The proxy address set with setProxy() (or the application proxy) was not found. QAbstractSocket::ProxyProtocolError 18 The connection negotiation with the proxy server because the response from the proxy server could not be understood. QAbstractSocket::UnknownSocketError */ void auth_tcp_client::socket_error(QAbstractSocket::SocketError socketError) { switch (socketError) { case QAbstractSocket::RemoteHostClosedError: emit disconnected_client(QAbstractSocket::RemoteHostClosedError); break; case QAbstractSocket::HostNotFoundError: qDebug("The host was not found. Please check the " "host name and port settings."); emit disconnected_client(QAbstractSocket::HostNotFoundError); break; case QAbstractSocket::ConnectionRefusedError: qDebug("Make sure the KontrolPack server is running, " "and check that the host name and port " "settings are correct."); emit disconnected_client(QAbstractSocket::ConnectionRefusedError); break; case QAbstractSocket::SocketAccessError: emit disconnected_client(QAbstractSocket::SocketAccessError); break; case QAbstractSocket::SocketResourceError: emit disconnected_client(QAbstractSocket::SocketResourceError); break; case QAbstractSocket::SocketTimeoutError: emit disconnected_client(QAbstractSocket::SocketTimeoutError); break; case QAbstractSocket::DatagramTooLargeError: emit disconnected_client(QAbstractSocket::DatagramTooLargeError); break; case QAbstractSocket::NetworkError: emit disconnected_client(QAbstractSocket::NetworkError); break; case QAbstractSocket::AddressInUseError: emit disconnected_client(QAbstractSocket::AddressInUseError); break; case QAbstractSocket::SocketAddressNotAvailableError: emit disconnected_client(QAbstractSocket::SocketAddressNotAvailableError); break; case QAbstractSocket::UnsupportedSocketOperationError: emit disconnected_client(QAbstractSocket::UnsupportedSocketOperationError); break; case QAbstractSocket::ProxyAuthenticationRequiredError: emit disconnected_client(QAbstractSocket::ProxyAuthenticationRequiredError); break; case QAbstractSocket::SslHandshakeFailedError: emit disconnected_client(QAbstractSocket::SslHandshakeFailedError); break; case QAbstractSocket::UnfinishedSocketOperationError: emit disconnected_client(QAbstractSocket::UnfinishedSocketOperationError); break; case QAbstractSocket::ProxyConnectionRefusedError: emit disconnected_client(QAbstractSocket::ProxyConnectionRefusedError); break; case QAbstractSocket::ProxyConnectionClosedError: emit disconnected_client(QAbstractSocket::ProxyConnectionClosedError); break; case QAbstractSocket::ProxyConnectionTimeoutError: emit disconnected_client(QAbstractSocket::ProxyConnectionTimeoutError); break; case QAbstractSocket::ProxyNotFoundError: emit disconnected_client(QAbstractSocket::ProxyNotFoundError); break; case QAbstractSocket::ProxyProtocolError: emit disconnected_client(QAbstractSocket::ProxyProtocolError); break; case QAbstractSocket::UnknownSocketError: emit disconnected_client(QAbstractSocket::UnknownSocketError); break; default: ; } } KontrolPack-3.0.0/libsecuretcp/auth/auth_session.cpp000644 001750 001750 00000027677 11444421172 021021 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "auth_session.h" auth_session::auth_session(QTcpSocket *socket, int client_nbr, QString server_password, QObject *parent) : tcp_socket(socket), nbr(client_nbr), password(server_password), QObject(parent) { OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); receiving = false; set_socket(tcp_socket); QObject::connect(tcp_socket, SIGNAL(disconnected()), this, SLOT(disconnected_client())); QObject::connect(tcp_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socket_error(QAbstractSocket::SocketError))); auth_status = TOKEN_WELCOME; xml = welcome_token_exchange(); token = welcome_token_exchange_parser(xml); strcat(token, password.toUtf8().data()); } void auth_session::set_socket(QTcpSocket* qSocket) { tcp_socket = qSocket; } QTcpSocket* auth_session::get_socket() { return tcp_socket; } void auth_session::read_results() { if (auth_status == AUTH_SUCCESS) { // If server received something then decrypt // and send message to app with signal. QString data = get_data_from_socket(); if (!data.isEmpty()) { QString decrypted = auth_aes_decrypt(data); emit received_stream(decrypted, nbr); } } else { handle_crypted_auth(); } } QString auth_session::get_data_from_socket() { if (!receiving) { QString sLine = QString(""); if (tcp_socket->bytesAvailable() > HEADER_SIZE) { sLine.append(tcp_socket->read(HEADER_SIZE)); } QStringList list = sLine.split(SIZE_DELIMITER); if (list.size() > 1) { packet_size = remove_header_padding(list.at(0).toInt()); current_bytes = new QByteArray; receiving = true; current_bytes->append(QByteArray(list.at(1).toUtf8())); current_size = current_bytes->length(); } else {send_error(); return "";} } if (packet_size > current_size) { while (tcp_socket->bytesAvailable() > 0) { current_bytes->append(tcp_socket->read(10000)); current_size = current_bytes->length(); QApplication::processEvents(); emit update_progress_size(current_size, packet_size); } } if (packet_size == current_size) { QString result = QString(current_bytes->data()); delete current_bytes; receiving = false; current_bytes = NULL; current_size = 0; packet_size = 0; if (result.contains(ERROR, Qt::CaseInsensitive)) { send_error(); } return result; } return ""; } void auth_session::write_data_to_socket(QString data) { tcp_socket->write(QString(add_header_padding(data.length()) + QString(SIZE_DELIMITER) + data).toUtf8()); tcp_socket->flush(); } void auth_session::disconnected_client() { emit remove_client(nbr); } /* #define TOKEN_WELCOME 0 #define RSA_PUBLIC_KEY_EXCHANGE 1 #define PASSWORD_VALIDATION 2 #define AES_KEY_RECEPTION 3 #define AUTH_SUCCESS 4 */ void auth_session::handle_crypted_auth() { QString result; switch( auth_status ) { case TOKEN_WELCOME : { // Sending token converting it in b64 format before sending over network. write_data_to_socket(QString(xml)); auth_status = RSA_PUBLIC_KEY_RECEPTION; emit emit_tcp_state(TOKEN_WELCOME, nbr); break; } case RSA_PUBLIC_KEY_RECEPTION : // decode from base64. result = get_data_from_socket(); if (!result.isEmpty()) { if (result.contains(XML_START_ELEMENT, Qt::CaseInsensitive) && result.contains(XML_END_ELEMENT, Qt::CaseInsensitive)) { // Saving client RSA public key. client_pub_key = key_exchange_parser(result.toUtf8().data()); if (strlen(client_pub_key) == 0) fprintf (stderr, "%s:%d Error transfering key...\n", __FILE__, __LINE__); rsa_client_pub = char_array_to_RSA_key( client_pub_key, PUBLIC_KEY, NULL); if (rsa_client_pub == NULL) { fprintf (stderr, "%s:%d Invalid RSA Key.\n", __FILE__, __LINE__); send_error(); break; } // Preparing AES (256) key to secure and encrypt messages between workstations. int i = 0; for (i = 0; i < 32; i++) { char c = (char)(rand() % 26+65); aes_key[i] = c; } aes_key[32] = '\0'; char *xml = symetric_key_exchange(aes_key); unsigned char cleartext[strlen(xml)]; memcpy(cleartext, xml, strlen(xml)); // Encrypt with the saved RSA public Key unsigned char *encrypted = (unsigned char *)malloc(RSA_size(rsa_client_pub)); if (RSA_public_encrypt ( strlen((char *)cleartext), cleartext, encrypted, rsa_client_pub, RSA_PKCS1_PADDING )==-1) { int error = ERR_get_error(); fprintf (stderr, "%s %s:%d \n", ERR_lib_error_string( error ), __FILE__, __LINE__); fprintf (stderr, "%s %s:%d \n", ERR_func_error_string( error ), __FILE__, __LINE__); fprintf (stderr, "%s %s:%d \n", ERR_reason_error_string( error ), __FILE__, __LINE__); send_error(); break; } // To prevent encryption error : check // if encrypted length is at least as long as the // RSA key length. while (strlen((char *)encrypted) < RSA_BUFFER_LEN) { // Encrypt with the saved Key. if (RSA_public_encrypt ( strlen((char *)cleartext), cleartext, encrypted, rsa_client_pub, RSA_PKCS1_PADDING )==-1) { fprintf (stderr, "%s:%d Encryption failed\n", __FILE__, __LINE__); send_error(); break; } } // Sending AES key to remote client. write_data_to_socket(QString(base64( encrypted, strlen((char*)encrypted)))); emit emit_tcp_state(RSA_PUBLIC_KEY_RECEPTION, nbr); auth_status = PASSWORD_VALIDATION; } else { fprintf (stderr, "%s:%d Key exchange bad format.\n", __FILE__, __LINE__); send_error(); } } break; case PASSWORD_VALIDATION : { result = get_data_from_socket(); if (!result.isEmpty() && !result.contains(ERROR, Qt::CaseInsensitive)) { // Receiving password encrypted with // AES symetric algorithm. QString decrypted = auth_aes_decrypt(result); if (decrypted.contains(XML_START_ELEMENT, Qt::CaseInsensitive) && decrypted.contains( XML_END_ELEMENT, Qt::CaseInsensitive)) { b64_hashed_password_from_client = password_exchange_parser( decrypted.toUtf8().data()); // SHA1 hash of token+password. unsigned char sha1sum[SHA_DIGEST_LENGTH]; SHA1((unsigned char*)token, strlen(token), sha1sum); b64_hashed_password = base64( (unsigned char*)sha1sum, sizeof(sha1sum)); if (QString::compare(b64_hashed_password, b64_hashed_password_from_client, Qt::CaseInsensitive) == 0) { emit emit_tcp_state(PASSWORD_VALIDATION, nbr); auth_status = AUTH_SUCCESS; write_data_to_socket(auth_aes_encrypt( SUCCESS)); emit auth_suceeded(nbr); } else { write_data_to_socket(auth_aes_encrypt( FAILED)); emit emit_error(nbr); tcp_socket->close(); tcp_socket->disconnect(); } } else { send_error(); fprintf (stderr, "%s:%d Bad AES encryption, password verification : XML bad format.\n", __FILE__, __LINE__); } } break; } } } void auth_session::send_error() { write_data_to_socket(QString(ERROR)); emit emit_error(nbr); tcp_socket->close(); tcp_socket->disconnect(); } QString auth_session::auth_aes_encrypt(char* message) { // AES Encryption std::string key_encrypt((char*) aes_key); std::string std_xml((char*) message); string str = END_DELIMITER; std_xml.append(str); std::string encrypted(aes_encrypt(encode(std_xml), key_encrypt)); return QString::fromStdString(encrypted); } QString auth_session::auth_aes_decrypt(QString message) { // AES Decryption std::string key_decrypt((char*) aes_key); std::string decrypted(aes_decrypt( message.toStdString(), key_decrypt)); QString message_final = QString(decode(decrypted).c_str()); message_final = message_final.mid(0, message_final.indexOf(END)); return message_final; } void auth_session::socket_error(QAbstractSocket::SocketError socketError) { emit remove_client(nbr); } KontrolPack-3.0.0/libsecuretcp/auth/auth_tcp_client.h000644 001750 001750 00000007017 11445164404 021114 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef HEADER_TCP_CLIENT_AUTH #define HEADER_TCP_CLIENT_AUTH #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../crypto/rsa_utils.h" #include "../xml/xml_parser.h" #include "../xml/xml.h" #include "../utils/b64_utils.h" #include "../crypto/aes_utils.h" #include "../crypto/aes_wrapper.h" #include "../utils/b64_utils.h" #include "auth_commons.h" class auth_tcp_client : public QObject { Q_OBJECT public: auth_tcp_client(QString server_password, QObject *parent); QString get_data_from_socket(); void write_data_to_socket(QString data); int write_encrypted_data_to_socket(QString data); void send_error(); QString auth_aes_encrypt(char* message); QString auth_aes_decrypt(QString message); signals: void emit_tcp_state(int state); void emit_error(); void auth_suceeded(); void received_stream(QString message); void received_stream(QTcpSocket *tcp_socket); void disconnected_client(int error); void disconnected_socket(); void wrong_password(); void update_progress_size(int current, int total); public slots: void connect_to_server( const char* ip_server, int port_server); void stop_client(); void socket_error(QAbstractSocket::SocketError socketError); void disconnected_client(); private slots: void read_from_server(); private: QTcpSocket *tcp_socket; quint16 block_size; int auth_status; RSA *rsa_key_pair; RSA *rsa_pub; RSA *rsa_prv; char *pubk; char *b64_hashed_password; QString qstring_pub_key; QString pub_key_final; QString password; AES_WRAPPER *aes; int current_size; int packet_size; QByteArray *current_bytes; bool receiving; int progress; char* token; char* authentication; void handle_crypted_auth(); }; #endif KontrolPack-3.0.0/libsecuretcp/auth/auth_session.h000644 001750 001750 00000006471 11445164472 020463 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef HEADER_SESSION_AUTH #define HEADER_SESSION_AUTH #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../crypto/rsa_utils.h" #include "../xml/xml.h" #include "../xml/xml_parser.h" #include "../crypto/aes_utils.h" #include "../utils/b64_utils.h" #include "auth_commons.h" using namespace std; class auth_session : public QObject { Q_OBJECT public: auth_session(QTcpSocket *socket, int client_nbr, QString server_password, QObject *parent); void set_socket(QTcpSocket* tcp_socket); QTcpSocket* get_socket(); QString get_data_from_socket(); void write_data_to_socket(QString data); void handle_crypted_auth(); QString auth_aes_decrypt(QString message); int nbr; void send_error(); QString auth_aes_encrypt(char* message); int auth_status; signals: void emit_tcp_state(int state, int client_nbr); void emit_error(int client_nbr); void auth_suceeded(int nbr); void received_stream(QString message, int client_nbr); void remove_client(int client_nbr); void update_progress_size(int current, int total); public slots: void read_results(); void disconnected_client(); void socket_error(QAbstractSocket::SocketError socketError); private: QTcpSocket *tcp_socket; RSA *rsa_client_pub; char *client_pub_key; char *b64_hashed_password; char *b64_hashed_password_from_client; char* token; char* xml; QString password; char aes_key[32]; int current_size; int packet_size; QByteArray *current_bytes; bool receiving; int progress; }; #endif KontrolPack-3.0.0/libsecuretcp/auth/auth_server.h000644 001750 001750 00000005705 11445164504 020301 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef HEADER_SERVER_AUTH #define HEADER_SERVER_AUTH #include #include #include #include #include #include #include #include #include "auth_session.h" #include "../utils/utils.h" #include #include #include #include #include #include #include #define MAX_CLIENTS 10000 class auth_server : public QTcpServer { Q_OBJECT public: int port_server; const char* ip_server; auth_server(QString server_password, QObject *parent = 0); QMap *client_list; int nbr_client; QMap* get_client_list(); int get_client_number(); int write_encrypted_data_to_socket(char* buffer, int nbr); int write_data_to_socket(char* buffer, int nbr); QString encrypt_message(char* buffer, int nbr); int stop_server(); void disconnect_client(int nbr); signals: void received_stream_signal(QString message, int client_nbr); void signals_state(int state, int client_nbr); void auth_succeeded(int client_nbr); void emit_error(int client_nbr); void wrong_password(QString msg); public slots: void add_new_client(); void tcp_state(int state, int client_nbr); void auth_error_handler(int client_nbr); void auth_suceeded(int client_nbr); void received_stream_slot(QString message, int client_nbr); void remove_client(int nbr); private: QString password; }; #endif KontrolPack-3.0.0/libsecuretcp/auth/auth_commons.cpp000644 001750 001750 00000003545 11432170456 021000 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "auth_commons.h" QString add_header_padding(int packet_size) { QString size = QString::number(packet_size); while (size.length() < HEADER_PADDING) { size = "0" + size; } return size; } int remove_header_padding(int packet_size) { QString size = QString::number(packet_size); while (size.startsWith("0")) { size.remove(0, 1); } return size.toInt(); } KontrolPack-3.0.0/libsecuretcp/crypto/000755 001750 001750 00000000000 11432306344 016145 5ustar00000000 000000 KontrolPack-3.0.0/libsecuretcp/crypto/rsa_utils.cpp000644 001750 001750 00000007750 11432170510 020661 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "rsa_utils.h" char* RSA_Key_to_char_array(RSA *rsa, int key_type, char * password) { if (key_type == PRIVATE_KEY && rsa != NULL) { char *str; BIO* memPrivateKey = BIO_new(BIO_s_mem()); if (password == NULL) PEM_write_bio_RSAPrivateKey(memPrivateKey, rsa, NULL, NULL, NULL,NULL, NULL); else PEM_write_bio_RSAPrivateKey(memPrivateKey, rsa, EVP_des_ede3_cbc(), (unsigned char *)password , strlen(password),NULL, NULL); BIO_get_mem_data(memPrivateKey, &str); BIO_set_close(memPrivateKey, BIO_NOCLOSE); BIO_free_all(memPrivateKey); return str; } else if (key_type == PUBLIC_KEY && rsa != NULL) { char *str; BIO* mem = BIO_new(BIO_s_mem()); PEM_write_bio_RSAPublicKey(mem, rsa); BIO_get_mem_data(mem, &str); BIO_set_close(mem, BIO_NOCLOSE); BIO_free_all(mem); return str; } else { return NULL; } } RSA* char_array_to_RSA_key(char *str, int key_type, char * password) { if (key_type == PRIVATE_KEY && str != NULL) { BIO *mem_back_pk = BIO_new(BIO_s_mem()); BIO_puts(mem_back_pk, str); RSA *rsa = RSA_new(); if (password == NULL) rsa = PEM_read_bio_RSAPrivateKey( mem_back_pk, &rsa, NULL, NULL); else rsa = PEM_read_bio_RSAPrivateKey( mem_back_pk, &rsa, pass_cb, (unsigned char *)password); BIO_free_all(mem_back_pk); return rsa; } else if (key_type == PUBLIC_KEY && str != NULL) { BIO *mem_back = BIO_new(BIO_s_mem()); BIO_puts(mem_back, str); RSA *rsa = RSA_new(); rsa = PEM_read_bio_RSAPublicKey( mem_back,NULL, NULL, NULL); BIO_free_all(mem_back); return rsa; } else { return NULL; } } int pass_cb(char *buf, int size, int rwflag, void *u) { int len; char *tmp; rwflag = 1; printf("Enter pass phrase for \"%s\"\n", (char*)u); /* get pass phrase, length 'len' into 'tmp' */ /* If password does not match 3DES password, then segmentation fault.*/ tmp = (char*)"mypassword"; len = strlen(tmp); if (len <= 0) return 0; /* if too long, truncate */ if (len > size) len = size; memcpy(buf, tmp, len); return len; } KontrolPack-3.0.0/libsecuretcp/crypto/aes_utils.h000644 001750 001750 00000003554 11432226252 020314 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef AES_UTILS_H #define AES_UTILS_H #include #include #include #include #include #include #include #include "../utils/b64_utils.h" // Encrypt and convert to Base 64 std::string aes_encrypt(std::string in, std::string key); // convert from Base 64 and decrypt std::string aes_decrypt(std::string in, std::string key); #endif KontrolPack-3.0.0/libsecuretcp/crypto/sha256_utils.cpp000644 001750 001750 00000003523 11432225364 021106 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "sha256_utils.h" void sha256(char *string, char output[65]) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, string, strlen(string)); SHA256_Final(hash, &sha256); int i = 0; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(output + (i * 2), "%02x", hash[i]); } output[64] = 0; } KontrolPack-3.0.0/libsecuretcp/crypto/aes_wrapper.h000644 001750 001750 00000003063 11432170426 020630 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef AES_WRAPPER_STRUCT #define AES_WRAPPER_STRUCT typedef struct { char *key; } AES_WRAPPER; #endif KontrolPack-3.0.0/libsecuretcp/crypto/aes_utils.cpp000644 001750 001750 00000005440 11432214656 020650 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #include "aes_utils.h" std::string aes_encrypt(std::string in, std::string key){ size_t textLength = ((in.length() / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE; if(key.length() < 32){ key.append(32 - key.length(), '\0'); } unsigned char *output = new unsigned char[textLength]; AES_KEY *aesKey = new AES_KEY; AES_set_encrypt_key((unsigned char*)key.c_str(), 256, aesKey); AES_cbc_encrypt((unsigned char*)in.c_str(), output, in.length() + 1, aesKey, (unsigned char*)key.substr(16).c_str(), AES_ENCRYPT); std::string ret((char*) output, textLength); delete output; delete aesKey; return encode(ret); } std::string aes_decrypt(std::string in, std::string key){ in = decode(in); if(key.length() < 32){ key.append(32 - key.length(), '\0'); } unsigned char *output = new unsigned char[in.length()]; AES_KEY *aesKey = new AES_KEY; AES_set_decrypt_key((unsigned char*)key.c_str(), 256, aesKey); // key length is in bits, so 32 * 8 = 256 AES_cbc_encrypt((unsigned char*)in.c_str(), output, in.length(), aesKey, (unsigned char*)key.substr(16).c_str(), AES_DECRYPT); std::string ret((char*) output); delete output; delete aesKey; return ret; } KontrolPack-3.0.0/libsecuretcp/crypto/rsa_utils.h000644 001750 001750 00000003540 11432170434 020324 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef RSA_UTILS_H #define RSA_UTILS_H #include #include #include #include #include #define PRIVATE_KEY 0 #define PUBLIC_KEY 1 char* RSA_Key_to_char_array(RSA *rsa, int key_type, char * password); RSA* char_array_to_RSA_key(char *str, int key_type, char * password); int pass_cb(char *buf, int size, int rwflag, void *u); #endif KontrolPack-3.0.0/libsecuretcp/crypto/sha256_utils.h000644 001750 001750 00000003147 11432170440 020547 0ustar00000000 000000 /************************************************************************** * Copyright (C) 2007-2010 by Thomas Thelliez aka jblud * * Contact : * * * * This program is free software; you can redistribute it and/or * * modify it either under the terms of the GNU Lesser General Public * * License version 3 as published by the Free Software Foundation * * (the "LGPL") or, at your option, any later version. * * If you do not alter this notice, a recipient may use your version * * of this file under the LGPL. * * * * You should have received a copy of the LGPL along with this library * * in the file COPYING; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * * OF ANY KIND, either express or implied. See the LGPL for * * the specific language governing rights and limitations. * **************************************************************************/ #ifndef SHA256_UTILS_H #define SHA256_UTILS_H #include #include #include void sha256(char *string, char output[65]); #endif