From 727b025799f7c5c37f32c4b57c892faa1e03ba72 Mon Sep 17 00:00:00 2001 From: dscho Date: Thu, 22 Aug 2002 10:13:48 +0000 Subject: [PATCH] synchronized with tightVNC 1.2.5 --- classes/VncViewer.jar | Bin 37317 -> 45518 bytes classes/index.vnc | 4 +- httpd.c | 133 +++++++++++++++++++++++++++++++++++++++--- vncauth.c | 2 +- 4 files changed, 127 insertions(+), 12 deletions(-) diff --git a/classes/VncViewer.jar b/classes/VncViewer.jar index cf4c1240f09737ea889b38df867d4c1d326b633c..5f3fbc6aec765235be4069f2cca8cdd59dcd50d4 100644 GIT binary patch delta 35604 zcmV)XK&`*UqXN$30uE410|XQR2mlBG5xoR0kq$Wo5xoR0kxPIC54{8}k2o0nznByl-6vPY{d;x}qeY z?CN@f_kG{HtFHID?ykC*{$IWK<_HGeU!3ah>gulQ>bm;DQ$IZLAUUX9-RI(ST)f`J z=eqbj7h|}?#k*YmTNnS%#SglF`1dY;*u{^y_)!->=Hka)yvM~)xcEsIKjq^0UHpNI z|KQ?3y7*5n{?NrAx%gujf8yd#UHqAgKX>t0F8+&)zjpCAF8-T~|L)>{xcFNaf9K+V zYuu^vPL1!^_#ut|tnn8bf2r~J8vj#MGc`3!Q-^En2u;n_RE4H0H8n?nQ*$*{rKuw| zHBVF3nmS5TM{BA^Q}Z=dtEoCoEzs04np&u-dQCNG>R3%J($r#29jB>AO)b&XQcWGN zsb!ivK~pEXsf@mJ(?kK21WXq&L%=KnH3AN&@7+`_U@HC7O=Ia_ZYmcrUckWuCI~o& z{_Un|^dC3P6fjRfoq)rC=)Z0{gnn?-IQr2|wF0Iv31BzPW>rMf*#Tm93Mg>X0xm3~ ziL425fjJj}5xa|MJQoX2$9~*HKnbMho?y-%ndk)`?3G?`0euAYEdpIX>Gg;7JU~_q zl;I#@K3ImOG8`haLva`$CPSZa8!r2efXqBnzyTuKfwE$h$b680>^xe)7@74$iCpHU zV|lEb7IL`^$GPcH9`B|j_+Z)e5Lq@sdJ_dqlC_6QZ?bGKMRuMlB!>x@CbQE;O*3S6 zrqIn2lEZOte1yn1TW}RZS6Kwn=E#ZWio&V{99aaqc|uYx;3$#mXg3|nHFC=NqQ6=< zRdStx1+w!o0u~B?sF&FW0msVPMFJKJI8H#LNVP=3Qa4TJ<7K~PBGm~pd!m4o}J%Jwl)XIySNE-OwJ(GoID z$}lAwN{jil$|+j~*CzX|mWeg8%P9iZ3OE&(&8LZqeNJ_7p6L_dCA zR|AB2pnySt{2yHnmR_lVAwn`#dc*i`UHN1Y~hy$uoIFUL? zb{;KYi~v7hrmHf(SXX2DLS2;$7{^<6HC}oL3pj*d)71nao+#T-5(y3!Fj>G9zFb#R zMS{bGWSW5K{HCsE@CIF-#24tQiGS2pP)I@o3?XTM=I3>_oZr$_3%{+auuQDrEdp-W z)k=OtR}ta1N{FK}8x!f{(mPo;O~`#DrI(TwX}(KWtuostV6}iX{DQ7d5h2$KIF;Yg z)oFaKu6`x6rwcekz?lNh;um#wHovEsH=-a&lk(^624AX zm+}pNy1HCeTp_qCh0#?4u9o4i1zaQGS|QmWy^R8{4y1Ip5)zuc6*vh+gb*q58<UQ6(+1^>N9#w&5A&4V0SCTWWk|Y*joKHKM8MW4c2!_3xg4 zc+q}maEwXa&g5`MCc>eL!1BsiG?_{S!qHUH+|Zl1tSV-6={GumT_D~P4qDWM^CoHn zYhvlt{6I9Y+&<&5yji0a?8h$-M?29CY($eQG1(Fqw`c-*R%pAGQC@E z_w9~wNlw@K`08#@)%hAVXBMWT(Lhsw#4zRPvc1hzOk`Ad`0nHz`#%w8jjLOJ`;%iy z?w0cLrVaP+Zo)k5@a|^zvD6ve(ELAa_n>Z;FX>i2&e2PRU%}|5719==t;YY-FC4wJ z+V-@i-7AI1;WrJGGs4kuY8IByPN!NH1foWSskkDYO2wk~sIU@}83{OLWh5MbZ;AyH zp(+VAkf1UaLc?PG>7hMp{=nmVVs;ck}2Se z<`~J!aJ)shdC*^(ip70V@bZO|zC2Vie2R_I=7f`Cai~D&WFsPzJ|{0c;y`n2D;LbJ zuU}lZ5VC4>6Ny-28dkgKt_~W1@l+U2jnmAlt8ZW`m1h6Zv}m3YX*E*eU;qb)u@u*2 z6^A?NQIn@SiJdiFbp}*PO`XLtgYeWWG=i~22v?IqxoZ|SH!VoSQnBg60R~nXh_(ij z81<|PM~&L_swN}RU>&?qz9B_Zh)t$Dc=7_1z3qUXgflA$iSy*9>Vt`YSR^7RnBHac z24i)qDr`g~Ck(XE;n?^&fmEP68c(NSTt;9O=K5vl>e8wFiN4v11+c>$-uu(o(iNFC z`FvzHKlQ9NQf;xsN?-O`$7V2wg$c&ek&tGP)$bHD8F<$~&F}hOi zyJ^B$6$4E&95Q^tNGxf8gfhG1a+wa;huqr8GUjx2Wi-|nm0eYB4EItS^95i<@H5zz ztoKC?BP8b5vn~$DsWsYsR-}h%=bI0cD`(fv1$7Hyzy~g@s>rZQrsMHgB9-*T#h8Mz zh!5DLFu)yV&CUnbSdla*!ZKIV)g-|tV~|XP>TSwIc6|~~88GCQ%5IFrqn09nZg`jGxot}<929Ts-A%N{%0LK=dI5IL_6W^^Xs{(_cA)>Lh!aR8 z0&9Y?_!`_rp438A+>{^Ii<;J?j75P+T0#i47F?OV^ZHaEm4>iAOmw}0s2)yXLoH|u zDklwQ!Wt5gY5g!vv$c%_VZio=+0oGKoE(PinocAzv>X_Jfyzo6$6Cn&nE{MKMli7^ zjzI1WNv5dGr^q1d&7_h=_BN5$aA7v16o)L6t2M2-mp#gbIFlDDx)_c(C}ialD}*QO zqWKxc9m*T@&JAoFL#Y;c>2f1gvBp$&F}jlaE6lAm zjON9XvO9Y7asQ}jVGbB9$YfCjG7RgDh?$V9Q^qQPYn|j2=^-061(xGr(rdFAI$Nww z!_nE%+3|S95V^w9+E`*$Ad*opHV#MY4N2E2!;V!Nyu?^t2gN$2xPgU+yTwJT zFb<)Ile42RX1IosdM$4>`Hau7>$#7MX36r4wysD!0mDXe={EwOH4`nay31<;VWMl2 z#uMRxXI>m|s_qkb{ysH0&3AeGbfL3ict*`Xd9`$ZrCpOW{UQ&Q36Z_Kpki$npMlv|d8HML zesUU_tBoy`Vx}P`KAK0N=fCMQw`&fq?79zmVZ?|oH{Eg-Y!Tr=n%N17K;BicR--Bw zOeY&+*$h7*51ENxX7vbsU$IR6tzrNU)0&;}KyW2^z^#)AgDJCX?Ex2xcMXPr zPN{HUuyM;Uu(BZ$5MR|yOa#LAMfn3)PwpE#N<_Vqo$Af90r5u=Rq04XvYqrz<{rD3 z7tVSJDsNoUWt_AT^=1`TZ3ZC|vB;{v<|knj4%AN&J6lD~M&;NlE}7_>hbvof?~-47 zCBdBuG_CEQ}wui8&pkrEZNs$$C!eIkxHx)37VT^b#qh3&>V@h z+;!3n)Clxe896_&!mJdRoR=`vuf zn}eKHU}y!%BJ?sr&Wrv}iWC=+4dIkHgfrP;!iN>Hy1?Fuw&o+ZgxbIK}zE2>aN zKqtvmAYsZZZI+AdCWvfV<4l_Cdq|Tt0ca`1tw&}cf+sAGPne(N@@^==14`4I{`e3wu{5z@9@9dyk z{EiOVD&YL>z%#!L*pCVThm(^IpdvbuO4Mc48)H%~zLb=?(`xMGL_5{LgPxc__7OCD zH_%YoX)pRO@1YWZC;icXIpa3!HFz7kAB}yqor=dk`cUoIM{jpHwm}Y!#?ZJd*HPd_ z{1IvVF_rM2sW*Q@gZNV#%Ae7J`~{7{++_Zm_kz}m)pH?F2~K9pqY{w05bM{2`K5bk zlgIU2SB>;LXLW~s-ug$g~cnT}cQG+yvS3R>`g!AYI;@igauZmMn^==6AYQRhxN zaauvykbwoAw7OxPgNKxE`tc>%t-_YpvENo~j@T_cTEc6sMG-{ra4UH~OZ9}7{ z&~qH1=Fu8tzj4@aC#{-RFtDJ^QRe8RGyS`%wy|s{MLTF01lYBQ4n?zd11@6+ebq@j ztmd6|(x9%-{6f=zNuO?{9=mB?qxYbl6n<#?Zkpb>la|z!LC>4YJl+mUl=bYOuLbI_P$+z8SyPvQByx?U&N;q}by9uq-iInl!(W#=23A{sM6px06F|uMoE< zVzus|ot<=(C7ea}Z2ON-=h!^C9k)`=3%H(+Lc5rc&))KXQ#1kH0^G7jI=iSJ7f~s@ zX&4vN0j$%Z+=J$F3C+j&SoYF6+?y`rKD2@R(pD~|Z9IhT0i)W%hO3NYv39iFkodBm!J*2hi-MttlD(MKme zg=TvvU4Uk-)jYn3+|pR1=d96loph>oH*V`vF39<#pWLwUH%L=&!WZA7zUpl%RqxP9 z^)C6%<$q4dhTAj&s)+-yMIB% zTQ<;%_F;C@%tmj|ozzlOwwn%X^!9Oh^qsV_lin19-82#2v=z7>j zmoe}i^n53Mh>>F#U6niS3DjSr92KamNLN==Z}n>$psppK+CT@XjWkYOM~ABGX@O7CKjLrAyFWuG;Bpbvs=T+MCp!bc?zIdzWUS23=y_ zAJGy^D}T3|N1>P9RM+S&-bpJ2wS&&-q*N#U8M?~M>Djq!J1OaPg1{PHgP}!=Q@)Wq z*9dZDGlgyIj~J>ID_d&Od_s6F6w?+6uieuau}W= z;37+$VqpiyCu7YqvZlF%p0{lL4>?_bHPHaTlW>|QDyAStArvPDTzokKV-p=pVVXt} z7(kScp%^WrIJMBp7$xWwO3~?*rghXx=TjSucQsuJ>_%Eko9Q&Vn|?(daGxR-;CpS; zS%3f_A;7nrCgNnr)s#UMcS-iRr3^t~D{QA7zYlT}4nCPMaodWI3Io;2Z}#Xqx< z?^)+iLxl9fO+P;RvxGR^5mb#o^X$`AQ7@eCIGnDLdZ;Bx6iaEWS_bcbJBcQ$03D&4 z@C#D43L$J7@Wf^^R0}P~d{RXaK35@Z#&G)9tmg%wXR)A<{C=-jG~hf73h$uJ=x^Rj zK0j=JV<%l_W4zo+S4brC_J)jp?@$EBhim*0zoUchw=_7!?=6*Et0~(GvIU zHu^4)+w7l(zS}dw?61oi;|dxCRUS+pbqEY&0*z1;p~gut#;M3WhtV80osL#Bs9w#a zlhiDzaW=(O1yoo`XQ?V=pd;y0H4mAmnl`B#x>e1myHzdiR(14$d$o|BQT6nOYM>9* zc&K|_M%~U4i1jcwwH~)V10K7y!>r@PZ*E3_?xz03%)7{ppdTw?C(uD{cJbGiSNye^ zQN5FXh2MpsoglPE2Yrz%AFVi++)cB<;&@3H$PEsMl^MobZj3#4)8UOkp3p(-C4~Ii zX13mDwmy?TBqXnY&+A)R^zB^biS3?gr&4?U7v}mb7pp*c*NPJm{$gP6wq}3Z&MW4F z%LArkc>7z4cyrb<+WF|b>486;9-BAaFE{Niv~u|UnFJ0}wn%r-dmHFXDVGLV$rfQw z0{$1UwM#6$jg*7QmiAF?e^nX2Z+DZttrOlLC){Hy5(hnhci+@2H}+XOE>(D6-A+*v z>H1oc3n6cKIUYEfAmQx`mgTvVQiUI6pP1b#KeMdYKFf+T%eKQB8+b74?FO@*iDWPB z@lV7vJSbC|BSmdL?MD!oJtw zcP$-21p=uLi~-r^7G9sUL{k$=*Ah??&!4XvC0pi1Zk)r&q-{plKL>(6R1eWHBysXBl@ zLj?F7QR6d2jV}=)u7MW+f(Y@oT1B2*A4rSmAv#=`tqqqTI7@9f z!ZNRaA(r)R*+9Le2cP;I>L1gHx0|VYAeCm*g_&^qN&KFoUi>r-M8A}ur6K$r4d*Ao z=i+RtKMh@X7~ntM9wAC`-FEr)#{BGi;+MVLfWvLaZI{+;;k zf(ZB1C@?GM-82cfDf}Q!<%ehnQVOZdvPV9D%0BWSzy0Z|%>UQ(vLN6Fz zmrok}CW`O3@a%jWyxzod-yo;_b35xX0P}E~N0c!0L`|8LnR_-OI#{PVr4TvdMydJi zvCA4?l%4kW=%g32BSePRtasJx*#(lWUdWDe6tA>r-hiiNo)K2m*A1@%L1H-Lt!fm8;kn*gV) zP^DC-hR`B4jF!Ox4K)JqkdYJveVgjj<>S%~c&J&H@dLu3Jl>iSE)S6aFQv}?NT3lb zh(p51G8Z>2`!0M@-h~C(ci~I9ccHoBTdVoq%u=~J`c~wZ?{=oOqGFdL4+gb=bDPKW zTUV{M$sGvO55kqU$@i?{GKa_2Ngvlp4SeflXJ03t!$9_R3R1pVO)CKH2FJhxhpgE} zY4gKWfqa-M99UTHD96If(eb#-Wv9z6CijBLH#WacdT6rNS2IO~X0883#=-a}gI(^s>U&}Cv2CQ5U7$F}TEu9uIF2*-Um2n#mo zAa15gv{l?f^LYiH%@K+)?w;e+%1K(wDO%61bSbwXY_Fvo`Bd7%r_nY(o$lo`kP6N+ zL;9I{yCpd-|>aqhcD(*zJ!PJWju;6=P`UGPvon)hBtDEukZ4Iq31@v-i|{9 zZB1~lYAiIb@Jx`k^NlvyWZOad*>%wVoVS_ynpRn|Y}z9cVA)AAY!w6w(lDkY(1siJ@sXrWSQ*;>GYC~5QB20~Jk z6ezN|;KJyrD2#$)E1(s3Mp|4D_kG{@QNM8+$9>0TFj&vN&3&pr3t z_v4vA?>h(*6pKC*&>sUb2nLD4#9(HyFvtv6h71OOJA)z}K79B?hQSOjh8za1fIHQJ zn;qt6hqD;+8Rjs|WthiM%TUKKpJ4&RLWV|$gA5NcJjC!Y!y^ojGCaocIKvYRPcl5k z@HE3m4F6>KjNx;J!&V$_MYk0_R;;q(3@bKRahVm@Sn*OTUTMXvtRhRs)iRzf;|3Ww z%Xq(kj0a?VK*obIJ}BcuGCnNhBQicJ<6|;DF5?q2J}Ki za96J~yk>*h@H*?>V0e?^Erz!l-r>RD4a2wG;yZ@#8Gc~+k>Mw9 z@iVvhh5I|ix?dT7%YZ5HJ9B?z&|?0>+@B1GZ7>JH1~U-JoG2J11`~ss!9w*=wh>r= z88TS3F=R5>GoTE!n9FA9Lu*5YbvZ0L82XYCu^)3zhW-o#7;+i%7zQ%rGZZisG7Pdo z6&^!oLKkx`<_0r2n7JVgLm7_cSsll4Jd4A)ZIK;k;uwZ9hDi+N3>6HOcASmN?dWCj zF{lhp49yHJ41R_HLp#H{4CgWY4Nqi$m}1APak3q+!7X;&#s%9Mu4TB6bvt+l9V~V- z+UxRbeE7`5YWF1-=A+VLjVb+LFe!yXoIVYn4fu;Xo5V#nKYq#f_TVmsc+;#~}T zag-hZ&fMJ$`?y6nLl1YqpJ#9no@K{-vDA+DF+9ihp64nrFuaH>?D!If?f5c(M(p?s z>t1Deji>QC8|+OSVaNB_VDEF=j~M=k;bRQi@e>?t$4~K8JATHa{fpav&hT#*zhLf5 zhOfEGH>~>>+wAx~b3fo{JO0SrPh90^hF=&CG5pH#8^iCsm_ION$NzBUKY7SMc|w13 zr-w-tCYr7=GiSjGb|EvD$&ihITM*1HZ`4(U;B@&Tu3#wY@&;Y=D$89FHM~*{BUoIm zp>WiNAQcTS*RVpvDue+=!>gBhS9(YKLnEt#t!>fTXjt{Gn1GO*R5H6Qnq1T`Ruu3C zn@5t`A8ekW^|(O8MF^&%;frag{GzHOtCqJlHL2kVT&ap%n2V}3Y9(5KRkeuOEMgZe zs?z>g&LnxU_Rnab)hZ~``}VGij#O8w!RW}DYWp;1CUEhfBZ_N6Z4ot5A-Aa4wR2Hk z??u}1?xLh6&2CtxHby5@^`g=$k0?6QRR4!boV``2ZukJO3-w0Bi;t%?xWwaSns_V|InNmBGwy9hV1Q0SR>gH7& zs;r8DpR8EX7OhiPN2y9h$fr_}tq28!m0o{9^>Lk0FcS3!qYJ!&HY&`T7HkapXnqx; zdGn^xk`nTY*036hRMRE}Mj*8wW>7fXR86;oJqNCUl@`iod zaYM+io~;{0n>2ZPPIWEqIcaF~LSdig{h3LQOD3-N2h~}BZ7UkoaGke-H$5+YD5rX( z-qd*2|7g+5884Varz4?v^cKT%bY)PDj;sweE?1+Z%cz-FH^p##%dF6pwrC6OcJgva zoD-tH)v&QzJBQyS_vqhgKxrX?!GP@)dnAvJ5U3c`^)n zHkmZr;Oj!68gH;&FVtNO;naoRaFFIS-bJ46ip|iqimc#jP+fFc_*{MpVyf5Y3N^X- zV3W*el()l2lhL-P1Yv5TC$+fISQYoBt+iO|ni}YbJmP8!g=3A4-l#5hgLHKYzBn!3 z)>but$ZPS2!`}8rZ5J{c{LRyXKEF3eTi)Q0M&^*+d7sG`4HRR^&|HbQ+7^EkZIIFs z4lP%MbQI_Ce6%y#7zjn!VKr*_7mG%$tqnJxmMYd$?>@CDpv4@sk762`JkzH}mPbRa zvo!DT>+?tWgx0or!|GJMguGt6bm?lN>M^!|TBX4(O?1gbs26inpp9uxQzDX0SM>m^ zB`e#8yqE?PZ#X1LW$Yp!HVJOcH{2IoV05p$(>x7N#EhkeD1P z=n^B%X*#Lr!NRH<)J$sASi`2KmJml+#UGr-rz@Zx=Ee~1f$&qenf}O>M)q79mps#d zPvMbHX(%w2e47>;Pe`ULtTSRoURsi(EypMuaFqP!$X1EehO(|$z|+$T)t6$S0Y{0U zw2kqUXLkJZqHM3XxSCWsDXPY_T1-vqLP<}KQdD~Ir3l`8R+L(|olaxwICU-I&?^0Y z=#v(_V|}*KeKm58zjfqP-H$mZ4yeI@W_GH+!L}9p?HQ>GCeA}B;7f8AITX9eMTkHO zwNc-ht$NI_@kW-DUvQ31Q)t!AL3eCj*xN{xk~K|$I?W~<`8XKWYC(;Bj1}zBMj3}g zZ(~$DBz9d9%Yd9L_L2k?^s47J(|sJ)wc@rwfSgfgzKR_rhq<)7COe_4q7=}77*SW$ zkXgLVYF&FPXI`wIAB^~$gQ_w4oMcsPi)IL|zXfDHvRh4rwpXG+r?uvAm%P$`36&nD z*fD8ibaf>~{&Kb19}H?vVj*|d4kg*nXB^4gFr9&LMAgnfd0R9}J2hrX&{s-(q~8}c z-esJk#Uy`_B}YV!CRt8T7_AY1BcRX@L{h?;DMCKQ+Nd`ijXO$Cl*5$~{b}iZ%B|5* z%%^S9aGR=M*wj=H|Fh=l`Iw_EzE{)Ymt$r^IXy*Mm?E8)B2l=qtxPhtWuJC|NrCLTmVJ{))mNA7o=85WtRYh+?x{~Jt+K62gG^&sT0OQF3!c}aha@xtCD0v@?Vo=iR8=E>R*;t|BAHwjcN7INvmIz zR)2kxY@+#|m(pJ0Z$U|a?G^sqlhj_}&qOKh14*)(pr0GG+o0DP^e2PU#nC075J;8*53;nEg)_tP6dH;h&z!y z+eF%X-TR@|?HJb$e|JmW(CjvK!xFc-8=BmfZaBj&cZ1Ju?FQAYkbF89H*oP%F7dh* zDmv4xDBaM=&Hus>V%WzuJKf6k15{%*Yql_4;V$lmyWO6DZrJ25=!UKC`(bXqdml;r zVC#NZ)D1V2>eTxCp_0`%_rN(hlVLwB*bno&;S#s5+t>|P?&XzXE8#L2NVt-gGnCxb z4SC>!A{YTBFcC_j3{Iv{IuRyA1x$e|sD)Xui0}+J4H{vImyNTWo>);+(iA!lD6CHx-H24l2Lo*;_Qa`*Q07LcZoke8F6EJ{D z545_m8+LSowc67If7?rqfhJrCGmYsV&wB;u(eHfPlZ_MsE&wN7NOjJmS{K70*aSo1 zTpI9t8c^FkT9VNE>8Fp>CwZiVVH~`}SO_u>f^0m02Kr(_$^zcN5~IKC$$!`z8mOa7 zdSLr0`M0p=kiqmnUR*x?Ch^axGqK=+br$o*J+SS5m`Qt9Q(wFv7Vn4C9?ZW@*UYMS zjNcFS`909m1GjKVe0FZyEPx)0sQ19Ja6fI>0T=}j(Ao~t>>hy`@Hi}lCtxu=9-sA0 zYW!AzeAXY*sW210*mA&D?UD3(T|3(}(Ib^88`hT*$$@j$Z-dDmQ><{Kz(S9SixqkG zIc3D^RSG@klqzP@A6~CyQytyL#}etJdeT@^7v!+c<204@z3c+g-Y#3sCBAl-F5GU5ncnOxH)CqcjDtl$=*EfWPPk_7A6M0O&@d+6N!wHOzC$UPojPwTy9$04VNc> z<}ieIAFv9nID@>i1_t6R7=p9GP2-)2wJ-^%r_ANu*j$92cAn;fEr~hYm0Gc8!rc!O8(^pT3Oi+&tCYVAIdl*~TjFN|RVxrgiI9Cmd; zmd*|C1k+xg8c$>?!Ma`0m*>Z`VR`LtI5mD0Pokr!&$z`gu?PJ6lv^BQbp9^p$LjoE z=1(NvIJSvByOK^T;9~Nd)5&j^kWZfhBk)W(3B52G8=wjs$)}rOJ~qP=YylsC`XPkN zU=7_u7hnLcz!lI*J$2FTem}=fWY%Ck395 z66Gy@DHj<^`Nk;9L8epQ(nx$W<#);P;U75K@Yng|uN>8eTMk&OdFv?vZ|gmJ>5=QM zw8OEJ4)89p<8J7OH_`=r6S%N{E5#u{h&d#>Nymddk?^;533jc)UfT_U1lty4w}UKo zfr)l_`H`wy6W!d9U@uCrD-u2KOt2Rx*x-LNfIDV^Zdl2F_LszV&x3x1pHL$ADfEZW zU@-iPLiOi#75tmZzJMk0CA7d-5P`4h*8GMpt8ZZod6pN;)(-_js^e9xdq!Y?Lie7h|#!%5H zkCLHjhG`6G26+^lrg3TvY3v>)vsAHlz{vPfK3PA?o9Ki(PSB6+Rz9+&i6iUQrs-3B zE!zBiimhd-J~JOh;oWY1Dq6WV1*3w^sBmM#2gcH~24E}M>T2SDwm~s$hZ?w+_We4z z6m~!tbik9e+s_ew6?W0i@5a7xRm!pag!UztZ0IND4D!kvscb~yMhWxjLf%|QxEm&o zC^Y#_FQsewoXvGcp}a;f&zW?1Hw@~fLiQTIt~b}QUyP6nd*GhL>`V9&A}t4#6ab5~ z0&=7v43I)FRBDBP(b8FPvJ{4?QUq$Hm9Ruwmf|U&Vx=+b<4DKenc?$bRp5jL{BHW6m8Hz zw25d7(Pe0-{4ER4!ECq;`_K`{f$ivk4(vxq!U=nS5R$ip(m2DabfC)Qbmc0iba#HaapUb3&gFLM(F+B1Ix%ZSCSF;r#X)V~l5m3ymz)Lml6}4>s?Eu5FObqtLE*cadWe zOIc2Tw^7~$tJ0EBc$uQfEA-fT8FJw@+L|}$QSegAaDt+@?snsiBlM|aDNrmeOSQ9N zkxX@Y7IS{w0C^TmevFd~lGN4$os-7OU9dIJqF9_VcT?HWZ3JFia?Lg2;g~ z(HEwQey~_L;VjV~E)fG@r^tl^A`f1rviC#*d?Mr&i%N7a>Kph1>FCac3l*DTObboW z_;MV~q zdwgL6z3O@XK(Bd#Vf1^Nesr6_OZ4Nl{Xjqd2KXEO!dheoN+bcT+G`Uif&#RE5$zBB zfrr0k0IVX)W2`3XA=*xK4AC`2$7y#h;AEoL((g-0EBwV}?HI^JcH}bwM*%3f+0l>tn&@yc8SCiJWTayNlOpPTLnqiAqgfiL9kkuxaGD%_ZvY#S z(YtA%S^Y@|R4{$K112#2xC2U=KGp#qrayPUP^NEmKt9v14(QADfey%jWV)*prWS6~ zU(TVz?NCCl9NG@U_|k26)8fwWfrD7^vO6-Tx;vh^B55siv6oPmfW$_GV zi)Ya(p2Gt1JPs8vpj*6uh@-_zc(QmICy7_EQoM>a;x()juj69z1~!N{(J$V@R`E8j z67S%8@h)B<-os19`*@Z30Jn%Q@M`fDUN64J8^t$xGtpbccleh09zPI2;HTn8{7U?U zKZ-;6yZ8+ci$g+)--S&a7P%6LJjpDEOBOLsl0}td74=ev@Jd;KLY1<`GD#6_QeUw~ z>L<>VoMMyIUu=`|#13ho*eMl?E@_asQ#wZUNJGSZ(opfBbewomq&!ghe{33o@LnT< zU6*fOPv*SByuJhaxg8}W#@?D_`h1gCXwnOdNlY%3wL)1h97$qwp<>laiFAO|?HI+1 zq;k$PuSkS7?em|1G#TvD6eyG`V7N3D#!Hn@DV+)nr7BRR8L&#KhPBcpT80%T8hOB< z6xjHsH-lYfqPa{SYlkGV@rI9>sp@gi^Yv)^7vFUDyp<3Y1^gPwax}1v05} z$k#O8@2oq4eRxY3jL=*DOo3ASX012RG+JhBEv;G`-ERwj$VsWm1!K*G7ml?!&DYTz zgK~L`MlET<-I^ZlN!)V872q@3U+dE7AhU8W{^b-C5C=F zP|F}sEQbOShT}zq62vHs5p8f1@#Doxm@HO7rC1F!iJv9bKrPi@ATEH7;zHOYE{4m+CfF)2fgR#fxKUgNJ>qhBR$M_j%VzjPT#5a~ zRah*x;R#|pjuShuO88QoI|HX1xy*C=g$EbQaslUtvx+5iU9mZlr4(D@2_Qwq`NgvA zG|_9st9t$ za2PB+l*5gH38ENgixTjOk+70<8^jp6NF1B8MjKsfy5}S5s4v)~^rL(&GcQw;>hdz> zd`hS?tp$vfekJ8@nF`G^MYbk+7Ks@#cOu@F7Q~W{MH?@8MrjO7{(=bl*Y_eg^~adpI6{fU)=^y}5p(H`dSep85p>cnHqM zU*RJB4KByu;cEPY-cNtR&G=c0VeIjj$Z+E&!rw%%G@hUP)1K#WJK65Gqz(|z2Y%12 z{a;W^2MFB2cv~?W0037s002-+0|XQR2mlBL01v$cEwd*sp#=mHy#y_j%rhc?U=+pD za8>ur&hBQCY!U{DNi-Zv2oMxBU=WmBFc3_D5b($*S(24xHzpe{eOv~-cpjiAh+H14 zh=NEG6z>DP@p#_P+xI-5K5y~LS2Z(xB*Z7*_y6DjgIiTyUEN(>U0q#0Gx+rH_dN&_ z28ov>fFKIm3A6)9`hgSQaN@gvPJGXa?>q4WC;sHbLmIxW;hP$Mr{VV+{-EK{8vd$@ zB27%w#F?5X)o_QKpI6nwX=BvovwGCeG2sxtb`~gjW+4nyA!7 zl_q?en5&6uP1I<@uZiZQ{TEF z6TWjpKL-8bdj>x+_|Xjm;3qfa!67#cVUPPV33Ov% zFzC)b_h8VIK{|t@+>nKT8QgQG3z9I4<&JiPj>j-Bn+NK}pf?x$@IZata1SEYNC|`K3}*1$X1d`-Ealo+49d7-wwt=2 z!{96iXEQj5oB_{eP|m>1yb1=DT&!Z?W3A>gubM#(7yWFy^BBxyP|IV~@fZPCEx_6b znODy`pU;cZz@X884T%`yUYdC3^BF8)xrN-zA_j}OgA2H;3*9gf|H2w9;o?%3TgG5H z7gsR2h(R+sE3V`rS8?sdtluRJE@f~TgUcDLX7E>Dg)6w(l|0Z@Y|g8B-PZ8Bt#N|~ z*D|<Usw28EjzT8yIZlu5M(oiNR(StUro>O(g8q@in}S!43vH8SG+k zHv_ZwUIzOZJkQ_-27l9qzyrFF__Qt*d`1^4-k}Qz9@K?K{Rt<&qYD>)s0%k!33$6M zbo@vciTH0_Br!-9pbHNRr{F!hNM*S+2Ho&32G22gSr-QLx-;m(peKWLY|+J0*vg3LKjo< z8(lQum%5nGEf(Mxx>$(+(#0aYQy0s*`xR`1i|`-1Xl809KB|jV*shC<@poNZf?w<6 zQnt`#Tzfh0*TrglN*7mfFIV!kuHuTT8LVNjmKT04zN(9Bxb|8M>tY>K*D<)B!Fv2y z7aPcbo5T$)yph$tk-cOSd&y>eP#0UctF8D?U2J2;Z(>bv=9RgHsax@3U4+Ta#BJn` z;&$%kb{=v&H@ky*ci1)$Ul%)hjdro(ceC7Xmb-_ix`$`kB2X7?tnOYO z@;(;X$JG4{9$@ewgNGPA%-|93`BD5t7mwk8=el?tAJD}UT(O@O+Rq9d;8{M&tNIjE zPqY1=!6$X`EZ(P!=UDi81_#;LFEI5Yev2S;`j0i?B!uoc{R_|Y&i4-XE(i@C=dbex z8vVh*2m~X(Vq$~0zQ$kKNc^;T{-i*oFT~sq-4y#OL*77jt&b|Y#aB!Z25aZ}L-Fi? zS`r*w5^C@Vsz;bQ%{1X`1SMw@E0{s(FwrqhbLaXRMp#1BLd}_E3U^~1r(T`6nw2oC zNz6gmBs3;W%4t$2>9WW;_UssY&KRZ>Y`Rm)Y|@uXv7!Au^x(0<+F-+!V3n_S#GEmc zj!4W_Ad$po&z{slxk#OoGr9j{3z@2aPL2pAgK z$+@O`P8Vy=6+Lr0Th-Ex)@f)LRh=hj@{1}OeGT(jv)LVWi1`cGWX9F_=KBJn!Dsju zjc3BtRO`1F#WognGy_d2b-gR~Fpn?kfTeBL^9#N3>?EmKr+9vOJVq%K&d*BCj6 zZ$-<^W?OrUyxrVeguB{X)@IOhOb?$FrFg%c;t%*kqiCm$X$pmcfoa}=uNEO^tT)gv zlwIQuRMq;jOMD@A&8CJa-um%>0UF-dm|f>nnoZhN=k--a29^V`-bv z_81!sG?LSVW_oLzsO%oUu+mr0mTyEr4jYpKmBEGvnq_v#UtJT*p6jm-`5LnQRR!7P zBAsjNy|unj$d}#dU+iOntj+?BO%*<3RgrPH{@6(Y>aC%vKIE&)UQpwIr+HNQtm^E^ z)5cHCHrJ5!ER35uS<6${aYDpODlD=Tk1*VY#d9lY;X^?xq!gBrEvT9{NwA^H40;K1 zyBs08&>!$kZK|vAHB9$b)cSakPMf|1D>6)4m*L%W_zHLHIJw z4M~A9Vn(u2CnJ)Pt-&Vv*2v;gc1hlUs;an9M@vPF4q=Jn zcZAh33eisV*4O(2Riux%p~1VTGFZQe_ELqK;bpd9br!4egG?$upd=*6Hi8=Xc+FE*Hc|q9cWZEmCHJiFP&IFw%RE1OQ{G^VV<8*i%r*mt+K6mHH$>T!j5UF zjK|p1AQB4;nqpROE*#drYDkWzH(biR)RyX)F#q9x)=OtuZo#}3hQ-G#U3ji*kYp=R z+%QKkmp)WCT+Zq)Ypl|-*7N}{GpT5dzpiVHs)uX`hE}=<=3=yrUKoxC?3_zHN_%GmD+}cb`O# zc(28}>xK!j{rThh6Eih2!eJv-@PPs?;Im5DfN7N6T>?B`$umbfqHSnPE4u&81&&{M&OwcwLXgoU-W z2a1LOn=#UQPhA*};uZEU*czVdPt`Ma;pV@WUdyXK?PmYh7MrW9i)+z?zzqM{Bv_;A zq-4oULFkjb{O8Civ-)mnh%+ET`jIo%)i*s!Z)E#>U$+wxSAFF)TTv}9_ku45bH zQ004rlr)S>L^yY(-cD~Hjng32NVfvrJ(VJ1RO?%q;m8wN0z*GqY{Qwvc%c#2pmrWDqWEh z$@IEfcyGVkbfQ>cTQ#~zpQu_&a^kiIy3SXb-1t@vv`qYZIR&ScVNd@02-J-<^vvPb zKZP2G5EQh8IGy^Ve^?|;v2IMx`= zH3kjMW*I&fjm`$;Y{T2Z9Qj3h7IEVr#+9g1V~V5a+|uFOOA2Jpa_b zZ9Yubw|QlZwN7lV!T~uPu4$`I>+}hiMkT3XY-{V4B^NAa{Ni{GUpIDW05eam*-0rI zz4S4k(pBmb}KhOGhCb5T@raXqik+Kcsn=2>=t5i zr*@$HN%G7jnquRJBC-om)-p&RI!mKf7Kd-l=*-{52!!di@MAk11(;0~B+bn(Aqyfy zEz_!ISD^=F(xJ@aSC=1SoV52?h#qOJdy%|%qmXtdRkiYXQ%;AsWXnl?r5$JsQ8N+Y z4+3O7q2m*=^QbaEYbwC{3Z@g)RC!2o71!xJiEihPPq&~rr&&Br9OHRE{L!<<4B16DMzivT!QPQ-#qfAze zQP0RHzG&gdC%sHF9~4sIOuMA)5u{h+X{kjO3_B#FF!XqNwP!r5aJhIjpd*zSTfd$y z4n;{AIg=JsjpmuOQV`Ab-+vh*%|b{iqAI2As+1aY4>Zi-0eZt-wg`F+A0{8nT0n_x z`eoruDwuUHL~&fAXbEDNK_o*5c3-fKHBHJV31mzM6p3n@I20t8QV7~kr;ynRG_^NI zN;*v2W#UPm`cEYCZM!RJS@j!&gUzV50f4)CGG(qC$`r?9+(8SRKq5=?D|?*Ap^_CI znz~@`izy-qP#PA2n=_}`?<)cQN(xk`Nib+)#a*U0@70wi;g@9GmQMo8Dl|% zvyXBA=A1 zM`JCo*mAJ7`Mb(4isjnS^!|%tn@Wzqy5-r8h^ncyW_|f1eJ{G9Y(s~p-tzS=RaR1% zb&dTq8YW>o-B@gyM{Y|zL_m_tsQSDC>z)xfs{qGj=CaoRdP!P-6;$6sC%1rX`*-Es z!B~a5M?&HVOGK3DKz+ z1?mUB*NYPW`$o72x3o7CUgoDxk4T6QdvW_gcUwUo9MKYtQrkqCGxxz;zOD>dV!1+# zH>EQpj;((3+%yunZxA7dyE2?bvyC%piCrWGih<7|l(3=@o6tn9govxil6{0O(-*(` z28l(qq5`v+q22n#S~DQ_?NZ^Mex*PVh4XKkon@Ot3;w!%%{5Q6Wk<+bfu_0&kN(YE z=rI%a%ju25-ypfy?#j-iulQN0ozQx3mk1xLL@QjC*7M#iVjG z@T(6-zI^~*NfdsR`1O`1@v;`I+%8&IM==Kt1%=1a#;I!^1d}#8I>~C$_ZG|(t~UMq z7aMEr0$%8`?yDsx!?=R>o@j=d>UPvD`Fr)j0x1n5*V><=j6Xb68h8sVGmCMp<%D}- zDn=%tr6Vy4vTj$;Zn_5JHA4MK`D2B7fNyfq0oRVKZ`QJY>W2k6?&P?Ofgc>g9+OwI`QR#BG#&N=i; zbjiK}QpjwKv}>$A_rba2uOqoK_x&#Gdhg=I1eAZk9*zWZnD5s%@B&Mu*k?2WK)6ty zd^9(7TNwKDSv;!Eg<5Npxe2asdyv^IKdX&g5@C~>N|VSBY-RrNPQ+`}*=xno!I5t< z*Kp5YFm^>92h8szv6rt;#qhGx&^_bwR#|2Zxe=Qv^$U>RBlEtteNOBsIGH*;GqjM9 z?l4EVZ_FCoXJ&6I?!?TdMG|$-04zBRHAXf&oTujBFR?tPZNl03qo=n^x33rz%B0&D zPjSpR7bML~zAp3a~R?&unT`-}&5f z%UDQ#6_Doxt2r*|(0B_+5tq~d^^grm(j)(tDYeQ6$~p1Mp!ybaktQTp@dY=Twnu^V zg>F;I1AUKq?_%7(R{e#Li0qAf?|0~vfB1Dd?JlHhKUF!zP8s8~qU(UY6@;{^WK4Rf zrWM+wY66S=gTd#$IKYZFyVz|&1T0U*Q?m|fy_oIcmmaN-s#jsQ%gce#f(o>p4!Px@1$9o9I*C@)P-YqH`eQwe(N5-mH0_KdWcqKN=qcPpf_6Oes ziIu2AB^SfM;{8lzB@rm09|~FIAF}r=gRjX4fC9o0iEFva(%ihl-2uxfD6J}aoFq_Q z$$V_?RMRQnt2r}2n=E3<*|h95$-GSPMEUo4QJ^}ty<6xdS^nI+c=!cl|Ah04NurCV zjbFt6u?*`Su*95scyqwVid3|zP{E&Vo4euCO%}j5_n~qzIZDgL-oV*MdY9Ga^153Y zKYdCul|C|CYGnONH|LzE`G7;~-qiHdx`bZoV1b1@^75H#U@rfYR|IM-m0Vtd14bmq zKZlhg9!B^avu>NGX};aZ+LLX`7g|uf!nZVI1<< zQShXr(zH?vZhgCyA~GqZT~cw4Lw*>&h((D*9dOXO%rOzOIi1E6L&Fy|W)h@VosV{T zmWj4_mT4#2RuGt`cr3%KOBxQb=uRl-FBE01DmRn3a{}}5!CYIk;G%XYG2Z){z^0^C zdrnpZoZox1&neh7$3~>#f>e>+)o2ed6{JU*H`l?pK2G0TsM6|d#mI!UD-(ZH;lim< zlCDj*x`c=SkYF{}p>biyU0;4AG@NX%a*gAWD==+nyF(rn>my+;mR;+%*a4c|$kOkw^X(FO&55m@| zMq+M=<+c6*VRJ<^3^C+OY|>)IZaT%=WAP1|g5~lr^V74wTw!<*GR{$6V#$YYflVD_ zJR-P>!?13GEHHN>IN^+HKv;Yx?bN5h*Pjv+_Ueq`f<7JPuYa98Zn;r<^ezHEo4$Ta zu@kjrZbp)eINv4faZrSJDXOwBZ%U$8NF9#`xw{51Y3+?^KK`T|D_9w<*3nVoO*Cp4 z-PLoOf1q8UL<50ds>9Iuwks#Slj3lIhVm=$x}o5G|8L|FeA*tKWYgWVm#0A~-v z2lHt6Od-hry8y#7+8dva#6&CVPLTGEz-rXhK)~~7{wU%BglD);IRRg>XX7`5k0|}z zULX&qXAqR{z1PEn-7}o`jD)q@!j0E6GWHCayf>l|7E+6qbFuraApf_6P&>{I16|)g z6|6EZs`?k;Uf>dp^6i}3Kog)V}kCp$<@ zGfXB}R^q_0{%6I5EE`M|`VKh4+_@fmn7_62m zeYiF#gm0f`iZbBofj>F2VTfxNveXL6xtmoBb>+X|NVOT!u}jl0zo675a$hkBM4j#w zxak|v`NY^>vt5dZ;qz8bmBkgg*5r5X5PqMyV7^Qxff~KIZXS*;aLz+M94rHS!jaM-n;Zj zdK4kt*JR%n9HnP_wGTjLs7)?h#%i6{jj0b+4&78+RT`hPyEdhJ6F~e?WHYCNox!~I zpn=2gk8()b)RjRXNVikwWS8jg(9_Y&@b9*bfjly@rY^(}x5NXtWJ%Z^H8w|6El#1F z->hC~ky|S#O#KH z4*b35Cf&G9wlC8j|$+09SwsHdSxtVZ*9$QAg2 zG|F>k4TJ-aV-iX)e|tqIEoOon3V!13)VlK?wuBXGDv6a8dSuOCY;_A3>&AN)InuK% z>;_2O#zGeV{@R2hM{6BmNWt0Dn{a7(A_;2wktZTer=y5>(c#S=pPG?u?cR`~J6rTx zsBsz4RbaaClUens#O$af?Q($uENH3tbTWLIU?d1AN3_awvA3`NbN@(a4gTEy;g*vq z^>mJQM2D;fUVL7WWG6*h$?%e$C}&X@k7wpPTH&z|+4H%pD?o*|AB0E? zRwP={Pd6DtpdZpSRN`uH78|Ld$22}mr=4n>oxil_oMratm7O!@zx;yj@kzh%i!Jlz zfcp(V9EYxp)qCgC{2|7bAnL;Qf?Get6ienCv_Ev^Lid6zmjtU^1X(PDB5fF?e*zM{)B* zGHJZVlvt#a!}6S(aTtDwvK?sVgR;pwZ*>$ICWcrwNz^8!>*UnJYzKS9)gt&zqgvI0 zKSRd1{EiCC;p!$?&l=E!F@Zq5aM}1Tmr>rbF|9OGd=r#4>IT!ab28ET9-DYbIF#hO z!!RemOj7KLwOa^H#*|U3wnQyPs*{KV(lvVZ`5n4LTF-z^F}tLcv5mvS`lRcw+ZrdK zo9uY?3G+j|mv|jI{gjna`NO7Ls{Rn*KubK%8Y4!hx^V14THZ5YUfWLP_8@B9q3s7Q zRSUKFAX73IO~c`obX%u*+xPAA%0xp`ge3Q`KuM>lWs*DX(?mxi)uG%WMVpML=X6QsK7W=y}0X`8b{W(V!iBzq)YT>!DGr(spvu0DRr9)Ap@}r)kMgm<*gy`K>re| z#YC*ilo(S%cYuCs)uzAoEl0&ZUcPMOaN(5kC9+*zutJb7M_E6PsnmWvW%21?XHouu z?)2&3Ox5tHyu=UC>^PB+_V6hkY(x{?5=utX*Y|Lhq{r<%d58NlVTU(6d51?Yc86~}R*3t9 z1aR?@dFFdbDA4^V^?TD3^^{URaM#Lz(>lxhm0Xp(tpE0PO76}ACQD+CX1&H;b9os8a{TlsoQg!AAF?F;cdi&e z%J1+11tvXzD6pvpiJo7@ptVDn2O(z|SFUU)+)QZ8ZjQ=F@bgZD`>y&85&VtdDHxJp z+9z}kOm@!n;YSq#fXVw4hDNvpj?)I2ivBp=&;$>fw??j4VFCK!CNSM5IZ@P|B}U1< zakKmt1-1)X^%TgDL5A~J`T6L*$$~(bzGdYW3fp9-p3I6zSIwcb_XW}Osz{E8-gcaM zo;!VGIQ@VMU8VfWWTL+JIZ0bU<1y4BGnZ8ZNiKS)KYLqz=1-);Uae!emDt552Ug8{ zmsVsmG{%6lGGL3tfyky%lO62qjn#F*^o^hmQp-@gq~!BBY5I~#JPKjnTM#+$d5lZ^ z&^vCJz9!zo(fp<;ms&>3hegmbq9h|{Elvfr_!j-$GjNbGH2mSSWw>P<E@M{ z19ggW0K(tS9myZ(OaP-q1Y%p~F3E>^z+2g~zQ}fdmMhmY{J&_qjaqI0Nj^hFqXX@&%!4 zwv8mFy0YY9>la}Rad=G)=xmTO(r)$YzmQoyDdKGM)08)`zCEBeXk^nE;$R4~Ad;%S zE68MIsp{cn9oYDG=IcOhC03A#YC;AiHZgZIWD@0Et604Uj8c;zg}=TRdU|UQRu>6P+da8$X3r>W$(+MAWQ0EpW0%d;`_1H1GZfzp-X`TBH;adzIZiY7AJnp z^=sg5c}fqv?aB^s4*<_}%f?b^HOKCuLOD$b{Z1x0BO3R%YD_gz_19-F;o_bDBz+Ik z-9Irt7>WeE+1z5VyfkN8pYUjV2z|JL7EC?(ftWd~8MA9K1e!O75Z!UG`sU_AKl7&f zU9bi$wo`IVqZ?Rt@8A2Jp9QPUWJx7}sR1^KP7<9T{gHJUqEpf(;iiQli$<+QJ z5Kql1IpaW&NYnMt(*0Q^&70a>tTa8Jg95UwS@gI6ymmPib_t%*h{QDNR2U@yNt&z3 zCT!~IF`13?%%h=C2NHtbY1U?p8NvyM;hPzKL&P8HTZGLAY2)zQQ9V?tG1V%|7EFsx z{e{=|LYfop#^p;_i^5gc3ePPl`3sH53dw3#S$>58$ffj zARzMN)x(+_3yt>aa1+9apdR%BE(D0q*B+%q=mv1eK@%**)gy)u=*S_=*@zoA7#0I@ z*WA(m>NhGLkR!P;BZkn?BL$A6kCLZwRQt^QkO&U&jwNX3c*(nI+zGkZCB~SF!t_JX z^aDlQ_)HZ4%9=e&ewY>mD7z8qO~0kpa1M4zq4(*6m*<;r(*xMBJ)k$Br53ek zJQX9_SgS@Mn(b~-J{2Qomt)XqU&P=i9g1M^kP(KS$lB#0q0%KoBTLmMzRY~s zk+>0OzLL2ZZMPbmpgRQHc`QYkb3f~2_Z_{~>f!E)oRLZF6RtHAiHx2lD?yB=(wC~Q z>1YfbvVfFmtS^_SQ+vM{LZu4maYMz6uiv)=YMYW%NMFABb(i^FOl7Kk z^+w&0h;K)P_6=6^8Xc-ZlsWTy?3yhTx~CVTU%AYO@=f9lc~>&jKm zQRiw2DjPBEO@F&qB-d7S^gX@%UgK*d&70!mA&MAIUSj34#}PVUJIQT*ef>pBkXQ-h zW7Nr;oLz*CJT>RLT*O7r!)!#=siRk>(v1bt6bT{G`t;ue6chL=dDADadI5nV5uWCU zoDtD}`usT9klNMJuBk8gdQyR})W)kYJYp!nU<@GmVaQ`-fWOf7Pg@TrP(fC{O;3w7 zkDOrYw#!djyBbfClWM7J5NEBm)tC?r4z{a05w3|w45OG1GB7* zpt~lgPfXiUE?wn&XXli62~~)ksIPmJX>-tI+6K<4MnX;;6K!q6D%GJ^0rXtq2cg@b zOW&TCs1>t20KX=K;q0$#*UM)-`?+_Q=w=b^ROBzqSB`S1GllfDUz?WUM=4u#-X1=A z>}no=o)OmfAc960_<}so@&^JGj9s=QO%E6^eMS`#sj{FV({{OVe{Ccg{e{H8a%3(af%QzVGMm=J(Mwn2+24 z=tm)oy`TDMK7B$_{4f3Je=-;ninS;KmBXaJIi6b?V}YRHFR-6+i9~SFUEx~a1FNf%u-Tiw((ZP{+QZB(t> z<+R&2ZB#8Yyb3*Sn^3|fO7y>9V8l~B#}M|iF6LjA=Eg@}OwY9MkT zdi;Mui27NA&nUAwZz99YWqk$)dC+IlJhlfBDD~KH;=}CIp4HKJSZ;LDnKGW;(RbKx zexeI8--x3BwFHk)`Wk`%t^dtICeYjbU=66#5WGU^YYc9o+-AQKqWoCtl}GBd+hu_4 zVY`+T9mZwdj)e1>tIr9`Z)u=%)Er9udsH1#{5voS7F=Us9C?6CI3vMJ)iraB z%@XCUnq9wdYcQ_F0QMj$f8n{g>Ptg=%s)ZWqMsngYo>pX`n4z2Uj>maK;;wx{^LjA z0ErKJ35E|vpirJr;N7#4)OWQn<|5!eWs>EA4U(I^rr75jViGuNW{kw$ClWYX)$p1i z@WWMvl0uG^YuvV;v8Ms zNQx*c_FsZ{Ppi3H13@C??|;GN^`9U~G)p6xl-yY4LQKMxWK^3$49RDObQqO`9VD7T z#6btFgsnQJ>bsc2rWfZ?uL)gao>^n}-JT5IkJ`2`m}Em?KAb?(wq#w4+oPLbO|#}) z>Uz}1g6)R#vM^nT2vnWc2&E^pPz}q%Qq~Xcleh3SY&3W*J%zS!+BvdKH9sz`Ckvfl zY*>?~f1h($g->!)qL_Q#X2hQy2(ARsh!?0aQDwHYGvtgHW_a1km$F>USlECLZ`Ibb z%xA^vH9pDFt@}y454PL5JH&CG znM#CFcRl8Z?)5C*IQHwb8LDaX&pAOpST~xJ=5RShKFM&CNw!&KF0??}x7vA%x2UYN z%p&dvS8MbVo5{w6s@Z$Y-f6A4-qsl_w z-J8|^@XN54wS9dFTa5~B%I3n4rSHn?B$LH1+QnJh&MpD2)HzCd%u;?wKTkl(po4J+ z*|UN&#%1~Y^=uP!S|HV|nYqEeCRYWalO^p^_DHQYQ~T2YHma<#sjb91CTZ)aQeAQM zcY3yuU;twq|Z&%s8J93twyF zrIF7jWVu>C5RSHQ@}N|*^{fzBPd=G6!G&|CgG`yyypX=!YM{s%a}KH(lVr6P->BO3 z^C{N;3NrDkw_WDt!}zc*`$>qXyE?qV#U-)jdIHQYxwNw^{PdthkWUwJ$3N0TO^^iVaJt#jnG(B`}v0aN#|8X;n~sblxAU}ObuBTNBMm(B>InSbH=8OWkzyEf^=~GRMmWx zTo51;d^2_8b`}eN!P>Q6Ca=!jyhS6+hiwg`%rZP*TJz%&e+x01kkKJZhM^-pV_{1G zB$jrV+{mZJI=UceUXPt{*pPF3Pu+Imj(zr*+PFF@}lUjz-Cd(2h&# zRQ(L$K41Ov+IJg8l#CVr*QLEqNDb`Qj;f#PNRO2csK1jXa+Teyf1J%@9hi&|A`}A| z@UHvvZ1aQNmnIvZ-C{1uH>4VhOX;mCHd@Fz&^@=lnEwkm*QkrBfH<(8t}P7*9?+LmX9=LdhdbdG_MU83md8#ZwrPmCF*h9+YTpv7xs_^`9X_fsnsV(a z*sao3P@8RSg`6B2*yAIr)pVP2r<4FKQ6$Hv^44`7x@+Hf3XhvRZUfwgo2ruIIzht2N|~LtK7sq-F5q8k|t`=Din~E z?W6wa=DYKQYq!Nop1I!RNs!NqTtlB?b5sYt$MD5FW8T6^x8(&j24O~L7{LJ2Z3^}c z<;$VC4_r@~$5_yv?L%{vXI3-IRSxG-)7o$+#K!6sIF0d0bz}HWN9P0#jm_kIW6H@` zg7Vj2`F?l9r8hT(x0y`m7DKJYi;N>oP2WT(e~Gw_d=4)(Qoa!{P9uLQQYYO435HZr zgp4(0HgZy$KiI7)qQz_A^9bM*oG!0^N6V2@c=TYUm$56weQY7CP^Gj4U#6C36{T3^ zuZj>uhreT(Z@BggMDoeqp$~sQXKYz+X;G<$3p$>O7Ko9ieB0d#?{vZZ2 zqZ^0PQ4`DXBR8df*9lll1rdlNE`*vJAxoO&M)$N0IxgNB+d~WC<3Dq76MKg;NE3ha z4c#dhBKg4O*e3Z9q6e?2LkhKFO^}1Bldm(%{Bk5^GobBuhwoDD2mQV_(Lr=Q80RC=tC_w!0Q7{Ge1WBMrQN5M>^>z{YpxaNu&nK&Zoy4l zZ-Oz}9bEct<0Q^#jSw*y^-x@TTd=|Y!;z1@d?r@d?%2f8-*hF-4UpAKTwaW_rQSQ0n1)qOv` z#^5QLa_?{cp0I;;nTc^gz!l8$sSk?xO(4WtoiNf2QhMBAMyQ8ZHy~9rhF`9g!q*(M z)(n-^hy^+6vOWGz_ed57*?1|E-b2vth_eD#GXWf7+FoNve$PcvIeeAh`#SA- z&(|7FcmwMjj=xG16B=gs*q&iRYiGvP8T5Wd-E$!{IsZW|^J+XFscnjHm$3C5cs@c^ z1k*AR;t=9PkQ3i=ZRrW?K0d%r`OeKKzfa_e{4_4}9NGEr4Hjws3Y0zsQ{=hO2qM~ghBZV<|6nY4U< zH?DGVS>H9Yl#QuS7bhPL|BWo8a~n{aT4v$m)1Ac z_tmuATwBYm?{u%%eg2K(ad?S#)KXMDN(u8G!dmt+G6Q}|-KusCwC5S8h5?Xdou!s# zELX&b8EZ=DoR^YIu#T&_{0^TzbBl&?1OSAl_kyC2y$4O3Z&{sEN z7=BW(q29&j`usB&Pbv{Gdcvkerq+Y`U5?X}1wnO4e=-Ze_`Ed8L$U(D5|y#MGv8i= zZ-oy0fYE@h0HX6^pC^ITGAY7Te%4Pl$D^}VvdXaQNhj`Tlw3jbyt&#zXgKP|Ey@$JKKk zsBgxU*O%nsxrn~6=DBm4@*Nug{;WRxE$O+b6QyVG1xV=HWjGnWI{12Hcq@7B-4^yJ zdDFZZ?0#UEnSu`CsS(KcaD6kL08TIuorwd4A#U?=Zf$AeR>-M)l9XN`ft!tkog~(n z-Odpz!x@~if6PzEY%AQWG+7<0rEDnHxdu5a{wmh724zZb-cS^&Mdt$0!zSZ`fcri@ zS-VN8=+;zm?v}Uq(j5))dDacmdqvjQVr|#KW za3_^N@z?&8bYH2+B#zQVK;m(kBXtaiQwqIdTD`)i7YiI%nSW{JGxkuw{xQ0X5kv!d z$|*{p3C_1#QLb{7vQ2;OM~L*8fKnY_snEY&)c3xzL{Y9f0b6k?*lrCiMJw384=q)b zz1e$ToB#a}O0=_9bxRWY)2DU3|6hTA`qc1YA@F||Mj<;gK+^_Y9YY{MbT}I%1*@=3 zuRtBW|Ml@Ff@bgT*Yv=^+N7}eOhj%rGk!T(T@7h1tz3G)WUTfSvG+m>4e?Lbgnzw#28}Fddxj`$0v;1URB4-O#!@*Q*a(AICd>NslaG zHYM0Ua3yl|m$A=RAO0b?Ez%L$QYSjxvH42mf}6r~@Uz_(m6`#>W!D_N7e82M%8G$H|ovWE+xNw z0BQ_yIgo;om!(7S8>PiM&MoPI%@~vG%bOcs(N1OAf;W2mFuSwrp@qcf1W6d>^m0Xk zJoAGzL0+$ht}PvV4cu8}vxIz_t?A$i=g!I)u$2{Aak(|p&r3Zs0Z3G}1j>a>cD8H? zTSLe-f`m7oC0h<8)wAYvPv45jmkL!`jum+7RUnpCR(GS=f}Sy#TQXy0AL{uOY?Uvg z9!U+ga-vB2y<9y3Rd=D(7~(+IDp6HT^Y&L6)fZTjakS|{c06gO0{dADuxCpc2aU&IVAxckz zM?gC9*dsrtB?wHqriE#0;tjYQz*b2i%zIT^YN^QH-mQAoYfe;EVoWK9H-zKsj5cO! zNSmE8RH}1n+LHIjkMZiVAqmJ$->~Q%0@W(?!;!L}i_1M8XB$GR#X{Pb_B2a%e-nub@?eAj?*t?DeX0+w1NpQHv#yVFmOkZThhEFH;PX11J{wkAy7S$p()q<3N z`h%<9r>nDMEi#1^LOO}}b;W8cs+mais>R$Y-c&Zts&hEJSxDNYT(2vJ<1|jC9+0hZ zhtXZ!GNf}MZ($XOYqvG4C=)|&#D%XZ95J{bN>6uAeo%a>x&@^st*+3_l>qjouh)2WF@@)|-&DD=4 zon`<2=}Q2nFjVnhJfpCm}W-y>;Kk%0^Jx8qDvt zjXb;e;BR5(iFzr-bV-iC7BjL+n~TzdkhV+qbz|SwA`=msFM^>F>Z#=V9$d)v1N0JT+Sac4zwr;vqI~t z%nC#CobqPre2*^;J`sB#6{UEmR5xVxPnC^{`F3OoXH^S*SBHx*8y=+6A%5IvL_W&) zt4L+Xlso89Vy=rP+fW8AxK;o1eA>%Kp;;TRr93QBNi_j zYEH7iC<{g^)HNP)O7lYQ2iXdBO)6| zLt4Ol@%Q0-WPg||T4TlJ_I~!RUigmu52j`ek#tT%gxZq94x0Lm1awIS==ft4qviPd zP7aaKx(g+}FgNd-(w-ZNo!k^IY*@xV|7eF7T`VRcC~2AdCg2&ZTmVh80~fiA->C*wi|39}HQe7(Wfd9_3{q$cAYUu0;m;OlvqE8A|N`x79Ib|#5pwEo!yqnx0$!q6H^SZKW z5VBI8)1tCUX|7zLaa(e!c^x6f>mInx^t`&j^iQn4`}=qDX=YOB?_}rC*U6O_erSB! zL1}Cvr#(|_J;yy)>}`iV0qkw}J$uHttsqE7pWXftMxO&Thp-_=MXEg}G{NLR`mnnA z(Ri_Dawl>YIW(dl2hybSXfN?NOkof|K(T@9Xy_D*)M2DQFl3D4$th*>#n1prDWh=m zVripv^611t7cR>DnJ5v;gj9^YohS$!S2FC4&1=@Q;ljutEOO2Tfn#5Mc94kW+>QCC z4X)j=zVbi_8C<7tsUi=S2Q{T2IJf^Nb(6O68w9fTCm?f5wm>eFhNaC!PsrMxX!X zZM~@t_uNEB{@u03{X0a)`Vk^&>eC0`ZM41OAverL{uRQ0oD>p>4?^-bH8cksfCueO zNDQU07za(_#`w7cMs{^I34(+*6XR)F0vrV?O`jX+$H&YS{r*9D<152xgC_@tOj#lb z&>HIGv79xSv3nAS<^T^JtUC`L;#X5g#F=PQrKp{W{9sjvUSiX_So4T$Hp-YWF!!S= z98=1!rsg7;L6d&Sx?UrA<;yn%x~#cxvFf}9jtTQ6Do{xZ=1b*|vgP_UsMK=CTooVN zp~d#vWr2xu97=3X+6_c=B3T^4(`o_L*wpk@d^pM*8*_%#wLl8zWGVV+i6OiAz6`zu zwiNj{RLwD3TN|VoZH}fK3|6w1#m(INGga3;gVlpS^Q~I~d$D-))@G5z7^!@;++*5A za}Z6^=DOS%OJw0#^98|3^5e~am@BA`?p4ghPSmWC1!Ejz`!Ng(>KQgGM)oJ?$7qzA zVm8aPz$;A-7Jz1s6>ho{tXKio($Xx+Qssh(pTl4GG8R-zD{zSPRI=g~4Zyzp2h|5* z%9Hyi`-esN#9t-@(iw@Sm2o(?&<$!FSp%u_qBGA}Y58h4+-WE+sRiu0LQb^Hm~x2d zc7s$&Z(Z*10UERlYBf+x@n5%qFe1h<+MkUIEvFQyO8{~7m&NZtRH7tKnxz{Rn!X?1 zSk=learB6E(9jzzIq7`sP(&z`?b^DqDipUwi4SrddTXiCb9 zcEUx1;ta@V=At4+MfrtRRasexKs0Adt)ya;t{+1g8`mn~-;puUh1#QK@4?coseZq0 z;rc^aLtgZ72nx;|QCoA$tCb24BXu?3)$OE8)|Fx^xr*b5p&6L**oiu&0kdFQts*Yk zp-{VMU?cIajAr6IFl3Y#WL@_OXA6$H;O4X|cJ1 zgUBo#;rg|{GOJDgmxZ!Z84h?95~&g~nT0e^dX*aKBKauV41;|s=DgJ)RJy}mI*1}u z2be6fTd#q-XS|hRn~yi*CCwRIxVNE1hiN%>F_S7;o^*3gKuX=zE2rsW*4Vo4u}Za1J@i{p^E ziAnR+m6w@_@C|dtl1y{KQEhJu$&Z)A0*J(L&xJAwqQo|n+-wGaex5fshcUrFbsxaIv z){Y%1LAg0W@!zeZlp`J%^G-HSfaNNId38#;w3Cc~$;$vqm8fxcQ7g$<9Y#(5V>$G( zsWCy9y{Q3haj&@k&yxzy9=>ZXuYC&t?N5;$KchH@X{~jwqTe_TDo^;>k=E`#;d*lI zXKNsuv7|=7upa&4Hx6N5QRfV0=r&Aj@~nT#w`B4PW}Zn9U%AdxcARS@b)4u4zrAbb>N_aO9~g+V3hqOd*Wi3o9+{3dt3 z{u2e&b?~|iK6^-^AzD%&5upn?qmFN5Gil>!45vR+co8qd3O&QBO17!dQg{=yWabRy zD1Iv)%sS>EPMV}x!ycL63=p(Tnc??W3bUgWv`!hfpcwi#O`P4gccS55d+Jth)A2+` zX@*5L4+_>a^arY?jw*s?0rWGrNLWtRP+2{ywyv?w$p#e}pVL->jySu$T(RzBC9|4m7{(0 zlfpW+&_kd~HbTTZ=J@kvd>NCvs4j9@RU_y{BWj2n^}(W86=8XPXUrmqn92}g-GO&` zpC7Cf9MuY4VgMsI#7NyreBlwOAfJmqlaDZCjIK9g)*0|^TapX;n;33)ke;#kF%%~$ ze<(bY*O1A57}=aWaFw%hymia27_uM^IsLVwR+pMvInXhg8_7Jv*`c}>_IDVaLw74O zb|}7MUMmcCL|3cW`9KkvM~6~x5EHDcLxa3ad&5(WrN6h1$W=WtI`V*<;2=8eaz1&z zR~#w58P5VELrt5rOViMQO=6?c(R*mhQhB7a6$FRT)lRqy$W=t~&C1i+eiBIb8DMl+ z<+=>qz^G*NpH4DN9t%?eSX__|;+l*v7(oIWcCg@n2}P5kkzK@{n40W+WgTP+BEp`pMD5^X2>-T$d@9+0}&tK;} z-_QG=^L(G@eV=zZ?{OUZu+~s2eZE{v{Uxd^#NXskO4+I`Xal`ROf!dEhr9_*%hK7Abr zDp5po1p-~|OMhDK0BJdXY#T)S;57gIjad7WV}4uGv^NvR*PK@TAKy4Y|2j$DD9yi| zEqqkw?32RKaZiT()CA>RfjTS^V|Gew-*&DDcg zMBIeH`P6M5yVIkThs-153Vw2CGnA zj%DusLraKx@Lr25%PVcJyyufqsl+aPg4iC8Kz13o?waNKB?K+mvy`YadL_a2a)hf{ zTgs`{d*au9NQ1zoo`EyEf_tabh#gbUKS(UbcXa$BTsO_BSlN9M4%ed0nu|_(wFvN> z89N&zL2pq2pikzX&dd(a1+bqxamL{Be!)RMJQxh_-@XfK0q^W0{{7Vl1?`x4vx9+r zFcN&+qj2i$!I~i_Ro8>5#}8Q_%VDQ`kB{bh&|KPriw55uF4CW#Rj<(?rpo0)lt{58 zD*Efv98||!O6?K$(zE4n;Tw7Qt(WGMg0_UEESv@Z8KaEM@9S>~iuPOFl5(ixMG#*2Ffh_v5)Xu+_wA;mthS58dTt_+gw2nSvgp34~UQHEU=K9@Ng zextz#6@8WCQ*eC?`WPYv?;A8%=nl1g3RI4Twh!=OVYm4hJT_sV>^Tu^2iBVP25!3gxE21Gfj`X8qv|Kq=1cDxC&}^mX z))wlRRf2x()j%OaZ*7D`nFem)x{n(A`3vv$JdvdzZVJn16&B1=f<&)fS{A<6VIk%o zZ=QkDPrqaMtl!=)>xC^5f-EPH5}H!Fmm=H(X{Ok8gtY1IW8>bGBSFUT{VqQTI`qS-B_eCqo4N{kp>Ojj)qt#-HPuA$%5a1_k&ryXue-3;f%pBnn+CFTvTJ|03Pkz zFcd6Sdz+>0{E%FI=169>UE+g5CjNfj)NdNtk%v)Tdf4d<6MtIZd#R^mp(g@;k`x_I zfE~^x`%a90`Caa`3P{nZ9pr5jv65FR9laklge_<4yWRNi zc9Pd;Fo9U^I0G^F*Rn9W(+Yc08$WMt5V|C%f7ym5fzl}&j)+gRu93T9T_gMOhAX;3 z8mQOcGvNFkGM{WxUpj86zbrj^PSddP>I3_*6_V^kMP|8=;u47#vB@xw(59~4WeTcL zYWIXtKsmnZDe!sBE7kZpgZInM%bhhspJ7&CE!?9nEOh#-J-{{&7$^Q|?2r-8NUeKy zY~cty(%`fqN7<|IwFaEBA2jP2og#^z75bDW!gc_coAjAxKAm(eosR+^P{8!rjVU1l zK1*8^gO>sVbVHMa-^YHxlL0Ixk--E9}qd-YFsp$!|i_rz!UC-u(J;of15 zO?Tc`-mMCJJvtdG6P;-n@ z5S!v~kxX|Xe+_`bMqa$JU$2X4A+}tf6Au;(p}Lx(JoH3!&Ir@A)Ip6tZW138p z0o&IHmroj$J9EfJl_|~WL&soFsSJJIl`d#2!|8|do4B+hjStmcoC&7DGuf3HeGUPKPgGtn%x}H4LY?g127+6htWJODcQlbF3FM9Aj5Rr4 zNwdiFo5Dvnvp)6{!rlr3V=S%KFxMv!DVZ+x{}wROcOJ!DO}0ps1#ati4^W56Cy2vc zy{o?8yzadl4YX^KKvhVC{0p=**arL?NGF==m8MAIab8ZN4MuUZNIkm$ z-2CDd0Kf`^NBV_a_>aljd2$|jrv>DN=zdah-v18R?c`v`W3ltk@l54UvZntZ!|8BB UfEz*t07SWCZ5II0S;m|F1%WbB#sB~S delta 27348 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 diff --git a/classes/index.vnc b/classes/index.vnc index 6cab43e..63b2f56 100644 --- a/classes/index.vnc +++ b/classes/index.vnc @@ -1,8 +1,8 @@ + APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT, PARAMS. Use two dollar + signs ($$) to get a dollar sign in the generated html. --> diff --git a/httpd.c b/httpd.c index dc49870..1e65658 100644 --- a/httpd.c +++ b/httpd.c @@ -54,6 +54,8 @@ static void httpProcessInput(); static Bool compareAndSkip(char **ptr, const char *str); +static Bool parseParams(const char *request, char *result, int max_bytes); +static Bool validateString(char *str); /* int httpPort = 0; @@ -153,7 +155,7 @@ httpCheckFds(rfbScreenInfoPtr rfbScreen) #ifdef USE_LIBWRAP if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr), STRING_UNKNOWN)) { - rfbLog("Rejected connection from client %s\n", + rfbLog("Rejected HTTP connection from client %s\n", inet_ntoa(addr.sin_addr)); #else if ((rfbScreen->httpFP = fdopen(rfbScreen->httpSock, "r+")) == NULL) { @@ -197,7 +199,9 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) { struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); - char fullFname[256]; + char fullFname[512]; + char params[1024]; + char *ptr; char *fname; unsigned int maxFnameLen; FILE* fd; @@ -209,14 +213,14 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) cl.sock=rfbScreen->httpSock; - if (strlen(rfbScreen->httpDir) > 200) { + if (strlen(rfbScreen->httpDir) > 255) { rfbLog("-httpd directory too long\n"); httpCloseSock(rfbScreen); return; } strcpy(fullFname, rfbScreen->httpDir); fname = &fullFname[strlen(fullFname)]; - maxFnameLen = 255 - strlen(fullFname); + maxFnameLen = 511 - strlen(fullFname); buf_filled=0; @@ -250,7 +254,7 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) /* Process the request. */ if (strncmp(buf, "GET ", 4)) { - rfbLog("no GET line\n"); + rfbLog("httpd: no GET line\n"); httpCloseSock(rfbScreen); return; } else { @@ -259,26 +263,26 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) } if (strlen(buf) > maxFnameLen) { - rfbLog("GET line too long\n"); + rfbLog("httpd: GET line too long\n"); httpCloseSock(rfbScreen); return; } if (sscanf(buf, "GET %s HTTP/1.0", fname) != 1) { - rfbLog("couldn't parse GET line\n"); + rfbLog("httpd: couldn't parse GET line\n"); httpCloseSock(rfbScreen); return; } if (fname[0] != '/') { - rfbLog("filename didn't begin with '/'\n"); + rfbLog("httpd: filename didn't begin with '/'\n"); WriteExact(&cl, NOT_FOUND_STR, strlen(NOT_FOUND_STR)); httpCloseSock(rfbScreen); return; } if (strchr(fname+1, '/') != NULL) { - rfbLog("asking for file in other directory\n"); + rfbLog("httpd: asking for file in other directory\n"); WriteExact(&cl, NOT_FOUND_STR, strlen(NOT_FOUND_STR)); httpCloseSock(rfbScreen); return; @@ -288,6 +292,19 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) rfbLog("httpd: get '%s' for %s\n", fname+1, inet_ntoa(addr.sin_addr)); + /* Extract parameters from the URL string if necessary */ + + params[0] = '\0'; + ptr = strchr(fname, '?'); + if (ptr != NULL) { + *ptr = '\0'; + if (!parseParams(&ptr[1], params, 1024)) { + params[0] = '\0'; + rfbLog("httpd: bad parameters in the URL\n"); + } + } + + /* If we were asked for '/', actually read the file index.vnc */ if (strcmp(fname, "/") == 0) { @@ -382,6 +399,11 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) } else #endif WriteExact(&cl, "?", 1); + } else if (compareAndSkip(&ptr, "$PARAMS")) { + + if (params[0] != '\0') + WriteExact(httpSock, params, strlen(params)); + } else { if (!compareAndSkip(&ptr, "$$")) ptr++; @@ -420,3 +442,96 @@ compareAndSkip(char **ptr, const char *str) return FALSE; } + +/* + * Parse the request tail after the '?' character, and format a sequence + * of <param> tags for inclusion into an HTML page with embedded applet. + */ + +static Bool +parseParams(const char *request, char *result, int max_bytes) +{ + char param_request[128]; + char param_formatted[196]; + const char *tail; + char *delim_ptr; + char *value_str; + int cur_bytes, len; + + result[0] = '\0'; + cur_bytes = 0; + + tail = request; + for (;;) { + /* Copy individual "name=value" string into a buffer */ + delim_ptr = strchr((char *)tail, '&'); + if (delim_ptr == NULL) { + if (strlen(tail) >= sizeof(param_request)) { + return FALSE; + } + strcpy(param_request, tail); + } else { + len = delim_ptr - tail; + if (len >= sizeof(param_request)) { + return FALSE; + } + memcpy(param_request, tail, len); + param_request[len] = '\0'; + } + + /* Split the request into parameter name and value */ + value_str = strchr(¶m_request[1], '='); + if (value_str == NULL) { + return FALSE; + } + *value_str++ = '\0'; + if (strlen(value_str) == 0) { + return FALSE; + } + + /* Validate both parameter name and value */ + if (!validateString(param_request) || !validateString(value_str)) { + return FALSE; + } + + /* Prepare HTML-formatted representation of the name=value pair */ + len = sprintf(param_formatted, + "<PARAM NAME=\"%s\" VALUE=\"%s\">\n", + param_request, value_str); + if (cur_bytes + len + 1 > max_bytes) { + return FALSE; + } + strcat(result, param_formatted); + cur_bytes += len; + + /* Go to the next parameter */ + if (delim_ptr == NULL) { + break; + } + tail = delim_ptr + 1; + } + return TRUE; +} + +/* + * Check if the string consists only of alphanumeric characters, '+' + * signs, underscores, and dots. Replace all '+' signs with spaces. + */ + +static Bool +validateString(char *str) +{ + char *ptr; + + for (ptr = str; *ptr != '\0'; ptr++) { + if (!isalnum(*ptr) && *ptr != '_' && *ptr != '.') { + if (*ptr == '+') { + *ptr = ' '; + } else { + return FALSE; + } + } + } + return TRUE; +} + diff --git a/vncauth.c b/vncauth.c index 48e5f6e..64e8cbe 100644 --- a/vncauth.c +++ b/vncauth.c @@ -63,7 +63,7 @@ vncEncryptAndStorePasswd(char *passwd, char *fname) /* windows security sux */ #ifndef WIN32 - chmod(fname, S_IRUSR|S_IWUSR); + fchmod(fp, S_IRUSR|S_IWUSR); #endif /* pad password with nulls */