From 7631f85613a17ef1079246e0376f77616dd21160 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 5 Jun 2013 18:22:20 +0200 Subject: [PATCH 01/39] formally fixed duplicate log detection --- htdocs/lib2/db.inc.php | 1 + htdocs/log.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/lib2/db.inc.php b/htdocs/lib2/db.inc.php index 59576b6f..2af7d18a 100644 --- a/htdocs/lib2/db.inc.php +++ b/htdocs/lib2/db.inc.php @@ -542,6 +542,7 @@ return $result; } + // returns false if no more matching rows exist function sql_fetch_row($rs) { global $opt; diff --git a/htdocs/log.php b/htdocs/log.php index d863f6bb..e9b15e6a 100644 --- a/htdocs/log.php +++ b/htdocs/log.php @@ -231,7 +231,7 @@ $rs = sql("SELECT `id` FROM `cache_logs` WHERE `cache_id`='&1' AND `user_id`='&2' AND `type`='&3' AND `date`='&4' AND `text`='&5'", $cache_id, $usr['userid'], $log_type, $log_date, $log_text); - $already_exists = sql_fetch_row($rs) != null; + $already_exists = (sql_fetch_row($rs) !== false); sql_free_result($rs); if (!$already_exists) From 82f09c12cfb8856ea9c4272fca29f8646dd55869 Mon Sep 17 00:00:00 2001 From: following Date: Thu, 6 Jun 2013 00:10:38 +0200 Subject: [PATCH 02/39] added rotator picture --- .../images/head/pano970-f13-moerfelden.jpg | Bin 0 -> 33382 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 htdocs/resource2/ocstyle/images/head/pano970-f13-moerfelden.jpg diff --git a/htdocs/resource2/ocstyle/images/head/pano970-f13-moerfelden.jpg b/htdocs/resource2/ocstyle/images/head/pano970-f13-moerfelden.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1101ba3f7362723ee0cef5233d36501df560907e GIT binary patch literal 33382 zcmeFZbx>U0((t>7!QI^<5Zv8@TX1)m!QDxK1b250?hsrOAh^3jaDux92$!65>%4E> zs_(nsegD1BnyQ)K?$vAW?p|xpboH9rFN-f50J@x%tP}u(0s$$nFW_a1*j`p#+(=nf zNlNy;Bme>d0I|V)h=U^(Isn)^xVflGi;-*V=#s;Y15f}001L1IfQgx_lY*L*I`Gse|lv*PdBH( z^0QaQHnsiBP~gAp@@n8K20sbpFjEf7#sL!TeQ6?UkL(?alx4k5>-!aJP76 zu>32Bct9*XUwP`4sqNhDA+LP%%GmZ6CawSgjqq3QW?^Ri%1p0}?4qtJ{>pp+0FP|- zFGiO9%clQgY?Z(4X5sZ}Cjf{$I(fT5tgPM0-e&ioqv|Fr*Y=YO>R_waXW|E+PQ@~bsTzbgDk^M4Kh?Rw0AulJwWkxN)unz-A!k^c>Fi zlZlxHIn)1h4gZe^{x`G!n;nd*7M2z+77nkM(tKTH5C^N**>*68xIr8p$RQ5@s~P?u z4*PF50KmT&^{WW0@DG4(#0;QMU<2TjQ2-hX2>|Qoy!L?pGi&b=G=aajofg^tzZd<# zPW7)_`Spg0eLaHum*oF`bA?!u|3z_Cb#gOz7mt67q5pos0Ehq@fDI4;qyQE07GMI{ z0UkgAcn3%Va)1(`4(I@efEi#7*aI$rC*TJJ0wF*o5CN5DC73p|2AAUF^T2n$32A_KhvF@V@XydYtaBOifaZqN{D3bX{;1Ra1bLBFBEP{>f&P$W<^P%KcqP@+)s zQ0h3qZ?2Ye1VpJ41hfj)KmBE`@G_ z?uDL#-h@7f{sV&oLkzkAtNn+;n7+XXuXyA68-2M0$0#{ee;rvzsL=LQ!7mkw76_Z@B;ZWrzz9toZd zo*iBaUKid0J_tSqz8wA={51SN{38N7!W#sB1SJG>1aE{`ghGTigb9RQghxaSL|Q~4 zM0G?P#6ZL}#A?Jo#8t#ABqStCBt9e+BnVOfQW{b%(jd|%(gQLkGCi_5vOcmqatv|_ zau@Ov@)ZgS3JuCT6kQZIlo*sUlpiSTDEFvXsLZIcsOG32Q8Q7SP^VE((GbwypoyXx zqWPeupnXM~Ks!c9K&L?$M>j$LfS!roioSq;gMo#?hM|OEj}e7YjxmJs3lk2L22&E# z9P=~g7t9}++gM;MDlBmAOG!v{5LKD&xst|e-<`DJ~9ur{`2@shPMG(~!EfYf#(-W%_`x1X49wojZAtjL} zaUw}4`9X3_ic9*A)P^*P^c(2`85Wr^8H6l}>^s>ZIS#ofxgB{Lc`x}n1u=yTg*!z) z#W=+yB`u`}We{Zz-;>z8QFPM?*`a zMH5QXO!JEtpH`OEhqi)t^)1R4+0tdxP0~ZrbJ1JVXVOnFKrwJL zKp3(arWj!u`4}A-3m6xekeNi8JeVq&Hkomm-!lg>H#48IP_yW=#Ip>r{9)x{wPP)0 zU17sylVb~FYh$})r)M`~&t#wFK;e+$_{h=1aly&JX~CJpxyXgZrN9-+)x-77&BN`& zUCn*KL(OB%lf|>Zi_NRd8^t@w2g4`E_mQuI?}4A2-;KYX|4e{Mz*eAK;Fln+poL(e z;I1vn$kscmcjoVk-|dUiiQ0%(ik^zGin)k2irtCx zi~EarNq{A!B_broB{3y6Br_z}r6{GWq$;G&rMaYirMqNcWaMSyWfo*fWX)vDWY6Vz zA-qXK#dEcf0r68w}sIaQ|M$tjBSqV^*RZ3J^Q>ImRR&G~;RZ&*S zRM}HyQ}t6FP{UF)QY%-xRToo_RbSC~tKqKEqlu=euUV#frzN44ptYgRqV2CeqC=P$Lb-;A6b?9{@b@Xzaa$;}_aoTX^cTRRbcae7~b_KZ_ zxVE@qzh+XS?r+_L-8VgiJu*G+JvBYQdSQ4uc#V3~dxv}P`$+i|`9k}e`S$ox_yziH z`iuJKe*k?j{m}D~>f`5+y8+SxrGbcnwt-_otU(Du*PpaLwS6Y}9PoKNSUR{O1U1AZ zWFb@_G&c-73=%dT&Jms-{wKmbVmOjDG9~gU$}DO)nk_ml`X$CPW;~WVHYW}?&LM6- zUL?LW0VBaDVLMSFu_=i>DI)1Q*(iA^g)=2L6*1L4btCP4T1z^0dR+QbhIPhVrdVc8 z7I9X1)?K!F_H@p>oa$VX+{oPDd62xteChnA0-A!9FR))czU&oh77i5g7L^qf7DpC8 zmpGJcl&Y5YmhqI8l@pi8RzOv_R~%I8S58(*RJBwyRp-~>)P*_&z8!*fGRE)H=*N+&scP z(lp97+Bn8F);P{R-Za58(K5+5*)}CO^=(>Yx_d@qrhis;c4SU*Zfag*esMv6VPnyJ z@z;{w(#5jJ^5aUtD$Huc8v0twI`MkJPr9Eq8{8Y6n-ZI&TWVV?+h*HGJFYuVyPx+^ z_EPrA_RD^;|LQo9I+#4vJKQ~TI(j?~Il(x|I(>WEaQ5zO^j!OV_rm4k|b8~$p!w&1^&qe z{>cUY$p!w&1^&qe{>cUYsSEs57x8h92z`48u@EQ7>E4-YkTPhy>5GfU|zQzUfaLZnb%_|F!ZZA@Cb-V=l~Q5 z42FUR!@OGg+T;J)2S8)MU{bJ&!eXhIz)?D5vj@iK!&8aXb>pZ`ol|p|x&$F0;^N^G z5Wby?y-ygG0m9GqZE^3yVw3n_JsE zyLW z1j_ov_ML{DFS;g_abPc2$)Tik?bK$7Pfw-Rer=&y;?I zq5Z_f`}wT#J9>T$Ykr~ie788g^3tTR!sM0RSUz&BSVhs z7z=7#A@3(4R~5@Zyj(RN4{j%f9joSHMn>)(tagg_tcyuEY~e7?I!~zt1Iqh`5kcz} zRcoSsSv+2f5Er%q{NH8~HkuxAWzCy!@#H$b&N81eGufS3{*bqK4i{Y)@h062`d|`F zZAH>rMfYnq+$Y!YUf!s2juW5R?L=|wmXlPrHA5(x<1HvHwpx0Y@LFwO>zAvDdkT#o z+Xq=%zA>BhL}IR`g3sc682G=~q`xYx`d!NPs@e*K!r6Lo*-&!}lNjzGJE{sdxD1rK z$~2@iC){%3OT=bLXLF6GEo02Ra{cc+$(+d^jdZ0p2Q&$erJLIvyGo$u| zt1{h+R?qw;@Mv(=B=7z4EXaEI3XdnA+NZ;$UwPyAg;H`TJM(iJO6yvzO(c5*#_1<0 z5Ykx&ti+7DF?((m6#fj(FL8gmB4<0wRe>xzxaCYuq*duwA?k?@Yn5YEgMROFe%z;n zMJ-%D>}IN(PC#2KGS8B9WA;!v7JmZmp$ZQttf}oBAI-;8)KcVxU7{l=smgi%hvqZe z70N7ct*RK)F?Ciin`D|RMZY$IYXAz9bUv0`xl5thkpe=D>=$Dv?Yjf1f;RKIuvPQc z-`54VB;nA;fW};CX^~UybDEvQR%CF9dEk(UzM2@dB-7$_i?&BU6+xi@yi12YO+c+V z@vif|8VD*YYG=x+_WTRqUSv$q30xyoZHR~upn^`EV2$qWEu?@4>Xs2?D-=Kl?l^%j zq)A<3a76$S`U?Qhsn1CI-hb*Ny{CyuP(Skiu+eZX2Od4f^*zx&@Y`7|6IEUMIiq|@ z2jAB+SEz4ThN+8p;z-Si4Aawok7Q8Ixx%IbTk zRkN0SnkFnrLa-)y#DD2TL8&E60JAEoY5{yvcu36!HL$q35>)uO_w_b`AsM4F;1AwY zpKAG!WEAcMC;(CP>_A$m=f}5R-`b~g?*UT+)629V&|SIWmUUDz>6~t2Uhtex6P*n> zu7BW+__wNkL2{&1p*J9fMw~b%ZdV}H6x^2gL}w5jG2M-|3rp191uU=o_)TkRN zW}OG=S2sIaFTN#Ut=(p#5kb`NHl?jMmO(DmpbL(uY@ud7(99mPhN$bu(M9|qS#fxW z4KirDCI?IQnIf2I2_~MYr)3bhvNP&o$PDCd1(yn8XpBe|sBXLf{1w-f^Rq=<+ql$V z%>paBZ#4?t-bkq)hYfnPs#gwvqBWcy3Mz+Q#&ot;enVlM&}OavHnd72f&>asyW9`vwc{ zVIA#}zZ&85jKAtr5P7SLm6CHy6XysZUb7#J+sdvn*F05PXb#zzt#DP2wqF=Fv-3R| z?%2Xi?P`&07*dQ-YR~UVBdD&5(&z=PA9OKt?-$$h$-SMDdSBn9W(A#iw)`a<)aZV%si zYj0eoAXYp{+yIyqL%0Rw918a<<$;h=n+)7s$1g@Js|LFIdWSi7J#P!V#fLDW>@{U3 zC}I#))=SdaA9UJFo?OpIb1>=`+?ga+8hXXKIyA2osMW%L3OWkulr(ye>Ho5>6FhQj51F;w*#YG$?b)a{1vN&d-i0b! zZ%r@rsM$d$^tJ59ARNMxUv%B<-0+Mh)?+R>kFYgGEbr(&xL%Mam?YAQ_(G^L21?At z{hEvinXMB3c(k^;Goq2B0^7ts>fBt#Ax)`8(v>4H39K=YbP2^#Z1-;HTM}>KWOb7X zF47%7mx^qjUPmZ2M6U#R&ZEZ5>Mf}-hEE-FdFQCk3H&jx8Oxn8gjsbQMQS-bR^OiJ zrrjM;?!}OV#CjM63gm~dUG@`KFV(SrI>7iOZH_?a>@&%(>yr3=v`MX0{CQ5HWgf0& z9WDkKm0ZZ;F9a_60oL!VM(s7q(kBQBF4ZK(_oeoxdhL{I`xr5wwm z=3esDY)dTfQ()kH$q|Mx_AglnS+Y)UgG$zz%}R09^}uwDCV>00dP zN-}lQVcYy7OD7KxRMVlt zgV+M~vl!*vGF0bfc7>6&CgeCcJoMdN_=s!=l6}TQ15nvr$~(%S4$|T{#Ey?Q2f?3V zg2_Pvt~ro^yqNTY4QA;gR+5EA^4fc2?-iS<$KR?hG7xS#w}-$DI`B7$YyKrWfqL(w zESauza_?M7g#!T`mqZMZp@rXaQ{sfE1=YFJEKBex=o@=k9?P(rZj`Uu=Wv%CPx?l1 zU+A!CWHRk%nX{uAkxC@4&@Ew%rV;yMkXvVh9ZJ456{JFu8%wpt8!xIa5>R@SO5Vba zcOl=z<|As4SD9^qKrT$#yT6$YOn=R6b=H*7@(3;w&~p~t%Ca!F*>Ucw?BLHAs#D*Q z3){A0W>^2<<{C;x!4}vLDjB7z)NO2xPS>Y1C=twQ%uM8z>1@wIdDmA6g^M)16$u1M z2*Sb%Uu(lD!=Q*^5wO>g-;gF(l8I5bB}E;?reEl4XXY2EGk$Q$zLF|fb#K_*V+(;c zPU2Kq$R+icVR4`@F>sxVuQLQOH{48#g3Jl4WROyv$~aXUJJT)5()_ zX+uRazqvmWVzqF_8=PV)qS_o!5u(ITnJs=4oGoaeZw+@%Ve~bhTdOCOq;vYo1HP!j zVo&&1#E|Z>V-H7qQ|Qi~NZ&Xc&%BATa-?OxRxQn;8z23yZc}EWh&X7!Wz*wRP%CW} zEiMgBV&DX)8rgnFlncDFtqM&FlY>t2fP4j#qtT7O!O>apQJ&`?p-?Tm| zP714(Ve$8)CRQ08q^`mGGDm*<8TKQRjmT1S$^xbJxa27AF@@VQk@c|*)8dX5Y{z>y zKEhqyYhSAIB(L_~4^)#(RZkR!ZyM`Y;b}AG(Ti}@jWN9#y{TUS=HESD!;>oV z$wv9iY>LM>MktF$dI#l>4$Ka;@g4nGSdSgCZ3z3oC&O&&O)~GJXP>y6#krVe&5b0D zYn&2x7~G+R{E8777bL%~m;TQ&;bN8G5X!poWZ{6je>gQXFKYV09){iF0 zNe{K)4yN%uf9;o&(pZ7Rj`(^0MUbKBUef^U-OTkf#i?loQbkMU_M)$fhV%bXkMOv1%?o@XvMHUw^v z^eaCgt{QtIf{O{vqgN z`SJQoZ&lIY$WGQ^ID|N8Zk0Nk9$}7_mAaj`_7gv!$3YolxKF!<7RtZ(m2zp_sPp+x znJ3cv5$;7%p@-&q2o!a!ukfCZB`D+=k2(&(=65Vjmbev?mJTtXhiin`qf|;TWjTo{ zi=%6RP-Ry|;o@W9@weY_Ef$`%c9R88Fl85|UC`JYy$@BGi?0;5UEGe}5g___>d9FT zyIBu^%As>a5;>K%AN>vOz$Z8Mnh8&N?v#M5wb8bshM7EsjGa1$y_Hr#4JqrYnU{ot zSW-uqp(Ab^{!5+GQvdujetQ6$2PJBL|St4Fj)prtwM}J2%vzOpafj+>!_5{BTBWAv1wujF*oyy@! z=^;0ed;h(wZ6cKBYi>_d$iqeg8u_1-52LkRrVr(pDOze0B*_z1LT$-p`gHLz-X9)*b=-~y~v{FXO&cEQ?(Wt7%B?Ni?wOy z9;D!uMoJ7DR=#bTatOTtMWTm~baPkM*aWr}pDmhk_&hbNnw>ra7yubp53o_N{c4;_yVOU_WgFTQjxrUtc0Xdw|!t ztxV5v{cy$QMK}J>d1%+(_-0fNbiCEus{WxgW&DYII>X=B9{6W=4Defjs%tmTj_i*$ zWQh1TGUF~K75PuOlTa%Uv!gYNnn#p+cNJ`!DpAOtG7NO$Awd>B}r835C4jpn<~dX(#7-jIg61UYd?_WZatKY!bDEQ?d>+!`|_ zJLvaieV&WVJDjsM&7}Z0Sc-j-wx&_oHuUXJmX`hX>^_s4#|B3AI3c=KM$02Zn&}Rq zk}?0%b!lW3;eG;`Nax^z8mcN<>O?z6@22mM@03bLQ9@E7&JL@6RB}6V-zvH$1f6qS z_2<}_7=9@4^4CB;DK=iXu~w~$%XOwVt%%K#UB@825d}7kZ>k^~`ek)9U#9e81)oKdGMqlN?g2BN^KQf3#o`+2}8;0y3lY4YPDo& zN!%d^tzu=26&p<1&?US>jFY4ZkynLQ9n3Q$D1XOh|K(>#-F7XfKHL}w?V6zwL>m$B zD}qz|Z?frzn2bcq%u=Di-w{(B++l)Q=5YNst>Lwq(`(6-WkMW(IKMH0H)m5HHFr@F z^No~k{4-dx!*R=J_^t@l!TmlNBm#DbMN19}QgAAJ#;BiQzpD5n?HNex$b`Hv?b&ZF z?2o)M>~m0O>vDK5w|9>FR$=#`yb-TB%KXkDGZl(bz~Z+uj6g+LVH`Vq*;!1o%=;Ra zbnewsa_6il#KP$}6-m{g!1G?SS;A@N9a)`tT%}Fthe=8V3+Fo@4JKJnJ&ZjmvA*w! zoVe}r?Bm;?SB3L53@DjsC>KY!_YQo*5UWgSmp$RWJHB6#dd21o5SCFB%;L!0V9QHLi6cBl;K=Z%)#_kE(5iU*XuQRy zG0VHG!lw#)?oLRcCx_=-$R)!IfN_`r&r;}R+@y>s)wOd?)UttmE2Q8tT|Lt&?b{Cd zBi3v-b^Ul`AjQHyzQwmazS_Ukea*F8LU4o&Uq7{fAG_tF)^g(9n(U&iqP!vcWuOX~6p_w_*I?m*{9YP^Lx0f*)q#$l;HnG0G3R2JatP`FdabET)E~9&Vf5_1VeALyT zTk|a~*I<0!v&mK+_gY@v3_lg=Z|%(5J|hvH#+)n>^!NhfgCZLGDBxw-zo!wir#jdp{P>dWDOxDxgL4>#U%lE zJ~V>iT0f0*iShVRHgEVVY?39JL42Wp4*kV6T6~eSnxTw-&F}e3KLl0u(>ua62D>c) zOa?6&d+3ttLfw!WBnEJ-Pm7xQZ~+_jtUZ#cHpau@53U;OHV$U@IqXxn75Oi11VP{@ zYI8&zdk0$l&alv6S}O8tv`3~t*uHM0z4xFJqV5PwW04Ntr=tn^);W`()-bZwLKaLf(Mk_WFez zPTrnsaaxp<68wA!T-O4FjR-o+70 z%!+P;2rq_}qvZ@v^#gf!kAXnvUCL8@`8FMjR2lbl+xorZ*Ns-~NS-hRW|;d*#qnY0 zB7IJ~%Dyu1oK@%q#;x80Hzk$~1=w?@&C%(~UwItmFzuLw|13mk2ecz4c2SiUOysqu zswQQWUU3gl5NBC7C{G`!3Wuqb%C0L-r_!TZ%4I}czlq(I?T$^y^#4Znq+K*TyeH;g z&vF)_U&;LGMCApT(D?FNKBvstcIp|%`z6U4*nX_eL_zC5MekDvya2jI4!uXKDQluh zrkjhTP=u+zc8F^ucAKd9!MB3yy1Sui-@aTGbWtSZRe+SzjNVngz^BP5xtxY$hR__2fWrN6yanCP`ix(YITQq7s#$e= zLS6cKd=iz?>s$&>qVnGJ#2VY^$V?-b02n9AtS))>)UJz@FrGmaSPa4A{M($TuqabRflsa!$k5><_We?*96@}#<6M7MH7hQN z3{aKS=j~al?D7?ax8_fm(p6=t@!htqEsZ*)W(IF=_6jtxQyIV5JK%CYacxB_{b(MY zpVvgRdMBu^J$-CbN1hH2RSNcMi2?^HgJd6JR z?4#JoUCAX@;E6!qX}PB%MH(4_6|icx8Wk-^mE6KK@$m&PAZz!BdF-1FaxEKNf&|=k zR~QaqK35z{;a>Qxf^(If70-_u6x?ZIPK|TaMo8D6G+lx^r>T zCG61_mGY}@i1xRdN^Oxqly4p{BHvxfFfAKJ+8BAX)|)W!r23GKJ{7Z->D*ZM+-Fny zNDp`)Rz9*Ku_Vjm^unaP>M2#d+UO7%rD8VCeE+Cj6{dcqv4P!j|6m>@2e}IWXeMr) zR)uL1YAe`Qn~~%t61PwOI?7jlEorQ52$crC7>x?EQ$% z9KghRR7GhZhIEVQAq*z@fe7piy)K0QDm~7GHW<9s%b!Gkx^oT*^9YQ^4PPVP0YMze z?r`{);5Sly`1`fh{EHD)2lc4xvFvlWA2E&!PHkJ?y9n^hv$11(?Id=S*FJbXF+>zD zFl4vIEE7(99rbZvDuLz-uS}r0Qe+XE`jwH4q3}t{ITp7XiZtC#v&<(eqmAIbJasP= zQ{s!NuD>pi_Q+Dgy_LmZ?W_9~gv$QG$V?3xD|=Q;*`8@a{@%XKhLrfi?;BAICgr%U zr3yY7H|pBbe%{Ts&{2IvGO_g6RHGvmJ_7^N(l;$A(cg`dE(~kvsWQZrT(AR-P<@a$ zGE`!nl42Zt$uKx;P-G~+&mxZMvn1tmTykXjm}Sk*RY}G65AJ0y_O;yaZ-&(v&Kixe zO1+&f6o?~xe*2PA0VG?0zV-QO^Hx(_5zY#h_ley*9w+m$C#8yL z2`p(iaQ-@DUa8yb1);;WO(E!VyO%n3Q5&SWf6CJ>-E9~|skua%#ua~VIfgy8GK(}j zjy6LlvU5ypex;kzn*iU$~xQwppj(#v`Lvwhrg&>nL@(_;X})>QH#jC**y! zB-JSUW2uu%^DKV~y77ag0?TdWg=F+^BZGCM(k~(%LE2ricqFwT65)oq_o_BC->af3 z+X;T}51e5h7O3M*uTWo|p%EZXMS&VTS5DR&-RqeD+|;aGzbX8U`t|;3>zR8|W~OS? zS=e*TvfiP)f1Vc(?&_{AgbKY1M(wP&6+PqbglX#x-GJ&KVdYnyRJrhkX`p;FQOs3> z_ddaPNvFN4`x_!T&1=q;d~H9w3&)H52~EvYlq++>?amKpzaK(51o_`!%C;DP^o8nF z4Gn!K7l4!6s{gv{_>Oaku^PY5@{U9SSH^sP0hSg@gP9{m)j3{u?iNcTo>hmS2_1B> zsOqaN5g((d#V|{JT}Zj8MhJ7|!sB`n5gB&q2eXwe-m{!IRI;vQeW&uABORm~r5@+S zN78lFXQeVEd0EGP7V(YzsBKbSAX@X!AwGf%@g4FGan{Z6j9~d?T@8|MD%T$`0REE^ zN!yC}7K$8*m;v0J<5ZqUAHeUn;dxh{P=@DDBi}X|seYfnRplTMDR72sq^~#ZIf7i@ zoH8&2esHUD~qXLZdGLBw=rpppg39#dUDQ{lLJ@R`atxY%`^@lJoM!3BuM&A0$5mNn5Asq^TL~ z$oDuvD|j=e+G|REyl;xb`_mMOCH4bHb6m~J4jV?p*YehhQr^LX`7g^_u}_^J16-u* z7Vf2QGv@3pyc#1N8}p;1e8V(<#-_%{a17y36dBE1;Xf`Xbxz;po>-Kw7*u*L8|G3w zY&%7GMo;gfs6{#Z z0@yGi0gw!sn}aLvnrz<4i!RtkuTz6~Cfe4L!aq}n=&c(3!7(KzG9yonr?$|1`=udO!$PB-}L(xzBGaOmK^A zw@~O#tdtMPTSem(`Ji`*FM{B>ri+lQdslo@P3IVCE_DTt_@I|A<%UZ}2WTD8cyG)1 z6s#%t$GR-Y{|HVBggLFEf7E3$UUir(2`2W3tZKfImCKs;Ny-lA>BVDWmc1_PXrt_0 zuY^lkBO}u#vSv&Rj;ll52DkDSoR#XhVU68lALEhM_rkG!I;DRzI-)6_@|%+gC*K(L ztaVJ9!6!D`P8jK{!=6k><;@WBjHeH)rfz}t4FjZb%>zv4K<6@KCv1H~ktEi)I*d-L zZjK2l6AFh2Nkpt!sA^iQ^DWc0MLT@X%T>WyXBTyXzoCpQ#e(p(3c@x#ul-l-jpE96Q?X2a>c5+N?HQs@Nb2Uv)^mejDfmCwh`p8fNN!W~NF89VO7)4Y;Yd&YQ8?yAoXu{-RIPGj-9VXlh$u zH&+oIcyyE1lfqa~m%EecLQo~onOHAk{&B+)nHK&)aLynvTxj6NC}qOBTMU|TS)(&Z zwlE2Df~CqeIh)WGQby%T%u`J;j}hfe5G{kwXxzS{Tc$RN4{Z+RW0H?!t7=&7^R zW-&ILjF@9f!)_Gly&aO^=ht~ZYtwq5YLkj0bQ5nZAf__3NB>-9NOJd$cc5s)J0J!S z5CsE~|aC z9W0O1<$Fc%*M%xF->Na-x*YElg~27G{G=-O0qL0>(Me4d_c1Bi)V8XpZ$|9t<%ly3 zq0WKvw`nh)ys8&vJG(3FbTSTN$ERvUj?Zl^Fo~;5k958ynWU?Tp2*1-VDc26U6H6grO1n4nwH|^YK^Q_#?=DN4%}rPN6wwN^ z{AM&To!j^$DvUn$R;3khS#8kfG4_LEM^>C7huWL*8~A1=Q&~R^a)Sg%m0vXx@<{&5 z>&(lXYHbVTIZVZ@19K03wuqRKoueh;QOT7mf2NmZpkZjUG{>{Y-8HHrS-lb%aGCph zay!HlfK%CH2E-(m)+r?nOXYK|@aUYh=^?>xW{3S&$$flJT3Qk>s+??wplI5+YY%^{ z?B#};N9y@y{lstMuZF8~ob~8Y&@T|8A0=F989^tq#i64a42?fR2IOXvIcRB``C>7C z9*|N@@3z}3?0k}o8{=6b`uIMm1THJ^Xy!<}SA3y79?<_Jw}O>tCvV&e~`= z3~pV#SL<7j{p{wONjdx5x|utA$3VSF(Yn9}e6d;YahP@`e^0yxd$iDiAqdXmTx^nq^6?9jX; zn%>=YrjfQ^>L!ta%NWzjEE;?PHiD+IE*9Jg9MI)m8D!Wxmt9=={YnHco{nhRR!NI3 zeugQ`=YQLR5T8B}-zbZeG(wJz-bT0_CdfF@26)$PoSAiXUGJ51Y9#oeFd?Gbq#D_1 zrifLKM0q;eEKP?p#Z7$}QPx(K4}V|B7MINODexDEwnp%B#DXY$-`Yh8?h+;5ZV!6b zV~~$qWnNNFsV7GxlcsHNlSGnygG0Y_V$8c|1|Rh=uq&E4r`Dp>s(P@iBa8vSO0Bfw zry{GjON%Agqa%+;zP>+@t-PgIf&gV!;p7HLGf^FvsX&$Sa~b9Hd3YRFGXPEyVWu~c zU;D0VU&e3Xmxr!g;a8dGd=jBZWy!hD1o@`Jg8({eCJ>SP6@wvdA3O+QdI(w-te12k zHuFWPbp3gte@Z+)qMA_mVSIa(zeTTL%brphftPRN>Or-za@)Nj8gg^ZyX`Tf@J&`H zf<@|=6GNla@Zf09xH$*HV6Vg_lq0=A-;<3Mo~=6;59d*s-HG7b5MwW^QIeUU`$i1g z(U{YGWL71tVhyoo{g034gJuG?(aDHE2*9z<2AmdjvIkmt>FXNjP99ejP}eh%Xr?jQU)VRc4rNins1KKgcB>z-4e8cuZFYiYRK!#2 zJ7a~$+L1pbf0#xqf9x}pmkT+3w{BWK(1Ep=&Le0_)m7Od$9 zMgFYB-^yh!-zSnou+swe(Jw!htW{S#FekcWxw zn&o=$&ZVqrcwUvyiI+G;EJ5pLm0MQ<_x>!b% znzg2cnd4iGrwB%DTh9aZE>?J5f<}MI!{@csoD6KD8z_|Dfwcv50qgfh7E=ZtQUwsTO-Re%c^3)>E6hFN&M!u-(d&$%Rm% z>wxW+0tDCTo5Rtnxrw^+1!#N$LZ%NUy?iyi05#$u?H}CIe1<>M zCmKcU+Q2tfSJ+Mu4BPt-QT9hT|rZ@f$~La^|0>em*m?V^0{$~CrrvpY<=tlVbY`*Q}H zx6S5t6L-do#6nMNhl$)9w|+6XcmX!o^SXG#aHm#8m}XJa2EM`X*XXv)f6`@bvyAYw zIL8jP@fwhYCU&JG={glUDEra!5R$IT@|mZcbG$AqNSS&nS}eo< zb&3QiI=S#|Pq$pe?x6DlP z4Qd@adado<1zkr*M*8wLGU;pzNTf{B_wJXV4p94U<Bm2)w_P0L;fvV8&(9IEAh556z&wqNO2^zkxS%QNDmGmtBfey%Px`X>&2kLI?6&M&BZ(RkZ=)Nv831qJQP-T+BzyZT z-Ko_WT`kA=II(=%w~tbMFTCdkqR6rBi~bH^$Id6!A@Z{u#wyQzw3UZ6X1aYpU)DXS z78|`-C9sT~3+O@?YT^7=3#a4!sOUu~M0j~QeR#RG1vBcQ1eUmi;|0k=`{p_h=Qb4+ zkM42iuAt6KCkUDKT#DnnYcEf4e*pct-6eizU~#Ca(;xdKth9pmo`0-^_1@)No7lfV z$I6IHy1bM~QD{PV&PY4DIQ@ z3l@|=3!bdn^0@5wv#h4a93Fuu?d*4J*9yHidyyu$40D>M zmT7}n;N%y;noN};r@&YHTdD zuCOPDP+N%pOhiNqthVbFtg z-$^L+L-I^W-*gG>cuqde`asR{pXqg^7%<~)+iqG^JYnaz=MCpL@eL=?K8f!_8LCR67w@>)A7qms{&h8#f z`5p?Mj|yHnzrD$nLS-AH08K2AYpe%tjgif8F@L>(>N=vqlu+mi?Ur}dI&G{%f|#&u zM*U??btt^j)E3mM|r+dCI=t!g((+pQkyUC zRk=xAXSteZ_PFa;yTF2#uI5@Ld-7?Gg;^WQx7odwa zLv<}}>``-^D>>LtI9?kMcu0jFmacxcjJ8LAXqMZDZ}5S(+H)}{1A}`C3Hznl z3%~@Oz-WS2LNN4HCe8kNdgs&k!D{4~Ji>pe;2pDc%3BO&UNgBTsQHxkkv5+bbx4ldB{J#R&E+^5o%=G=H zv^$Nl+vyskO#cAF@**$hf5N6&lp?O+{{RAco6_bj=j|(fa|xeI(d^O`lM)%FX&7Vp zc7i$2ddj9{H2G9geFtkJ8&>_HJXffcdpWE$*f!_)5SMfH+zvkvT8U%pOGK>7^f~B0 zF8IGho@=4v8>!OZ{LL;VMPNE@Ve)nDj@1#mhO}izvwc2^=3X{|6TfE1Se)avs zj3a%HrVoxj3A=_#CAyZ;lm1yt23Y$H5;OH8w1#0##`^uiC|t(W{yEsavo4RMPxi8` z(fy}jOn^=f3CJLOb?aGF%+G;q*yMuoljMQep83z=RXom7OO?<*>T`Mof;G%i$$BSjUOZ#YNF*U%$`EF5IbHPwCjNoy{0=Q*T zqmHY6%6c56`nBY8yLp!i@*Tx@dk?$$S3;#3MJKWz<;1<#ZvOy#1b%dI18KRjd({C<_&8&i@}*p0U!x4N3%BL&fu%)#6vQ~J?535ljsywv5C z1Y*jdU}TmV`qk5HORYFQ6Xhj90Py`e-T^7wG|r*OoGfS??Wq1DLaPHa5(8iwCSLY3k#O= za_ovik~`!8d{G+RM<)6Y1PGNpz&AlFS!XB$Nib4yRSwv{AjWtJjY_RiVZ zGuIg4#@Mf zw^2%uCPY${KPf)G{{ULnh2!qCHKv7Bj%EfK2ttdzqQ4l=Uu@QmrKrsvKHNQCU!p=gWN_tNQ%` zYGEz4`A~ne*|_`LPd@e9=MUx$JD9M_%&H@dM~nvAcsTEa-ntqzVwf^dI63>Yt`|B# z2kE{Y)MC3Dq5?!x{}{x9{$BGZyE#}h&V=Gj6FxO zu82*_H)SnKj|7Ood4DnGPCC`xW6&<-DoA7N)9|27w{B#%x@d_;V~#WJQ7cJYmUbF% zgRXT880AH`WRni3%mK0JbJOWwU0i%AO~u^J%FLBM9^E~{k}dXNhEKGNliH!?)Y9ws z2RXgr-wEq}8@XxhRaQ9{Ye)8_Ap7>NEKXyF#7CB=;i zq`w9ikzn2Gmoe8WpD+{eA)Y;1w{lqK&t);U=w0dL`O>kDmMx*A8l76rJ zicO*q6ln5l+Iq)n5RO3LkZg9AA5fyT!sB@-dAqMsIb5lucrFO+T{R{KMsVOIvkx!v zE6#Z17_F-2Z<_S>_5T2Z7qO`yhIEMIjz6+mNT@h6St%##cJo~CGOFG0_=hqV{t;~z z$tO?K3F-d;9=NCdqg(l(-WNc=57ALdrkSRINH|!C&N_5zf7(^L$%ca^@II4p`DG*xA}jN?1)?8=8Rak_GDS?MDmaQp0xhft^D7D3lX=&og}FPPdxR- z)Su%`X4QY2@IhiR@ZU_w7MB2y>vq*^HmTixz@m!sd@a(5AX;6FjB$0J=~}Gfeb?L^ zq%ZKo(46^mjE+cdeXx5~EZSYrauO%Q=q+tbHqu?kmfTsLTlx>@NA{O9ysSP#5BOGg z1eWu4AcejPwh%XxU6 zF_cqOvq#wrkcs{rqXi48T%cCS{m9AvYL;jH-^4iv$?)m6oN8}@&oF2I0A{AMMf|^r zausd73T|X+8tv_wen6%$caL0Wino}k>1&IWk^UcCDk{aPA;8DY3I2ws`%Vvd{vhH- z{{RRL_$2+l+i~c2xX0m&(PlLN0G0j%55Rs(@Ro$8VB%Z zuIGBo2qa_uVgCRM)nn+b1C@*(4c60c$t}h@{`B+uRegSg-s7`6KM!8`o5Hp&6dJ7d zp@;!soZ#{3PCK5}g7FyphGIJ(QkAI}ss-L=|(KFhDYM&pGW^UlSUN{{W#0SfgvCeTk&Hy`CW9cNB;P z*gx81`BxONJl2d8HBq+YqVCRV1c`23sUaFZaq2nzdV19<)rz+;+KcFB?X$Yng{8D| z?V%RK^=izXv(PLUH`6-AaGVzVPH@($7(J zlYX0exi|#C*(36)bs(Cwm);z*L>E?ilL50&yz~R?>@Ytnx^*e1te4(2nkJ4r<%JBk zw+Zr(lgc13KT67OE$GQ{ZI%4%rUhiSyF8p9Ex%4ECarLN6yB(}np6tL1VMjQ@<0SV#N-cIG3%m3dNTMQH z&f?p+Cq9(p2hR1-I)l#MTxA2k20mP6ez@sUqpP?y(X*iGS6YUjEc00T(Z2Nz=NKSl zcJ}>hXDGr}PR5Xp&Z-?cKO#FLk3H?#j?zP89Xfs)K9%QlUR>U0(N-taJgovaQa>=M zM*ZAbJ91Axxz0LzR&l(y2WYDpcN&9h1Q{pt7$_0OcDZAo=YkGsR~eZZ6L5JL%>RzRB=#<@esW7h}Xh^H8-7g=)3&#}v0+v)y#hmv@S8A2Z_MtXDU zTgFu_rHpmlzh;Rb#LlS-Ce?Kyht4}5J9AjgzMG2o9d#5J%Fc5 z?eioiF>mj$X6P0SbC&obU~IG?N{R9(-jMIlp=%&N6u(wUwRjgofSfi4ifq!YEu7 z8RQD6Qg2%em4jbI@S`N*vg12>>NxszHA*dX3p)!P>x{nea&QlzrD39G)uy(MWJ%-! zPi{tjoxZg`$}@IoZ&Jm!p=!48c(MqcoSp#ywmJMNB?(*CK@`Yk)gR7Q^9ytG zhT)H=6;YR;sgV&D=RB*^__5Kd9W>?Vm%unT{}8#lvyakSY}1U%M-O z!;+_FS-H}@K(Q;q;q6LUcYy2Uw$g;*hd9R{U!`SAFmBS4OZ6%=r`TOb!@8sqNG)`Y zO5-2`rq)8F9uEi8j)t8%-fNkq^Fwr}eGy8>!+O=W-z&rVgd}wT07rAvzcsCDihmT7 z`-%2*>@WNxo+E*0iaiSYMP}ZOwLv)`<1E1X)q84FvvN!N@eG0c85b|(W2#t6w$fN#uHHshcha_up+9=)af6H0wP9nf-#95@cgGlz;ODneFoZqC*Ofr09I{b*IFDPG~q$*uGadJto14&UJce(!#x-m|GH6V~HNl@6Dy z*=jPpdOo7aR0#Z}$OM6t&!;s{*~$rXA-J|;+}h7$sQGi-G;<7YicYbPF`vT~uQxLH zb`_bUXM1V(n^yZo$p-JbPB}aipHJ4gDnfR8D~Ts^L2azIsWdub&2to7jn^ox&pc%3 zo;~TpG^I^B=--nly?LnKMJ(3xZ&MpAix^z|$C8VK>-@N`RYEGy`t=JIqYZJk6KgZ9 zh*DULWaps=>(5i|Sva`6r>{V0z`f8lxUL=zH%M=>gSa$_^D*^2SFcWRlvJuqQ8+d+ zv_B9$j7F9%$V>pC@LMCV80nh0%8XT1&EZ{kS=My6kjuL*<|$G9s@5WsR=$9f z9-bA|{E1|hR7`MURaZFYo_6uUsrtn≪HTEL0u}@e4%gBZ*5l-pR=ym0#AV-uDYw zVt7Ygw~WUnu$8fZb`l5UiXJA5dx@4~@Yb%jKWCFkl00atWzhamC zA{xb{j#EsXgJT~lz#f^cKC?-sc_E7@hc(D-qY+w56uxUSpD4B$3%3{@bG!7RSEDYY zDb3++Y(`@?vnO!Oq?Y`;Rjf@b?k;3ki^2XPOck^%pIKC6^{RN952*R#Pj%sabXeOW zLVVC1ObpAio0JvW6LvZ+Tj5pap9FH~ldhnm9| z)m6**{p54sa;};1$6Js$orsmA-54Vse}taL6|GFtgm%|a^L9Fa_(%1JwuUpL*gupu zMCey?4?&UMxE?NtGkot-bvU0FcwYX-;TbeLs3S%B<@@{j89aB%uTuw$rBQro{spEt z!Wwcmq=NqdM!CL?kH}SA5PqZZ>s5=W)E^|&U&v2w4?~YkwNf#pYcc--xi9|!TD&)2 zePEb*Q0Mk^J24=X>6QIv2Hk`Q~RrpaT~ZWgNn_{`>6fnvMyUf%y7Dv zqm$3iZ;$C%%1ilI-Zd56v*lbyIKH_#{{W^#{3||azp{sKG2%&-0M~Mp?;7*^RNg^*L?+#jf>l3M`fxlWAHFVs_N;}lH`9vK+> z8eFUghL8SvpQvg*>uxPas)js7fA66~<{g_IL_UY9*kJyM&LwG`T9|Nbtc4u z&v#34`Tqd*s(qtfMv#4k4o$lC^&jC++DY{o;bR%=XutQ>4y?O@R{sFQmbd&#YWc?n zCj%dW6{S2yNNmY!=5CwdwXl(z<`1=y#K)PDM$?`cW9j)o*cKi z8%CBQ!N@6k7eA$C97~S8-+>J)>|osZS5k!t-D)=sHfK^B1MeK;n(2lvn|(!Qau+bq zZ!~tdPjYN?w`KlgOU(5D01oRK_L*Ro+ODx}aM>g%Kf{b;=EmSYmF8B&b4v80 z>^^y|jr%+8I`j!Au(M)9nBf&lSC#w;+rxrc<t$J3 zsJNx7GOuKYX&y957G^?+=E~rA_Myt{STuVT?`^JC+C`sxGxTK*fCuP$^Y~S&iZQg2 zF6iYoT^jY9?NLM(e?8UHiEeVtS92lY z9I;;$BA zD_h+nOG_(jwFwMX@+c~Rvo7L!!41V`r#VMgf4GF%r=?9Z#FEEgsP^raDV)N6c8-ci zdd_xE{M-H|t#vx7Gz8Zyh1{;fS!2L$yMY(tjIu`Umnu-Z)-@c26J*v97VoCEwZ zF+TicW1r5omL?4n;bT(c!%*H#ZX~seNttk7NQUm6>SK%LRw*m3QA$sTdVI{T(MT9) zgp+8kKeS}DLU1&+?+><{YL?cqA1QJ`Y&TzXS<4sB?#fYUowS)qA)rzSIU838*NR_R z>=tXGLifRzSK&nZbYu^^umt{Ct615`W=o4KS$KTu_Ui?t1}M;A41Zqr62&PwwIo=liM_pSQm3T(TS@zfJ=%@52H8X*%9v?;<%Z zE+xvz3c8-4?W+36X$QQ=MQd{eVIhnn4vHUWAB9V*w`@ucbRV+(4z2h}QtL;!U7*gR z+1vj9Q}(c7%)|#!#tf`K;BEOyp{{VQ>_R$|T#1{8t<8l80zNq%dE;w0U zbT7xbrS0MuxS!d#NBD;y?Nj#X1pdvrJQq3i-AC3E4M&YW;~5~4{`F7R7eT9z`vd;~ z6JzT1zOusX1(r?=kL=(EJvh9$-La4=Nyq)JY0h8k#vAQ?ZkZ1^{EB?z-Xni z7HHe^r}c?3+;{d1<2$0`*NT^lkZMO3oTB1ea#35$2PdZ|{{XCOWr&xua(&BA&~38Z zgk9)bb-Kq5w~*8BB#h1b&7u8zAgyr~r4B~+79ifpKK*ulY?0)O7FU#!T-op%rH z*onxVFQ7DiVqwmoQBIbh^VT!@(e36O%ejZ*d*AG@E<08;Nh9nrqLO~Ktr<$AZM!6d z<=LDy?vo7e(xeTU4(5=8;5T!gydT4!wdq2yADX>sO~Y))()@pFu9|rY8I&vp0O3w3aW*f z&elAW#yvax^{nbfPe<_i19vs_-A2z;aT&Fp)D7bqBooNNByrb+T=R^n^(j8*K#*F= z7=6;FdBZ6LezljikU6A0L2J{@em~hXomq>W4)QI%B|q>J{xqFQgOVPW*2)0#=H!2L z{{W3ksV?K@9Ym39FRG6BH) z59v>uW4js(r~#Ev`$r$)Po90p%qS6)%us{sP-pp4=bv$N5Avhiosl1Kt4Fk#aq|Ym z!P^OM_g0dq7r54lXC~V?{{UzI0Ig4&;i$)m6Z2Z8dUB$UVHkcX^6Vn8)EYE}ZLg5K zg&ZpeL!5T`g>~THG@N^{%Tl9mV?EZPm4kDA`o1F?;2 zx#YT!lgO|AiDCZ$KGy#L_rlTbW!zkzN6c{+ibX7N!+>k+8o84#rP~Z{KuGV5W}(L0 z6Jq_Ji0&;w+GRoxK@FP5bR#{$%Z^~s22Qg|9yyFtvyr;T+` z055F#@8$FQRJ;u?%zVs|d~2xZk!n47H9t_KwzzXLMe&`_0in0gT=HsuqYp82gZR!@ zY%1G>+K;Hm%zWe1#n%AmWxvx0{Aqnk54dyr6UXAm!7mIt^c0n=8f$TF$;c9meXor8o zU#E}xVKE-cKgNZHsoZ|i2mB?rT|_dG_*43{`mpwhPxwl$asH}N_=r(2Z zJBpDed6yqS(wDbgg>+0|j1m5l{PqH$wvSX7Lxs8)z@5K3Uf0MjhP*@gW*>_aO;lZl zaeTeN4>kBbhADH)uv}7w226+Zrl$J^!)oK1n;%*npJ81J6#(JE?lazxdGrgR`xhfA z88j|#!OVyA8sKaP=~H&zs2dn$kTwH?Pe3Y?xRXqDZy<2R#~ghHQ%S1~ltwN-WhPhW za3dfCTDon=o(b7*SF`3kJ8_YKE69Nw)9y-@Tlq8PW*QZx=LOWTl zWDD+x&`FXF`RwL4F~c2_R@$Ne3a1T<46?_6n5Lm5wHTBI&nz7N_OsJAoC< z=^j+Dwt5ughUVXBk_S@bjDmAnI9pREMWQb-1A?JXrYbZ+?AQr64hoEQ%`2onQQMmY z@z1>+;FBBk6Zb}cm0GB;c2&+}#Wos;*`#X#jPjq~?l>resW|Px9COdTdU#5-2bK@r9>jF% zRSGd~^U(xqMo&{7Rq+Mgv)V&-Wgw6-cb3etkh2y$i5c!qX*!f;Q`*Tp-?*hIH*q2G zUb$%=%NL$IOJ2?2M!R8T#WQPT!Rl>2dQ%xm~2Q zk0e;TWPcNM{VLU;QhAp_yY0&Swn{VKbssX5xZRO446pz_*kYH=e76wWC^=|wKi|a{ zY_DY4i)#xualq^Q+OB3E&cX`_0nRw@^O`xN9?X$#tyh8=P)pq?Q$YX!H&OB-keaOe*#agDiVIqpgP$*m_&Gq*oPSJt4? zyhs<~MTwZ7>`4?8fKSa;94#fOQLjlohe_kzCSWsW(MV1R=cjyCEEHs4w5L6a_ueSd zwJSLwjQKJY!j(M_;fiv=Ezmf|TO6!5QLLDjRS%r`n~31_=s-C4^`cbdm69=Z-qt0D zO178>I=m|@@SuQ3-ZP#(t2U(-XA&G-cQJ3ZI~zIIPeBHu8cCEWnA+Uu1oa%A{{YUm zjTy;v-r5T0o}Z*h@tf^~sXju3&QL&6NNV798(C*{`?nW|C{{ULDn^WBq;?dIE z$1#W*V=T%!+S&YjS1+=V)%zVh9tacKXm<;78C_Ji@XB*;6_^rvrGB{j#<9Nb2K1?P_p@QDsKS3?Z1B{0s#PLlZR6UD8^5FHooU> z_Zn-kwto+2^L0_HeVWK=md!NkB}rR3Dga&Ml1Hzns)I1V&hqDWu)Tv3phZCpmsAv6X(v-8#o~C zBOvwSlEK!yR{U2{-5B%Ot*z_YTri4wq%pb` z*Pca_Y`2lENL!L-Sky1nHh9lU?Vbv7a=La~X}-1+nkdQOO;hcwXZ@V5A&I6e)2EiI zxCbx0Xu%*5PI5=BXZ1>)+_vf8_1HO(L*OlHf3yYCl{|;?*clKOY;MBkzH^Kpmpw3%l3aU|rqt7>GdoH5qIURFHzxajWzY|($7Vv6N>GB0x;gK#+pt&J@^!=5NjM&3xCWGPl=d?wJyPV9a0 z$ILU$JQZg7R>98ic5knPd{oyg8%S8A5*Spy)LW%+ise;9e8h)cp>kV1R!aw6trou` zy`v~irfMl|CCrwkVUF4>mSR_gkd3_$BiMK{U5}2&CIFct^!K67pt$j;C?G4L$o212?FDh`rIU@Ug!KE= zom7J4pV*TiEI`NCil1*CgP58<3RdM=G5+|ec!;gSso|rWc6#-lZlXRR2 zT>cb$cy|kp`#jNLG;A^KXy=T!7K4Fx`ABLsV95lIr=xN0Q)C3u&nABB5Iw3~P*{*m z@3oM6(d^I;ThF2Q z^rY#9ho$fz#K*laW&_3Mc_fb1oiG&Lw?Iy5doUg@4>@C#!KwCO0)4~=YB@UrB1wQV zAkJ~tmnaW2GV%`L-v>23iHt?Kb|h{ejXp#Jy!TUraoUbZu-tK#umHs+1U&^3HgTM1 zxucN*W;=POKt!?e>%~KGPgDh%bQ}2-a>*ZFK5EKXifP)zEhd4fhr&*yjOTSj#8PWi z7G=1swTL)t^Z+9N@&|}fU zw;&KsI(MYxB4uR>!W{cnZb`A)!$j(@_mAKx=1gf0Yq;=9Z2O)l(04>}-z0B@XWR%Y zwD-?XrFP-*O)ggUHHAwS*B6LbLStjgj2=(<%{*2LEqh85zjSFhDeDrA*2_|SwP1?9 zG5Y@ipIY;wD{OJKVx%v1Bl(e!EE9~ezz3I}Ibn+J3N#j@wz7jjRSi{hFc;_uLQzvq*R*@zyZ%p{{Z!=`v|3=-Vs|u#J>&fB36wZh;-Q7oScG3^%bly z4Pt2=GLFVBv+##QmlH!|jVrd)j{PS70AuKy9K8Y&s7;UN6rMVL6vLCQ)Q@uDHb6Gh_8S>a^ zNYr3)Qsl|96l^~#y9{$jIJ6Zo<0E-K^m8Fxky&^1y?DtYlhj(WL{)MEIXD>^sOGS? z9HfFnG7NMDxip(y1DmlKx(HAD%#T5uBd<~3T?n4>LlQpFPt&DZazLDfc|)#MpOeTW zQudN7+BLY>BrqaLHi6CnIHEOLT8Fe8illw{TR-gLm$q%{H9mmWsN->G4d3TK%9pl# z6Du)N+0=kszJNWU>sSHBfX{m64;P28jwRnA6v zs*Tsg$o7p89YW)HQxkL3CbqJBGbdH{54T)`#7FLUquuUHn-yV{4>z?C=fgR&6E4K!2ss9g?f>C7U1M(*?2O~O4{&dNg#-#Gcdv3*XzK~H0M{D zJCeQ4hHHKax|y2d$`c~9kH7OMBlxqC*C&s9ags=;@2PJ{({3y*eEnJ#-yE1&kd+4j z;N)QbABAA;cGkeED67coExb z$cz+i`7$IVbs&!Yg^9PkqpNp%`8D#~PBO8Tu6#hf*6k&P>9g|i$ggvF(=b#L00|&u zlP-9`80p@ztykKsH1}O^wf_Ljh0Idd^=Wlm$u&q}5nf#1&pgnRyd-A~fE)~*?*#og z6_r>O^@C!+k8RRZMDs7Q;ySdy0{a^5tl0lCrO5Q`M&Pn-E-|*Mzd8VJ8tjz zr}_fsW!wJ%ix-QnTir`xd?SuIBOY#~T0mbJ!xh>F7ok!;bHN(V74NB8{r&#{uEW%; zAH}F_=GA03u#d; z+UnsZR>^rDBoVGKa0AA7ut{Iwl?`V&eOOz zMaMX#)SSHE<8SgGF}Gv!pZ*gs7U=#XpF$SrP1Hr|A-Xd(?c`fTS8+^({)?U8H{Zu> zo-Af9#&NQ}o&NwKDP5N}{{R}=4+ZIZ0$c~Y4Dw9EHW*ON Date: Thu, 6 Jun 2013 13:13:21 +0200 Subject: [PATCH 03/39] rotator picture finetuning --- .../images/head/pano970-f13-moerfelden.jpg | Bin 33382 -> 34419 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/resource2/ocstyle/images/head/pano970-f13-moerfelden.jpg b/htdocs/resource2/ocstyle/images/head/pano970-f13-moerfelden.jpg index 1101ba3f7362723ee0cef5233d36501df560907e..4abde71d8a86628045fa46d14f82a964e1ad6d22 100644 GIT binary patch delta 26670 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 Jx-;fK|JhjQak~Hj delta 25640 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 Date: Thu, 6 Jun 2013 14:39:56 +0200 Subject: [PATCH 04/39] Gerald aus dem Vorstand rausgenommen ... Topics in bold Gerald aus dem Impressum entfernt ... --- htdocs/templates2/ocstyle/articles/DE/impressum.tpl | 4 ++-- htdocs/templates2/ocstyle/articles/DE/team.tpl | 2 +- htdocs/templates2/ocstyle/articles/DE/verein.tpl | 12 ++++++------ htdocs/templates2/ocstyle/articles/EN/impressum.tpl | 4 ++-- htdocs/templates2/ocstyle/articles/EN/team.tpl | 2 +- htdocs/templates2/ocstyle/articles/EN/verein.tpl | 12 ++++++------ 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/templates2/ocstyle/articles/DE/impressum.tpl b/htdocs/templates2/ocstyle/articles/DE/impressum.tpl index 5a86eb16..dbbd352a 100644 --- a/htdocs/templates2/ocstyle/articles/DE/impressum.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/impressum.tpl @@ -79,11 +79,11 @@ Vorstandes gemeinsam vertretungsberechtigt.

- Der geschäftsführende Vorstand besteht aus (Stand 31.08.2012): + Der geschäftsführende Vorstand besteht aus (Stand 06.06.2013):

  • Michael Vaahsen, Vorsitzender
  • -
  • Gerald Halbig, stellv. Vorsitzender
  • +
  • unbesetzt, stellv. Vorsitzender
  • Maik Bischoff, Kassenwart
diff --git a/htdocs/templates2/ocstyle/articles/DE/team.tpl b/htdocs/templates2/ocstyle/articles/DE/team.tpl index a23c84d1..9e12fbe4 100644 --- a/htdocs/templates2/ocstyle/articles/DE/team.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/team.tpl @@ -20,7 +20,6 @@ BildNicknameAufgabenbereiche 4_VsVorsitzender - dl8ndmstellvertretender Vorsitzender SchrottieKassenwart; Anwendersupport, Datenpflege DanlexPressesprecher; Anwendersupport, Datenpflege bohrstyLeiter Technik/Systemadministration @@ -32,6 +31,7 @@ Bundy609Anwendersupport, Datenpflege ClanFamilyDesign, Softwareentwicklung dl6hboServerbetrieb, Dokumentation + dl8ndmstellvertretender Vorsitzender doglobeProjekt „Cachewartung“ FloppSoftwareentwicklung, Anwendersupport, Datenpflege followingDatenpflege, Softwareentwicklung, Forenmoderation, Wiki diff --git a/htdocs/templates2/ocstyle/articles/DE/verein.tpl b/htdocs/templates2/ocstyle/articles/DE/verein.tpl index 10ac28d5..2d7303f5 100644 --- a/htdocs/templates2/ocstyle/articles/DE/verein.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/verein.tpl @@ -10,22 +10,22 @@

Der Verein Opencaching Deutschland wurde am 9. Juni 2012 gegründet mit dem Zweck, den Betrieb von Opencaching.de (OC) zu übernehmen und die zukünftige Entwicklung von OC sicherzustellen. Ferner wird der Verein auch zukünftige Projekte zum Thema Opencaching begleiten.

-Wo ist der Sitz des Vereins?
+Wo ist der Sitz des Vereins?
Der Sitz des Vereins ist Bad Homburg vor der Höhe. Wir haben diesen Sitz gewählt, da er zentral gelegen ist. Letztenendes ist der Sitz von Opencaching Deutschland aber zweitrangig, denn es handelt sich um einen online agierenden Verein, der das Vereinsleben (fast) komplett online abbildet.
Mitgliederversammlungen, Vorstandssitzungen und Konferenzen zur weiteren Entwicklung von Opencaching werden per TeamSpeak abgehalten und dokumentiert. Wir arbeiten viel mit E-Mail und natürlich in unserem Forum.

-Was kostet die Mitgliedschaft im Verein?
+Was kostet die Mitgliedschaft im Verein?
Für ordentliche Mitglieder, die Opencaching.de mitgestalten, ist die Mitgliedschaft kostenfrei. Wir sind immer auf der Suche nach Entwicklern, Grafikern, Fotografen, Lektoren, Supportlern, Dokumentatoren etc.! Wer nicht die Zeit hat, um sich bei Opencaching einzubringen, kann stattdessen Fördermitglied werden. Der Mindestbeitrag für Fördermitglieder beträgt derzeit 1 Euro / Monat.

-Wo finde ich die aktuelle Satzung?
+Wo finde ich die aktuelle Satzung?
Die aktuelle Satzung kannst Du hier herunterladen.

-Wo finde ich den Mitgliedsantrag?
+Wo finde ich den Mitgliedsantrag?
Den Mitgliedsantrag kannst Du hier herunterladen.

-Ich möchte Opencaching unterstützen, habe aber kein Interesse an einem Vereinsbeitritt. Was kann ich noch tun?
+Ich möchte Opencaching unterstützen, habe aber kein Interesse an einem Vereinsbeitritt. Was kann ich noch tun?
Da der technische Betrieb der Website laufende Kosten verursacht, sind wir auf Spenden angewiesen. Über unsere Spendenseite kannst du uns jederzeit einen kleinen Obolus zukommen lassen, auch wenige Euro helfen uns weiter.

-Ich habe Fragen oder Anregungen zum Verein, an wen kann ich mich wenden?
+Ich habe Fragen oder Anregungen zum Verein, an wen kann ich mich wenden?
Du kannst den Vereinsvorstand unter verein@opencaching.de gerne kontaktieren.

diff --git a/htdocs/templates2/ocstyle/articles/EN/impressum.tpl b/htdocs/templates2/ocstyle/articles/EN/impressum.tpl index ae407382..38517714 100644 --- a/htdocs/templates2/ocstyle/articles/EN/impressum.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/impressum.tpl @@ -62,11 +62,11 @@

- The managing comittee are (as of August 31, 2012): + The managing comittee are (as of July 06, 2013):

  • Michael Vaahsen, chairman
  • -
  • Gerald Halbig, vice chairman
  • +
  • n.n., vice chairman
  • Maik Bischoff, treasurer
diff --git a/htdocs/templates2/ocstyle/articles/EN/team.tpl b/htdocs/templates2/ocstyle/articles/EN/team.tpl index 7a6ae424..a5244e62 100644 --- a/htdocs/templates2/ocstyle/articles/EN/team.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/team.tpl @@ -19,7 +19,6 @@ NicknameAssignments 4_Vschairman - dl8ndmvice chairman Schrottietreasurer; user support, data maintenance Danlexpress spokesman; user support, data maintenance bohrstyhead of system administration @@ -31,6 +30,7 @@ Bundy609user support, data maintenance ClanFamilydesign, software development dl6hboserver operation, documentation + dl8ndmvice chairman doglobeproject „cache maintenance“ Floppsoftware development, user support, data maintenance followingdata maintenance, software development, message board moderation, wiki diff --git a/htdocs/templates2/ocstyle/articles/EN/verein.tpl b/htdocs/templates2/ocstyle/articles/EN/verein.tpl index bd3677ff..f9159b0a 100644 --- a/htdocs/templates2/ocstyle/articles/EN/verein.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/verein.tpl @@ -10,22 +10,22 @@

The Opencaching Deutschland e.V. (e.V. = registered association) was founded on June 9, 2012 as new operator of the Opencaching.de website (OC), and to ensure future development of OC. The association may also support other upcoming Opencaching projects.

-Where is the association located?
+Where is the association located?
The association's registered address is at Bad Homburg vor der Höhe near Frankfurt/Main. We chose this place because it is a central location in Germany. Eventually, the location is not important as the association nearly solely acts online. General meetings, board sessions and conferences on further development of Opencaching.de take place via TeamSpeak. We use E-Mail and – of course – our Forum.

-What do I pay as Opencaching Deutschland member?
+What do I pay as Opencaching Deutschland member?
Membership is free for active members (ordentliche Mitglieder) who directly contribute time and work to the Opencaching.de project. We are always looking for software developers and testes, graphic designers, photographers, lectors, support people, documenters etc.! If you don't have the time for this, you may become passive member (Fördermitglied). The minimum fee for passive members is 1 Euro per month.

-Where do I find the association's statutes?
+Where do I find the association's statutes?
You cand download the current statutes here (in German).

-Where do I find the membership application form?
+Where do I find the membership application form?
You can download the application form here (in German).

-I would like to support Opencaching, but I don't want do join the association. What else can I do?
+I would like to support Opencaching, but I don't want do join the association. What else can I do?
We depend on your donations to finance the technical operation of the website. We will be glad to recieve you support via our donations page; a few Euros will already help us.

-Where can I ask further questions on the association?
+Where can I ask further questions on the association?
You are welcome to contact the chairman at verein@opencaching.de.

From 97feab6c1379c5f7982a643e7f475feabc65e7e8 Mon Sep 17 00:00:00 2001 From: following Date: Thu, 6 Jun 2013 23:34:58 +0200 Subject: [PATCH 05/39] update teamlist, Gerald has currently no assignment --- htdocs/templates2/ocstyle/articles/DE/team.tpl | 1 - htdocs/templates2/ocstyle/articles/EN/team.tpl | 1 - 2 files changed, 2 deletions(-) diff --git a/htdocs/templates2/ocstyle/articles/DE/team.tpl b/htdocs/templates2/ocstyle/articles/DE/team.tpl index 9e12fbe4..7bee3b45 100644 --- a/htdocs/templates2/ocstyle/articles/DE/team.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/team.tpl @@ -31,7 +31,6 @@ Bundy609Anwendersupport, Datenpflege ClanFamilyDesign, Softwareentwicklung dl6hboServerbetrieb, Dokumentation - dl8ndmstellvertretender Vorsitzender doglobeProjekt „Cachewartung“ FloppSoftwareentwicklung, Anwendersupport, Datenpflege followingDatenpflege, Softwareentwicklung, Forenmoderation, Wiki diff --git a/htdocs/templates2/ocstyle/articles/EN/team.tpl b/htdocs/templates2/ocstyle/articles/EN/team.tpl index a5244e62..eaef6d9d 100644 --- a/htdocs/templates2/ocstyle/articles/EN/team.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/team.tpl @@ -30,7 +30,6 @@ Bundy609user support, data maintenance ClanFamilydesign, software development dl6hboserver operation, documentation - dl8ndmvice chairman doglobeproject „cache maintenance“ Floppsoftware development, user support, data maintenance followingdata maintenance, software development, message board moderation, wiki From 2601934c1fc2d025bce9ca79c7e472f5d36a1da6 Mon Sep 17 00:00:00 2001 From: following Date: Thu, 6 Jun 2013 23:18:26 +0200 Subject: [PATCH 06/39] fixed number of new logs displayed while system logs are hidden --- htdocs/newlogs.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/htdocs/newlogs.php b/htdocs/newlogs.php index 0a9b1e0e..b40664c2 100644 --- a/htdocs/newlogs.php +++ b/htdocs/newlogs.php @@ -31,7 +31,20 @@ if (!$tpl->is_cached()) { sql_temp_table_slave('loglist'); - sql_slave("CREATE TEMPORARY TABLE &loglist (`id` INT(11) PRIMARY KEY) SELECT `cache_logs`.`id` FROM `cache_logs` INNER JOIN `caches` ON `cache_logs`.`cache_id`=`caches`.`cache_id` INNER JOIN `cache_status` ON `caches`.`status`=`cache_status`.`id` WHERE `cache_status`.`allow_user_view`=1 AND `caches`.`country`<>'&1' ORDER BY `cache_logs`.`date_created` DESC LIMIT &2", $exclude_country, $logcount); + sql_slave("CREATE TEMPORARY TABLE &loglist (`id` INT(11) PRIMARY KEY) + SELECT `cache_logs`.`id` + FROM `cache_logs` + INNER JOIN `caches` ON `cache_logs`.`cache_id`=`caches`.`cache_id` + INNER JOIN `cache_status` ON `caches`.`status`=`cache_status`.`id` + INNER JOIN `user` ON `cache_logs`.`user_id`=`user`.`user_id` + WHERE `cache_status`.`allow_user_view`=1 + AND `caches`.`country`<>'&1' + AND `username`<>'&2' + ORDER BY `cache_logs`.`date_created` DESC + LIMIT &3", + $exclude_country, + isset($_GET['showsyslogs']) ? '' : $opt['logic']['systemuser']['user'], + $logcount); if ($opt['logic']['new_logs_per_country']) $sqlOrderBy = '`countries`.`de` ASC, '; @@ -59,10 +72,9 @@ INNER JOIN `countries` ON `caches`.`country`=`countries`.`short` LEFT JOIN `sys_trans_text` ON `countries`.`trans_id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1' LEFT JOIN `cache_logs_restored` ON `cache_logs_restored`.`id`=`cache_logs`.`id` - WHERE `username`<>'&2' AND IFNULL(`cache_logs_restored`.`restored_by`,0)=0 + WHERE IFNULL(`cache_logs_restored`.`restored_by`,0)=0 ORDER BY " . $sqlOrderBy . "`cache_logs`.`date_created` DESC", - $opt['template']['locale'], - isset($_GET['showsyslogs']) ? '' : $opt['logic']['systemuser']['user']); + $opt['template']['locale']); $newLogs = array(); From 5626bc87dff80185c03b2048e117b1b7797f94b5 Mon Sep 17 00:00:00 2001 From: following Date: Fri, 7 Jun 2013 14:12:18 +0200 Subject: [PATCH 07/39] added profile link to admin cache status history --- htdocs/lib2/logic/cache.class.php | 1 + htdocs/templates2/ocstyle/adminhistory.tpl | 2 +- htdocs/templates2/ocstyle/res_status_changes.tpl | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/lib2/logic/cache.class.php b/htdocs/lib2/logic/cache.class.php index 3110e4d3..72e3fbcb 100644 --- a/htdocs/lib2/logic/cache.class.php +++ b/htdocs/lib2/logic/cache.class.php @@ -487,6 +487,7 @@ class cache $rs = sql("SELECT `cr`.`id`, `cr`.`date_created`, `cr`.`lastmodified`, `cr`.`userid`, `cr`.`adminid`, `users`.`username` AS `usernick`, + `users`.`user_id`, `admins`.`username` AS `adminnick`, IFNULL(`tt`.`text`, `crs`.`name`) AS `status`, IFNULL(`tt2`.`text`, `crr`.`name`) AS `reason` diff --git a/htdocs/templates2/ocstyle/adminhistory.tpl b/htdocs/templates2/ocstyle/adminhistory.tpl index 7249efbb..d93c0277 100644 --- a/htdocs/templates2/ocstyle/adminhistory.tpl +++ b/htdocs/templates2/ocstyle/adminhistory.tpl @@ -43,7 +43,7 @@

{include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs}
-
+

 

{include file="res_status_changes.tpl"} diff --git a/htdocs/templates2/ocstyle/res_status_changes.tpl b/htdocs/templates2/ocstyle/res_status_changes.tpl index c35b148f..bad1e4a9 100644 --- a/htdocs/templates2/ocstyle/res_status_changes.tpl +++ b/htdocs/templates2/ocstyle/res_status_changes.tpl @@ -23,7 +23,7 @@ {$change.date_modified|date_format:$opt.format.date} {$change.old_status} → {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id} - {$change.username} + {$change.username} {/foreach} {else} From b76d7da98c83f2be0d4cb6a5d37abb73f824de71 Mon Sep 17 00:00:00 2001 From: following Date: Fri, 7 Jun 2013 14:19:25 +0200 Subject: [PATCH 08/39] table header color fine-tuning --- htdocs/resource2/ocstyle/css/style_screen.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/resource2/ocstyle/css/style_screen.css b/htdocs/resource2/ocstyle/css/style_screen.css index ba2b5a7d..276e4716 100644 --- a/htdocs/resource2/ocstyle/css/style_screen.css +++ b/htdocs/resource2/ocstyle/css/style_screen.css @@ -327,15 +327,15 @@ div.changelog ul li ul {font-size: 90%; margin:0} .table td {padding: 2px 7px 5px 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} /* .table th {margin: 0px; background-color: #e6e6e6;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } */ /* .table th {margin: 0px; background-color: #7fa2ca;color: #f8f8f8; padding: 2px 7px 2px 7px; border: solid 0px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; } */ -.table th, .searchtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } -.searchtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; } +.table th, .searchtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } +.searchtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; } .searchtable td { padding-top:2px; } .table-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} .narrowtable {font-size: 10px; line-height: 2.0em; clear: left; padding: 0px; margin: 0.5em 0px 0.2em 0px; border: solid 0px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(255,255,255);} .narrowtable tr {margin: 0px; padding: 0px;} .narrowtable td {padding: 0 7px 0 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} -.narrowtable th {margin: 0px; background-color: #d8e5c9;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } +.narrowtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } .narrowtable-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} td.listicon { From 829a20056bbf7299e646c860f5b9013b8f6a3e92 Mon Sep 17 00:00:00 2001 From: following Date: Fri, 7 Jun 2013 15:13:48 +0200 Subject: [PATCH 09/39] table header color fine-tuning --- htdocs/resource2/ocstyle/css/style_screen.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/resource2/ocstyle/css/style_screen.css b/htdocs/resource2/ocstyle/css/style_screen.css index 276e4716..ce4ec598 100644 --- a/htdocs/resource2/ocstyle/css/style_screen.css +++ b/htdocs/resource2/ocstyle/css/style_screen.css @@ -327,15 +327,15 @@ div.changelog ul li ul {font-size: 90%; margin:0} .table td {padding: 2px 7px 5px 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} /* .table th {margin: 0px; background-color: #e6e6e6;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } */ /* .table th {margin: 0px; background-color: #7fa2ca;color: #f8f8f8; padding: 2px 7px 2px 7px; border: solid 0px rgb(150,150,150); empty-cells: show; text-align: left; font-size: 120%; } */ -.table th, .searchtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } -.searchtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; } +.table th, .searchtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } +.searchtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 4px 0px 4px 0px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 12px; } .searchtable td { padding-top:2px; } .table-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} .narrowtable {font-size: 10px; line-height: 2.0em; clear: left; padding: 0px; margin: 0.5em 0px 0.2em 0px; border: solid 0px rgb(150,150,150); empty-cells: show; border-collapse: collapse; background-color: rgb(255,255,255);} .narrowtable tr {margin: 0px; padding: 0px;} .narrowtable td {padding: 0 7px 0 7px; border: solid 0px rgb(150,150,150); text-align: left; font-size: 120%;} -.narrowtable th {margin: 0px; background-color: #d7e7c1;color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } +.narrowtable th {margin: 0px; background-color: #deebcd; color: #404040; padding: 2px 7px 2px 7px; border-top: solid 1px #404040; border-bottom: solid 1px #404040; empty-cells: show; text-align: left; font-size: 120%; } .narrowtable-caption {margin: 0.5em 0px 1.0em 30px; padding: 0px; clear: both; text-align: left; font-size: 120%;} td.listicon { From 9db4e787c35de72ea89e4c12529ccd7cd1a6691d Mon Sep 17 00:00:00 2001 From: following Date: Fri, 7 Jun 2013 16:57:24 +0200 Subject: [PATCH 10/39] fixed user profile link in status histories --- htdocs/lib2/logic/cache.class.php | 2 +- htdocs/templates2/ocstyle/res_status_changes.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/lib2/logic/cache.class.php b/htdocs/lib2/logic/cache.class.php index 72e3fbcb..0e727fd4 100644 --- a/htdocs/lib2/logic/cache.class.php +++ b/htdocs/lib2/logic/cache.class.php @@ -487,7 +487,6 @@ class cache $rs = sql("SELECT `cr`.`id`, `cr`.`date_created`, `cr`.`lastmodified`, `cr`.`userid`, `cr`.`adminid`, `users`.`username` AS `usernick`, - `users`.`user_id`, `admins`.`username` AS `adminnick`, IFNULL(`tt`.`text`, `crs`.`name`) AS `status`, IFNULL(`tt2`.`text`, `crr`.`name`) AS `reason` @@ -517,6 +516,7 @@ class cache `csm`.`old_state` AS `old_status_id`, `csm`.`new_state` AS `new_status_id`, `user`.`username`, + `user`.`user_id`, IFNULL(`stt_old`.`text`,`cs_old`.`name`) AS `old_status`, IFNULL(`stt_new`.`text`,`cs_new`.`name`) AS `new_status` FROM `cache_status_modified` `csm` diff --git a/htdocs/templates2/ocstyle/res_status_changes.tpl b/htdocs/templates2/ocstyle/res_status_changes.tpl index bad1e4a9..9bf56c69 100644 --- a/htdocs/templates2/ocstyle/res_status_changes.tpl +++ b/htdocs/templates2/ocstyle/res_status_changes.tpl @@ -23,7 +23,7 @@ {$change.date_modified|date_format:$opt.format.date} {$change.old_status} → {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id} - {$change.username} + {$change.username} {/foreach} {else} From 29223f32486bbc4b0d5cfbab6aeb95a9cc146c49 Mon Sep 17 00:00:00 2001 From: following Date: Fri, 7 Jun 2013 18:02:09 +0200 Subject: [PATCH 11/39] added link tarkets for changelog versions --- .../ocstyle/articles/DE/changelog.tpl | 18 +++++++++--------- .../ocstyle/articles/EN/changelog.tpl | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/htdocs/templates2/ocstyle/articles/DE/changelog.tpl b/htdocs/templates2/ocstyle/articles/DE/changelog.tpl index a965a096..629b087c 100644 --- a/htdocs/templates2/ocstyle/articles/DE/changelog.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/changelog.tpl @@ -13,7 +13,7 @@

Im Folgenden sind alle Veränderungen ab OC Version 3.0 aufgelistet. Manche Kleinigkeiten wurden zur besseren Übersicht weggelassen und sind im Entwicklerforum nachlesbar.


-

OC 3.0 Version 8 – 1. Juni 2013

+

OC 3.0 Version 8 – 1. Juni 2013

Neu:

  • Der Cachestatus kann (nur noch) per Log geändert werden. Dazu gibt es die neuen Logtypen momentan nicht verfügbar, archiviert, gesperrt und kann gesucht werden. Der gleiche Status kann auch mehrmals geloggt werden, z.B. um zu signalieren dass mit dem Cache alles ok ist. Der Typ alter Logs kann nachträglich geändert werden.
  • @@ -76,7 +76,7 @@

-

OC 3.0 Version 7 – 19. April 2013

+

OC 3.0 Version 7 – 19. April 2013

  • Neu: OKAPI
  • „Apple-Touch-Icons“ für Smartphones
  • @@ -84,7 +84,7 @@

-

OC 3.0 Version 6 – 12. April 2013

+

OC 3.0 Version 6 – 12. April 2013

Neu:

  • Loggen mit Uhrzeit
  • @@ -125,7 +125,7 @@

-

OC 3.0 Version 5 – 16. März 2013

+

OC 3.0 Version 5 – 16. März 2013

Karte komplett überarbeitet:

  • Markierung von eigenen, gefundenen, nicht gefundenen und OConly-Caches
  • @@ -175,7 +175,7 @@
  • dänische Flagge bei dänischen Cachebeschreibungen
-

OC 3.0 Version 4 – 17. Februar 2013

+

OC 3.0 Version 4 – 17. Februar 2013

Neu:

  • neue Cachegröße „nano“
  • @@ -206,7 +206,7 @@

-

OC 3.0 Version 3 – 18. November 2012

+

OC 3.0 Version 3 – 18. November 2012

Neu:

  • Attribut „nur zu bestimmten Jahreszeiten“
  • @@ -231,7 +231,7 @@

-

OC 3.0 Version 2 – 26. August 2012

+

OC 3.0 Version 2 – 26. August 2012

Neu:

  • Schwierigkeitsgrade erklärt, inklusive Tooltip und Link in den Cachelistings
  • @@ -271,9 +271,9 @@
  • Logbearbeitungsberechtigungen für gesperrte Caches korrigiert
  • wirkungslose Spoileroption beim Hochladen von Logbildern entfernt [→ wieder eingebaut in Version 5]
-
+
-

OC 3.0 Version 1 – 8. August 2012

+

OC 3.0 Version 1 – 8. August 2012

Neu:

  • Kurzadressen für Direktzugriff auf Cachelistings, z.B. http://opencaching.de/OCD93B
  • diff --git a/htdocs/templates2/ocstyle/articles/EN/changelog.tpl b/htdocs/templates2/ocstyle/articles/EN/changelog.tpl index d80e6a74..5b7a72e6 100644 --- a/htdocs/templates2/ocstyle/articles/EN/changelog.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/changelog.tpl @@ -13,7 +13,7 @@

    This page lists all changes since version 3.0. Some small items have been omitted here.


    -

    OC 3.0 Release 8 – June 1, 2013

    +

    OC 3.0 Release 8 – June 1, 2013

    New:

    • The geocache listing status can now (only) be changed by logging the new state. New log types temporarily unavailable, archived, locked und ready for search have been added. Unchanged states may be logged, too, e.g. to confirm that the cache is still searchable. The type of old logs can be changed afterwards.
    • @@ -74,7 +74,7 @@

    -

    OC 3.0 Release 7 – April 19, 2013

    +

    OC 3.0 Release 7 – April 19, 2013

    • New: OKAPI
    • "Apple Touch Icons" for Smartphones
    • @@ -82,7 +82,7 @@

    -

    OC 3.0 Release 6 – April 12, 2013

    +

    OC 3.0 Release 6 – April 12, 2013

    New:

    • logging with time
    • @@ -123,7 +123,7 @@

    -

    OC 3.0 Release 5 – March 16, 2013

    +

    OC 3.0 Release 5 – March 16, 2013

    Completely reworked map:

    • Own, found, not found and OConly caches are marked
    • @@ -172,7 +172,7 @@
    • fixed nano size selection in search form
    -

    OC 3.0 Release 4 – February 17, 2013 +

    OC 3.0 Release 4 – February 17, 2013

    New:

    • new cache size "nano"
    • @@ -202,7 +202,7 @@

    -

    OC 3.0 Release 3 – November 18, 2012

    +

    OC 3.0 Release 3 – November 18, 2012

    New:

    • attribute "only at certain seasons"
    • @@ -227,7 +227,7 @@

    -

    OC 3.0 Release 2 – August 26, 2012

    +

    OC 3.0 Release 2 – August 26, 2012

    New:

    • Difficulty ratings explained, including tooltips and links within the cache listings
    • @@ -264,9 +264,9 @@
    • fixed log edit permissions for locked caches
    • removed dummy spoiler option when uploading log pictures
    -
    +
    -

    OC 3.0 Release 1 – August 8, 2012

    +

    OC 3.0 Release 1 – August 8, 2012

    New:

    • URL shortener for direct cache listing access, e.g. http://www.opencaching.de/OCD93B
    • From ebe25ee0f73e3b50912b05e9e608a0496332f101 Mon Sep 17 00:00:00 2001 From: Christian Matzat Date: Sun, 9 Jun 2013 09:45:16 +0200 Subject: [PATCH 12/39] fix typo in password change form --- htdocs/doc/sql/static-data/data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/doc/sql/static-data/data.sql b/htdocs/doc/sql/static-data/data.sql index c1930bce..d700f72f 100644 --- a/htdocs/doc/sql/static-data/data.sql +++ b/htdocs/doc/sql/static-data/data.sql @@ -5417,7 +5417,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('605', 'DE', 'Die E-Mail-Adresse gehört zu keinem gültigen Benutzer.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('606', 'DE', 'Dir wurde eine E-Mail mit dem Sicherheits-Code zugesandt.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('607', 'DE', 'Der Sicherheitscode konnte wegen eines Fehlers nicht gesendet werden.', '2010-08-28 11:48:06'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitten deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst Du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitte deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst Du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('609', 'DE', 'Der angegebene Benutzer ist noch nicht aktiviert.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('610', 'DE', 'Sicherheitscode:', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('611', 'DE', 'Der Sicherheitscode ist abgelaufen. Fordere bitte einen neuen an.', '2010-08-28 11:48:06'); From 32e8e836c20c4a28625ed38875d0d61d231e30a6 Mon Sep 17 00:00:00 2001 From: following Date: Sun, 9 Jun 2013 11:52:23 +0200 Subject: [PATCH 13/39] fixed oc team comment editing; fixes #220 --- htdocs/editlog.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/editlog.php b/htdocs/editlog.php index 132aa661..b3deae8b 100644 --- a/htdocs/editlog.php +++ b/htdocs/editlog.php @@ -104,7 +104,7 @@ $log_time_minute = isset($_POST['logminute']) ? trim($_POST['logminute']) : (substr($log_record['date'],11) == "00:00:00" ? "" : date('i', strtotime($log_record['date']))); $top_option = isset($_POST['ratingoption']) ? $_POST['ratingoption']+0 : 0; $top_cache = isset($_POST['rating']) ? $_POST['rating']+0 : 0; - $oc_team_comment = isset($_POST['teamcomment']) ? ($_POST['teamcomment'] != 0) : ($log_record['oc_team_comment'] == '1'); + $oc_team_comment = isset($_POST['submitform']) ? @$_POST['teamcomment']+0 : ($log_record['oc_team_comment'] == 1); $log_pw = ''; $use_log_pw = (($log_record['logpw'] == NULL) || ($log_record['logpw'] == '')) ? false : true; From 81692e667692cc98114d2f68b9cd95831413311a Mon Sep 17 00:00:00 2001 From: following Date: Sun, 9 Jun 2013 12:01:23 +0200 Subject: [PATCH 14/39] unified spelling of German 'du' --- htdocs/doc/sql/static-data/data.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/doc/sql/static-data/data.sql b/htdocs/doc/sql/static-data/data.sql index d700f72f..391e5fe4 100644 --- a/htdocs/doc/sql/static-data/data.sql +++ b/htdocs/doc/sql/static-data/data.sql @@ -4983,7 +4983,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('158', 'DE', 'Französisch', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('159', 'DE', 'Englisch', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('160', 'DE', 'Deutsch', '2010-08-28 11:48:06'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('161', 'DE', 'Vorsicht: Wenn Du diese Option verwenden, vergiss niemals auf Logout zu klicken, wenn Du dich von einem PC aus angemeldet hast der auch Fremden zugänglich ist. Ansonsten könnte ein Fremder Deine persönlichen Account-Daten auslesen und ändern.', '2010-08-28 11:48:06'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('161', 'DE', 'Vorsicht: Wenn du diese Option verwenden, vergiss niemals auf Logout zu klicken, wenn du dich von einem PC aus angemeldet hast der auch Fremden zugänglich ist. Ansonsten könnte ein Fremder deine persönlichen Account-Daten auslesen und ändern.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('162', 'DE', 'Simbabwe', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('163', 'DE', 'Sambia', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('164', 'DE', 'Südafrika', '2010-08-28 11:48:06'); @@ -5413,11 +5413,11 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('601', 'DE', 'Folgender Sicherheits-Code wurde generiert: %1', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('602', 'DE', 'Der Sicherheits-Code bleibt drei Tage gültig.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('603', 'DE', 'Dein neues Passwort kannst du unter %1newpw.php eingeben.', '2010-08-28 11:48:06'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('604', 'DE', 'Um ein neues Passwort einzugeben, musst Du zunächst einen Sicherheits-Code anfordern. Dieser wird per E-Mail an Dich gesendet.', '2010-08-28 11:48:06'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('604', 'DE', 'Um ein neues Passwort einzugeben, musst du zunächst einen Sicherheits-Code anfordern. Dieser wird per E-Mail an dich gesendet.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('605', 'DE', 'Die E-Mail-Adresse gehört zu keinem gültigen Benutzer.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('606', 'DE', 'Dir wurde eine E-Mail mit dem Sicherheits-Code zugesandt.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('607', 'DE', 'Der Sicherheitscode konnte wegen eines Fehlers nicht gesendet werden.', '2010-08-28 11:48:06'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitte deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst Du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('608', 'DE', 'Gib bitte deine E-Mail-Adresse, den Sicherheitscode und das neue Passwort ein. Der Sicherheitscode bleibt drei Tage gültig; danach musst du ihn ggf. erneut anfordern.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('609', 'DE', 'Der angegebene Benutzer ist noch nicht aktiviert.', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('610', 'DE', 'Sicherheitscode:', '2010-08-28 11:48:06'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('611', 'DE', 'Der Sicherheitscode ist abgelaufen. Fordere bitte einen neuen an.', '2010-08-28 11:48:06'); From cef230b66122d49e98e4b79890e02c0d7ae25db2 Mon Sep 17 00:00:00 2001 From: following Date: Sun, 9 Jun 2013 12:31:16 +0200 Subject: [PATCH 15/39] restructured cache-history code --- htdocs/adminreports.php | 2 +- htdocs/doc/sql/static-data/data.sql | 6 +- htdocs/templates2/ocstyle/adminhistory.tpl | 111 ++++++++++++++---- .../ocstyle/adminreport_history.tpl | 36 ------ htdocs/templates2/ocstyle/adminreports.tpl | 31 +---- .../templates2/ocstyle/res_status_changes.tpl | 32 ----- 6 files changed, 93 insertions(+), 125 deletions(-) delete mode 100644 htdocs/templates2/ocstyle/adminreport_history.tpl delete mode 100644 htdocs/templates2/ocstyle/res_status_changes.tpl diff --git a/htdocs/adminreports.php b/htdocs/adminreports.php index 9ffcdf96..1eea2ae5 100644 --- a/htdocs/adminreports.php +++ b/htdocs/adminreports.php @@ -144,7 +144,7 @@ $tpl->assign('adminid', $record['adminid']); $tpl->assign('adminnick', $record['adminnick']); $tpl->assign('reason', $record['reason']); - $tpl->assign('note', $record['note']); + $tpl->assign('note', trim($record['note'])); $tpl->assign('status', $record['status']); $tpl->assign('created', $record['date_created']); $tpl->assign('lastmodified', $record['lastmodified']); diff --git a/htdocs/doc/sql/static-data/data.sql b/htdocs/doc/sql/static-data/data.sql index 391e5fe4..95060111 100644 --- a/htdocs/doc/sql/static-data/data.sql +++ b/htdocs/doc/sql/static-data/data.sql @@ -2487,7 +2487,7 @@ INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2065', 'Guest', INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2066', 'Open chat in a new tab/window', '2013-04-25 23:00:00'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2067', 'Status', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2068', 'since June 2013', '2013-05-28 16:51:40'); -INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2069', 'since February 2012', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2069', 'since deletion date February 2012', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2070', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2071', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2072', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-05-28 16:51:40'); @@ -6431,7 +6431,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'DE', 'Chat in neuem Tab/Fenster öffnen', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'DE', 'Status', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'DE', 'seit Juni 2013', '2013-04-25 23:00:00'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'DE', 'seit Februar 2012', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'DE', 'seit Löschdatum Februar 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'DE', 'Eine oder mehrere Emails an diesen Benutzer konnten nicht zugestellt werden. Es könnte ratsam sein, Hinweise zu seinen Caches zusätzlich zu loggen, und ihn ggf. über weitere Adressen wie z.B. Forenaccounts oder andere Geocaching-Plattformen zu kontaktieren.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'DE', 'Dieser Cache ist seit mehr als einem Jahr „momentan nicht verfügbar“; daher wird er automatisch archiviert. Er kann vom Besitzer jederzeit instand gesetzt und reaktiviert werden.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'DE', 'Dieses Event fand vor über fünf Wochen statt; daher wird es automatisch archiviert. Das Listing kann vom Owner selbst reaktiviert werden, falls es aus besonderen Gründen weiter aktiv bleiben soll.', '2013-04-25 23:00:00'); @@ -7995,7 +7995,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2066', 'EN', 'Open chat in a new tab/window', '2013-02-19 05:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2067', 'EN', 'Status', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2068', 'EN', 'since June 2013', '2013-04-25 23:00:00'); -INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'EN', 'since February 2012', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2069', 'EN', 'since deletion date February 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2070', 'EN', 'One ore more emails to this user could not be delivered. It might be a good idea to additionally log comments on the user\'s geocaches, and/or trying to contact him/her through other channels like a message board account or another geocaching platform.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'EN', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'EN', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-04-25 23:00:00'); diff --git a/htdocs/templates2/ocstyle/adminhistory.tpl b/htdocs/templates2/ocstyle/adminhistory.tpl index d93c0277..eced3521 100644 --- a/htdocs/templates2/ocstyle/adminhistory.tpl +++ b/htdocs/templates2/ocstyle/adminhistory.tpl @@ -4,6 +4,7 @@ * Unicode Reminder メモ ***************************************************************************} {* OCSTYLE *} +{if !$reportdisplay}
      World {t}Cache history{/t} @@ -16,36 +17,96 @@

      +{/if} {if $showhistory} -

      - {$cache.name} - {t}by{/t} - {$ownername} -

      -
      - -
      -

      - - {t}Cache reports{/t} + {if !$reportdisplay} +

      + {$cache.name} + {t}by{/t} + {$ownername}

      -
      - {include file="adminreport_history.tpl"} -
      +
      + {/if} -
      -

      - - {t}Deleted logs{/t} {t}since February 2012{/t} -

      -
      -
      - {include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs} -
      -

       

      + {if !$reportdisplay || $reports|@count} +
      +

      + + {if $reportdisplay} {t}Other reports for this cache{/t}{else}{t}Cache reports{/t}{/if} +

      +
      - {include file="res_status_changes.tpl"} + + {if $reports|@count} + + + + + + + + + + + {foreach from=$reports item=report} + + + + + + + + + + {/foreach} + {else} + + {/if} +
      {t}ID{/t}{t}Report date{/t}{t}Reporter{/t}{t}Reason{/t}{t}Admin{/t}{t}Last modified{/t}{t}Status{/t}
      {$report.id}{$report.date_created|date_format:$opt.format.date}{$report.usernick}{$report.reason}{$report.adminnick}{$report.lastmodified|date_format:$opt.format.date}{$report.status}
      +
      + {/if} + + {if !$reportdisplay || $deleted_logs|@count} +
      +

      + + {t}Deleted logs{/t} {t}since deletion date February 2012{/t} +

      +
      +
      + {include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs} +
      +

       

      + {/if} + + {if !$reportdisplay || $status_changes|@count} +
      +

      + + {t}Status changes{/t} {t}since June 2013{/t} +

      +
      + + + {if $status_changes|@count} + + + + + + {foreach from=$status_changes item=change} + + + + + + {/foreach} + {else} + + {/if} +
      {t}Date{/t}{t}Status{/t}{t}Changed by{/t}
      {$change.date_modified|date_format:$opt.format.date}{$change.old_status} → {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id}{$change.username}
      + {/if} {else}

      {$error}

      diff --git a/htdocs/templates2/ocstyle/adminreport_history.tpl b/htdocs/templates2/ocstyle/adminreport_history.tpl deleted file mode 100644 index c4b3249b..00000000 --- a/htdocs/templates2/ocstyle/adminreport_history.tpl +++ /dev/null @@ -1,36 +0,0 @@ -{*************************************************************************** -* You can find the license in the docs directory -* -* Unicode Reminder メモ -***************************************************************************} -{* OCSTYLE *} - - - {if $reports|@count} - - - - - - - - - - - {foreach from=$reports item=report} - - - - - - - - - - {/foreach} - - {else} - - {/if} -
      {t}ID{/t}{t}Report date{/t}{t}Reporter{/t}{t}Reason{/t}{t}Admin{/t}{t}Last modified{/t}{t}Status{/t}
      {$report.id}{$report.date_created|date_format:$opt.format.date}{$report.usernick}{$report.reason}{$report.adminnick}{$report.lastmodified|date_format:$opt.format.date}{$report.status}
      - diff --git a/htdocs/templates2/ocstyle/adminreports.tpl b/htdocs/templates2/ocstyle/adminreports.tpl index f28c7b7c..01e713cf 100644 --- a/htdocs/templates2/ocstyle/adminreports.tpl +++ b/htdocs/templates2/ocstyle/adminreports.tpl @@ -67,7 +67,7 @@ {/if}

      {t}State:{/t} {$status}  Admin: {if $adminnick==''}{t}not assigned{/t}{else}{if $otheradmin}{/if}{$adminnick|escape}{if $otheradmin}{/if}{/if}

      {t}Reason:{/t} {$reason|escape|nl2br}

      -

      {t}Comment:{/t} {$note|escape|nl2br}

      +

      {t}Comment:{/t} {$note|escape|nl2br}

      @@ -76,7 +76,7 @@

      -

      +

      {if !$ownreport} {else} @@ -107,32 +107,7 @@ {/if}
      - {if $reports|@count} -

      -

      - - {t}Other reports for this cache{/t} -

      -
      - {include file="adminreport_history.tpl"} - {/if} - - {if $deleted_logs|@count} -
      -

      - - {t}Deleted logs{/t} {t}since February 2012{/t} -

      -
      -
      - {include file="res_logentry.tpl" header=false footer=false footbacklink=false cache=$cache logs=$deleted_logs} -
      - {/if} - - {if $status_changes|@count} - {include file="res_status_changes.tpl"} - {/if} - + {include file=adminhistory.tpl reportdisplay=true showhistory=true} {/if} diff --git a/htdocs/templates2/ocstyle/res_status_changes.tpl b/htdocs/templates2/ocstyle/res_status_changes.tpl deleted file mode 100644 index 9bf56c69..00000000 --- a/htdocs/templates2/ocstyle/res_status_changes.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{*************************************************************************** -* You can find the license in the docs directory -* -* Unicode Reminder メモ -***************************************************************************} -{* OCSTYLE *} - -
      -

      - - {t}Status changes{/t} {t}since June 2013{/t} -

      -
      - - - {if $status_changes|@count} - - - - - - {foreach from=$status_changes item=change} - - - - - - {/foreach} - {else} - - {/if} -
      {t}Date{/t}{t}Status{/t}{t}Changed by{/t}
      {$change.date_modified|date_format:$opt.format.date}{$change.old_status} → {$change.new_status} {include file="res_cachestatus.tpl" status=$change.new_status_id}{$change.username}
      From b381453176abcb2da134d90fc52e0ddef037e63c Mon Sep 17 00:00:00 2001 From: following Date: Sun, 9 Jun 2013 17:55:37 +0200 Subject: [PATCH 16/39] fixed search form logtype translation --- htdocs/search.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/search.php b/htdocs/search.php index b34de00f..5f339ad0 100644 --- a/htdocs/search.php +++ b/htdocs/search.php @@ -1332,7 +1332,12 @@ function outputSearchForm($options) // logtypen $logtype_options = ''; - $rs = sql("SELECT `log_types`.`id`, IFNULL(`sys_trans_text`.`text`, `log_types`.`name`) AS `name` FROM `log_types` LEFT JOIN `sys_trans` ON `log_types`.`trans_id`=`sys_trans`.`id` AND `sys_trans`.`text`=`log_types`.`name` LEFT JOIN `sys_trans_text` ON `sys_trans`.`id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1' ORDER BY `id` ASC", $locale); + $rs = sql("SELECT `log_types`.`id`, + IFNULL(`sys_trans_text`.`text`, `log_types`.`name`) AS `name` + FROM `log_types` + LEFT JOIN `sys_trans_text` ON `sys_trans_text`.`trans_id`=`log_types`.`trans_id` AND `sys_trans_text`.`lang`='&1' + ORDER BY `log_types`.`id` ASC", $locale); + for ($i = 0; $i < mysql_num_rows($rs); $i++) { $record = sql_fetch_array($rs); From d06cc8f4cb0e341d7c871e894a27a0ceb89a3eb9 Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 00:04:36 +0200 Subject: [PATCH 17/39] added workaround for inconsistet HTML encoding in OC forum titles --- htdocs/lib2/RSSParser.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/lib2/RSSParser.class.php b/htdocs/lib2/RSSParser.class.php index b0361c1f..b82b04b2 100644 --- a/htdocs/lib2/RSSParser.class.php +++ b/htdocs/lib2/RSSParser.class.php @@ -60,7 +60,9 @@ class RSSParser { // increment counter $i++; } - else if (!in_array($item->title,$headlines) && + // htmlspecialchars_decode() works around inconsistent HTML encoding + // e.g. in SMF Forum Threads + else if (!in_array(htmlspecialchars_decode($item->title),$headlines) && strpos($item->title,'VERSCHOBEN') === FALSE) // hack to exclude forum thread-move messages { // fill array @@ -69,7 +71,7 @@ class RSSParser { 'title' => $item->title, 'link' => $item->link ); - $headlines[] = "" . $item->title; + $headlines[] = "" . htmlspecialchars_decode($item->title); // increment counter $i++; } From 7c64fc717c258ab48821d897482686d0503eb28a Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 00:47:33 +0200 Subject: [PATCH 18/39] hide locked/invisible caches on map --- htdocs/map2.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/map2.php b/htdocs/map2.php index cbd26f86..9d8c0c8c 100644 --- a/htdocs/map2.php +++ b/htdocs/map2.php @@ -454,7 +454,8 @@ function output_searchresult($nResultId, $compact, $nLon1, $nLon2, $nLat1, $nLat LEFT JOIN `cache_logs` `notfound_logs` ON `notfound_logs`.`cache_id`=`caches`.`cache_id` AND `notfound_logs`.`user_id`='&6' AND `notfound_logs`.`type`=2 LEFT JOIN `caches_attributes` ON `caches_attributes`.`cache_id`=`caches`.`cache_id` AND `caches_attributes`.`attrib_id`=6 WHERE `map2_data`.`result_id`='&1' AND `caches`.`longitude`>'&2' AND `caches`.`longitude`<'&3' AND `caches`.`latitude`>'&4' AND `caches`.`latitude`<'&5' - AND `caches`.`status`<>6 /* hide vandalized listings, locked duplicates etc. */ + AND `caches`.`status`<>6 /* hide vandalized listings, locked duplicates etc. */ + AND `caches`.`status`<>7 /* ... and locked/invisible caches */ ORDER BY `caches`.`status` DESC, `oconly` AND NOT (`found` OR `notfound`), NOT (`found` OR `notfound`), `caches`.`type`<>4, MD5(`caches`.`name`) LIMIT &7", // sort in reverse order, because last are on top of map; From daa08853e5478ca55a92fa20f8e75885ce3dbd10 Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 13:02:01 +0200 Subject: [PATCH 19/39] update teamlist --- htdocs/templates2/ocstyle/articles/DE/team.tpl | 2 +- htdocs/templates2/ocstyle/articles/EN/team.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/templates2/ocstyle/articles/DE/team.tpl b/htdocs/templates2/ocstyle/articles/DE/team.tpl index 7bee3b45..d43fbd31 100644 --- a/htdocs/templates2/ocstyle/articles/DE/team.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/team.tpl @@ -30,8 +30,8 @@ Bundy609Anwendersupport, Datenpflege ClanFamilyDesign, Softwareentwicklung + cmanieSoftwareentwicklung dl6hboServerbetrieb, Dokumentation - doglobeProjekt „Cachewartung“ FloppSoftwareentwicklung, Anwendersupport, Datenpflege followingDatenpflege, Softwareentwicklung, Forenmoderation, Wiki FriedrichFröbelWiki, Forenmoderation diff --git a/htdocs/templates2/ocstyle/articles/EN/team.tpl b/htdocs/templates2/ocstyle/articles/EN/team.tpl index eaef6d9d..4e50508c 100644 --- a/htdocs/templates2/ocstyle/articles/EN/team.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/team.tpl @@ -29,8 +29,8 @@ Bundy609user support, data maintenance ClanFamilydesign, software development + cmaniesoftware development dl6hboserver operation, documentation - doglobeproject „cache maintenance“ Floppsoftware development, user support, data maintenance followingdata maintenance, software development, message board moderation, wiki FriedrichFröbelwiki, message board moderation From c5c8ee1f7a8cb9d8618455cb118c5f6991b307e5 Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 13:02:01 +0200 Subject: [PATCH 20/39] update teamlist --- htdocs/templates2/ocstyle/articles/DE/team.tpl | 4 ++-- htdocs/templates2/ocstyle/articles/EN/team.tpl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/templates2/ocstyle/articles/DE/team.tpl b/htdocs/templates2/ocstyle/articles/DE/team.tpl index 7bee3b45..95af53bd 100644 --- a/htdocs/templates2/ocstyle/articles/DE/team.tpl +++ b/htdocs/templates2/ocstyle/articles/DE/team.tpl @@ -30,8 +30,8 @@ Bundy609Anwendersupport, Datenpflege ClanFamilyDesign, Softwareentwicklung - dl6hboServerbetrieb, Dokumentation - doglobeProjekt „Cachewartung“ + cmanieSoftwareentwicklung + dl6hboDokumentation FloppSoftwareentwicklung, Anwendersupport, Datenpflege followingDatenpflege, Softwareentwicklung, Forenmoderation, Wiki FriedrichFröbelWiki, Forenmoderation diff --git a/htdocs/templates2/ocstyle/articles/EN/team.tpl b/htdocs/templates2/ocstyle/articles/EN/team.tpl index eaef6d9d..a8e63e13 100644 --- a/htdocs/templates2/ocstyle/articles/EN/team.tpl +++ b/htdocs/templates2/ocstyle/articles/EN/team.tpl @@ -29,8 +29,8 @@ Bundy609user support, data maintenance ClanFamilydesign, software development - dl6hboserver operation, documentation - doglobeproject „cache maintenance“ + cmaniesoftware development + dl6hbodocumentation Floppsoftware development, user support, data maintenance followingdata maintenance, software development, message board moderation, wiki FriedrichFröbelwiki, message board moderation From 5873cb46d9d56d2dd2ee7ec5a6cbd0dfa1d04bef Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 14:17:46 +0200 Subject: [PATCH 21/39] fixed admin log editing --- htdocs/editlog.php | 5 ++--- htdocs/lib/logtypes.inc.php | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/editlog.php b/htdocs/editlog.php index b3deae8b..ce0a5936 100644 --- a/htdocs/editlog.php +++ b/htdocs/editlog.php @@ -222,7 +222,7 @@ } // ignore unauthorized team comments - if (!teamcomment_allowed($log_record['cache_id'], $log_type)) + if (!teamcomment_allowed($log_record['cache_id'], $log_type, $log_record['oc_team_comment'])) $oc_team_comment = 0; //store? @@ -289,8 +289,7 @@ $selected = ($log_record['logtype'] == $logtype ? ' selected="selected"' : ''); $logtypeoptions .= '' . "\n"; } - - if (teamcomment_allowed($log_record['cache_id'],3)) + if (teamcomment_allowed($log_record['cache_id'], 3, $log_record['oc_team_comment'])) tpl_set_var('teamcommentoption', mb_ereg_replace('{chk_sel}', ($oc_team_comment ? 'checked' : ''), $teamcomment_field)); else diff --git a/htdocs/lib/logtypes.inc.php b/htdocs/lib/logtypes.inc.php index 638cdf9e..2d16dcf0 100644 --- a/htdocs/lib/logtypes.inc.php +++ b/htdocs/lib/logtypes.inc.php @@ -109,6 +109,11 @@ $allowed_logtypes[] = 3; // note } + // always allow to keep the existing logtype when the log is edited by an admin + if ($login->hasAdminPriv(ADMIN_USER) && + $old_logtype > 0 && !in_array($old_logtype+0,$allowed_logtypes)) + $allowed_logtypes[] = $old_logtype; + return $allowed_logtypes; } @@ -119,7 +124,7 @@ } - function teamcomment_allowed($cache_id, $logtype_id) + function teamcomment_allowed($cache_id, $logtype_id, $old_teamcomment=false) { global $login, $opt; @@ -127,6 +132,8 @@ return false; elseif ($logtype_id != 3 && ($logtype_id < 9 || $logtype_id > 14)) return false; + elseif ($old_teamcomment) + return true; else { $rs = sql("SELECT `user_id`,`status` FROM `caches` WHERE `cache_id`='&1'", $cache_id); From 61f58adf3caa5561cab8e25bea604a1d4078cbb6 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 5 Jun 2013 18:25:56 +0200 Subject: [PATCH 22/39] geocache scheduled publishing and auto-archiving improvements - set user ID for status-change logging when running cron/publish_caces - discarded obsolete lib1 cache publishing code - separate enable/disable settings for auto-archive cronjob - fixed auto-archive threshold for leap years (message is "was disabled > 1 year") --- bin/dbsv-update.php | 4 +- htdocs/config2/settings-dist.inc.php | 8 ++- htdocs/lib2/login.class.php | 5 ++ htdocs/util/publish_caches/.htaccess | 4 -- htdocs/util/publish_caches/run_publish.php | 60 ------------------- .../util/publish_caches/settings-dist.inc.php | 4 -- ...class.php => autoarchive_caches.class.php} | 12 ++-- .../cron/modules/publish_caches.class.php | 3 + htdocs/util2/cron/runcron.php | 6 ++ 9 files changed, 28 insertions(+), 78 deletions(-) delete mode 100644 htdocs/util/publish_caches/.htaccess delete mode 100644 htdocs/util/publish_caches/run_publish.php delete mode 100644 htdocs/util/publish_caches/settings-dist.inc.php rename htdocs/util2/cron/modules/{cache_autoarchive.class.php => autoarchive_caches.class.php} (89%) diff --git a/bin/dbsv-update.php b/bin/dbsv-update.php index 5e44bd77..20ada60a 100644 --- a/bin/dbsv-update.php +++ b/bin/dbsv-update.php @@ -173,7 +173,7 @@ sql("ALTER TABLE `cache_reports` ADD INDEX `userid` (`userid`)"); } - function dbv_108() // automatic email-bounce processiong + function dbv_108() // automatic email-bounce processing { if (!sql_field_exists('user','last_email_problem')) sql("ALTER TABLE `user` ADD COLUMN `last_email_problem` datetime default NULL AFTER `email_problems`"); @@ -181,7 +181,7 @@ sql("ALTER TABLE `user` ADD COLUMN `mailing_problems` int(10) unsigned NOT NULL default '0' AFTER `last_email_problem`"); } - function dbv_109() // improved email-bounce processiong + function dbv_109() // improved email-bounce processing { if (!sql_field_exists('user','first_email_problem')) sql("ALTER TABLE `user` ADD COLUMN `first_email_problem` date default NULL AFTER `email_problems`"); diff --git a/htdocs/config2/settings-dist.inc.php b/htdocs/config2/settings-dist.inc.php index 77f8c66c..800b0d38 100644 --- a/htdocs/config2/settings-dist.inc.php +++ b/htdocs/config2/settings-dist.inc.php @@ -368,9 +368,10 @@ // fill_gaps = false: continue with the last waypoint $opt['logic']['waypoint_pool']['fill_gaps'] = false; - /* Automatic system user actions + /* Username for cronjobs or CLI tools + * is used e.g. for cache auto-archiving and auto-publishing */ - $opt['logic']['systemuser']['user'] = ''; // enter an active username to enable auto archiving + $opt['logic']['systemuser']['user'] = ''; /* Purge log files - age in days (0 = keep infinite) */ @@ -437,10 +438,11 @@ $opt['cron']['sitemaps']['generate'] = true; $opt['cron']['sitemaps']['submit'] = false; - /* Geokret cronjob + /* other cronjobs */ $opt['cron']['geokrety']['run'] = true; + $opt['cron']['autoarchive']['run'] = false; /* E-Mail settings * diff --git a/htdocs/lib2/login.class.php b/htdocs/lib2/login.class.php index c73ae644..784fb47f 100644 --- a/htdocs/lib2/login.class.php +++ b/htdocs/lib2/login.class.php @@ -341,5 +341,10 @@ class login return ($this->admin & $privilege) == $privilege; } + + function logged_in() + { + return $this->userid > 0; + } } ?> diff --git a/htdocs/util/publish_caches/.htaccess b/htdocs/util/publish_caches/.htaccess deleted file mode 100644 index d75c7092..00000000 --- a/htdocs/util/publish_caches/.htaccess +++ /dev/null @@ -1,4 +0,0 @@ - -Order Deny,Allow -Deny from All - diff --git a/htdocs/util/publish_caches/run_publish.php b/htdocs/util/publish_caches/run_publish.php deleted file mode 100644 index 2e269c23..00000000 --- a/htdocs/util/publish_caches/run_publish.php +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/local/bin/php -q - \ No newline at end of file diff --git a/htdocs/util/publish_caches/settings-dist.inc.php b/htdocs/util/publish_caches/settings-dist.inc.php deleted file mode 100644 index d3671a01..00000000 --- a/htdocs/util/publish_caches/settings-dist.inc.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/htdocs/util2/cron/modules/cache_autoarchive.class.php b/htdocs/util2/cron/modules/autoarchive_caches.class.php similarity index 89% rename from htdocs/util2/cron/modules/cache_autoarchive.class.php rename to htdocs/util2/cron/modules/autoarchive_caches.class.php index c33d3c4c..306b2e48 100644 --- a/htdocs/util2/cron/modules/cache_autoarchive.class.php +++ b/htdocs/util2/cron/modules/autoarchive_caches.class.php @@ -16,16 +16,18 @@ checkJob(new autoarchive()); class autoarchive { var $name = 'autoarchive'; - var $interval = 120; // provisonal minimum interval for initial archiving + var $interval = 120; // provisional minimum interval for initial archiving function run() { global $opt, $login; - if ($login->system_login($opt['logic']['systemuser']['user'])) + if ($opt['cron']['autoarchive']['run']) { - if ($login->hasAdminPriv(ADMIN_USER)) + if (!$login->logged_in()) + echo $this->name . ": not logged in / no system user configured\n"; + elseif ($login->hasAdminPriv(ADMIN_USER)) { $this->archive_disabled_caches(); $this->archive_events(); @@ -43,7 +45,7 @@ class autoarchive $rs = sql("SELECT `caches`.`cache_id` FROM `caches` WHERE `caches`.`status`=2 AND `caches`.`type`<>6 - AND IFNULL((SELECT MAX(`date_modified`) FROM `cache_status_modified` `csm` WHERE `csm`.`cache_id`=`caches`.`cache_id`),`caches`.`listing_last_modified`) < NOW() - INTERVAL 365 DAY + AND IFNULL((SELECT MAX(`date_modified`) FROM `cache_status_modified` `csm` WHERE `csm`.`cache_id`=`caches`.`cache_id`),`caches`.`listing_last_modified`) < NOW() - INTERVAL 366 DAY GROUP BY `caches`.`cache_id` ORDER BY `caches`.`listing_last_modified` LIMIT 1"); // provisional limit for initial archiving @@ -68,7 +70,7 @@ class autoarchive WHERE `caches`.`type`=6 AND `caches`.`status`=1 AND GREATEST(`date_hidden`,`date_created`) < NOW() - INTERVAL 35 DAY ORDER BY `date_hidden` - LIMIT 1"); // provisonal limit for initial archiving + LIMIT 1"); // provisional limit for initial archiving while ($rCache = sql_fetch_assoc($rs)) { $this->archive_cache( diff --git a/htdocs/util2/cron/modules/publish_caches.class.php b/htdocs/util2/cron/modules/publish_caches.class.php index 84263a53..15c284f0 100644 --- a/htdocs/util2/cron/modules/publish_caches.class.php +++ b/htdocs/util2/cron/modules/publish_caches.class.php @@ -16,6 +16,8 @@ class publish_caches function run() { + global $login; + $rsPublish = sql("SELECT `cache_id`, `user_id` FROM `caches` WHERE `status`=5 AND NOT ISNULL(`date_activate`) AND `date_activate`<=NOW()"); while($rPublish = sql_fetch_array($rsPublish)) { @@ -23,6 +25,7 @@ class publish_caches $cacheid = $rPublish['cache_id']; // update cache status to active + sql("SET @STATUS_CHANGE_USER_ID='&1'", $login->userid); sql("UPDATE `caches` SET `status`=1, `date_activate`=NULL WHERE `cache_id`='&1'", $cacheid); } sql_free_result($rsPublish); diff --git a/htdocs/util2/cron/runcron.php b/htdocs/util2/cron/runcron.php index 5499ad05..4ec920a8 100644 --- a/htdocs/util2/cron/runcron.php +++ b/htdocs/util2/cron/runcron.php @@ -25,6 +25,12 @@ exit; } + // Run as system user, if possible. + // This is relevant e.g. for publishing and for auto-archiving caches. + if ($opt['logic']['systemuser']['user'] != '') + if (!$login->system_login($opt['logic']['systemuser']['user'])) + die("runcron: system user login failed"); + $modules_dir = $opt['rootpath'] . 'util2/cron/modules/'; $hDir = opendir($modules_dir); From 1864d8906c8675fec10966c216ccb4c3c10eb875 Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 17:29:56 +0200 Subject: [PATCH 23/39] fixed activation hour field size when editing unpublished caches --- htdocs/lang/de/ocstyle/editcache.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/lang/de/ocstyle/editcache.inc.php b/htdocs/lang/de/ocstyle/editcache.inc.php index 1a992959..47c6f3fb 100644 --- a/htdocs/lang/de/ocstyle/editcache.inc.php +++ b/htdocs/lang/de/ocstyle/editcache.inc.php @@ -63,7 +63,7 @@ . .   - {activation_hours}  ' . t('#time_suffix_label#') . ' {activate_on_message}
        From 0718e8a3115d78a167c8221f6cb3c58c130853de Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 20:11:31 +0200 Subject: [PATCH 24/39] moved adoption history from logentries to new table; added adoption history to admin cache history --- bin/dbsv-update.php | 36 +++++++++++++++++++ htdocs/doc/sql/static-data/data.sql | 12 +++++++ htdocs/doc/sql/stored-proc/maintain.php | 4 +++ htdocs/doc/sql/tables/cache_adoptions.sql | 11 ++++++ htdocs/lib2/logic/cache.class.php | 18 ++++++++++ htdocs/templates2/ocstyle/adminhistory.tpl | 33 ++++++++++++++++- .../util2/cron/modules/purge_logs.class.php | 4 +++ 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 htdocs/doc/sql/tables/cache_adoptions.sql diff --git a/bin/dbsv-update.php b/bin/dbsv-update.php index 20ada60a..e33a62fc 100644 --- a/bin/dbsv-update.php +++ b/bin/dbsv-update.php @@ -187,4 +187,40 @@ sql("ALTER TABLE `user` ADD COLUMN `first_email_problem` date default NULL AFTER `email_problems`"); } + function dbv_110() // move adoption history to separate table + { + if (!sql_table_exists('cache_adoptions')) + { + sql( + "CREATE TABLE `cache_adoptions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `cache_id` int(10) unsigned NOT NULL, + `date` datetime NOT NULL, + `from_user_id` int(10) unsigned NOT NULL, + `to_user_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `cache_id` (`cache_id`,`date`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"); + + $rs = sql("SELECT `id`, `date_created`, `objectid1`, `logtext` + FROM `logentries` + WHERE `eventid`=5 + ORDER BY `date_created`, `id`"); + while ($rLog = sql_fetch_assoc($rs)) + { + preg_match('/Cache (\d+) has changed the owner from userid (\d+) to (\d+) by (\d+)/', + $rLog['logtext'], $matches); + if (count($matches) != 5) + die("unknown adoption log entry format for ID " . $rLog['id'] . "\n"); + sql("INSERT INTO `cache_adoptions` + (`cache_id`,`date`,`from_user_id`,`to_user_id`) + VALUES ('&1','&2','&3','&4')", + $rLog['objectid1'], $rLog['date_created'], $matches[2], $matches[3]); + } + sql_free_result($rs); + + // We keep the old entries in 'logentries' for the case something went wrong here. + } + } + ?> \ No newline at end of file diff --git a/htdocs/doc/sql/static-data/data.sql b/htdocs/doc/sql/static-data/data.sql index 95060111..dda9bd2a 100644 --- a/htdocs/doc/sql/static-data/data.sql +++ b/htdocs/doc/sql/static-data/data.sql @@ -2492,6 +2492,10 @@ INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2070', 'One ore INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2071', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2072', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2073', 'This user account is disabled.', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2074', 'Adoptions_', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2075', 'since September 2012', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2076', 'From Owner', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2077', 'To Owner', '2013-05-28 16:51:40'); -- Table sys_trans_ref SET NAMES 'utf8'; @@ -6436,6 +6440,10 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'DE', 'Dieser Cache ist seit mehr als einem Jahr „momentan nicht verfügbar“; daher wird er automatisch archiviert. Er kann vom Besitzer jederzeit instand gesetzt und reaktiviert werden.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'DE', 'Dieses Event fand vor über fünf Wochen statt; daher wird es automatisch archiviert. Das Listing kann vom Owner selbst reaktiviert werden, falls es aus besonderen Gründen weiter aktiv bleiben soll.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'DE', 'Dieser Benutzer ist deaktiviert.', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2074', 'DE', 'Adoptionen', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'DE', 'seit September 2012', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'DE', 'Alter Besitzer', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'DE', 'Neuer Besitzer', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'EN', 'Reorder IDs \r', '2010-09-02 00:15:30'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'EN', 'The database could not be reconnected.', '2010-08-28 11:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'EN', 'Testing – please do not login', '2010-08-28 11:48:07'); @@ -8000,6 +8008,10 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2071', 'EN', 'This cache has been \"temporarily unavailable\" for more than one year now; therefore it is being archived automatically. The owner may decide to maintain the cache and re-enable the listing.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2072', 'EN', 'This event took place more than five weeks ago; therefore it is being archived automatically. The owner may re-enable the listing if it should stay active for some exceptional reason.', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2073', 'EN', 'This user account is disabled.', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2074', 'EN', 'Adoptions', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'EN', 'since September 2012', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'EN', 'From Owner', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'EN', 'To Owner', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'ES', 'Reordenar ID', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'ES', 'La base de datos no se pudo conectar.', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'ES', 'En pruebas - por favor, no entre.', '2010-12-09 00:17:55'); diff --git a/htdocs/doc/sql/stored-proc/maintain.php b/htdocs/doc/sql/stored-proc/maintain.php index 2419f17c..a780e5ca 100644 --- a/htdocs/doc/sql/stored-proc/maintain.php +++ b/htdocs/doc/sql/stored-proc/maintain.php @@ -710,6 +710,10 @@ /* logpw needs not to be saved */ /* for further explanation see restorecaches.php */ END IF; + IF NEW.`user_id`!=OLD.`user_id` THEN + INSERT INTO `cache_adoptions` (`cache_id`,`date`,`from_user_id`,`to_user_id`) + VALUES (NEW.`cache_id`, NEW.`last_modified`, OLD.`user_id`, NEW.`user_id`); + END IF; IF NEW.`user_id`!=OLD.`user_id` OR NEW.`status`!=OLD.`status` THEN CALL sp_update_hiddenstat(OLD.`user_id`, OLD.`status`, TRUE); CALL sp_update_hiddenstat(NEW.`user_id`, NEW.`status`, FALSE); diff --git a/htdocs/doc/sql/tables/cache_adoptions.sql b/htdocs/doc/sql/tables/cache_adoptions.sql new file mode 100644 index 00000000..5e907cd1 --- /dev/null +++ b/htdocs/doc/sql/tables/cache_adoptions.sql @@ -0,0 +1,11 @@ +SET NAMES 'utf8'; +DROP TABLE IF EXISTS `cache_adoptions`; +CREATE TABLE IF NOT EXISTS `cache_adoptions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `cache_id` int(10) unsigned NOT NULL, + `date` datetime NOT NULL, + `from_user_id` int(10) unsigned NOT NULL, + `to_user_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `cache_id` (`cache_id`,`date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/htdocs/lib2/logic/cache.class.php b/htdocs/lib2/logic/cache.class.php index 0e727fd4..6d1752c3 100644 --- a/htdocs/lib2/logic/cache.class.php +++ b/htdocs/lib2/logic/cache.class.php @@ -413,6 +413,9 @@ class cache VALUES ('cache', 5, '&1', '&2', '&3', '&4')", $login->userid, $this->nCacheId, 0, 'Cache ' . sql_escape($this->nCacheId) . ' has changed the owner from userid ' . sql_escape($this->getUserId()) . ' to ' . sql_escape($userid) . ' by ' . sql_escape($login->userid)); + // Adoptions now are recorded by trigger in cache_adoptions table. + // Recording adoptions in 'logentries' may be discarded after ensuring that the + // log entries are not used anywhere. sql("UPDATE `caches` SET `user_id`='&1' WHERE `cache_id`='&2'", $userid, $this->nCacheId); sql("DELETE FROM `cache_adoption` WHERE `cache_id`='&1'", $this->nCacheId); @@ -529,6 +532,21 @@ class cache ORDER BY `date_modified` DESC", $this->getCacheId(), $opt['template']['locale']); $tpl->assign_rs('status_changes',$rs); sql_free_result($rs); + + // Adoptions + $rs = sql("SELECT `cache_adoptions`.`date`, + `cache_adoptions`.`from_user_id`, + `cache_adoptions`.`to_user_id`, + `from_user`.`username` AS `from_username`, + `to_user`.`username` AS `to_username` + FROM `cache_adoptions` + LEFT JOIN `user` `from_user` ON `from_user`.`user_id`=`from_user_id` + LEFT JOIN `user` `to_user` ON `to_user`.`user_id`=`to_user_id` + WHERE `cache_id`='&1' + ORDER BY `cache_adoptions`.`date`, `cache_adoptions`.`id`", + $this->getCacheId()); + $tpl->assign_rs('adoptions',$rs); + sql_free_result($rs); } } diff --git a/htdocs/templates2/ocstyle/adminhistory.tpl b/htdocs/templates2/ocstyle/adminhistory.tpl index eced3521..92089222 100644 --- a/htdocs/templates2/ocstyle/adminhistory.tpl +++ b/htdocs/templates2/ocstyle/adminhistory.tpl @@ -88,7 +88,7 @@

      - +
      {if $status_changes|@count} @@ -106,6 +106,37 @@ {/if}
      {t}Date{/t}
      +

       

      + {/if} + + {if !$reportdisplay || $adoptions|@count} +
      +

      + + {t}Adoptions_{/t} {t}since September 2012{/t} +

      +
      + + + {if $adoptions|@count} + + + + + + + {foreach from=$adoptions item=adoption} + + + + + {/foreach} + {else} + + {/if} +
      {t}Date{/t}{t}From Owner{/t}{t}To Owner{/t}
      {$adoption.date|date_format:$opt.format.date}{$adoption.from_username} + {$adoption.to_username} +
      {/if} {else} diff --git a/htdocs/util2/cron/modules/purge_logs.class.php b/htdocs/util2/cron/modules/purge_logs.class.php index 45c8eede..3bfc680b 100644 --- a/htdocs/util2/cron/modules/purge_logs.class.php +++ b/htdocs/util2/cron/modules/purge_logs.class.php @@ -29,6 +29,10 @@ class purge_logs if ($opt['logic']['logs']['purge_userdata'] > 0) sql("DELETE FROM `logentries` WHERE date_created < NOW() - INTERVAL &1 DAY AND eventid IN (6,7)", $opt['logic']['logs']['purge_userdata']); + + // Type 5 events = adoptions are still recorded here and preliminary archived, + // but may be discarded after verifying that they are not used anywhere. + // Adoptions are now in cache_adoptions table. } } From 519be7c37d142972760ea550926ae69ac965e8fb Mon Sep 17 00:00:00 2001 From: following Date: Mon, 10 Jun 2013 20:33:44 +0200 Subject: [PATCH 25/39] fixed another enlargit problem with quotes in pic titles; update #7 --- htdocs/templates2/ocstyle/res_logpicture.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/templates2/ocstyle/res_logpicture.tpl b/htdocs/templates2/ocstyle/res_logpicture.tpl index b16a62db..bff4197a 100644 --- a/htdocs/templates2/ocstyle/res_logpicture.tpl +++ b/htdocs/templates2/ocstyle/res_logpicture.tpl @@ -4,7 +4,7 @@
      - {* ' in title would cause enlargit and IE errors, even if escaped *} + {* ' in title would cause enlargit and IE errors, even if escaped *} {if $logdate || $loguser}
      From 8ea1c08fdd8dff53ac9dd1516f4c0cc1fd1448fa Mon Sep 17 00:00:00 2001 From: Nils Bohrs Date: Mon, 10 Jun 2013 06:45:20 +0200 Subject: [PATCH 26/39] fixed handling of geokrety waypoints, corrected indents, updates #18 --- htdocs/util2/cron/modules/geokrety.class.php | 68 ++++++++------------ 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/htdocs/util2/cron/modules/geokrety.class.php b/htdocs/util2/cron/modules/geokrety.class.php index 0066267b..2640b406 100644 --- a/htdocs/util2/cron/modules/geokrety.class.php +++ b/htdocs/util2/cron/modules/geokrety.class.php @@ -39,7 +39,8 @@ class geokrety $this->removeXML($path); - $modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', '2005-01-01 00:00:00')); + // changed default-value for getSysConfig() from '2005-01-01 00:00:00' to 'NOW - 9d 23:59:59' to stay in api-limit + $modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', date($opt['db']['dateformat'], time()-(60*60*24*10)+1))); if (!@copy('http://geokrety.org/export.php?modifiedsince=' . date('YmdHis', $modifiedsince - 1), $path)) return false; @@ -129,7 +130,7 @@ class geokrety $typeid = $this->GetNodeAttribute($element, 'type', 'id')+0; $typename = $this->GetNodeValue($element, 'type'); $this->checkGeoKretType($typeid, $typename); - + $description = html_entity_decode($this->GetNodeValue($element, 'description')); $datecreated = strtotime($this->GetNodeValue($element, 'datecreated')); @@ -139,19 +140,16 @@ class geokrety $longitude = $this->GetNodeAttribute($element, 'position', 'longitude')+0; $latitude = $this->GetNodeAttribute($element, 'position', 'latitude')+0; - sql("INSERT INTO `gk_item` (`id`, `name`, `description`, `userid`, `datecreated`, `distancetravelled`, - `latitude`, `longitude`, `typeid`, `stateid`) - VALUES ('&1', '&2', '&3', '&4', '&5', '&6', - '&7', '&8', '&9', '&10') - ON DUPLICATE KEY UPDATE `name`='&2', `description`='&3', `userid`='&4', `datecreated`='&5', - `distancetravelled`='&6', `latitude`='&7', `longitude`='&8', `typeid`='&9', `stateid`='&10'", - $id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, - $latitude, $longitude, $typeid, $state); - -/* we are using now the moves to update waypoints */ -/* - sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); + sql("INSERT INTO `gk_item` + (`id`, `name`, `description`, `userid`, `datecreated`, `distancetravelled`, `latitude`, `longitude`, `typeid`, `stateid`) + VALUES + ('&1', '&2', '&3', '&4', '&5', '&6', '&7', '&8', '&9', '&10') + ON DUPLICATE KEY UPDATE + `name`='&2', `description`='&3', `userid`='&4', `datecreated`='&5', `distancetravelled`='&6', `latitude`='&7', `longitude`='&8', `typeid`='&9', `stateid`='&10'", + $id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, $latitude, $longitude, $typeid, $state); + // remove waypoints for this krety + sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); // update associated waypoints $waypoints = $element->getElementsByTagName('waypoints'); if ($waypoints->length == 1) @@ -161,10 +159,14 @@ class geokrety { $wp = $wpItems->item($i)->nodeValue; if ($wp != '') - sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) VALUES ('&1', '&2')", $id, $wp); + sql("INSERT INTO `gk_item_waypoint` + (`id`, `wp`) + VALUES + ('&1', '&2')", + $id, $wp); } } -*/ + } function importMove($element) @@ -190,15 +192,15 @@ class geokrety $logtypename = $this->GetNodeValue($element, 'logtype'); $this->checkMoveType($logtypeid, $logtypename); - sql("INSERT INTO `gk_move` (`id`, `itemid`, `latitude`, `longitude`, `datemoved`, `datelogged`, - `userid`, `comment`, `logtypeid`) - VALUES ('&1', '&2', '&3', '&4', '&5', '&6', - '&7', '&8', '&9') - ON DUPLICATE KEY UPDATE `itemid`='&2', `latitude`='&3', `longitude`='&4', `datemoved`='&5', - `datelogged`='&6', `userid`='&7', `comment`='&8', `logtypeid`='&9'", - $id, $gkid, $latitude, $longitude, date($opt['db']['dateformat'], $datemoved), date($opt['db']['dateformat'], $datelogged), - $userid, $comment, $logtypeid); - sql("DELETE FROM `gk_move_waypoint` WHERE id='&1'", $id); + sql("INSERT INTO `gk_move` + (`id`, `itemid`, `latitude`, `longitude`, `datemoved`, `datelogged`, `userid`, `comment`, `logtypeid`) + VALUES + ('&1', '&2', '&3', '&4', '&5', '&6', '&7', '&8', '&9') + ON DUPLICATE KEY UPDATE + `itemid`='&2', `latitude`='&3', `longitude`='&4', `datemoved`='&5', `datelogged`='&6', `userid`='&7', `comment`='&8', `logtypeid`='&9'", + $id, $gkid, $latitude, $longitude, date($opt['db']['dateformat'], $datemoved), date($opt['db']['dateformat'], $datelogged), $userid, $comment, $logtypeid); + + sql("DELETE FROM `gk_move_waypoint` WHERE id='&1'", $id); // update associated waypoints $waypoints = $element->getElementsByTagName('waypoints'); @@ -212,22 +214,6 @@ class geokrety sql("INSERT INTO `gk_move_waypoint` (`id`, `wp`) VALUES ('&1', '&2')", $id, $wp); } } - - // now update the current gk-waypoints based on the last move - sql("DELETE FROM `gk_item_waypoint` WHERE `id`='&1'", $gkid); - $rs = sql("SELECT * FROM `gk_move` WHERE `itemid`='&1' AND `logtypeid`!=2 ORDER BY `datemoved` DESC LIMIT 1", $gkid); - $r = sql_fetch_assoc($rs); - sql_free_result($rs); - if ($r === false) return; - - if ($r['logtypeid'] == 0 || $r['logtypeid'] == 3) - { - sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) SELECT '&1' AS `id`, `wp` FROM `gk_move_waypoint` WHERE `id`='&2' AND `wp`!=''", $gkid, $id); - } - else - { - // do nothing - } } function checkGeoKretType($id, $name) From 53678a8cb5153f30e9786877e7827024fc4af504 Mon Sep 17 00:00:00 2001 From: following Date: Tue, 11 Jun 2013 00:31:17 +0200 Subject: [PATCH 27/39] changed autoarchive parameters for permanent operation --- htdocs/util2/cron/modules/autoarchive_caches.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/util2/cron/modules/autoarchive_caches.class.php b/htdocs/util2/cron/modules/autoarchive_caches.class.php index 306b2e48..c9096a3e 100644 --- a/htdocs/util2/cron/modules/autoarchive_caches.class.php +++ b/htdocs/util2/cron/modules/autoarchive_caches.class.php @@ -16,7 +16,7 @@ checkJob(new autoarchive()); class autoarchive { var $name = 'autoarchive'; - var $interval = 120; // provisional minimum interval for initial archiving + var $interval = 3600; // once per hour function run() @@ -48,7 +48,7 @@ class autoarchive AND IFNULL((SELECT MAX(`date_modified`) FROM `cache_status_modified` `csm` WHERE `csm`.`cache_id`=`caches`.`cache_id`),`caches`.`listing_last_modified`) < NOW() - INTERVAL 366 DAY GROUP BY `caches`.`cache_id` ORDER BY `caches`.`listing_last_modified` - LIMIT 1"); // provisional limit for initial archiving + LIMIT 3"); // limit to avoid mass emails and spam-filter triggers while ($rCache = sql_fetch_assoc($rs)) { $this->archive_cache( @@ -70,7 +70,7 @@ class autoarchive WHERE `caches`.`type`=6 AND `caches`.`status`=1 AND GREATEST(`date_hidden`,`date_created`) < NOW() - INTERVAL 35 DAY ORDER BY `date_hidden` - LIMIT 1"); // provisional limit for initial archiving + LIMIT 1"); while ($rCache = sql_fetch_assoc($rs)) { $this->archive_cache( From 51c4629eed723d422d6754fd16c31dfd213821eb Mon Sep 17 00:00:00 2001 From: following Date: Tue, 11 Jun 2013 20:30:43 +0200 Subject: [PATCH 28/39] force runcron to be run by the right user --- htdocs/config2/settings-dist.inc.php | 1 + htdocs/util2/cron/runcron.php | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/htdocs/config2/settings-dist.inc.php b/htdocs/config2/settings-dist.inc.php index 800b0d38..d44118ff 100644 --- a/htdocs/config2/settings-dist.inc.php +++ b/htdocs/config2/settings-dist.inc.php @@ -406,6 +406,7 @@ /* cronjob */ $opt['cron']['pidfile'] = $opt['rootpath'] . 'cache2/runcron.pid'; + $opt['cron']['username'] = 'apache'; // system username for cronjobs /* phpbb news integration (index.php) * diff --git a/htdocs/util2/cron/runcron.php b/htdocs/util2/cron/runcron.php index 4ec920a8..bbade666 100644 --- a/htdocs/util2/cron/runcron.php +++ b/htdocs/util2/cron/runcron.php @@ -18,18 +18,23 @@ require($opt['rootpath'] . 'lib2/cli.inc.php'); + // test for user who runs the cronjob + $processUser = posix_getpwuid(posix_geteuid()); + if ($processUser['name'] != $opt['cron']['username']) + die("ERROR: runcron must be run by '" . $opt['cron']['username'] . "' but was called by '" . $processUser['name'] . "'\n"); + // use posix pid-files to lock process if (!CreatePidFile($opt['cron']['pidfile'])) { - CleanupAndExit($opt['cron']['pidfile'], "Another instance is running!"); - exit; + CleanupAndExit($opt['cron']['pidfile'], "Another instance is running!"); + exit; } // Run as system user, if possible. // This is relevant e.g. for publishing and for auto-archiving caches. if ($opt['logic']['systemuser']['user'] != '') if (!$login->system_login($opt['logic']['systemuser']['user'])) - die("runcron: system user login failed"); + die("ERROR: runcron system user login failed"); $modules_dir = $opt['rootpath'] . 'util2/cron/modules/'; From 066243fbf7026502d5d0c2f78b9de758e9fe0a7c Mon Sep 17 00:00:00 2001 From: following Date: Tue, 11 Jun 2013 22:17:38 +0200 Subject: [PATCH 29/39] added second maintenance log counter in listing view; fixes #227 --- .../viewcache/16x16-maintenance_shifted.png | Bin 0 -> 634 bytes htdocs/templates2/ocstyle/res_logentry.tpl | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 htdocs/resource2/ocstyle/images/viewcache/16x16-maintenance_shifted.png diff --git a/htdocs/resource2/ocstyle/images/viewcache/16x16-maintenance_shifted.png b/htdocs/resource2/ocstyle/images/viewcache/16x16-maintenance_shifted.png new file mode 100644 index 0000000000000000000000000000000000000000..9417137270a7d65842617c77006a585aef29aba7 GIT binary patch literal 634 zcmV-=0)_pFP) z6b>eBlyolu000SaNLh0L03N{r03N{s!)a7g00004XF*Lt006O%3;baP0006BNkl^>2+6oyvy^NUIuRWJ-s})2TwwAbd|l_!x-;4{br!K@8wlC2 zHIl8}7iINXjIiMzoIvZkrZUH8M^S%r2<=M> zs4y1VbIuEVm051fhISQXQy(z<@P}JNZWBJxdCw~>azHsLO~tpz0oL19CyB zSjt@Dy(p%=qW1Az`q*(9!*Lk4Ze(Yz#C%l&%&O#?7`>R4BgT}qiSaf4BmX6S0%Zy> UB29rji2wiq07*qoM6N<$f~(OIOaK4? literal 0 HcmV?d00001 diff --git a/htdocs/templates2/ocstyle/res_logentry.tpl b/htdocs/templates2/ocstyle/res_logentry.tpl index 6aaf7f02..d5a345ac 100644 --- a/htdocs/templates2/ocstyle/res_logentry.tpl +++ b/htdocs/templates2/ocstyle/res_logentry.tpl @@ -14,10 +14,10 @@ {t 1=$smarty.capture.cachename}Logentries for %1{/t}    {if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if} {$cache.found}x - {if $cache.type==6}{t}Will attend{/t}{else}{t}Not Found{/t}{/if} {if $cache.type==6}{$cache.willattend}{else}{$cache.notfound}{/if}x - - {$cache.note}x
      + {$cache.note}x + {if $cache.maintenance} {$cache.maintenance}x{/if} +

      From adacc676946a0ac95d4cff25d2e2e3d167d58c37 Mon Sep 17 00:00:00 2001 From: following Date: Tue, 11 Jun 2013 22:24:27 +0200 Subject: [PATCH 30/39] added/fixed translations for logtype titles in listing view; updates #227 --- htdocs/doc/sql/static-data/data.sql | 3 +++ htdocs/templates2/ocstyle/res_logentry.tpl | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/doc/sql/static-data/data.sql b/htdocs/doc/sql/static-data/data.sql index dda9bd2a..500f169c 100644 --- a/htdocs/doc/sql/static-data/data.sql +++ b/htdocs/doc/sql/static-data/data.sql @@ -2496,6 +2496,7 @@ INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2074', 'Adoptio INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2075', 'since September 2012', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2076', 'From Owner', '2013-05-28 16:51:40'); INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2077', 'To Owner', '2013-05-28 16:51:40'); +INSERT INTO `sys_trans` (`id`, `text`, `last_modified`) VALUES ('2078', 'Maintenance', '2013-05-28 16:51:40'); -- Table sys_trans_ref SET NAMES 'utf8'; @@ -6444,6 +6445,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'DE', 'seit September 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'DE', 'Alter Besitzer', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'DE', 'Neuer Besitzer', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2078', 'DE', 'Wartung', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'EN', 'Reorder IDs \r', '2010-09-02 00:15:30'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'EN', 'The database could not be reconnected.', '2010-08-28 11:48:07'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'EN', 'Testing – please do not login', '2010-08-28 11:48:07'); @@ -8012,6 +8014,7 @@ INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUE INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2075', 'EN', 'since September 2012', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2076', 'EN', 'From Owner', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2077', 'EN', 'To Owner', '2013-04-25 23:00:00'); +INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2078', 'EN', 'Maintenance', '2013-04-25 23:00:00'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('1', 'ES', 'Reordenar ID', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('2', 'ES', 'La base de datos no se pudo conectar.', '2010-12-09 00:17:55'); INSERT INTO `sys_trans_text` (`trans_id`, `lang`, `text`, `last_modified`) VALUES ('3', 'ES', 'En pruebas - por favor, no entre.', '2010-12-09 00:17:55'); diff --git a/htdocs/templates2/ocstyle/res_logentry.tpl b/htdocs/templates2/ocstyle/res_logentry.tpl index d5a345ac..d0499e1b 100644 --- a/htdocs/templates2/ocstyle/res_logentry.tpl +++ b/htdocs/templates2/ocstyle/res_logentry.tpl @@ -14,7 +14,7 @@ {t 1=$smarty.capture.cachename}Logentries for %1{/t}    {if $cache.type==6}{t}Attended{/t}{else}{t}Found{/t}{/if} {$cache.found}x - {if $cache.type==6}{t}Will attend{/t}{else}{t}Not Found{/t}{/if} {if $cache.type==6}{$cache.willattend}{else}{$cache.notfound}{/if}x + {if $cache.type==6}{t}Will attend{/t}{else}{t}Not found{/t}{/if} {if $cache.type==6}{$cache.willattend}{else}{$cache.notfound}{/if}x {$cache.note}x {if $cache.maintenance} {$cache.maintenance}x{/if}
      From 3c985331242f211ea43e7caf3abee8d30d43b2c8 Mon Sep 17 00:00:00 2001 From: following Date: Tue, 11 Jun 2013 22:09:24 +0200 Subject: [PATCH 31/39] added tool for geokret waypoint tables consistency check --- htdocs/util2/geokrety/.htaccess | 4 ++ htdocs/util2/geokrety/check-waypoints.php | 53 +++++++++++++++++++ .../license/process-old-disabled-users.php | 2 +- 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 htdocs/util2/geokrety/.htaccess create mode 100644 htdocs/util2/geokrety/check-waypoints.php diff --git a/htdocs/util2/geokrety/.htaccess b/htdocs/util2/geokrety/.htaccess new file mode 100644 index 00000000..0a83c864 --- /dev/null +++ b/htdocs/util2/geokrety/.htaccess @@ -0,0 +1,4 @@ + +Order Deny,Allow +Deny from All + diff --git a/htdocs/util2/geokrety/check-waypoints.php b/htdocs/util2/geokrety/check-waypoints.php new file mode 100644 index 00000000..5ccebafc --- /dev/null +++ b/htdocs/util2/geokrety/check-waypoints.php @@ -0,0 +1,53 @@ + $wps) + foreach ($wps as $wp => $flags) + if (isset($flags['itemwp']) && !isset($flags['movewp'])) + echo "item ".$itemid.": ".$wp." is not the current wp in gk_move_waypoint\n"; + else if (isset($flags['movewp']) && !isset($flags['itemwp'])) + echo "item ".$itemid.": current wp ".$wp." is missing in gk_item_waypoint\n"; + +?> diff --git a/htdocs/util2/license/process-old-disabled-users.php b/htdocs/util2/license/process-old-disabled-users.php index eb92c677..4254c2a1 100644 --- a/htdocs/util2/license/process-old-disabled-users.php +++ b/htdocs/util2/license/process-old-disabled-users.php @@ -12,7 +12,7 @@ ***************************************************************************/ $opt['rootpath'] = '../../'; - require_once($opt['rootpath'] . 'lib2/web.inc.php'); + require_once($opt['rootpath'] . 'lib2/cli.inc.php'); require_once($opt['rootpath'] . 'lib2/logic/user.class.php'); $login->admin = ADMIN_USER; From ee8507226b4069d6be57b1c8a499f914790c34bf Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 13:53:16 +0200 Subject: [PATCH 32/39] added instruction on running cron --- htdocs/util2/cron/runcron.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/util2/cron/runcron.php b/htdocs/util2/cron/runcron.php index bbade666..8c8aa412 100644 --- a/htdocs/util2/cron/runcron.php +++ b/htdocs/util2/cron/runcron.php @@ -21,7 +21,8 @@ // test for user who runs the cronjob $processUser = posix_getpwuid(posix_geteuid()); if ($processUser['name'] != $opt['cron']['username']) - die("ERROR: runcron must be run by '" . $opt['cron']['username'] . "' but was called by '" . $processUser['name'] . "'\n"); + die("ERROR: runcron must be run by '" . $opt['cron']['username'] . "' but was called by '" . $processUser['name'] . "'\n". + "Try something like 'sudo -u ".$opt['cron']['username']." php runcron.php'.\n"); // use posix pid-files to lock process if (!CreatePidFile($opt['cron']['pidfile'])) From 449eb0b3649f7a36da1f9cd9110fd25b720a33f9 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 02:35:50 +0200 Subject: [PATCH 33/39] improved geokrety waypoint check; added fixing tool --- htdocs/util2/geokrety/check-waypoints.php | 16 ++++++-- htdocs/util2/geokrety/fix-waypoints.php | 48 +++++++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 htdocs/util2/geokrety/fix-waypoints.php diff --git a/htdocs/util2/geokrety/check-waypoints.php b/htdocs/util2/geokrety/check-waypoints.php index 5ccebafc..f2ddc5e3 100644 --- a/htdocs/util2/geokrety/check-waypoints.php +++ b/htdocs/util2/geokrety/check-waypoints.php @@ -5,7 +5,7 @@ * Unicode Reminder メモ * * Tests for consistency of gk_item_waypoint und gk_move_waypoint tables. - * + * See http://redmine.opencaching.de/issues/18. ***************************************************************************/ $opt['rootpath'] = '../../'; @@ -25,7 +25,7 @@ { $lastmove = sql_value(" SELECT `id` FROM `gk_move` - WHERE `itemid`='&1' + WHERE `itemid`='&1' AND `logtypeid`<>2 ORDER BY `datemoved` DESC, `id` DESC LIMIT 1", 0, $rItem['id']); @@ -46,8 +46,16 @@ foreach ($itemwps as $itemid => $wps) foreach ($wps as $wp => $flags) if (isset($flags['itemwp']) && !isset($flags['movewp'])) - echo "item ".$itemid.": ".$wp." is not the current wp in gk_move_waypoint\n"; + if (sql_value("SELECT COUNT(*) FROM `gk_move`, `gk_move_waypoint` + WHERE `gk_move`.`itemid`='&1' + AND `gk_move`.`logtypeid`<>2 + AND `gk_move_waypoint`.`id`=`gk_move`.`id` + AND `gk_move_waypoint`.`wp`='&2'", + 0, $itemid, $wp) == 0) + echo "item ".$itemid.": ".$wp." is missing in gk_move_waypoint\n"; + else + echo "item ".$itemid.": ".$wp." is not the current wp in gk_move_waypoint\n"; else if (isset($flags['movewp']) && !isset($flags['itemwp'])) - echo "item ".$itemid.": current wp ".$wp." is missing in gk_item_waypoint\n"; + echo "item ".$itemid.": ".$wp." is missing in gk_item_waypoint\n"; ?> diff --git a/htdocs/util2/geokrety/fix-waypoints.php b/htdocs/util2/geokrety/fix-waypoints.php new file mode 100644 index 00000000..777c9361 --- /dev/null +++ b/htdocs/util2/geokrety/fix-waypoints.php @@ -0,0 +1,48 @@ +2 + /* TODO: How does Geokrety.org order moves with same date? We assume by ID: */ + ORDER BY `datemoved` DESC, `id` DESC + LIMIT 1", + 0, $rItem['id']); + + $rsWp = sql(" + INSERT INTO `gk_item_waypoint` + (SELECT `gk_move`.`itemid`, `gk_move_waypoint`.`wp` + FROM `gk_move_waypoint` + LEFT JOIN `gk_move` ON `gk_move`.`id`=`gk_move_waypoint`.`id` + WHERE `gk_move`.`id`='&1' AND `logtypeid` IN (0,3) AND `wp`<>'' + )", + $lastmove); + } + sql_free_result($rsItems); + +?> From 8ebcfc7fc3fde3af3391ee63983f395041c2ff81 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 14:16:04 +0200 Subject: [PATCH 34/39] added safety measures and documentation to geokrety import cronjob updates 18 --- htdocs/util2/cron/modules/geokrety.class.php | 54 +++++++++++++++++--- htdocs/util2/geokrety/check-waypoints.php | 2 + htdocs/util2/geokrety/fix-waypoints.php | 2 + 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/htdocs/util2/cron/modules/geokrety.class.php b/htdocs/util2/cron/modules/geokrety.class.php index 2640b406..16c80488 100644 --- a/htdocs/util2/cron/modules/geokrety.class.php +++ b/htdocs/util2/cron/modules/geokrety.class.php @@ -3,10 +3,16 @@ * For license information see doc/license.txt * * Unicode Reminder メモ + * + * Import new data from geokrety.org. + * + * See util2/geokrety for check and repair functions. + * See discussion in http://redmine.opencaching.de/issues/18. ***************************************************************************/ checkJob(new geokrety()); + class geokrety { var $name = 'geokrety'; @@ -39,8 +45,9 @@ class geokrety $this->removeXML($path); - // changed default-value for getSysConfig() from '2005-01-01 00:00:00' to 'NOW - 9d 23:59:59' to stay in api-limit - $modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', date($opt['db']['dateformat'], time()-(60*60*24*10)+1))); + // Changed default-value for getSysConfig() from '2005-01-01 00:00:00' to 'NOW - 9d 12h' + // to safely stay in api-limit, even when client and server are in different time zones. + $modifiedsince = strtotime(getSysConfig('geokrety_lastupdate', date($opt['db']['dateformat'], time() - 60*60*24*9.5))); if (!@copy('http://geokrety.org/export.php?modifiedsince=' . date('YmdHis', $modifiedsince - 1), $path)) return false; @@ -146,13 +153,18 @@ class geokrety ('&1', '&2', '&3', '&4', '&5', '&6', '&7', '&8', '&9', '&10') ON DUPLICATE KEY UPDATE `name`='&2', `description`='&3', `userid`='&4', `datecreated`='&5', `distancetravelled`='&6', `latitude`='&7', `longitude`='&8', `typeid`='&9', `stateid`='&10'", - $id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, $latitude, $longitude, $typeid, $state); + $id, $name, $description, $userid, date($opt['db']['dateformat'], $datecreated), $distancetravelled, $latitude, $longitude, $typeid, $state); + + // Deleting and inserting item-waypoints if they have not changed will + // update caches.meta_last_modified -> caches.okapi_syncbase and thus trigger + // OKAPI changelog actions. This probably can be ignored as OKAPI will verify + // if data has really changed. // remove waypoints for this krety sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); // update associated waypoints $waypoints = $element->getElementsByTagName('waypoints'); - if ($waypoints->length == 1) + if ($waypoints->length > 0) { $wpItems = $waypoints->item(0)->getElementsByTagName('waypoint'); for ($i = 0; $i < $wpItems->length; $i++) @@ -166,9 +178,9 @@ class geokrety $id, $wp); } } - } + function importMove($element) { global $opt; @@ -204,7 +216,7 @@ class geokrety // update associated waypoints $waypoints = $element->getElementsByTagName('waypoints'); - if ($waypoints->length == 1) + if ($waypoints->length > 0) { $wpItems = $waypoints->item(0)->getElementsByTagName('waypoint'); for ($i = 0; $i < $wpItems->length; $i++) @@ -214,13 +226,40 @@ class geokrety sql("INSERT INTO `gk_move_waypoint` (`id`, `wp`) VALUES ('&1', '&2')", $id, $wp); } } + + /** + * This Code is buggy; it produces wrong gk_item_waypoint entries (why?). + * See http://redmine.opencaching.de/issues/18. + * We use geokret.waypoints information instead, see importGeoKret(). + * That's preferrable anyway, because it does not mage assumptions on internal + * Geokrety.org behaviour (e.g. the order of moves with identical datetime). + + // now update the current gk-waypoints based on the last move + sql("DELETE FROM `gk_item_waypoint` WHERE `id`='&1'", $gkid); + $rs = sql("SELECT * FROM `gk_move` WHERE `itemid`='&1' AND `logtypeid`!=2 ORDER BY `datemoved` DESC LIMIT 1", $gkid); + $r = sql_fetch_assoc($rs); + sql_free_result($rs); + if ($r === false) return; + + if ($r['logtypeid'] == 0 || $r['logtypeid'] == 3) + { + sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) SELECT '&1' AS `id`, `wp` FROM `gk_move_waypoint` WHERE `id`='&2' AND `wp`!=''", $gkid, $id); + } + else + { + // do nothing + } + + */ } + function checkGeoKretType($id, $name) { sql("INSERT INTO `gk_item_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); } + function checkUser($id, $name) { if ($id == 0) return; @@ -228,11 +267,13 @@ class geokrety sql("INSERT INTO `gk_user` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); } + function checkMoveType($id, $name) { sql("INSERT INTO `gk_move_type` (`id`, `name`) VALUES ('&1', '&2') ON DUPLICATE KEY UPDATE `name`='&2'", $id, $name); } + function GetNodeValue(&$domnode, $element) { $subnode = $domnode->getElementsByTagName($element); @@ -242,6 +283,7 @@ class geokrety return $subnode->item(0)->nodeValue; } + function GetNodeAttribute(&$domnode, $element, $attr) { $subnode = $domnode->getElementsByTagName($element); diff --git a/htdocs/util2/geokrety/check-waypoints.php b/htdocs/util2/geokrety/check-waypoints.php index f2ddc5e3..0865466c 100644 --- a/htdocs/util2/geokrety/check-waypoints.php +++ b/htdocs/util2/geokrety/check-waypoints.php @@ -6,6 +6,8 @@ * * Tests for consistency of gk_item_waypoint und gk_move_waypoint tables. * See http://redmine.opencaching.de/issues/18. + * + * Data import functions are in util2/cron/modules/geokrety.class.php. ***************************************************************************/ $opt['rootpath'] = '../../'; diff --git a/htdocs/util2/geokrety/fix-waypoints.php b/htdocs/util2/geokrety/fix-waypoints.php index 777c9361..3e5efd57 100644 --- a/htdocs/util2/geokrety/fix-waypoints.php +++ b/htdocs/util2/geokrety/fix-waypoints.php @@ -6,6 +6,8 @@ * * Regenerates gk_item_waypoint from gk_move_waypoint. * See http://redmine.opencaching.de/issues/18. + * + * Data import functions are in util2/cron/modules/geokrety.class.php. ***************************************************************************/ $opt['rootpath'] = '../../'; From 05910557c1f506e7a41ea069de4d0c601d78e103 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 14:38:41 +0200 Subject: [PATCH 35/39] fixed/simplified util2 file paths --- htdocs/util2/cron/runcron.php | 6 +----- htdocs/util2/geokrety/check-waypoints.php | 2 +- htdocs/util2/geokrety/fix-waypoints.php | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/htdocs/util2/cron/runcron.php b/htdocs/util2/cron/runcron.php index 8c8aa412..d80947bf 100644 --- a/htdocs/util2/cron/runcron.php +++ b/htdocs/util2/cron/runcron.php @@ -11,11 +11,7 @@ * ***************************************************************************/ - $opt['rootpath'] = '../../'; - - // chdir to proper directory (needed for cronjobs) - chdir(substr(realpath($_SERVER['PHP_SELF']), 0, strrpos(realpath($_SERVER['PHP_SELF']), '/'))); - + $opt['rootpath'] = dirname(__FILE__) . '/../../'; require($opt['rootpath'] . 'lib2/cli.inc.php'); // test for user who runs the cronjob diff --git a/htdocs/util2/geokrety/check-waypoints.php b/htdocs/util2/geokrety/check-waypoints.php index 0865466c..baa11d94 100644 --- a/htdocs/util2/geokrety/check-waypoints.php +++ b/htdocs/util2/geokrety/check-waypoints.php @@ -10,7 +10,7 @@ * Data import functions are in util2/cron/modules/geokrety.class.php. ***************************************************************************/ - $opt['rootpath'] = '../../'; + $opt['rootpath'] = dirname(__FILE__) . '/../../'; require_once($opt['rootpath'] . 'lib2/cli.inc.php'); $itemwps = array(); diff --git a/htdocs/util2/geokrety/fix-waypoints.php b/htdocs/util2/geokrety/fix-waypoints.php index 3e5efd57..c0ec1e1c 100644 --- a/htdocs/util2/geokrety/fix-waypoints.php +++ b/htdocs/util2/geokrety/fix-waypoints.php @@ -10,7 +10,7 @@ * Data import functions are in util2/cron/modules/geokrety.class.php. ***************************************************************************/ - $opt['rootpath'] = '../../'; + $opt['rootpath'] = dirname(__FILE__) . '/../../'; require_once($opt['rootpath'] . 'lib2/cli.inc.php'); if (count($argv) != 2 || $argv[1] != 'run') From d3b188d478708cfd611cc591556184434ba73679 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 15:37:41 +0200 Subject: [PATCH 36/39] fixed geokrety waypoint import; update #18 --- htdocs/util2/cron/modules/geokrety.class.php | 36 ++++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/htdocs/util2/cron/modules/geokrety.class.php b/htdocs/util2/cron/modules/geokrety.class.php index 16c80488..3cefd365 100644 --- a/htdocs/util2/cron/modules/geokrety.class.php +++ b/htdocs/util2/cron/modules/geokrety.class.php @@ -160,9 +160,14 @@ class geokrety // OKAPI changelog actions. This probably can be ignored as OKAPI will verify // if data has really changed. - // remove waypoints for this krety - sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); // update associated waypoints + /** + * This does not work properly, because geokret.waypoints does NOT contain the + * current location of the Kret but something like the last cache where it was logged. + * Evaluating the 'state' fielt might help, but for now, we import waypoint data + * from the moves instead. + + sql("DELETE FROM `gk_item_waypoint` WHERE id='&1'", $id); $waypoints = $element->getElementsByTagName('waypoints'); if ($waypoints->length > 0) { @@ -178,6 +183,7 @@ class geokrety $id, $wp); } } + */ } @@ -227,30 +233,30 @@ class geokrety } } - /** - * This Code is buggy; it produces wrong gk_item_waypoint entries (why?). - * See http://redmine.opencaching.de/issues/18. - * We use geokret.waypoints information instead, see importGeoKret(). - * That's preferrable anyway, because it does not mage assumptions on internal - * Geokrety.org behaviour (e.g. the order of moves with identical datetime). - - // now update the current gk-waypoints based on the last move + // update the current gk-waypoints based on the last move sql("DELETE FROM `gk_item_waypoint` WHERE `id`='&1'", $gkid); - $rs = sql("SELECT * FROM `gk_move` WHERE `itemid`='&1' AND `logtypeid`!=2 ORDER BY `datemoved` DESC LIMIT 1", $gkid); + $rs = sql(" + SELECT `id`,`logtypeid` FROM `gk_move` + WHERE `itemid`='&1' AND `logtypeid`!=2 + ORDER BY `datemoved` DESC LIMIT 1", + $gkid); $r = sql_fetch_assoc($rs); sql_free_result($rs); if ($r === false) return; - if ($r['logtypeid'] == 0 || $r['logtypeid'] == 3) + if ($r['logtypeid'] == 0 /* dropped */ || $r['logtypeid'] == 3 /* seen in */) { - sql("INSERT INTO `gk_item_waypoint` (`id`, `wp`) SELECT '&1' AS `id`, `wp` FROM `gk_move_waypoint` WHERE `id`='&2' AND `wp`!=''", $gkid, $id); + sql(" + INSERT INTO `gk_item_waypoint` (`id`, `wp`) + SELECT '&1' AS `id`, `wp` + FROM `gk_move_waypoint` + WHERE `id`='&2' AND `wp`!=''", + $gkid, $r['id']); // "late log" bugfix: replaced $id paramter by $r['id'] } else { // do nothing } - - */ } From e9222e89635afeb139542c7fc5762a5594803f6b Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 16:02:38 +0200 Subject: [PATCH 37/39] user disabling: fixed log type; keep profile description which is published under the data license terms fixes #228 --- htdocs/lib2/logic/user.class.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/lib2/logic/user.class.php b/htdocs/lib2/logic/user.class.php index c719c59c..028276a6 100644 --- a/htdocs/lib2/logic/user.class.php +++ b/htdocs/lib2/logic/user.class.php @@ -722,10 +722,12 @@ class user `last_name`='', `first_name`='', `country`=NULL, `pmr_flag`=0, `new_pw_code`=NULL, `new_pw_date`=NULL, `new_email`=NULL, `new_email_code`=NULL, `new_email_date`=NULL, - `email_problems`=0, + `email_problems`=0, `first_email_problem`=NULL, `last_email_problem`=NULL, `permanent_login_flag`=0, `activation_code`='', - `notify_radius`=0, `statpic_text`='', `description`='' + `notify_radius`=0 WHERE `user_id`='&1'", $this->nUserId); + // Statpic and profile description texts are published under the data license + // terms and therefore need not to be deleted. sql("DELETE FROM `user_options` WHERE `user_id`='&1'", $this->nUserId); $this->reload(); @@ -741,7 +743,7 @@ class user $log = cachelog::createNew($rCache['cache_id'],$login->userid,true); if ($log !== false) { - $log->setType(cachelog::LOGTYPE_LOCKED); + $log->setType(cachelog::LOGTYPE_LOCKED,true); $log->setOcTeamComment(true); $log->setDate(date('Y-m-d')); $log->setText($translate->t('The user account has been disabled.', '','',0,'',1, $cache->getDefaultDescLanguage())); From 9874a8cd23b514d2313b69e4c6a213fbab539ffe Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 16:41:15 +0200 Subject: [PATCH 38/39] okapi r817: fixed hint format --- htdocs/okapi/core.php | 2 +- .../okapi/services/caches/formatters/gpx.php | 2 +- .../caches/formatters/gpxfile.tpl.php | 2 +- htdocs/okapi/services/caches/geocache.xml | 15 ++++++++++----- htdocs/okapi/services/caches/geocaches.php | 19 +++++++++++++++---- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/htdocs/okapi/core.php b/htdocs/okapi/core.php index 58df0499..da8b6341 100644 --- a/htdocs/okapi/core.php +++ b/htdocs/okapi/core.php @@ -806,7 +806,7 @@ class Okapi { public static $data_store; public static $server; - public static $revision = 810; # This gets replaced in automatically deployed packages + public static $revision = 817; # This gets replaced in automatically deployed packages private static $okapi_vars = null; /** Get a variable stored in okapi_vars. If variable not found, return $default. */ diff --git a/htdocs/okapi/services/caches/formatters/gpx.php b/htdocs/okapi/services/caches/formatters/gpx.php index 18b40cd7..42784c41 100644 --- a/htdocs/okapi/services/caches/formatters/gpx.php +++ b/htdocs/okapi/services/caches/formatters/gpx.php @@ -118,7 +118,7 @@ class WebService # We don't need to do any additional queries here. $fields = 'code|name|location|date_created|url|type|status|size|size2|oxsize'. - '|difficulty|terrain|description|hint|rating|owner|url|internal_id'; + '|difficulty|terrain|description|hint2|rating|owner|url|internal_id'; if ($vars['images'] != 'none') $fields .= "|images"; if ($vars['attrs'] != 'none') diff --git a/htdocs/okapi/services/caches/formatters/gpxfile.tpl.php b/htdocs/okapi/services/caches/formatters/gpxfile.tpl.php index 87bbd56e..b68543be 100644 --- a/htdocs/okapi/services/caches/formatters/gpxfile.tpl.php +++ b/htdocs/okapi/services/caches/formatters/gpxfile.tpl.php @@ -113,7 +113,7 @@ http://www.gsak.net/xmlv1/5 http://www.gsak.net/xmlv1/5/gsak.xsd </ul> - + diff --git a/htdocs/okapi/services/caches/geocache.xml b/htdocs/okapi/services/caches/geocache.xml index acfc3502..463a5163 100644 --- a/htdocs/okapi/services/caches/geocache.xml +++ b/htdocs/okapi/services/caches/geocache.xml @@ -177,12 +177,17 @@
    • req_passwd - boolean; states if this cache requires a password in order to submit a "Found it" log entry,
    • description - HTML string, description of the cache,
    • -
    • descriptions - a dictionary (language code => HTML string) of cache +
    • descriptions - a dictionary (language code => HTML string) of cache descriptions,
    • -
    • hint - plain-text string, cache hints/spoilers; in general, hints should not be displayed to the user - unless user specifically asks for them,
    • -
    • hints - a dictionary (language code => plain-text string) of cache - hints/spoilers,
    • +
    • hint - HTML-encoded string, cache hints/spoilers; + deprecated (Why?), + use hint2 instead,
    • +
    • hints - a dictionary (language code => + HTML-encoded string) of cache hints/spoilers; deprecated, use hints2 instead,
    • +
    • hint2 - plain-text string, cache hints/spoilers; in general, hints + should not be displayed to the user unless user specifically asks for them,
    • +
    • hints2 - a dictionary (language code => + plain-text string) of cache hints/spoilers,
    • images - list of dictionaries, each dictionary represents one image saved along the cache description; each dictionary has the diff --git a/htdocs/okapi/services/caches/geocaches.php b/htdocs/okapi/services/caches/geocaches.php index ac45edbc..503f9a32 100644 --- a/htdocs/okapi/services/caches/geocaches.php +++ b/htdocs/okapi/services/caches/geocaches.php @@ -33,7 +33,7 @@ class WebService 'my_notes', 'trackables_count', 'trackables', 'alt_wpts', 'last_found', 'last_modified', 'date_created', 'date_hidden', 'internal_id', 'is_watched', 'is_ignored', 'willattends', 'country', 'state', 'preview_image', - 'trip_time', 'trip_distance', 'attribution_note','gc_code'); + 'trip_time', 'trip_distance', 'attribution_note','gc_code', 'hint2', 'hints2'); public static function call(OkapiRequest $request) { @@ -73,6 +73,7 @@ class WebService if ( in_array('description', $fields) || in_array('descriptions', $fields) || in_array('hint', $fields) || in_array('hints', $fields) + || in_array('hint2', $fields) || in_array('hints2', $fields) || in_array('attribution_note', $fields) ) { @@ -317,6 +318,8 @@ class WebService case 'descriptions': /* handled separately */ break; case 'hint': /* handled separately */ break; case 'hints': /* handled separately */ break; + case 'hint2': /* handled separately */ break; + case 'hints2': /* handled separately */ break; case 'images': /* handled separately */ break; case 'preview_image': /* handled separately */ break; case 'attrnames': /* handled separately */ break; @@ -461,15 +464,18 @@ class WebService # Descriptions and hints. if (in_array('description', $fields) || in_array('descriptions', $fields) - || in_array('hint', $fields) || in_array('hints', $fields)) + || in_array('hint', $fields) || in_array('hints', $fields) + || in_array('hint2', $fields) || in_array('hints2', $fields)) { # At first, we will fill all those 4 fields, even if user requested just one # of them. We will chop off the remaining three at the end. foreach ($results as &$result_ref) + { $result_ref['descriptions'] = array(); - foreach ($results as &$result_ref) $result_ref['hints'] = array(); + $result_ref['hints2'] = array(); + } # Get cache descriptions and hints. @@ -500,17 +506,22 @@ class WebService $results[$cache_code]['descriptions'][strtolower($row['language'])] = $tmp; } if ($row['hint']) + { $results[$cache_code]['hints'][strtolower($row['language'])] = $row['hint']; + $results[$cache_code]['hints2'][strtolower($row['language'])] + = htmlspecialchars_decode(mb_ereg_replace("
      ", "" , $row['hint']), ENT_COMPAT); + } } foreach ($results as &$result_ref) { $result_ref['description'] = Okapi::pick_best_language($result_ref['descriptions'], $langpref); $result_ref['hint'] = Okapi::pick_best_language($result_ref['hints'], $langpref); + $result_ref['hint2'] = Okapi::pick_best_language($result_ref['hints2'], $langpref); } # Remove unwanted fields. - foreach (array('description', 'descriptions', 'hint', 'hints') as $field) + foreach (array('description', 'descriptions', 'hint', 'hints', 'hint2', 'hints2') as $field) if (!in_array($field, $fields)) foreach ($results as &$result_ref) unset($result_ref[$field]); From 0626d867ad4fa4cdf5ed5d6e4193ad014671ea40 Mon Sep 17 00:00:00 2001 From: following Date: Wed, 12 Jun 2013 17:34:16 +0200 Subject: [PATCH 39/39] log autoarchiving without time --- htdocs/util2/cron/modules/autoarchive_caches.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/util2/cron/modules/autoarchive_caches.class.php b/htdocs/util2/cron/modules/autoarchive_caches.class.php index c9096a3e..a1a70aa5 100644 --- a/htdocs/util2/cron/modules/autoarchive_caches.class.php +++ b/htdocs/util2/cron/modules/autoarchive_caches.class.php @@ -99,7 +99,9 @@ class autoarchive // create log $log->setType(cachelog::LOGTYPE_ARCHIVED, true); $log->setOcTeamComment(true); - $log->setDate(date('Y-m-d H:i')); + $log->setDate(date('Y-m-d')); + // Log without time, so that owner reactions will always appear AFTER + // the system log, no matter if logged with or without date. // create log text in appropriate language $translated_comment = $translate->t($comment, '','',0,'',1, $cache->getDefaultDescLanguage());