From 65ec04e32a5d45e7b725e534093caaa8557b559f Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Thu, 23 Sep 2021 19:04:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JSD-8345需求确认书.docx | Bin 0 -> 40507 bytes README.md | 5 +- plugin.xml | 27 ++ .../ztzzSSO/config/InitializeMonitor.java | 21 ++ .../ztzzSSO/config/PluginSimpleConfig.java | 176 ++++++++++++ .../fr/plugin/ztzzSSO/filter/SSOFilter.java | 175 ++++++++++++ .../handler/ExtendAttrHandlerProvider.java | 14 + .../com/fr/plugin/ztzzSSO/handler/Test.java | 50 ++++ .../ztzzSSO/handler/URLAliasProvide.java | 17 ++ .../com/fr/plugin/ztzzSSO/logout/Logout.java | 29 ++ .../plugin/ztzzSSO/serverDS/DatasetData.java | 67 +++++ .../ztzzSSO/serverDS/ORGHttpDataModel.java | 268 ++++++++++++++++++ .../ztzzSSO/serverDS/OrgHttpTableData.java | 18 ++ .../serverDS/OrgHttpTableDataDefine.java | 46 +++ .../serverDS/OrgHttpTableDataPane.java | 74 +++++ .../ztzzSSO/serverDS/UserHttpDataModel.java | 260 +++++++++++++++++ .../ztzzSSO/serverDS/UserHttpTableData.java | 18 ++ .../serverDS/UserHttpTableDataDefine.java | 46 +++ .../serverDS/UserHttpTableDataPane.java | 74 +++++ .../fr/plugin/ztzzSSO/utils/DateUtilSelf.java | 227 +++++++++++++++ .../ztzzSSO/utils/FRDepartmentUtils.java | 106 +++++++ .../fr/plugin/ztzzSSO/utils/FRUserUtils.java | 111 ++++++++ .../com/fr/plugin/ztzzSSO/utils/FRUtils.java | 174 ++++++++++++ .../fr/plugin/ztzzSSO/utils/HttpUtils.java | 239 ++++++++++++++++ .../plugin/ztzzSSO/utils/ResponseUtils.java | 80 ++++++ .../com/fr/plugin/ztzzSSO/utils/Test.java | 20 ++ .../com/fr/plugin/ztzzSSO/utils/Utils.java | 95 +++++++ 使用手册.docx | Bin 0 -> 124321 bytes 28 files changed, 2436 insertions(+), 1 deletion(-) create mode 100644 JSD-8345需求确认书.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/config/InitializeMonitor.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/config/PluginSimpleConfig.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/filter/SSOFilter.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/handler/ExtendAttrHandlerProvider.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/handler/Test.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/handler/URLAliasProvide.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/logout/Logout.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/DatasetData.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/ORGHttpDataModel.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableData.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataDefine.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataPane.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpDataModel.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableData.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataDefine.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataPane.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/DateUtilSelf.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/FRDepartmentUtils.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/FRUserUtils.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/FRUtils.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/HttpUtils.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/ResponseUtils.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/Test.java create mode 100644 src/main/java/com/fr/plugin/ztzzSSO/utils/Utils.java create mode 100644 使用手册.docx diff --git a/JSD-8345需求确认书.docx b/JSD-8345需求确认书.docx new file mode 100644 index 0000000000000000000000000000000000000000..82ead75dff780976c9d7ee4ae51a5a0153729b70 GIT binary patch literal 40507 zcmaI7W0WXMvn|@T?e5jKZQHhO+qP}5wr$(CZLGHL+WU<2#`(^@;eBj=l?z+|2B;6jN~2d?49W3|B9jf?SS}K?95Eb&KeK^z!L}n z0O5a%8Q9y?y4zUiB+AJh(jyGtQr+VgZXt6O`~;SYlJr4dt6JuZ8FMU-5Z2Rd61-n$ zSgVnE9kbrXd@g2T4ql(mk>Q^OwV39hamXPvPqb{{te!hPrdKZz3tMQeYXx2Y3I5fM zs@AK2SuKRm5*my^TD3?k>Ncn@j|<0mw8Xl^q0ToZzJQ;>gVQwNRk;JsoRE@Dhv6&A zOw*Fl39!g?e?s()vZ2Xx0!=qPuAmPH3s;kdIDE?>o7c(;*GEfheT*2C4#<*d>tI**(Un4_3jGGi*M$x_NSKvvTe0~lcStmQGqsXu`CJAI{UIYF@cuuc~j@% z^wvc;itx8xyxOwm{kuB1cG_eoCl$I%&UDSGO$)_|$;j!G_lR0{+7s9s3W)PIZiQRz zp~RfOl0;V9mby3Ke|pB`)Q(8@uV>u;dIs@-ddA4k(c~Z3_#`UG4HBS)?8?OxzZv~zvdc}I_TZG8ep# zUiP=#%t8k_o>*J;vhB-^ww+p2z#W|Jw0knU>ZCcZBM=?^e)V~KW#ne5QTb5=LZB+f z*f<^ldLbwR7=yo-ozQaqk*7hBl8`i%G-51=m?qPZ9TN+Xt2z9_bJw?+%xyk{HQI(R z+Ml5t+)`y3>*UGWo?CC~>kVO0_hSCZqaNyrS*$7~&Xc7}$^oddvop|o;Tj^fU~R&M z54~_yS!4T8<5#} z&bsrw;P1vX;u(mOFyal#^G-I#uXVRK2R^vd9mAIzQF^IU@FJ;nQV^i>cEljww7VyF zek};^v!*lAA`?jT^ZlBRZi?KT`h^eyPXxq`v^%80X@=)dLY31bjLY;tBjvP1i#he@ z9|4mqcM=k~^d!bXZ%082W8VjRDQUC&z2XM1mZx%~!=l?2uc37LY6b`-pXQCFHcW}X zI?P}tB{Yd#M{f|WJEkoWj2TLs7Wo` zUW-?VDsCQfAPXR5L%<<`fbaD|wmA^GW2c(z23A#3Hf!>cs60mlKQ|bar#z{cnEIq> zP#*g}oOiN6*m`7!5N5!I#=(K%$$29Nk54<_oxFSB-uF#9rh-r-LFU2Tc(A_yIe+PW z8Q+#j-4)}0%nu;uiugL$&p542`udvEdq_8l8;T^mI}|KtnA~UVUXRmwckSMI6zMYb zV23ZF@7=}6#leAfW-{bd|2-aIYe)z8rEF}NAeDezuO7_1`hyYC1YeWLjrz@bA`u(@ zK@pb^PdJ{sPsvn0ytJYpF10vTZG+J2V4T}|3G7O?pq~PjXNI{(9IJe4ghndDG$>JB zAm|Xs@9<&y`q4mvfRDGQSKh=iChmiGU~^{J1iVntZ*Uo%i%_1 zXz;s9#qar7Xfus(YG{qOQ6?Wb$#)H1%R3K@;GnPHc~?eiQ@tW-d#)ved$N1lYL=?} zR)#r8i~VO1r6}B!=zP4R8T7d6*mj8~7xe!#UTC(>IoB7SD2>(v6ktCYjwMw2M~&t{J9L zn~dlFnYzDutVR6-e7V ziYaH$DHXzvzneVLG?}~8_<JYgtlBapypA{*U*5(M9L4sf~m&+AI3rGDRm~X_*hsnDkvlgtS7~txy;X%Jj=;(aYI- zfG9MK1_BsI3{cGe5^w~f<)%1>&J}bW%^8xq5w;?LLcSrnbiXk_NA3JIeox#NA#_=t z;F{|i;#B9-lbqmrc1FMuWV|}g+^(N%L)z4SAd=p$5Q%b^TU!*4e5Bi%g?HbvTJM-0 zLbwgBA!B?{>>zxuJ7GyK>4s+@u9-;BNF#xfpGq99w4TW*`?vl3pSBchTw_C_3yF)+ z=70z8Ndore4B@XAuk7qc$}R~EYWQvOHthTrf$oBRordJ?V(aEVM`%&VH%^FKUaK_* zlD|YEV(sx}@{0@_Zt!evII$!mi_jWC)M$($XEeuHJFT!+djsW#Xp8AQM{RR*V|Nx4 zPqeE~+Z!A8>dmVORmpm}LVW1R0%9g}!YHcDgX_B5A;tJSX%0Ot5LPjJ1l+VFSRHL; zI}?;D9C6HKwh(y&zhux2E$+wBU#M~gQQlX^HD*LmBDnC@N^sR8=EY43Xui58l;#EB zYUo>r&!}~2G|)_CH`teNWxLd@kBQwe`%`YXcz+6% z%=EN-JMMA?Fmks>K?DR1!@?Wq62_8~A-2xoOZ2O zrNl?>uEk~`7u2YAIY#8dJzDmpFXK>Iz{v$ zAd*BX%1zShX?WL=T(neLgtyCdB4!A|>{vFRMXq^R8_C@mAq#0iUaN0&)p3*-RMuO4J3YB_9Xopck;@O+G@X-Ab+RI>IAb* zZgpyEvT|{5w%V|lKa=nwaM?|csT?|X6S4BP6o1sZBh(lbWwNebE6)`32}h;53GP`f zqJ3N_5D2tZrR7`?-p{VcBshL7edD{e#xcM)|JaMRRQ{~-HvhCZk!bR*`9fp6od2w~ zXgNcPx$?aK;cS`SCM;Qxz>BqEYV%(+fM}7>Zt4Y=SX=59$*W^I9^^n`R9UmG-=Eh} zus&HsxTqm#EmF>KQKLqW+(xZrTipo2VT&GZ`9;`@ehVH!WndTE8dv!U@u*CS z)EpRT$RzJmonN?Cwb-I6UvDj}*^hN?Np#vA$VqPYPzuD6#D+SS(N)erb0h=eNMuJD z9)k*%TN%%WIynLhs`}3et0%et#6P2Cc7}p(#!N~%UFGDgz{}%Vk%o=3A@X6N^5yC% z52c3x^Io8iq;{0?OdiMqTVq*JhDITQr<6xB!wn8X0V@BD#Na{YGyXF=-g%s&y=t3H zlwG;ehN0}Of4JAwSk1<5yLFF^LBKU8PwjG(Tf&Wz~ zpYtE>RxJM72koB+|25Wszo1e;_IMW5k@Su*0oy}qp!{F0O%6i?l_vj+G|USDDwEoQ z1QwbdQ<^oPV5kBHAIfofTQT8QO{on%2%{``G?QW$*mra3B3+y&yD5oYZoU78b zpYL%-7i8~S`JVdxG6XZZaHeS=(UbnC|FZY%LGS0Y*?VL5BJO~F=Rq0GXt4gm4SfCM zAe7f7wL5Qo!1dx+(kVT8Na^jp@$Ga<@H&65-p#b`q?S{e3L9>n^X)|j9%U?IXtd^S zosvNYVro2DuE9fpLQu6KRvFjxV5SWW$} zmG&+lht6wG7Pbtc3-8jo$4)EzjX+~R?2v_1v31`%z>qTbvxj0i2 z9S8+22|Wrbnb5Yi=SCz?^=Zk?q;+L?W4&h7(5?63sj>!jCj)T`Qz)T8VB7YQ5!jJo z;@!4@4lx&Cm0yh(rk41`?fv45=im(58f?(a9nyb2D`y@Q~oL1uS=WJ{Vf>RoNA+|{(nUw6G)f1*4KHZJO1 zCN4n2O{u1<;EgNy`vDhRqw4QY8=9vcWlk7XTj_d3JnH-_>k;(5jh%3tGo?mVnVl@4 z+{v9_;SuYmwI5DtoX$_Prb2Yz`RF@8NkEc%KHafBchIC(gwV7EvZmQ!*iW%jdp*Z2 zR8glyZEkyx|(2Xb)XKQ1~tdO|!8Obk{9mx=?UI`Zbq1P&tqTEgWXvOrQd1 zk&y}`X3Z%v*#;Hpkd|uHNJ3|Eht+Z;r?rgV$@i+!@&sunZm3l5VoYQQ4HvWi5zHX5 zcA=r4ToCBdjb~ejrp=eM%;II6ACVtjJw}z@1}0aWduuCo%>YlQgyLDM2};CW?(xLS zr$XNeZ%?3(DlyHbW9Egqyc?rCuSp zX+09EJ;STC7bRT$>pExo>Pqm$CO*uDv1uAN`Evh)@}-cI3B@$YTRk?X1WkL9jEpAv za0Agf|5lu-tPXE_P4Xmj`*2&60D1;zMQKD5vZ&&?nG(y?%7=xyGImF(p8~=O-t44* zf8IT`(?neizcpd+2f0qi$HFFeK!q z@dPzzpnBo)W3!sWa$e7@?oMYM>$};e(i86a8vo~e`qppX=WBJ>`!S7=im3IhrHkC6 z<7VkP%;1%VtRA*Dx25my`>}Di9Zt?~=ZAmLDi&LxuYmK^VX^4}QE6FyA{duRr`9I( zc1c=q%+WD%tuzRdczN$&I0sX>p5OnDk3(Ung7sHFjTTVB&U3}6s2x%n6?LH&o_j3; zH-#j(N?7^n2d#kF;vYUvc5be03S3jEjI~4QC!!hp;Fs34OVFw3^F3>KPhZapl|{s= zKdLf3zHcx1zTek*zL&5%IU1D{H%OkKOPm=*>wceK13MdKVt|_1L~1r?2&*-)-5VA* z-e%9o?-kgkekqw%ZauB($QJvfhn?0=(k|v<)H)jX z+w6YssorAImZL41TQKl(bNS}+6nvY1+cZJ;i@|15U+D4-()a5;|LOhD^uqQhJZAs| z06-J&f8}=mT`xPCI6GU|n*F;RZpPfS-DH3E3HSmZ{OGU{k3=6&cjk{gXbLhe#c1uE zZIT(?I5QM?+&a2E6>m6b;h>Gwkk%!9+^X%$&h!1&Mr$0MYx2<9o;t^7%nPy9v3t1q zHvK*?>Wn;XYUF-_y6+g(@iiCToN)(fbn7uQhhrOGcm ze&@2%MWZ`UG>=#0o>hyr8*LB@a@I_~8ujv`vi+(8DB)7<{f)+W(OxsT?obaujTH!T zj*;-@0{=HSTh5u@^x4njef`kC05&#G3PYR2=Q$G;8$vCE9=G=TJT9>C>~iZL+<+(O z=(y4SWh+bZSOB=!A&0()LOFKsa;9`{%6pE{@-6R-|7E$p{2_s3hTL{91~Eb>)AJ^0 z-r;>6b-Yt+U?Er{m|KMl>!Zf@=A`4&Q)jjTWBFuJn64i8io7YcW_{GN^EOi3KbQ21 zBFyZPzkFfH6 z+51+ynM34`{b@w+`!$EwvwhxE1k)#UUw{9$7w2FQ?)K~f?_<_J*}9Ei5L8OP_dfjt zXXBQowy!gG>$d#?#jTtD+SG5-`d!ZJ41BX@l4_I(1WctT*b-Cud&f!5ZUBcrjMOh> z4jsCX45Lxj`#j4IbQysP!VLpO+f@#fz4{{c&1r7=M6Hf6%$C*jwbts62UKvm^Th3J z06*`!9~53U`1|Vx0^9H;(%UahXq)A>5>|P1my~+fRtOl#aW{mEytAu3E+}u*^2hI3 z7a!dy^UoVx)?sN5@3%iGLr5Ni6@`Okv_PC|D1vA^cgbigf(VK%vV)OfGIm-*UpuDl zg3{ruXe^?vMsn7ns09w;I0;rsBScYwv$W9@YTWSOg_ z$1cBO0>cvc5~VF{MY9sAECWPQGPyGFNVpV-wkQm~N zR&l9}0|cQQ8T#s?Ch zV{r@VP$A_&H*~xtcF{}lhCb0Yuu!c~(JZY33R??NB5o*dCE}5G4oeOwL}Bf_*nF5w z&=X)lHQ2CsP5YGngrKcyVv+U|h2R&3v%<`L-uPq_cNR&?Y@teFMpGl^UE)KDP*XbM za3*$P`SN*~ggG4yTCsU%K_-w2(QAbSN#;y&s0m(yWAd3pjF|F7MeJ-XY1E#qa`ifxX{!_nvN>}q zBErw60!4{CyxM#{tEE-SqKH8nmq=)4w}Ws}M9u#Cz}#?CRDR>&6LV{dQ8!Hg;@6oa zp*tO>7D89^xHy_6`iuEs@fb6^0p(H!TOUm)<_$?SJ(_B(gJah{~tzA+QS{c2AJc z-03V1X+tnOlB%NADkarn?B>WojUs5XiJ6BAE_^Eoc`}zMYB0kqLdpmmdBjVK7&!nI z-g_BYlJB#}6zEe;OzU>k7o#Z)c@>r{IVfA1cMI+@BW<|?A}M?}8Kj6)bQEc^7mzbU zsfuClyj7vW^@49E_t%7YjFv{SFBPTj!dE2$@p%X_Aa(gNisIhnNXL)mcca&6p!9;9 zMP5Ku?@^y1@#&e(q1-E(fxU=+HYJ#BnU?J~NcR;$Kb8^M?}~VZ6HTZy3*n#w^+s^5 z`NCM12fdTDWe1z#T%*t;Mi=(DW^#U}9yT4h_izXugL0fG`Z=XGpiHx+J)O!f6~&t1 z!~{A88ngnXiVq|j#{=J*d?AB%C8k9AB0Lmi^t_YJYH;wTmG)?}wC8O<6(PA7(4beI z^dBvQ=z+Sc!s`j9hAo41bzlM7oJS4xBR_*+XzS3j-a*+8y6S6fy`6kdy#&waS7z0H zJ%y<8xj{_R(X*|^EyTv`#>r(Qu}{23=;`)zIdfFEhAlf5R_JftgF=KN^zyOt3|=;R z#YVxE8V@GjRrARK3c5U5tnZ!czf z%=3jT=2ivi(PMdF_*UJlLymx9d|ns~!uQ_9fL<+%#nJl$t(+frp~+ayd%%i{6XEgI zMp(#XuO2ml3H2Nrg3HazB&fmP?eO|MUv74gUl^@*Wue)f)TWA(HF5RABV71y0b#1q zg@T43*3oaCh}73aVVwm2I1cW5t9NF&eNi`-Uv3E}i2z88YRlM5aQHMFUcMzbU`K_sw6 zGMe`+^Ts&p%R-PV%_W&2d!S4}99;9Kn9+u^r~iQETOGUxt8M83xHc^Jm%&U&5789F zaap8>p^v~B( z*W%Qcm1*mCK}U_U9>7Z znAGJwFJaS#BE8xYs6*rlTO`1RO#-Pp6A2A1G8>#{zgtd61ueQ!DT2z7a!X`5Yxf7& zLOF`)eFrhmrt-8T%r!GdPHiLxnt1rQtmVt2BXXZVn_GP(5^^3tF8~C^hwoo3VIzyo zU4QmhcNTTq*y_p53?W$dl{iZ7uEPQXIFJEi(LMdC*G&_=x51sBy7=6|^FLXdh6$n! z2;N^^04m2%?)-honVFsESf&6BTduB0Tle&4DHDFWpnQ6ArK=YAb;#nE6nQD6tHLXz z8w+D@e2%dVnJtvflqlsLmikTtuGkyQdeCzQ+1?NA&_Q;Iu<}5A+ADC|2mF5mSE7>zTlz0>WB--_{4d}#{ugj3Ww9Ahw$(29)Emi| zfCChxKoraokSY-7;O)6(M+`sXuZ;)Ll|^)#qG~!W3NOC}K3JN(MQeHDg26&o33Ivb zyH9gJmaeX5gabV4TMY3`CS>n2R>(9fmY{cUf zL0u|ZTIO@%7DvqC+Cny@Ay=SMQ59A@oC=|85#n!Z+LZBwCt{hv;+VoIP5WlKqvW-+ zP~^#fkt;d@abPW$;XobUo_@x{zdCgPi>|E`oYLVp1?uHFFDUVh<3dv?&B5-T{JExEKZFg>zxp2}rI=V3MUGad^ELs5|8 z#9zwZjhLu1T3F$@f7MNQ`3G^)ScTq2gj;xW{}+nwhjlu{fC=O{N&V10@OddfNJ12EE)fz7#ncKRK=QyQoc zNp4~xx{a8F9~oH81*7>AEZhW^lZO4c{75y|tw~SgrFVss7+;9BN2mvpTKC z8_`66)b1-0>}@sdZJAqm`*ri7GB2%iptwIS4UnF+d;PLN9%r+XTuOh22yz2-gNYFl z4xd`}{P=wNEvf}}W#D1wIer5JzwlxOjza(7P?|`E1{Cr>Exxw^IY571q)pR-bL=6*cJU3d1Lu1QwnGkLjNEy(<=qBELZT{ zdmW7y=muxPtKNVZA~z=bF14-_v5A?P^pB&tbYQ{q?bT!Tbv^(dmX%Evm$4)P9ROQC zKng*+bexS$sRE#>(~m&#Du3&Z*)B-bEkSG2g~=8i{g{06Ntu{;esLrH568d2d!{B+ zAu>{;;9!J_`BHxTo}R5`>*d?^{`qryG5VB7H9G-n+c#R9Wk0a0{Dc3W$cvWENj&{q zJy7xYfB650JX1S6=l`BElPCX~GDTiMAK-yr&`3rlfPXn6tcfS+1T^9I%_WNnd;1GT zxb*ZC{obaee^^ULE9ZEbi4JXb^HWA;83JT*r}f| zPe=*^aBS^)b;WKN=!7U@G46lJPTtv!R@^I*hcP5+XVQnlcPc8QfEovd9l1VZlt{YC za|wk8NZz2|rY8WFowgW(iqQ;li1Y}L*;E?dlCnV;Z=ISn(~$7vcXi}3l$N#p-Pk{8 z$hZ`0++ARRNwh^B#pe7mR=wYhwBZ)H6amG90b9~E%FHV@h%z~^=tLVKs&eSnUs{>5 zllRLJ7Ae7Fz^j&- zbWp0sL}q5ydDU}^>_2SrKH>jqU)rL?tLhu`T&72=%C&@VpQ=5p7z7V!+W4c)NJYwp z#>(Pe)H2l=fh`yw6q0_qPsowc^C$6Oo*`T~(k#x)2FI(0zBRt4FkV;W+CQE}SF7dY z?Y!f79G?;~q{=`=wg-8`Rv9bC7A8{{eKlf09x$N{6ok3|2G{o{TCf? z+b+_h^oSk&Ew-waSaF51I%j6(l*ycHiUGIBZDok^Gwz&r4MRXWz}&<2_ZnKf`#{6t z;wz(>tiEx^6>v^oaxz>9mOjoc;N3lqEKA_JJ9E*;S!0PG3vAqrrs8=^`iw`W_ zhh^FS-n%dAMmo-b>(j(grc4ZNZ-x>{_{DL&=FCo{iN(=^OXxv7Y9wl|ESV#+>44-V zVIfh*uy=tFg~@6FJE}HcTnOYHQ*yGF8M~AeZsfzFqUB#xXF{Y(?*+VeFAGexXkP(Z z0cq15oDEs=4;c&A3fGU=nRpP7Co36rkBTn>v5OlxmYx`V()~-urdfgM_kYP)WkKtH zHPkx|3&%qHA2O!0w@OS<5$!5_*t_7Wz32^>=%PsPAcQMCwnvAWiR*?FN+ zmD8rgiOd7p)5gF7*~@2E;1?&Jl3|`&MIVg^){DTbC-<5X zLEP3k234|zV<~WI$uDcZ0FI%r!@*X)+g(tuW-t#1t`+s;Xc!i6w|RYLjW&*yqlqPG z_uMzrtX?e4P@x0-1083zuIgtE~OXwKJpFfaIcA%1UL3;t;+p zH1QjvU0$52^FvqB0wI*<;=`qe0VR{FHvYIt6|9#|omF`4t0ZJ`{=b<7#C6!aX;T)-%r#2a&q_A_fz9w6CUQ=R>K|H zCm+@)=zr3&gs&1`^Itl)`oHP;zXGA;S=nHEgppg)9^i8yidR12l_2aGHsmKj%U0^; zmc^!!4m-O^pw7tkD$fG>^j+^=n8nL1c#6bS%t?V1ayh1CdJ%*12WOcEn zLCe}*4fGTyiE!1HyUf%wS6OrnElnl~Yf26l{Q^e{(1?Nxc9XRrje{iW z*$yrne?}{z3avs-Lxs2`B`ot&!5XM&;+ax?RduAtoimMpRw`8JTh+i^of!1;g(GE! z=*-xl!|{ehWqP3yOb+)#J2FQ==0q8eI--BW6fFMr%**PS-i5$n&-kSqrg=#Q?^73F z)^RpX-ePcQA#d|xH1_^4`RHR(@kkk5L%&v?FWIR^AJg|(;i0m91V}w6I7#At%c0L| zX0GAsSu)AzmFMD*UN-7xaa&GF;$!kJ@QFf(v_=PfTVT5iU`vp z92-0AOMcpLBBE8VJWm^?iuWL6v-bxj99^3rc|wc(Iz|1lN{AhA-_+Mn?g-$(ll`@Y z?c;gp$s{f4)Yn3iLg6%s(P=hLYmA->ovoo?)S^RA03)ljgG%g_r+NSBV$p9~ZH>Rh zlIvjq*NppL*>Z zkMjG|qI6Iiax}jjhDDB0o_ttnHc27?BAK>7LO;=DLI&erJ#`<%BQs(N`y*iYs!bm< zaY20gS9LxJ4K8K_Lu}dnL^^@IL|ViakvzA}+gP1b*&SG#`ZY|e-~4G0VuEK?=0*rK@a&a0|J|o&_8f zwse?moa*Z~k6w6)wv5s^m@&yZn%l?yS0n4zKjo(tVeharpHTvq4>BM@>weS(V%@m3 zr&{G08vLMMy4B5y2Rj%=-D18=I}sp5(AsrjDTz<<1*lK^aUHQ(dbNJKR^0e#)IlE-+~<@?pJ+ zH}CWw`CDBrs$CI{aOKK|F}W%}e4&YhL&1&##7L+> z_g_zz=j=1HbTiuz2F+b>-}Y|ZHP?r5tHh0`A7O36I8bGC{Cet#B*h+St5OV^ewRSk z^^v2^W##c6-)b=PO+jn`N=jOHJu}azkWZ`uG8UK31`PP6um6^g{=aJ>q5nHq;%shW zWAeX(ftYjBcfh~jDm5km0P24V{ww}(X60H##txeep&R|oPyMPp!T55Jkr2Fvc+}>K zI6N7JL$Py-mgvS&K+)A1I#Ed>pFf~!tN<`l*ONRF%-kRBy5OgT7N__;?kt|FT0EkH zZ%+te=vm;PC&MHA*KYh}ymcVjv9B1E@)RsM*kHGVuX5ycEIM*giW! zDXU}0?qq_*cil)NdoL??V!-Eb->1^Kp%_>( z)DQ&Z`O+;e;ihAuws_p9d!chL6i7&TO<#?l*OKZ=k|qw8LdTG5gH>BMwvA4u&T;{E z%|!+eX7WJQ%4SQS&bwMbW!l4z7~5_wx=#xLD4=wUnc?Skbt|>s>cGi<&aXGjoR_H3 zcCUJR2VFW!y=b~Yjz7yJpEtJH4d(kSo<^H)4?Bm9hKh#2XTqm+}y4{?v7Hh=FP6`nn)`elJWZmL z&GvXcE-Hn+*u;X7cF7@8cV)efbq*q>=g-9A0>Hn%QNJ?~mJYjOK_(NT4)6C;8A1Cv z1(G}Nxz^>3df_w;fp+ow>LcC^ds9aY9>%cO`-4Z%V7OWyL{yCOK0 z7R!OHSY~2hCxBcqIv@snYPEB;onF&lWV(RkZ-}p9hjWg-Ff=c?tM$L)?!EWX6c zZzLf{zJ&1lLz{E$)51`4`2Y?N+fYaC7j29q^bLsMSYXF7y>TQs(1~K=>`?VMB1M#6 zio0VX+gmIR%I-qRjgA9CKT4UE6w;=*yF(D49v*8lz@dX>6kW!=iB#Cvu8Y18a1rHO z&k7Adm?o*a#hXuosU-e+!b&_LC@^!Spw5It!=Cu6QkJ6j*Hl1dNB6MLw0vu(O!r6B z&O#V2s8G_q&~R~Kple*HOth%>XYATbukrUN$%?$3I4@s6mb!*XX%WYmoF*+`D)LGX zR|x-IsT7kNGU8#iot?H+_*;=-Iz*tT{@#z8R@16ZYY8kfQ&K?bw(NLy)vC@ID7pFb zm-f!SQDXlF;stk! z)D2n2L`v$5gLEB~AFabcb|q5>TlajUVJ#}VPPYbn!X6)nn=)j&q9{!{wWU4;#(t|F z^}Vv@FcB|_k2fL05iaXb7i(@eondi=rRcmk6QytnF`x1*Dxxm4Y*U(wq&EkIXzNyu zV^^6{gt}U|zG`=%leBUyc7!+y&XW-Ai+tngyuiTr=d;3_Dkw##nW$SlJ1^bfHbUkK zUQ^2q$bY?0T?_6+;_btL2cchl>bJI88kn0d5X)Yz`PLtQ?L?BCj?5-dQ@zvO!f_PI zy+PkPv-O#bC732LE3#82fXw;K`N-y#%yMjh+5PZZN0su{mIW@gH;Cw!wn%%2B~=Li z_BE-Dhu3wq$xx0tSH@JhxKnEp?do{CRr@*pd2Q{NRXOmq=_$$p5Ek3U9NS8%4lNz$ zGHsk-d1WoqwS~?mELW82oRY9!+tY*E`#OD8CQoNRfY$u{C$ic zHluf;XW?1wU?p($Wq`^=zr2xNTs*<^p^Bryp4B`-)(Q;T;Tcj>ltZh=^X zdTKV4sIn)wLc)fxh=HjssDJN)UzN@YS0|p@9^Zy#u*jo?Mk#AEVu>qpppNj54gaPz z@P@4*OoI!mF*=os*qPP{z6GdHIpbje8XK&uFyOBt(Exg4^mV+z0eDQ=O~#@I8Mxd( znD-NC;7IXmb2?1^MDYMPUAsgBL2yO)ypWO3%-)Nu@%&(!4c@I}J8&|x|sMFBnv31cIJzb7 zpZ16zn7&Wa0YkB(oahZp`uB_%iU=07dnpuf5@}b1I^eQuK}7^EaWN%9*trD~Lh?H1 zN;2y^n1{D{83Px8yI8_BcP$N71=>ML3*=W@LkR#4gL5gq8Vf%&3QJ^uT6rS5a!?@o z0d&dCyYO&u22c2pJvbaHGFNGT3Qg;_;b?pun81Fo3&94^7<3XjKw}#k^xwy6Iinyd zTM4;B^t#TyNOw?6HM$^K))gTD4i_4<556mZ!d5{ph^CqK6L_*&;)@T}JFFV^)2ske zOLSn$lR!AihF}qB0!(rjS>mbaLzFS~Aa;1V-0n1o`E}jj1zCZ&-r{b3Zyv3}Kl{Er zzi-+Ba@?W#Pzpm7mDZwPQNxcAMbm8*zQ~V`B4Y3pAP&gR?-CKv9wfWc9H2ZIIR3aT z>iG(JvVXnKF7kCTbicj*`NIFcU))S``}VYd%=)794F*cWwv*HA>~TBAUGUR>xcPIE z^?~2R>T`K~K58eU+soSS;s&dWP>L1?gQxng9|#!QL}*_?h`0|Xi0|u9iWP(hvhQpn zb^VM1`lkuw9DuCTA`4bR(A%Jq3$UEj zl`|2%t(R1PM0hZ_N%9ns+QwhcWjuTclRHD_P_g5C$T_QAg~{Bw(7PTFE>PD9vnFIT zvakR3{Fb2IKjaTxXgIiU!9p@9DH75cDRGC|Es!g}P{js>26*Vfrh)q2ckW0p@dJxZ zSYmUUeySomXWCu!@Nvgg)2y9kVwaE>T@e>-)o(W(R&N%B3Qb_V01b@ii#_-E5H1TFU4G zEwl{*g`Y@1M9Pb115_=O5dVu8Ph$A*C}pJM=;gskp$y!N@x+Cit=!6EXz2^5;_wfhOa3j&}v&~?V%UDAIIXv^nQRTO+EyCj!V99gDlzhji(7LLmo>}Rs;95>xpthLGns2ST3e%}d49?7+`Dq@TvZsA9K)R86j_G2 zd7=KovQRmz5^ECO&~;;xKz~Sp0xN@gOmJqliM2VMO6S+*uNXzXM*zB>xE3aXNyFO( zKqL#nGX&CrB1)Zjo+Rpwp^0q*!j&}eUs_9IK(`FkGo6+uS)plMraq>1?JQEC?9?() zMD$}qwE&-d-kCd?a?~w1d8XR8H+4HwtAwl`^EzmW=CH+XnZnpxtB6(kePl0&vYcf% zw#@IPP3>Hy?5Isno^4*^(c0Q-)XpDQOYUf;ocyRf#pQ^eW!tzCzYHbSqp_!jz4D4G$oIEmKS90*8+`+5GVaxVG zlOoHjcHHn4kLCJ;lky9U-JIAB`huMUM>8Z**&ZF!En{M61ebSJg7or4l9B#qW#BEC zE6I6%#FEtJaRHQtC7G+BzL5fa3$lXbi72;XZ2$mQr1iqu@|rsDaXl0EcbV&!MMt~N zb=$zYu?Eg5rv^#?@l^B4n8xLY+jRncmI11skMU}i_Q(NxPINos4CiC;#B$%5r4>1z zUvdpulyrfDRg37cF%K%0 z#@J}LBS!0-C57h5xw%FHW2a1*lvK%fz3UR^Va z2({ENns)35Wi2B!K<<+Q` zovp;L)WI1zSg#R803v!~}EW|PjH(#w!hRA zJ`2uA520#9@`ovufGBn%IsookEn2lb^Ge9kdOo5j)pll%f074ue(8lTm7t ztw%$bYIe%6vJqMku?QUGEG#RsR zN^qRV5p7F7&vhnSh;ZCIR7En~Hg~9&w#99VfplM|2L0p`B%c}hTar-s{cPB%;V4Ut zQ7;qC8L}wYzaVSb&Pp@4^3fGERNtl~Xg<^aca~t&i ze^I8iTbqN5^S4Z1t1Py-toer4v)^11NA)RXNWE+Q zG?KQJMNQmADrjcyM(rY}4s9A<$+8qJT;xI4Z!?eTHC@4Q6Y&vc%9RR?of7U!JI>^+ zCDFXIOG2QYwcpT%P#)} zuYZ~7cb7g|Umjh6cz9WBs=YuRAtNFHcPpno^lCcZFQ7DU!jZ>d>u-+BYP*uTF{J%? z*+R-5Aj=ZF<`fS2Eh>#7LTuSThq!-om^*NVZUZ&fMg)58q37Wb;awb_TkRQ`lI79U z{TVlCeA19rAmKo(QdPA(UTO35m0#IVLavP03HpJZL{E zT9ICkML?*9-IL&&pf$BT?h}L_yBf;;pkPA(kZMfE&!kec!s;$Ng>~_K+WGxz@%($n znmJ?K8%a*kgu7puY3{8FS*O}FJkHgy>hY9&gs#6V8z7c9j*uRK5bMgG-i!>r5ARH7 zthK%cv$6f5(Mg$$Je@)hN31!?wVgW7nJlb7h2G5%e^bt;UWxV<{tx>CaL++mi$=9- z8nX8In!oXlU-SO5C~uAnujSwDg(w`kz0kJzcJQ{}+yMHhjLkx* zE+ofS{o;8!XH^`*?xL$YvKjV+6Vd;n>z#r`3%0Gz;x5~^ZQHi(s$I5i+qP}nwr$($ zeNK1Wj{ipY!+OcgmzfbWW9D4r8)@Hnm6e;j9w&A7S;yp(jjiQOa9Lpa@Tvv&YRmU^ zwlV10D}Y$Fe_n<^54+2%JzXi6B8=7oEZ75OQnie!)8F_S2)erq z_MvW%v}Y4Ek2u2vB|*9jbnIi>WDdVAUY+d5rpiI?AVyU|`m5;2913(n3u{~-)M@?j4|xkPSOEIIQazCB1bAS@Y5LIhFM@`;-e+;eA#Hxj2zMN zCs*5`RpFM^!#BJ6u3kGDf@ES6l^z4$B>mydceTo*MrM`@Jg=!9@56dzV@M_!HFJm>Gdbfm zaJdHT`BYa~VeP09_RZ@avaeCE#iaqKa?^bj>7{V}~?J$qP z%7`-%gTRzBkvngBgfizQ|se<(jxbsv8AnkjB??g8?9aCWR0^RI!zeL9E2{n;#b0&mH)jI958eK`D)7Ih7EQa(+p)UjPc?$&f)8j1pL|MAjJWir^fn~>xb-W^4VIE~n<}sz$OswI z1m2Ylnxw^aRHO^jE#zjZ5Oioe`XjC`lr&8fvvKT~Qh6FN797S55p5LAcGo1=I>HJs=2_&~x$59@Gf! z7>LdCf|u-D-@+9(6bhPb?KJl_UF%oaO^whv7SEbiV|oruIRX>d7#?8fJ#E=DpP~U- zS5H~N{OhrRq@fsEOb3#-u}C~J6l|Nr!YMN>ls`jZs3N*p4k-#Su>T1oFALZ@{Mvk_PE z+|)$W*VbE3zf^@$wEkd6>k^N2S&bars0ej-|DDs>lhQ?KjVmn2#Vb&$M|?T~-1p}n z&yb4guKCxg9?Td$r5bl8!I~Yq(B?>z0VA#+4jBeP+K_F{GGWDnNuil;YUeu$pWV5@ z31tixSU!fGP!8AjXm4o=uc&W!;xlBUCS zW?Ou*s?u~}Q^AW5rL7=PirY@Kh#pL;P2Q;?!|p84nS)wM6C^;RQvEX{8P}kWcrS~u z(9mS~;?#r-9@*Vi^&V_rwX^^2^e;nHI@%`VeI|Aj%E|TOJSbk{aI`Atql9YS|DLN> zoF2MKN`qkw)lw0$Ec~s=iZU&bG`>nAw%yq(7t!biw`VFID?Bv_%ndw65O=F)zhz*%At<;s#@(%~>BYw5Iv zMm6f@JWC%*mv&%DmP=+PZ%2r8`=28muIi>qdneFM2hhr4$xa5Qo!}nt6DuT{yg+*$;H?H65m0AQ7x8ZV&SP;s0{-BlILQ4p>fSfO zU$*MVQJ!Su06=uU0+mi8;=iHFKnZ1mtLJ^ioFT^!XS|w1p${Hok@Bu`TB*s*>VR$= z8|bB_)zA{6g2`~X)gL$K6@~FL5s_zR!|b|=V0Ylze+S}fXUM}*FG$d*^y`uUAaMkg zvr+GoO7Lq309dh*nY{26cKgl{0K_}Zq6t!&YQQN3QKE}Ey*`QKn-W?ufK1L?hHvZ= zcWAalKw~*)X}4S0som=0(L$bH%|Y&_Zun!r?uVx%#!P=&{yQYW;mLjsOX;I6UCf0lJt z7uqQ|L^6CKUe%u~km57tTC(cSk93(X#FolyR_K+j+I_wGuKTUTE1~Osh|T5IR=l74 zj+oBQu`+5>8Z}D+` znwVRI*NIqhKmWS;dc#|?bNCTWvj4X?cVNvg{}dsZliFFQ@#UK$CSyF>^`-acCaLfb zMU=`FPOH%eyn1GUBPFlf+x_HX@0Y{xNp+x>-qrT^-&9?uuO|fmp0UsIQ_*gWkQ0%{ zHP#E5^zgABtw9T^i|9a>L&4HfK9+Bn8b)aLhc4u0M#31P7$+>DR+^QHF<(=ade`5> zz|>kEB$9kFkQFRpm7b9&VeVYLFwyOg=bi6e1X6f|QD~vThis`}Y{LTgdHcfzx^k?v zH<*7~?n%VT;AdNwi`*NOJhz%Zjj2lK{0@aV`dC3o9|Eiw7S)S@>r7Sbi^)e0tVXM& z_l?=!G*ZW>(?dIDWatJXU#=D@o;9j{B<(7W$ zO$Zp;SiTD#ea9pEzCO?|r_f%dawJ=%1-U{?AWK2w{yt2Oh z0sUcs)mmf@KC48yj6Fw1An$PbW@O{OK6o+LrbQooS2xr{|A*OPig3Zh?GBIE8t>>hDvulm<{rX#6bggx!RcFAz4>bwqW6s|*84=@Nk zG<5=FhW>lVk{RS`lu$;;a7`B79G;r>M#&GH;Oy5_4bn(c+0o@c|WQo4-@_gGoJ%EA4cE-8DXH(MX=6`TPX+yRxoqK7}c;3S|r;(3p}1Eq1n$h{5$o z-uPrsXBjQ^6^~5Z$xx^JX@sQT{su==x8E7$O~{Nmr<^Y}$I6%d)P9do45t7`3MU}n zK1zh!Ex|{9U1+&eLMy-3$AoR38^*RQVhWi&@(V=i^R<k}4NiadtJkdkJl+BO0Nd zfzYho0qVYoMU)(qHdbf4$T~{=NJ#5|sYs}P)yu>;%GrlH=;X9dnpYPt*GR^(>tA8} z!};F6jt1pY$gxhSIrK8=$xbt->E_ZU6SNX`9ewMUHg(DRHedR4XL7af%6j?a#(20s z)086$$7cAO1Y1L9dyT{qnCa@j(U!I7n9z2X*tgdBciJHg86vS1GnT}Y8E5Om#^Luh zGl(QBol#1RefcGC#Op#inNBlcG%~%;*#3g+jrJIS-tG;i9y7&;tK1pOb%UlwW?+F& z2=Q5ottR#kGmpV@O#zMz3D5O%>fgk@qJL^LgLMB)TwT!7c!=>VVf+C#gcSY_o3Q5} zVJ_zZMAc!e1Rmf7Ys3`&wQhKqAL{+z+==tHnSYAL1T<2_z*6Q=kwd6uA!aVme6BXt z&TL?a+#o0zHmJ*dnTY<4LL=G?Pcx#I)+g>T$GtKrWJ^u9N3VR3HiSYvX6D($zn9#H`goaRx?xsCH9mVK!tb~ z0*86;s+fT%m{CBT`ZF;#Acz=Aez{Vam1QdI;mEjZ&YU<5x}?6n&UU{qUwiJ}e942Y zXsD*x6@BGyryo>W*7-yfy7`oGy7hB_SK^DSOO3oi!NXi{RrI2&bS_wVL#5~de`(D zasts*TJHJNl_kV{^d`lui|!Xkb3!+<#9;lC&^UgWIMwQyv|&R+r^uJ3JG`2{G`8J^ zqaSdke{x`!-Qam`!i2~eR{LK&pz|VEq~pTW=6hUTeS1x}ryOXP8C9I1Eukw3C;D6a znb{rxL^4*9)L5yIc;&@Wm*ex$*km;Uo-tI+Fpa49kW$#K5m}ESW|bSnN7T??tV%X= za|#Nf2^+v+$3*T#X_#Ll36;?BLigpT;i~j$N#RhepA?9tT30TdF%+_1L-am?zb6PeFkP-?+v% zNJLrJ6j^kzbb$upSQt5L{{;LiWb&M!6<1f`x3R&6wsNk(1lE#HLO`VA8w8~7a$H2nRVKtBM<;EhP*6tj*ESJ+ zuP*D%+rDzvu~$bHDAA>O1og!*N;IcuSuA$|4L#}4*J(Ew9iP{8=6Ggp=Gc4v;^itF zu2-uKKOeBJa}Hl^&9>5h7(wHZADR9oOl^(yPh6K!;m!Je#U<$8GT!cr`}1C>+AE*8 z?d?owU)v(zb{qcH#YWww5t%&Jaz$>JzDLvig%9A`^NiM?&Yh3X{_4!W8Zf=^rESK%N%PA>4QmHi=p5H6Z_cNkw9kNxQwa(YjZ@k`&t&cmyyNb+>yNeLD*>JV< z(_FPzA1}Gn>+0BFc05p-e4MVl?EbswlA-;n zYPRPLxspa)eNRjG))%uz?l3RM;pkNz$uy0N`w+p?^)hoblIaQeGdl>!r@Pu=hObCX z7bDJK-gz`0bWIFrLZgp&a$&6t_lx5JgiKs1Zm$fc$3xrEea6@WZ=Esx04w&KvK4pf z6)9Ko9cUnkq?W`iY&6+vMgpV;CHnf=j%b*v%SI3#6kAqbQMMeE<({ z!hjK|U9jJq_U)VioHv811ki-8-LCpXE3U@u219qZPfBM-eP%%%7c63k60nB0FA}*f zaYxNKi9Vnq2H^A0tm<8;}-L8m!>unM&&e%USL{pkNU2v$;)VSpj!g z0S-?L9bKw%ismwdAFCaVy^nAN9}j$;#q;dIsTVd7ksEcOT9yX~WK$?8r4i881`>PD zu7?M-K+jv4d+N;RpZ>NC==v$|hFi3g_4zCiZ1-*w zYJ@KBUF}Uo&Yx%I%wNG*ffyLGJ2pn5x*;lF^Cc}_<`Tk$Y5a#>#qXHYZmJ9DL^10C z8!SEwu@t`@Myj)2m_R9D1ay-_fJ`}GT z7WCzY4*>k=?RvbHm&5J(r#~puG#n2b&;?8576sgrJ6VxATU@h z0OF1SU(e5Vzt(TF>uL5d5Lr^J95Qev=BGJ_Zw?XcALM>K3_TDYdRv~h?}?w>-T;oP zqnXP%F5dRf)$!-slH8w=JPepYx!trbf6?`$5w%3NU-PJS*OJ@qoSteW0MX;B2@%1U zba?SM+mBGT5;nfw&d2Niz*kbdZ;8@A<~UOk^+?F4JZlhoc1gO3NQ z&)puD_m}VU>R%{eBz9+q>)J%HS|G`BD)1wWzR=p8Tpv5ne;2F0;w7$uSa8jSu z$UrUNN_G*QBPM2O(p6hNulK<~Fx#t=#5oiB7_e5kjFxZV;Fa~avu`*vqAH`|{ED^ufgbb%EF7-W5UqUGJ5xwpO_6aBAaw4jcb zAE|n>JAj{iFTTBBlO#FXeB-VJvBL%h9cJF_Tg%O|*~344qmCViQ|Pp7$S|O~F^R`@ zoN4z>P8RfdrJtds(n|DqcwT~pEsL+dZf`%Yb)WbBtF=hg0wYw?;c?4PH@2mCz7Fi) z2UWMeZ||LOzi)Vnv%P^tc>B|fvA@#lrnfsR1xW#8Mx&Dn1@lWL7Y}jhKH{0XJ)U>1 zwxoJqGB?sY?nb|(wF+E%-K_378h%AT2DqAk>u~Md;xz`)**K0!L+fL?jofO>P{Q+T z5qW0tJKVUPs;+>6(H!vzRJ|`lKoG*1z(B2xoM1Kmp{*BN#*5$_uH^BRa!CaEED`J~ z^Q*%OUqo;#W>3d5L#Jb*6=%o7%ge>&Qh4-Fnfgfad>!pRrMA!9?10}(d_InkW^jmU z>&>h_eo7a6e}49&e}lxt^L!tUk8a?=^n7{UziaWo<0T$;^qh!}k1ai4eR$emj;moxn`@#0h(UkB|C4>8JXU1Ec~-<0d^4 z>q=o!1|3;}F7`iLaeZC@-3xWE;9Sx4yr(cG83Js=*u#h~!4xk~ zFYiwyi}BH$^FpIh0mwlP?9SYl?Llifo+s_lk7H{ADPlNJ{Ln{@lW>6nMK5O~dNsf& z)S;wc8$nczj&P=I?DnX1xi1~AIk!1l#(%)(dWyr+=XH(fz{8&Lnl1md)U8@I-eU(1 zI~V^vy)5b%Uw|_qU7gKY4(7nA{qp^XZ2A923jQ-{^j{Ndb!)5tMHFxrs>!zeXa4_j zt^R-4SvZ+k|CcAoj+223;D-;n75Fts_pHGb4yz2MK0{SLjdPX}Fhetw`Fw>i#0v$_ z*qoYtoT4|_T1DwB50Q)p;vNMpk-w-Ks`PubXjKO$$}~(-#Z30=Bn&Hjr!L}eF?P-_ zVl@c_k>EF|hG4(#m^p{$Ky06RRICu5Y*96Dzx9yf70x7sB*OZV5ZiYfR*>*CZ_1wq z{9S&qbu(z`_Fji<9MxuGG$Gwv=oHc!bNohurXn35x_jLf{$EhLk&vgz@xL&|{)LJD ze{9Ep!u+qx{eNRMiB+%+r2l7-4)zJ>u*)KPxnxM)Bztzbre8~-yXhw}G_=9+vWv!s z?&RH(<=M8&(Ym3t46kk1uwed&If8(nMw;w7ynoXY3l&~{)Oi%FFuos5b8R^mPQ|Ph z$90R7X@5Q+@=Nf;-3s07#v=XHdM8LC>v~W|d#t92v{vax1b1bT?dp%Ra{`A<1u;jM5ZzN13--S5*kc`k2uXbk{;CbWp^#jz?lWO(v zBk`|dib;6Nyr|%=l7(cK^BW-B4$WOhR_oL@G%>T(iS+N>->Hh;vdtm?o5dUq> ze~mh9oUIK_9R690{YM~Nt@b}w9ngRpP6(HWa@a(Y@a!`2gya#dJODHbs0i`M;uEqf zpb@ymk=m8y9+9vTQa=z8G_FSLM_xN!?m`o2YI4k%Q}uB{jdS;%Ig9<&2Mh*{bMG&9 zo}3PxiUg>IQB2sJv+A5`skXb?)FV}SO4NOIzzk{FbPwcCip3B0mlNc}$m6sm@p}nm z6*gl8gm81TAdTgLiWjAXs#O*{Xg`lWRblypnMBN+L44m+pgw0fr^gqH254^me35 z3AGdESTK^(QsR##geS~Y*Qo8gyW?ufU2pQ;~je zU-f!@f689?M2q!8kW5mC&GIKvTC*r1Hsch6VMP^nqyn0vp*lCfbK(ZMSJS+c&3!}9 z^7zi*1IIm~@^Z`@Gb}!;mpNxMe|`f`(ZzxaOe$yy<-Tfy0WO_EPEz;>n&Oyi^B1u) zLQ2D?^DJLlNgOP+J7ggkrBXF(Et2u9p8wVYdC)+aFKP6`e*cxf z?1K}dS-Wio`K|Ey16E0Px8JrLD$7CPSO}?+=7FQulE2Z*!|W4=9=lLWjkb%7 zALXum*W?PN)6~B7mhe$gDQ85#-1Y*dwQp;x+2+I=qydxdv&pxM_J8a3aShmR1OMeC z^gj!L|H(&FTN@{314FC-zT$AKHvb>w+gt1aub|7;e! z+OU-B695-pE=;V){~i|e3wm))&(4}nr1sQHp~GI4wr8uw>c!hY{LIpyIFm~WmJRJ z!aYZFB*>tdiZp0&IzJBD>`pC)JLGuWsUZ=ZwIAbpG0D_S*KaO|OOA+boG?TvBaSFu z8e>0Q<5nU;P_%zJO;$O_x<#TTJuWaD8A1VaW=b(L)?fn7;>(T%p)ed-61q``J<81W z=v=vOOY8(qN+*=0x|E2P_@>lvdkStlki%}KYM3E#kHJKkV|IMXodEsBbO6LLKMc-M z)_%i90bmukBA*j-AE~c)?%AotII5U%-H@hNh~<%tS!%@n3t6gy&2*KV zGXP6zSk0&(WPidilc+LvQN)iyuX&Qr&5Z;6q z>jW}Q)Weaap~H?g@kP=;N1|D8{E_Kq)%B1g3t^iFzyQ3E0U3ba(AFKdt1*L76;xS% zPEy)`@YaYt*o(a-q|gyE8!Wy6+Y~MkgO3|Kr2M+nbO^x13-JG6Z2b?vX>DR`Ver4IE!^uj z-CPm?fUbYv|L~jt_d*M612Yo_T00xFU`-QwteHhv5Z6*|kB85nTzA_OV_O?nIWt$=9B~#DcdMw@|I|2IfYgP60Qh-5 zEz5KAx>AJOn1id3{Tf2LkO~Ept-s0qAJpa45CBUf2D}-By$feC`rc*$etpNiQFW#g z$M+i&Cxn%!1?T$b2R4v_KuOip2Cy@=$jueS#myW`ziG1&0C{Fgaq&wJ^qfB-7l!O{ zibr?pwBQgp!A#>(Wx1L}iVW?7hUSnl^{SVqmXAJh3#PIHZ=9Sft~ZbBBQ0~RAI}SP zSsmFUkcRW+pxF%GG>94>wV)t;eF95o0{TS|RH>QG7pl^^DpdSY+IHYyK3&5T#os6T zE1%~>Z>H5Mp4>82gzW6<8AtYdC@3f_*i!H(XJ_DIsiW>Pf|++WH#YD@!Et$cd$Qoy zzQ7GQuB@!A2M|USx=2-I`+TO!zr#U<4!R?d85#X@pUe{~7x19*tIPaX4Rz}2U79Ai%~TyL>o1j?MVH+SvORV|_GsRGszSc; z47=S^^!In`B=#exE%HS239@5o*=eEV; z>MGP?pBkvwZI+rWZJ#Jf!Z5L9+IXGI((54lQ;Pf*pPI`Rr`o3If`a%UfKwMl(-u)9 z?mx$Q>-^YU`^YJsUSi5WV#89kUf}Sh2vsHBB}Q9g$}AinZRz#g8j_ag)L7iMAJtvdfbJ7ZNyjC6+rWl~ZI zb1OT3(}SdLy85`AtiP1tS4Z-kJS{p+7$v|bxB7&+Hw9Q|G30-W ziF&D4rP!E0yZ)4*X;nbc__^dC{KuJwCkZa z_U#tVEBnN$^F75%mp#6#4o2_9GNcJ}d*_XAADgTUpaNdy{xo8gqOAJR-1(7tG&4P& zjqQP}%1XsErQ)rbLhDW;&2*rP>TovpI1S6|MWvq$Q$aQJ%w)%<^VuRA$&EvNXM%Bo z{Y)Ko+C#Fo?ft#z;?I11vN3JK{w1(RD1k6ore|SJn`UVbYP+I+m|w9WitqZzjjCK= z!HFpCGpdwdv;yEZ^W*(l!lEvZmKd|JiKK8r@LuNdQx5tp*{y~1QQDXXZ-%@=$@6jk zyuEkvZIIi`*%zmL-El#~hiu)NtL(m>jd2-62B66o{&?7JC*nYUX?giMK%c&xX?p9e z#4+QK3D-*=8VlT(l(Y{#>JH2ZN+exS5sb**qUfvn1J^G`yRt3ZPED-%9meD$fa<=q)(P{&kkN_brE>rHd|Y9-DqY&1GY*6 zdrS~ov#+jVgU&fxXq(=_mF%`u(@4*^4AYPDkp3{UWer*X-Wro?QjY_dK`(o}SXWlI zF`-bwr#{2Qgpoo1-9X*v-QA%f?dWtm`iudwtPW3od%3y(b39KVaSx}~kbb2OUH-X? z3Esr^fR3F~fl+VH=>>uG#f6MwgxCI$MyFfk@M}Y$urYABBOR<~8|_0)Fq=NjtN*G; zMW0C>75^Yel9=^S2ZrR|q4#G(qpi?=CBq`z%;HtCf*?{ykKD~^yPH`fMJOYP6f&+Dab5}#s}Bp9dBmB=zv?$V^6!@|V0`Di*&s{0A!vmqOYW0g_X6v)+5<%m>wq3norY1r#D9P5 zN)?bc27e0i#`tQKRTLUk!|5Ck^6G^63B@4o%VpIAwvu|C^Fs)SYjTHI$8R$#W_U8aMih-L(Ixv0$3BBPrNyW7c8IyK06LL#XN$n9ck=jVUsPhAan!42fjjl!zs=0b z`DqJ%a~4R22}?^Qtz>0nE@GEq=i$j22Se~w$M)TH^zFn!W5T+tuQZAo7Dfja5;0FL zGr6R?4D%d18Kw{I3#3q%0T4hLCp|(nxqbbcYUsKi!q%HyQCUf4gP&8#z~UF}C5`}u zVZCKIw~E8~1j5V3xd+Q(;OyZNzB7i%q};UJ2i9b2Xj}5@&4nA zb+^~wWM|xpvGRzK+AB!<%n?9pKay8ag&kgP2xJG( z$@a*5YP3+{(%wc@Q*nR;Sq6?DU|aWmKT*48N}ufPxVW(S*9+5AqSxpkABw(S70GN= zC_y8N^w5Gt7jgrY(BOJ-PGB9dbrcLLkEhB#H$mW!JtRV_vrVo5TVY_@$IJKQ$bfXk zba@0OETCmIlVQH%4g~1!lsaI4P1USgur7^jWSJyx1LSGj`!!|QkGA_cg4|vrkLpmQ7L4X~< zEX1v5GIwQOaLZrW6R8_VHD~=p6SNESZTG&6H;DwR@G14>ce{ly$qnUUEE1Qh^a)H5 zK*A>9Bc$Wpz~%WV`Z#h_iBA&CTSKOU3t?N;tmBzr@<(9pks(|w2nLxa@RElCFvBNJ z{orP5k|KHXMPoz!25BOvG~u(lf*zDKmPKE+1{?g8pDMBBsJbH`dCe=)Fr~Y9B#n0r zRfFv}$;d{=_v(pS)C#u=_oEvTp92s`Db#%9x3>%-!3}>_CrN)g<}i=pviXYgdweH{ z8^w1R%{4X1LW)fJh^1vHGVQhN-t~1(t;UqA(TDl+U_tGl{8^b>F9S2J*V>;^dsQDd zJD)(OiQ(FVrTv+UD>oO1+R<#}+D;bSs|7HqUu$?^%FqlR1uH*%gSVPrpAaJ$- zd0l?I``xieYp0od?0?Uzy(|}L`U){*PXA9$JL#u3+tEQ zBqgia&$=$tuOAkTjGu&6MS@-X{-`;Lbu#sovYh2U-YZQ3e6=Ye`|A`#`ngP} z3k!z0eK=4`xT%;WP!ccxE#f(RWoqk%4$Q#zO`r}lNKTBu0&Z+0pFB=U8>AP@hx_}M z05BFrK9rt4LS=pWkyE*J6U4@*JTKe0R$P^BMVciiG_XI+srqy7y zUaYXXQ!5+1wx>+6FViz)(JiPqyV=pm^>JhldaY>Gi`I%4OW(OSN;eALMCYld>pEKP zuoADkTH1$`n!G|O(RyQj@8<}9#oyq@^U}`z>stsk z(FPk>mcgMD#W(go|3la*N%*o~X+fOGsU!fz=QsH<9L6ZkvPS@QCJ!Y?=V%;Z7wh}f zVhuh`j)=ToHW>ffjCaw-t&e0GWdglwQCj&FMW_30bv;MkGHy>1xiLjEvdnpn6ni33 zZHt^j-2InF^s`qx_EMI(&ynnR>}k6^-6|skOki|Wp@IE~ts&UBq2ho~ffJ~KL!*lD z2Ah0R5qoHfV}-}c5ea+9EPaK?I@1i3Mq>*bb!CT`Bg~=>GOVM*nftq_Dnv%kXs~3u zI~l!QP1?&kQK&4Mv*QJw3n+yI`zz=6W$Y9f$~+7_v-3oB7TqWBV!vpYZlwVIKn>tn zeaQ;g6u8ZIOH*8e;G1|dMvET?f*9@r9r}qs{kF%bP!yxF285T%0fd7KLnTg#THH8W zUFt_-ioT;qNF7;Ji+C9KqGin7uDylJEfoaSY>^h5lXC72eZ2_WNAJPW)-NLZcZ@cg zhmC3496c!Ys=Zo$Zo;(r;ba$%Zat{9Q7UO@r&?{(+m2~5dv`szak@HHER>W2D`{!e zKcGJ(Bg;_G?0sKDoouKZ5(OA2>@~(bi?|japuwOp-`csikW_AJWUD~rpnWoXi2WF{ z4#K$5l(7hWe-y4Jd})qI46%{aL~L@9p=hIEvhhGrW`OxUFraw;Lm+X=*>Am4MaY1& z(&uDz2L=V<_uk7buN*rRUXkwAjHG*)qAbISR2Yusei5t34~*j0Tq_!wo)Y?ZJnTrY zKM`@Cjm80mpj%l=v?gefU^kjm$lt9id6JNshUk<-ASWSGK)VXKJufm*Li!7vKza&d z8_F$le+1=w7@NagAta|Tq}m2UI@}l`2}u6b>e^JA(#&uOE2|7$W(-LO&_yGE718eF zE!jqi`F!MH{if3%2}53RGd`B6u%rHZ!iP4oG^i<%IWZcU`&tLBz@8SuN_0FK?t)l; zeC8$(=1)VXoTTJHxcl_51>>o&>#{_bHkG`P?mwlw^U_m-SZ$^_u8k~c&0X~w=gbXU zWurqGHyzor5px?H(7eiHmMGIZ`Wi`c2Sa#|j+EU?y_k6Jx+FU3A>WNO->8Z8!e%`I z@hPs0rPP-HT71jYXFvvV_+8k#y^|ev$1M6;QBoX;fi3lZG+DxM`sX~LaG$pB>H^}S ztu`d}(o?(*#>Nl?<nriW)It!2*H2nFTMcUbewKG?5S{@ zJ?*Pvt^hjVuesjxq zMa1H@Pt;}zHW@IP=Yc+m{=j2t#fn$i1xc;lOG@$q;G~MW5F0vThsgaK81MPLr;uLS zf7e!dHZ{<#_g<9Zxk%aUw5F|!hM=totHkWtDqsxM=H1`M7{n)LA4I}_v|H3t$So;h~GUD2(b|CUAlr{WTl?^lZd%wn4X3& zyz(CW$%q=^CC%pT+`e{D`GHAL>HW&o;xpd!47DX3JA5+SuO%08k~lO_aLlkj4+e>3 zV6r*4Ok)J+pD&3l1WKx1dTnnv#B}M^8jF2i;A-UWv}N&Xr9}z=J*>3*X_my02}hS4 zB5Mi;(InR`#21}Sn?%yb|LxODnt_0^)7s;?TX*Zm-*!rvbL_J-5*6t!N>2$0%FPs% zW}U69Q6DA%y^i99BY~N86_vc(!+=@!J?5oXC*t-+)X|G%zt;Yhr%<>NDWa6-nHt_) zrL!2hX3r%NVt$O^4tp2eAX@z>MfNpppo$0KlIP6v1)%WJ9T101iXT%h^n^_xPj z)ITQ)jX&P4Z{tiW`??uMX@xQRL=(sA!B~=CGZ~S2*&=v(bUnrz>^@I>;Oh|T9wC8< zTHfWan4Ol)i5*<*v}oU5D788oTZeZ=w{_L~xh@LgAwj|5vl zaT&{RR%rEN8LA>0n8i#TBdb4?b1|mZWES=|J(_&#e>3t7hm1iJIL7Z3{kd&orI>&s zy94X7IXkmRCU8u4V7f;zvy%$ZJ@U)Xy}a`38gh;pbwHnOt$DBR)#Pj1bR(2tC?e=% z99p;d67SJdAwe89DQd#O%$sRUz-JUETXVYCL^6=t(=Y#ZpY#n14@D>+!V4SG07T7} z7)O+i)g3@6NjRQobdez)viPmg!2JMpmvDLJOQ?J9)ix`zEN@T^mY#XL^I0r^Otw zNxkMD^Gg@T2WLO1h`$Q*$h34thP^gz+FvC?7q%Dl1EU7`5{9spEIXqq3Cov3rYXgN zn~%Ge2LyR?3zr`wb-7B~oKuh!l2XHaL;&WBs-YbFa`s=C}#RXrCQaF&LdB`rS?hHA6=I|$rzdTUN zFUy9_aP?lfOcSx+m(wQtg{B2GKGp4M|IUIf3?yARD4^3oAZ3^;it0R# z>$-408d&C)jXfaXXbtVDV<-yPC2a5U2nZE93d%t@oes1Ue6gp$*l!iQn9m8S%4K9` z{BRf_>zS96+^f1?-nJ;xk;t*M_b$8+-(Jz$U`IIb-^zgeYS!EHLMNqO-xxbUU6=Ia zE?jtIs(Tw|4jt;nWQw@}rt=NqR7gk4{QYYF`dICWh5GfgMAQd9+2MY(*HfI}k;~^) zhN^ol-*#l5*J z-ePP{7q18fT6~V_E_eu}{#jHQ_ zPjpiI+ToQTWdg7&mfEs|C&%VET!4+CLuzH7!KqV8aKED|%=;FXDut~V#dlXL!*fu{ zn?|~BA7Ywp=uN2V=mb>c^26LWu&YI&uuMNdjgFVks>klZDJW8`09*m5@UTw#m^W5X z&2^JdXVxyr#pgiVPMz9m~04C2oY2vO`%M@-VlfDXZNs>OwY^x~ls zgoFO>rI_bYpL5AAXwYMIuNM#n1hYoE;knt^{Mn5XW>rJahmR((B8#7Ixkq9yV=(4f zVodk{Ro+#GMZt7!kd$r&q!E_xE&-KNx|RkB5s>Z_6r`jPP^7y#GG7w&$*tr>S~j(dH2by{vtrFY+&Z(>Ifn2gn}MN@pEdCr+S zp06q(JI$N7JDioj?f{l{r~0hFV4^>Nu)7~KilB?2eh|S1c>!!ZN)^<5VOu*)iJ+l! zhrvjhQAvFVbwUKVhK`{ohsV}lBv{=c?NVgU`K$FU2jBjkW$#mZRwVu+>g0%WxhmlFb|brTR>Vh{nD5E><*;I*9OfYR&_3)@jHlh z;?or?ImR>0?Bt>ql*k{eehvK*%Z15AwWuS7AUm3|QjA_`&X*V`tz?qnF5zdHsdh9W zL>j4ovk}-$!%unRn=xsS=>FiduxHp&;mLlk28jL{Yk*Hx1oug)nch~;(^`yx36%tS z{c=|F7Byx{O=|P*w%m?dj(p)7tPK4_-%hjEj(v-_qE0r3l7sz3BGq>}g@~5L^v9jK zmGMa#YCjshx3od)OS-PYH%ewBB7S~K-NW}0FA4?wG0uIe)Nge#Q*%4H?`ula4X{kr zx#g$Vk*QssOeiC=SzRg3%AQx+qk>E0Y~k_6_};x5&9Q3=yE9+gWbw_P5;?v9xSe#3 z3g6_B-2u{4-XKWd*ZlF;>4O2cWk{kDh;CT1HRvR*HV;@bExu*5s_TRFc4!5?)+bY9 z+TB@@922Ri(ARqe@%IaSQf@UJHPg>(K275g z;<>qo<&W+jI~>#glSNf|lZIHcQ*TUOdl`!qvrJVbo6(;oc<+Y{aZ~*fvB!u`=3P^n zA_ULR>>+9%-U>U>X|#Fk)OKo8h)sZLoDs$)3~hkTw5&kW zlfW1=aQ637Dm67O44za7P1&>iF|o($EE_SgJtytQhQYGjdRAtL7#a6y$-Iqs@<=VboH)Hi6QM^yRK&-bjA2J{#Iu23V zv1GRzX=m&lK=pZosTg7KL0>3zPPNT3`R-;Y^2o|CKn!E-sGH`xwS|o2F<6&faN5+0YR+u2+14mdA~MWMlQzW(@K4#> zB9PHuZ%wfFbM-*FY`1TzA&S8z?{#pWe(vSK$84Bf!FU|FY zwS=?P7hgQNlX;{)dIMR6e-}MQ)K;eAxs^`x=lq_)A{jx821=te;HdiBB|6N$bFYM!Hg$7oYJNOsvj@VZyI!? zsID3Y*~L#~L2q#bK}AFrW^_6pn}vShUYFo9pGn>tnZ}3m#zDT!JS2%vy4U91tJI$O zi3L{AzCq4;e-f_vae(xp@eM%&=>H+@Ct0K8(C%e8+|ujUJg~J!ih2i@@^|^b7mH9k z&@&*P=*~qa@{p5}T0%*MKviC0^zeY(v~rq$fsUJHKZz_BnQy(E;QjM2F(X5-D=>oP zeeuQE3#A5tp%e)=EON0SnnAYC{lySJs)Rtugp)`b>NfiK{0$)lA0B6uDe*nZQIiR8OKytnblI;dDxE~yv?<-n; zW2Jbg<)_Z%BKDKEBC6&DC0vIX|9qoVKMKoShEfVl_Ueh8jMe3mcZ%v9ufkaBx{2q| zmj;U{rm{bT3%of<0e(4F5Oc0<8|5fi$8}}v70@x8<|100_E+V6X24K&Yj%_-pVH-{ z%&1%|v$Xl1)MmB3Mx8i^*Kh&|l`yX8XiFSf4p&L1&L%Q+^I3XB!^dHPb$pkB?>7{A zxHr)k+bKxJ>Fxz{)C?`F92d(}MgY`D6}dmvHV*jMWNp4AEw7~}IZqU?9Yk)@AlfcMeG+E6^!X^c*xuR~V$>mx- zPoWl+30qN@fJ3kR{b21%dm@@Gh1n9%cgX#l#LLLnfxKwVUS11)$lv4ZD}h5wFX^v0 z7IbxkqXXNUw*s>(hZ+)USLP!(d#odjzhOT$>g{0km7n<`|A|acj`JDYozM{PLDsx3 z-Q${u)tho!pnI%yeS8B7Lsa`_+CEu~0sN!V7V;4Swa3nE$njc@7`4$%8+fB3x9zhm z31&f$qH17XpAnM3@mjxp>aKy zECAGK$2|xysEyLxwa}<=x%s{I5o*%}5>K%jxU&s4*BB8b%6gDNlz#iWq6)ZbBo`B{ zXPPot+=N$FmXUysmR*_0yem2eD1pV^e!sq)Gw-5^^SZPcbwb#o)?z@H};APPHbK#)15 z?m}mp8JyfCZFN#U*jv}OC%!GEbvH+$i(%>XU#@;ZALd6eax}Mbg1hyFNJmF~4E=5z zT4@4yJ?y*>2drmt%!C3GH{Npy$|P-%kKk7px*;38J4-2YKK`^x6W9|+QTN~Zcm?{^ zmX&{tZoOB69hDWxT|l0YjAz;aBsaFOVRyi$-2MrvW!wl^FFS?;{N{XS1!K9x;M8AzA0$)H?@J!nGc6aeGN) zZu;~roZUmeny~<@es#e_xXP!_lER)KXfFWtLO<0Nz5lQm&fNUGzcKV0Hx}wt-IQn? zIHk`WFM8P>NCFC}oqFfY!`o`5o(wqnL88pcw#I$^=SkLtWK+?4;%9Zf0S$gY_)AY} zStQ9t$R`q_u!s*S%o$Iac-HFXGsLHDve`E02n#dr2ylgDrHrmIVkNLD+~_t-yIB;+ z6Db08dq= zG`k-+bK!wV4{-18=~fTt;F>O~VZ0|H_0(M34b+W^9?d>E6?#244L7aUTIiI9(h&wxMT^{KR7N+8X8GD zESLJM2-0*7pX7e|d>W{HJb#q3=m$~vd+%p?Qn6I@6gU`Tn4P4;aen9B6h)J z_t{=j`fyjq=SyTY_WP!+kzVFi6fok{!$xstw)lmpBQnUCF)ee3pr~g`*Au{`I zXV;5^poF<}+ejX9USoHY&`y9{?DB2>YMtKG%4RXq2f1l}Vh$deQGMEOD5ez}MD9E| z)Fxwhs%e4^>%|1XaL>&DujZcBO#1(0E-#EZ^MA(Ngl~A6uv%Ek&?jxNVc-Wge8Nh69O;A*xg;J;X|`S_<yK|x1rxD7GKlh2m)a8~r2Y1DAVupBYziR#Yix(N z_l>BD?G~+;#4H61fYJ(8%*D)lmaJ7@->oIz z&(JRrpm)fjpA>Od&ic84t50!QK6Kt-=Q&@*@5~2YDSUne!<;MC`GYyzN&lwod5FFw<(utj{oKm=nntYe!B*mFPt$Xp=s@9Pb^ug+u1;)f+sYw{oVQ86HHJM ze_$r|_OJi}k2YVlqgR5W-JodvUnH>a7e7(?r^-@JS$3s71cGx2S%9sAlPq0k>yulz@k(W{|_`$+wV=&Kf>uELrK(57vbk(BP$m$Hc#O|&qO-}1YDSIXgd!H zQNP2Fle347`Cs7w#%~_%zjXhuA9&es@D&6vv}RleUeps*QA9aA$!QU25g4HMA|}8< F{{fj$2SNY< literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 3a8420c..b9a2c43 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # open-JSD-8345 -JSD-8345 开源任务材料 \ No newline at end of file +JSD-8345 开源任务材料\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..341ff64 --- /dev/null +++ b/plugin.xml @@ -0,0 +1,27 @@ + + com.fr.plugin.ztzzSSO + + yes + 1.0.10 + 10.0 + 2018-07-31 + wink + + + com.fr.plugin.ztzzSSO + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/ztzzSSO/config/InitializeMonitor.java b/src/main/java/com/fr/plugin/ztzzSSO/config/InitializeMonitor.java new file mode 100644 index 0000000..d712c9d --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/config/InitializeMonitor.java @@ -0,0 +1,21 @@ +package com.fr.plugin.ztzzSSO.config; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2018-12-04 + */ +public class InitializeMonitor extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + PluginSimpleConfig.getInstance(); + } + + @Override + public void beforeStop(PluginContext pluginContext) { + + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/config/PluginSimpleConfig.java b/src/main/java/com/fr/plugin/ztzzSSO/config/PluginSimpleConfig.java new file mode 100644 index 0000000..589dbc5 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/config/PluginSimpleConfig.java @@ -0,0 +1,176 @@ +package com.fr.plugin.ztzzSSO.config; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.record.analyzer.EnableMetrics; + +@Visualization(category = "单点登录和用户同步配置") +@EnableMetrics +public class PluginSimpleConfig extends DefaultConfiguration { + + private static volatile PluginSimpleConfig config = null; + + @Focus(id="com.fr.plugin.ztsso.config.simple", text = "单点登录配置", source = Original.PLUGIN) + public static PluginSimpleConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(PluginSimpleConfig.class); + } + return config; + } + + @Identifier(value = "frDomain", name = "帆软系统域名", description = "帆软系统域名", status = Status.SHOW) + private Conf frDomain = Holders.simple("http://localhost:8075"); + + @Identifier(value = "clientId", name = "clientId", description = "client_id", status = Status.SHOW) + private Conf appId = Holders.simple("xxx"); + + @Identifier(value = "secret", name = "clientsecret", description = "client_secret", status = Status.SHOW) + private Conf host = Holders.simple("xxx"); + + @Identifier(value = "codeUrl", name = "获取授权码接口地址", description = "authorize", status = Status.SHOW) + private Conf codeUrl = Holders.simple("https://xxx/idp/oauth2/authorize"); + + @Identifier(value = "tokenUrl", name = "获取token接口地址", description = "getToken", status = Status.SHOW) + private Conf tokenUrl = Holders.simple("https://xxx/idp/oauth2/getToken"); + + @Identifier(value = "userInfoUrl", name = "获取用户信息接口地址", description = "getUserInfo", status = Status.SHOW) + private Conf userInfoUrl = Holders.simple("https://xxx/idp/oauth2/getUserInfo"); + + @Identifier(value = "logoutUrl", name = "登出接口地址", description = "GLO", status = Status.SHOW) + private Conf logoutUrl = Holders.simple("https://xxx/idp/oauth2//Redirect/GLO"); + + @Identifier(value = "rzzxUrl", name = "认证中心登录地址", description = "认证中心登录地址", status = Status.SHOW) + private Conf rzzxUrl = Holders.simple("https://xxx/idp/oauth2//Redirect/GLO"); + + + // -----------------------------------用户同步--------------------------------- + @Identifier(value = "username", name = "用户名-数据同步", description = "用户名-数据同步", status = Status.SHOW) + private Conf username = Holders.simple("xxx"); + + @Identifier(value = "psd", name = "密码-数据同步", description = "密码-数据同步", status = Status.SHOW) + private Conf psd = Holders.simple("xxx"); + + @Identifier(value = "tokenUrl2", name = "token接口-数据同步", description = "获取token-数据同步", status = Status.SHOW) + private Conf tokenUrl2 = Holders.simple("http://xxx/api/users/login"); + + @Identifier(value = "orgUrl", name = "组织接口-数据同步", description = "组织接口-数据同步", status = Status.SHOW) + private Conf orgUrl = Holders.simple("http://xxx/api/mdm/m_organization/query"); + + @Identifier(value = "userUrl", name = "用户接口-数据同步", description = "用户接口-数据同步", status = Status.SHOW) + private Conf userUrl = Holders.simple("http://xxx/api/mdm/m_person_basic_info/query"); + + public String getRzzxUrl() { + return rzzxUrl.get(); + } + + public void settRzzxUrl(String userInfoUrl) { + this.rzzxUrl.set(userInfoUrl); + } + + public String getFrDomain() { + return frDomain.get(); + } + + public void setFrDomain(String url) { + this.frDomain.set(url); + } + + public String getAppId() { + return appId.get(); + } + + public void setAppId(String url) { + this.appId.set(url); + } + + public String getHost() { + return host.get(); + } + + public void setHost(String url) { + this.host.set(url); + } + + public String getCodeUrl() { + return codeUrl.get(); + } + + public void setCodeUrl(String codeUrl) { + this.codeUrl.set(codeUrl); + } + + public String getTokenUrl() { + return tokenUrl.get(); + } + + public void setTokenUrl(String tokenUrl) { + this.tokenUrl.set(tokenUrl); + } + + public String getTokenUrl2() { + return tokenUrl2.get(); + } + + public void setTokenUrl2(String tokenUrl) { + this.tokenUrl2.set(tokenUrl); + } + + public String getUserInfoUrl() { + return userInfoUrl.get(); + } + + public void setUserInfoUrl(String userInfoUrl) { + this.userInfoUrl.set(userInfoUrl); + } + + public String getLogoutUrl() { + return logoutUrl.get(); + } + + public void setLogoutUrl(String userInfoUrl) { + this.logoutUrl.set(userInfoUrl); + } + + public String getUsername() { + return username.get(); + } + + public void setUsername(String url) { + this.username.set(url); + } + + public String getPsd() { return psd.get(); } + + public void setPsd(String url) { + this.psd.set(url); + } + + + public String getOrgUrl() { return orgUrl.get(); } + + public void setOrgUrl(String url) { + this.orgUrl.set(url); + } + + + public String getUserUrl() { return userUrl.get(); } + + public void setUserUrl(String url) { + this.userUrl.set(url); + } + + @Override + public Object clone() throws CloneNotSupportedException { + PluginSimpleConfig cloned = (PluginSimpleConfig) super.clone(); +// cloned.text = (Conf) text.clone(); +// cloned.count = (Conf) count.clone(); +// cloned.price = (Conf) price.clone(); +// cloned.time = (Conf) time.clone(); +// cloned.student = (Conf) student.clone(); + return cloned; + } + +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/filter/SSOFilter.java b/src/main/java/com/fr/plugin/ztzzSSO/filter/SSOFilter.java new file mode 100644 index 0000000..ac1a50f --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/filter/SSOFilter.java @@ -0,0 +1,175 @@ +package com.fr.plugin.ztzzSSO.filter; + +import com.fr.decision.fun.impl.AbstractEmbedRequestFilterProvider; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.json.JSONObject; +import com.fr.plugin.ztzzSSO.config.PluginSimpleConfig; +import com.fr.plugin.ztzzSSO.utils.FRUtils; +import com.fr.plugin.ztzzSSO.utils.HttpUtils; +import com.fr.plugin.ztzzSSO.utils.ResponseUtils; +import com.fr.plugin.ztzzSSO.utils.Utils; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + + +public class SSOFilter extends AbstractEmbedRequestFilterProvider { + + @Override + public void filter(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + + //是否登录 + boolean isLogin = FRUtils.isLogin(httpServletRequest); + + //访问路径 + String url = FRUtils.getAllUrl(httpServletRequest,psc.getFrDomain()); + //获取code + String code = httpServletRequest.getParameter("code"); + String msg = httpServletRequest.getParameter("msg"); + + //跳转路径 + String redirectUrl = ""; + //是否从一体化进入 + String fromSSO = httpServletRequest.getParameter("fromSSO"); + + //从一体化进入每次都重新请求code + if(Utils.isNotNullStr(fromSSO) && "1".equals(fromSSO)){ + FRUtils.FRLogInfo("一体化跳转:"+url); + redirectUrl = url.substring(0,url.indexOf("?fromSSO")); + FRUtils.FRLogInfo("一体化跳转,截取后url:"+url); + + redirect(httpServletRequest,httpServletResponse,redirectUrl); + return ; + } + + //如果已经登录而且没有code和msg则放行 + if(isLogin && Utils.isNullStr(code) && Utils.isNullStr(msg)){ + return ; + } + + //如果是自带登录页资源则放行 + if(url.contains("test")||url.contains("login")||url.contains("decision/file")||url.contains("decision/resource")||url.contains("decision/system")||url.contains("query/ip")){ + return; + } + + //如果是远程设计则放行 + if(url.contains("remote")){ + return; + } + + //跳转 没有code + if(Utils.isNullStr(code) && Utils.isNullStr(msg)){ + redirect(httpServletRequest,httpServletResponse,url); + return ; + } + + + //获取code错误 + if(Utils.isNotNullStr(msg)){ + FRUtils.FRLogInfo("获取授权码异常:"+msg); + ResponseUtils.failedResponse(httpServletResponse,"获取授权码异常:"+msg); + return; + } + + //获取token + JSONObject tokenResultJson = getToken(code); + String token = tokenResultJson.getString("access_token"); + + if(Utils.isNullStr(token)){ + ResponseUtils.failedResponse(httpServletResponse,"获取token异常:"); + } + + //获取用户信息 + String uid = tokenResultJson.getString("uid"); + + String loginName = getUsername(token,uid); + + if(Utils.isNullStr(loginName)){ + FRUtils.FRLogInfo("获取用户信息异常:"); + ResponseUtils.failedResponse(httpServletResponse,"获取用户信息异常:"); + + return; + } + + if(url.contains("code=")){ + url = url.contains("&code") ? url.substring(0,url.indexOf("&code")) :url.substring(0,url.indexOf("?code")); + } + + FRUtils.FRLogInfo("登陆成功-url:"+url); + + FRUtils.login(httpServletRequest,httpServletResponse,loginName,url); + + } + + private String getUsername(String token,String uid){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String clientId = psc.getAppId(); + + String userInfoUrl = psc.getUserInfoUrl(); + userInfoUrl+="?access_token="+token+"&client_id="+clientId+"&uid="+uid; + + String userInfoResult = HttpUtils.get(userInfoUrl,null,null); + + if(Utils.isNullStr(userInfoResult)){ + FRUtils.FRLogInfo("获取用户信息异常"); + return ""; + } + + JSONObject userJsonObject = new JSONObject(userInfoResult); + + String loginName = userJsonObject.getString("loginName"); + + return loginName; + } + + private void redirect(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,String redirectUrl){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String clientId = psc.getAppId(); + + String authUrl = psc.getCodeUrl(); + + try { + redirectUrl= URLEncoder.encode(redirectUrl,"utf-8"); + } catch (UnsupportedEncodingException e) { + return; + } + + authUrl+= "?redirect_uri="+redirectUrl+"&state=123&client_id="+clientId+"&response_type=code"; + try { + httpServletResponse.sendRedirect(authUrl); + } catch (IOException e) { + FRUtils.FRLogInfo("跳转异常:"+e.getMessage()); + } + } + + private JSONObject getToken(String code){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String clientId = psc.getAppId(); + String clientSecret= psc.getHost(); + //获取token + String tokenUrl = psc.getTokenUrl()+"?client_id="+clientId+"&client_secret="+clientSecret+"&code="+code+"&grant_type=authorization_code"; + JSONObject tokenParam = new JSONObject(); + tokenParam.put("client_id",clientId); + tokenParam.put("client_secret",clientSecret); + tokenParam.put("code",code); + tokenParam.put("grant_type","authorization_code"); + + String tokenParamStr = tokenParam.toString(); + + String tokenResult = HttpUtils.HttpPostJson(tokenUrl,tokenParamStr,null); + + if(Utils.isNullStr(tokenResult)){ + return new JSONObject(); + } + + JSONObject tokenResultJson = new JSONObject(tokenResult); + + return tokenResultJson; + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/ztzzSSO/handler/ExtendAttrHandlerProvider.java b/src/main/java/com/fr/plugin/ztzzSSO/handler/ExtendAttrHandlerProvider.java new file mode 100644 index 0000000..4d90f98 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/handler/ExtendAttrHandlerProvider.java @@ -0,0 +1,14 @@ +package com.fr.plugin.ztzzSSO.handler; + +import com.fr.decision.fun.HttpHandler; +import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; +import com.fr.io.context.info.GetConfig; + +public class ExtendAttrHandlerProvider extends AbstractHttpHandlerProvider { + @Override + public HttpHandler[] registerHandlers() { + return new HttpHandler[]{ + new Test() + }; + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/handler/Test.java b/src/main/java/com/fr/plugin/ztzzSSO/handler/Test.java new file mode 100644 index 0000000..c3b1b0c --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/handler/Test.java @@ -0,0 +1,50 @@ +package com.fr.plugin.ztzzSSO.handler; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.plugin.ztzzSSO.utils.FRUtils; +import com.fr.plugin.ztzzSSO.utils.ResponseUtils; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +@FunctionRecorder +public class Test extends BaseHttpHandler { + + + public Test() { + } + + @Override + public RequestMethod getMethod() { + return RequestMethod.GET; + } + + @Override + public String getPath() { + return "/test"; + } + + @Override + public boolean isPublic() { + return true; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + String username = req.getParameter("username"); + FRUtils.login(req,res,username,"http://localhost:8075/webroot/decision"); + System.out.println(); +// HttpSession session = req.getSession(true); +// LoginService.getInstance().crossDomainLogout(req,res,""); +// session.invalidate(); +// +// String username = LoginService.getInstance().getCurrentUserNameFromRequest(req); +// +// ResponseUtils.successResponse(res,username); + } + +} + diff --git a/src/main/java/com/fr/plugin/ztzzSSO/handler/URLAliasProvide.java b/src/main/java/com/fr/plugin/ztzzSSO/handler/URLAliasProvide.java new file mode 100644 index 0000000..4c212d2 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/handler/URLAliasProvide.java @@ -0,0 +1,17 @@ +package com.fr.plugin.ztzzSSO.handler; + +import com.fr.decision.fun.impl.AbstractURLAliasProvider; +import com.fr.decision.webservice.url.alias.URLAlias; +import com.fr.decision.webservice.url.alias.URLAliasFactory; + +public class URLAliasProvide extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + + URLAliasFactory.createPluginAlias("/test","/test",true) + + + }; + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/logout/Logout.java b/src/main/java/com/fr/plugin/ztzzSSO/logout/Logout.java new file mode 100644 index 0000000..3df887d --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/logout/Logout.java @@ -0,0 +1,29 @@ +package com.fr.plugin.ztzzSSO.logout; + +import com.fr.decision.fun.impl.AbstractLogInOutEventProvider; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.plugin.ztzzSSO.config.PluginSimpleConfig; + +import javax.servlet.http.HttpSession; + +public class Logout extends AbstractLogInOutEventProvider { + + @Override + public String logoutAction(LogInOutResultInfo result) { + HttpSession session = result.getRequest().getSession(true); + LoginService.getInstance().crossDomainLogout(result.getRequest(),result.getResponse(),""); + session.invalidate(); + + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + + String authUrl = psc.getCodeUrl(); + String redirectURL = psc.getFrDomain()+"/webroot/decision"; + String clientId = psc.getAppId(); + String logoutUrl = psc.getLogoutUrl(); + + logoutUrl+="?redirctToUrl="+redirectURL+"&redirectToLogin=true&entityId="+clientId; + return logoutUrl; + } +} + diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/DatasetData.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/DatasetData.java new file mode 100644 index 0000000..3b4616a --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/DatasetData.java @@ -0,0 +1,67 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据集数据 + */ +public class DatasetData { + private String name; + private List columns; + private List> values; + + public DatasetData() { + columns = new ArrayList(); + values = new ArrayList>(); + } + + /** + * 获取表名 + * @return 表名 + */ + public String getName() { + return this.name; + } + + /** + * 设置表名 + * @param name 表名 + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取列名 + * @return 列名 + */ + public List getColumns() { + return this.columns; + } + + /** + * 设置列名 + * @param columns 列名 + */ + public void setColumns(List columns) { + this.columns = columns; + } + + /** + * 获取表数据 + * @return 表数据 + */ + public List> getValues() { + return this.values; + } + + /** + * 设置表数据 + * @param values + */ + public void setValues(List> values) { + this.values = values; + } + +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/ORGHttpDataModel.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/ORGHttpDataModel.java new file mode 100644 index 0000000..92d4ceb --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/ORGHttpDataModel.java @@ -0,0 +1,268 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.data.AbstractDataModel; +import com.fr.general.data.TableDataException; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.ztzzSSO.config.PluginSimpleConfig; +import com.fr.plugin.ztzzSSO.utils.FRUtils; +import com.fr.plugin.ztzzSSO.utils.HttpUtils; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.*; + +public class ORGHttpDataModel extends AbstractDataModel { + private static String[] COLUMN_NAMES = {"DISPLAY_PATH", "DISPLAY_PATH_NAME", "MDM_CODE","ORG_NAME","ORG_NAME_SHORT", + "FOUND_DATE","UPDATE_TIME","REG_ADDRESS","ORG_CODE","ORG_UID","ORG_PID"}; + private int rowCount = TableData.RESULT_ALL; + private DatasetData datas = new DatasetData(); + + public ORGHttpDataModel(int count) { + this.rowCount = count; + if (this.rowCount == 0) { + return; + } + queryData(); + } + + //获取列的数量 + @Override + public int getColumnCount() throws TableDataException { + return COLUMN_NAMES.length; + } + + //获取列的名称 + @Override + public String getColumnName(int i) throws TableDataException { + return COLUMN_NAMES[i]; + } + + //是否还有行 + @Override + public boolean hasRow(int rowIndex) throws TableDataException { + int count = getRowCount(); + return rowIndex < count; + } + + //获取行数量 + @Override + public int getRowCount() throws TableDataException { + if (this.datas == null) { + return 0; + } + List> values = this.datas.getValues(); + if (values == null) { + return 0; + } + int count = values.size(); + return count; + } + + //获取数据 + @Override + public Object getValueAt(int rowIndex, int columnIndex) throws TableDataException { + if (this.datas == null) { + return ""; + } + List> values = this.datas.getValues(); + if ((values == null) || (values.size() <= rowIndex)) { + return ""; + } + List rowValues = values.get(rowIndex); + if ((rowValues == null) || (rowValues.size() <= columnIndex)) { + return ""; + } + return rowValues.get(columnIndex); + } + + //释放 + @Override + public void release() throws Exception { + this.datas = null; + } + + public static String httpRequest(String requestUrl, String requestMethod, + String outputStr, String tokenid) { + StringBuffer buffer = null; + HttpURLConnection conn = null; + InputStream is = null; + InputStreamReader isr = null; + try { + URL url = new URL(requestUrl); + conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod(requestMethod); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Authorization", tokenid); + conn.setRequestProperty("X-MDM-UNIFIED-RESPONSE", "true"); + conn.connect(); + // 往服务器端写内容 也就是发起http请求需要带的参数 + if (null != outputStr) { + OutputStream os = conn.getOutputStream(); + os.write(outputStr.getBytes("utf-8")); + os.close(); + } + + // 读取服务器端返回的内容 + is = conn.getInputStream(); + isr = new InputStreamReader(is, "utf-8"); + BufferedReader br = new BufferedReader(isr); + buffer = new StringBuffer(); + String line = null; + while ((line = br.readLine()) != null) { + buffer.append(line); + } + System.out.println(buffer); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + if(null != conn){ + conn.disconnect(); + } + if(null != is){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(null != isr){ + try { + isr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return buffer.toString(); + } + + /** + * 查询数据 + */ + private void queryData() { + try { + String token = getToken(); + FRUtils.FRLogInfo("orgToken:"+token); + createDatas(0,token); + } catch (Exception e) { + FRUtils.FRLogInfo("数据集获取组织信息,请求出错:"+e.getMessage()); + throw new NullPointerException("数据集获取组织信息为空," + e.getMessage()); + } + } + + /** + * 获取token + * @return + */ + private String getToken(){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String tokenUrl = psc.getTokenUrl2(); + String username = psc.getUsername(); + String psd = psc.getPsd(); + + Map header = new HashMap(); + header.put("Content-Type","application/json"); + header.put("X-MDM-UNIFIED-RESPONSE","true"); + + JSONObject params = new JSONObject(); +// Map params = new HashMap(); + params.put("username",username); + params.put("password",psd); + + String result = ""; + + try { + result = HttpUtils.HttpPostJson(tokenUrl,params.toString(),header); + } catch (Exception e) { + return ""; + } + + JSONObject resultJson = new JSONObject(result); + + return resultJson.getString("token"); + } + + /** + * 获取组织数据 + * @param pageNum + * @param token + * @return + */ + private JSONObject getOrg(int pageNum,String token){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + + String orgUrl = psc.getOrgUrl()+"?pageNum="+pageNum+"&pageSize=1000";; + + FRUtils.FRLogInfo("orgUrl:"+orgUrl); + + String result = httpRequest(orgUrl,"POST",null,token); + FRUtils.FRLogInfo("orgResult:"+result); + + return new JSONObject(result); + } + + private void createDatas(int pageNum,String token) { + JSONObject json = getOrg(pageNum,token); + JSONArray jsonArray = json.getJSONArray("content"); + addRowDatas(jsonArray); + + boolean last = json.getBoolean("last"); + if(last){ + return; + } + + pageNum = pageNum+1; + + createDatas(pageNum,token); + } + + /** + * 添加行数据 + * @param jsonArray + */ + private void addRowDatas(JSONArray jsonArray) { + if(jsonArray == null || jsonArray.size() <= 0){ + return ; + } + + for(int i =0;i< jsonArray.size();i++){ + JSONObject org = jsonArray.getJSONObject(i); + + String DISPLAY_PATH = org.getString("DISPLAY_PATH"); + String DISPLAY_PATH_NAME = org.getString("DISPLAY_PATH_NAME"); + String MDM_CODE = org.getString("MDM_CODE"); + String ORG_NAME = org.getString("ORG_NAME"); + String ORG_NAME_SHORT = org.getString("ORG_NAME_SHORT"); + String FOUND_DATE = org.getString("FOUND_DATE"); + String UPDATE_TIME = org.getString("UPDATE_TIME"); + String REG_ADDRESS = org.getString("REG_ADDRESS"); + String ORG_CODE = org.getString("ORG_CODE"); + String ORG_UID = org.getString("ORG_UID"); + String ORG_PID = org.getString("ORG_PID"); + + List rowDatas = new ArrayList(); + + rowDatas.add(DISPLAY_PATH); + rowDatas.add(DISPLAY_PATH_NAME); + rowDatas.add(MDM_CODE); + rowDatas.add(ORG_NAME); + rowDatas.add(ORG_NAME_SHORT); + rowDatas.add(FOUND_DATE); + rowDatas.add(UPDATE_TIME); + rowDatas.add(REG_ADDRESS); + rowDatas.add(ORG_CODE); + rowDatas.add(ORG_UID); + rowDatas.add(ORG_PID); + + List> values = this.datas.getValues(); + values.add(rowDatas); + + } + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableData.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableData.java new file mode 100644 index 0000000..5c6828f --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableData.java @@ -0,0 +1,18 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.data.AbstractParameterTableData; +import com.fr.general.data.DataModel; +import com.fr.script.Calculator; + +public class OrgHttpTableData extends AbstractParameterTableData { + @Override + public DataModel createDataModel(Calculator calculator) { + return createDataModel(calculator, TableData.RESULT_ALL); + } + + @Override + public DataModel createDataModel(Calculator calculator, int rowCount) { + return new ORGHttpDataModel(rowCount); + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataDefine.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataDefine.java new file mode 100644 index 0000000..a5344e7 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataDefine.java @@ -0,0 +1,46 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.fun.ServerTableDataDefineProvider; +import com.fr.design.fun.impl.AbstractTableDataDefineProvider; +import com.fr.design.i18n.Toolkit; + +public class OrgHttpTableDataDefine extends AbstractTableDataDefineProvider implements ServerTableDataDefineProvider { + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public Class classForTableData() { + return OrgHttpTableData.class; + } + + @Override + public Class classForInitTableData() { + return OrgHttpTableData.class; + } + + @Override + public Class appearanceForTableData() { + return OrgHttpTableDataPane.class; + } + + @Override + public String nameForTableData() { + return Toolkit.i18nText("组织机构数据集"); + } + + @Override + public String prefixForTableData() { + return "zt_org"; + } + + @Override + public String iconPathForTableData() { + return ""; + } + +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataPane.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataPane.java new file mode 100644 index 0000000..cdb55a9 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/OrgHttpTableDataPane.java @@ -0,0 +1,74 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.i18n.Toolkit; +import com.fr.general.IOUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + +public class OrgHttpTableDataPane extends AbstractTableDataPane { + public OrgHttpTableDataPane() { + super(); + createContent(); + } + + + + @Override + public void populateBean(OrgHttpTableData ob) { + if (ob == null) { + return; + } + + } + + @Override + public OrgHttpTableData updateBean() { + OrgHttpTableData tableData = new OrgHttpTableData(); + return tableData; + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("组织机构数据集"); + } + + + private void createContent() { + setLayout(new BorderLayout()); + JPanel contentPane = new JPanel(); + contentPane.setLayout(new BorderLayout()); + add(contentPane, BorderLayout.CENTER); + + JPanel connectionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); + + UIButton previewButton = createIconButton("Fine-Design_Basic_Preview", "/com/fr/design/images/m_file/preview.png"); + previewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + PreviewTablePane.previewTableData(updateBean()); + } + }); + connectionPanel.add(previewButton); + contentPane.add(connectionPanel, BorderLayout.NORTH); + } + + /** + * 获取图标按钮 + * + * @param toolTip 提示信息,国际化key + * @param iconPath 图标路径 + * @return + */ + public static UIButton createIconButton(String toolTip, String iconPath) { + UIButton iconButton = new UIButton(IOUtils.readIcon(iconPath)); + iconButton.setToolTipText(Toolkit.i18nText(toolTip)); + return iconButton; + } + +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpDataModel.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpDataModel.java new file mode 100644 index 0000000..052fd6a --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpDataModel.java @@ -0,0 +1,260 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.data.AbstractDataModel; +import com.fr.general.data.TableDataException; +import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.plugin.ztzzSSO.config.PluginSimpleConfig; +import com.fr.plugin.ztzzSSO.utils.FRUtils; +import com.fr.plugin.ztzzSSO.utils.HttpUtils; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class UserHttpDataModel extends AbstractDataModel { + private static String[] COLUMN_NAMES = {"Mobile_Phone", "Email", "Gender","Name","Main_Org_Id", + "Account_Number","Main_Org_Id__ref","Gender__ref"}; + private int rowCount = TableData.RESULT_ALL; + private DatasetData datas = new DatasetData(); + + public UserHttpDataModel(int count) { + this.rowCount = count; + if (this.rowCount == 0) { + return; + } + queryData(); + } + + //获取列的数量 + @Override + public int getColumnCount() throws TableDataException { + return COLUMN_NAMES.length; + } + + //获取列的名称 + @Override + public String getColumnName(int i) throws TableDataException { + return COLUMN_NAMES[i]; + } + + //是否还有行 + @Override + public boolean hasRow(int rowIndex) throws TableDataException { + int count = getRowCount(); + return rowIndex < count; + } + + //获取行数量 + @Override + public int getRowCount() throws TableDataException { + if (this.datas == null) { + return 0; + } + List> values = this.datas.getValues(); + if (values == null) { + return 0; + } + int count = values.size(); + return count; + } + + //获取数据 + @Override + public Object getValueAt(int rowIndex, int columnIndex){ + if (this.datas == null) { + return ""; + } + List> values = this.datas.getValues(); + if ((values == null) || (values.size() <= rowIndex)) { + return ""; + } + List rowValues = values.get(rowIndex); + if ((rowValues == null) || (rowValues.size() <= columnIndex)) { + return ""; + } + return rowValues.get(columnIndex); + } + + //释放 + @Override + public void release() { + this.datas = null; + } + + /** + * 查询数据 + */ + private void queryData() { + try { + String token = getToken(); + createDatas(0,token); + } catch (Exception e) { + FRUtils.FRLogInfo("数据集获取用户信息,请求出错:"+e.getMessage()); + throw new NullPointerException("数据集获取用户信息为空," + e.getMessage()); + } + } + + /** + * 获取token + * @return + */ + private String getToken(){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String tokenUrl = psc.getTokenUrl2(); + String username = psc.getUsername(); + String psd = psc.getPsd(); + + Map header = new HashMap(); + header.put("Content-Type","application/json"); + header.put("X-MDM-UNIFIED-RESPONSE","true"); + + JSONObject params = new JSONObject(); +// Map params = new HashMap(); + params.put("username",username); + params.put("password",psd); + + String result = ""; + + try { + result = HttpUtils.HttpPostJson(tokenUrl,params.toString(),header); + } catch (Exception e) { + return ""; + } + + JSONObject resultJson = new JSONObject(result); + + return resultJson.getString("token"); + } + + /** + * 获取组织数据 + * @param pageNum + * @param token + * @return + */ + private JSONObject getUser(int pageNum,String token){ + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String orgUrl = psc.getUserUrl()+"?pageNum="+pageNum+"&pageSize=1000"; + String result = httpRequest(orgUrl,"POST",null,token); + + return new JSONObject(result); + } + + public static String httpRequest(String requestUrl, String requestMethod, + String outputStr, String tokenid) { + StringBuffer buffer = null; + HttpURLConnection conn = null; + InputStream is = null; + InputStreamReader isr = null; + try { + URL url = new URL(requestUrl); + conn = (HttpURLConnection) url.openConnection(); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestMethod(requestMethod); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Authorization", tokenid); + conn.setRequestProperty("X-MDM-UNIFIED-RESPONSE", "true"); + conn.connect(); + // 往服务器端写内容 也就是发起http请求需要带的参数 + if (null != outputStr) { + OutputStream os = conn.getOutputStream(); + os.write(outputStr.getBytes("utf-8")); + os.close(); + } + + // 读取服务器端返回的内容 + is = conn.getInputStream(); + isr = new InputStreamReader(is, "utf-8"); + BufferedReader br = new BufferedReader(isr); + buffer = new StringBuffer(); + String line = null; + while ((line = br.readLine()) != null) { + buffer.append(line); + } + System.out.println(buffer); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + if(null != conn){ + conn.disconnect(); + } + if(null != is){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(null != isr){ + try { + isr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return buffer.toString(); + } + + private void createDatas(int pageNum,String token) { + JSONObject json = getUser(pageNum,token); + JSONArray jsonArray = json.getJSONArray("content"); + addRowDatas(jsonArray); + + boolean last = json.getBoolean("last"); + if(last){ + return; + } + + pageNum = pageNum+1; + + createDatas(pageNum,token); + } + + /** + * 添加行数据 + * @param jsonArray + */ + private void addRowDatas(JSONArray jsonArray) { + if(jsonArray == null || jsonArray.size() <= 0){ + return ; + } + + for(int i =0;i< jsonArray.size();i++){ + JSONObject org = jsonArray.getJSONObject(i); + String Mobile_Phone = org.getString("Mobile_Phone"); + String Email = org.getString("Email"); + String Gender = org.getString("Gender"); + String Name = org.getString("Name"); + String Main_Org_Id = org.getString("Main_Org_Id"); + String Account_Number = org.getString("Account_Number"); + String Main_Org_Id__ref = org.getString("Main_Org_Id__ref"); + String Gender__ref = org.getString("Gender__ref"); + + List rowDatas = new ArrayList(); + + rowDatas.add(Mobile_Phone); + rowDatas.add(Email); + rowDatas.add(Gender); + rowDatas.add(Name); + rowDatas.add(Main_Org_Id); + rowDatas.add(Account_Number); + rowDatas.add(Main_Org_Id__ref); + rowDatas.add(Gender__ref); + + + List> values = this.datas.getValues(); + values.add(rowDatas); + + } + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableData.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableData.java new file mode 100644 index 0000000..e6866b6 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableData.java @@ -0,0 +1,18 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.data.AbstractParameterTableData; +import com.fr.general.data.DataModel; +import com.fr.script.Calculator; + +public class UserHttpTableData extends AbstractParameterTableData { + @Override + public DataModel createDataModel(Calculator calculator) { + return createDataModel(calculator, TableData.RESULT_ALL); + } + + @Override + public DataModel createDataModel(Calculator calculator, int rowCount) { + return new UserHttpDataModel(rowCount); + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataDefine.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataDefine.java new file mode 100644 index 0000000..58d60e1 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataDefine.java @@ -0,0 +1,46 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.base.TableData; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.fun.ServerTableDataDefineProvider; +import com.fr.design.fun.impl.AbstractTableDataDefineProvider; +import com.fr.design.i18n.Toolkit; + +public class UserHttpTableDataDefine extends AbstractTableDataDefineProvider implements ServerTableDataDefineProvider { + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public Class classForTableData() { + return UserHttpTableData.class; + } + + @Override + public Class classForInitTableData() { + return UserHttpTableData.class; + } + + @Override + public Class appearanceForTableData() { + return UserHttpTableDataPane.class; + } + + @Override + public String nameForTableData() { + return Toolkit.i18nText("用户信息数据集"); + } + + @Override + public String prefixForTableData() { + return "zt_user"; + } + + @Override + public String iconPathForTableData() { + return ""; + } + +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataPane.java b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataPane.java new file mode 100644 index 0000000..cd12a09 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/serverDS/UserHttpTableDataPane.java @@ -0,0 +1,74 @@ +package com.fr.plugin.ztzzSSO.serverDS; + +import com.fr.design.data.datapane.preview.PreviewTablePane; +import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.i18n.Toolkit; +import com.fr.general.IOUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + + +public class UserHttpTableDataPane extends AbstractTableDataPane { + public UserHttpTableDataPane() { + super(); + createContent(); + } + + + + @Override + public void populateBean(UserHttpTableData ob) { + if (ob == null) { + return; + } + + } + + @Override + public UserHttpTableData updateBean() { + UserHttpTableData tableData = new UserHttpTableData(); + return tableData; + } + + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("用户信息数据集"); + } + + + private void createContent() { + setLayout(new BorderLayout()); + JPanel contentPane = new JPanel(); + contentPane.setLayout(new BorderLayout()); + add(contentPane, BorderLayout.CENTER); + + JPanel connectionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 5)); + + UIButton previewButton = createIconButton("Fine-Design_Basic_Preview", "/com/fr/design/images/m_file/preview.png"); + previewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + PreviewTablePane.previewTableData(updateBean()); + } + }); + connectionPanel.add(previewButton); + contentPane.add(connectionPanel, BorderLayout.NORTH); + } + + /** + * 获取图标按钮 + * + * @param toolTip 提示信息,国际化key + * @param iconPath 图标路径 + * @return + */ + public static UIButton createIconButton(String toolTip, String iconPath) { + UIButton iconButton = new UIButton(IOUtils.readIcon(iconPath)); + iconButton.setToolTipText(Toolkit.i18nText(toolTip)); + return iconButton; + } + +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/DateUtilSelf.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/DateUtilSelf.java new file mode 100644 index 0000000..0ff664d --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/DateUtilSelf.java @@ -0,0 +1,227 @@ +package com.fr.plugin.ztzzSSO.utils; + +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class DateUtilSelf { + + /** + * 日期转换为日期字符串 + * @param date + * @param formatStr + * @return String + */ + public static String DateToString(Date date,String formatStr) { + SimpleDateFormat sdf = new SimpleDateFormat(formatStr); + String dateStr = sdf.format(date).toString(); + + return dateStr; + } + + /** + * 日期字符串转换日期 + * @param dateStr + * @param formatStr + * @return Date + */ + public static Date strToDate(String dateStr,String formatStr){ + SimpleDateFormat sdf = new SimpleDateFormat(formatStr); + Date date = null; + + try { + date = sdf.parse(dateStr); + } + catch(Exception e) { + } + + return date; + } + + /** + * Date转Timestamp + * @param date + * @return + */ + public static Timestamp dateToTimestamp(Date date) { + Date transDate = DateUtilSelf.strToDate(DateUtilSelf.DateToString(date, "yyyy-MM-dd hh:mm:ss"),"yyyy-MM-dd hh:mm:ss"); + + Timestamp timestamp = new Timestamp(transDate.getTime()); + return timestamp; + } + + /** + * Date字符串转Timestamp + * @param dateStr + * @param format + * @return + */ + public static Timestamp strToTimestamp(String dateStr,String format) { + Date date = strToDate(dateStr,format); + Timestamp timestamp = new Timestamp(date.getTime()); + return timestamp; + } + + /** + * 获取两个日期字符串之间的天数 + * @param startDateStr + * @param endDateStr + * @param formatStr + * @return + */ + public static int getDays(String startDateStr,String endDateStr,String formatStr) { + + Date startDate = strToDate(startDateStr,formatStr); + Date endDate = strToDate(endDateStr,formatStr); + + long startTime = startDate.getTime(); + long endTime = endDate.getTime(); + + int days = (int) ((endTime - startTime)/(60*60*24*1000)); + + return days; + } + + /** + * 获取给定时间之前之后的时间 + * @param type + * @param dateStr + * @param count + * @param formatStr + * @return + */ + public static String getAfterDateStr(int type,String dateStr,int count,String formatStr) { + Date startDate = strToDate(dateStr,formatStr); + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + + calendar.add(type, count); + + String endDateStr = DateToString(calendar.getTime(),formatStr); + + return endDateStr; + } + + /** + * 获取给定时间之前之后的时间 + * @param type + * @param date + * @param count + * @param formatStr + * @return + */ + public static String getAfterDateStr(int type,Date date,int count,String formatStr) { + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + + calendar.add(type, count); + + String endDateStr = DateToString(calendar.getTime(),formatStr); + + return endDateStr; + } + + /** + * 获取给定时间之前之后的时间 + * @param type + * @param date + * @param count + * @return + */ + public static Date getAfterDateStr(int type,Date date,int count) { + Calendar dateResult = Calendar.getInstance(); + dateResult.setTime(date); + dateResult.add(type, count); + return dateResult.getTime(); + } + + /** + * 时间戳转日期 + * @param timestamp + * @return + */ + public static Date timestampToDate(Timestamp timestamp) { + Date date = new Date(timestamp.getTime()); + + return date; + } + + /** + * 时间戳转时间字符串 + * @param timestamp + * @param format 日期格式 + * @return + */ + public static String timestampToStr(Timestamp timestamp,String format) { + Date date = timestampToDate(timestamp); + + String timeStr = DateToString(date, format); + + return timeStr; + } + + /** + * 获取所给日期length天内每一天的日期 + * @param date 所给日期(yyyy-MM-dd) + * @param length 长度 + * @return + */ + public static List getDateList(String date,int length){ + List dateList = new ArrayList(); + String format = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + //获取length天后的日期 + + String targetDate = getAfterDateStr(Calendar.DATE,date,length,format); + + Date start = null; + Date end = null; + + if(length >= 0) { + start = strToDate(date,format); + end = strToDate(targetDate,format); + }else { + start = strToDate(targetDate,format); + end = strToDate(date,format); + } + + Calendar calBegin = Calendar.getInstance(); + calBegin.setTime(start); + Calendar calEnd = Calendar.getInstance(); + calEnd.setTime(end); + + while (end.after(calBegin.getTime())) { + calBegin.add(Calendar.DATE, 1); + String dayStr = sdf.format(calBegin.getTime()); + dateList.add(dayStr); + } + + return dateList; + } + + /** + * 比较startDate是否在endDate之前 + * @param startDate + * @param endDate + * @param format + * @return 0 两个日期相等 <0 开始日期在结束日期之前 >0 开始日期在结束日期之后 + */ + public static int comparisonDate(String startDate,String endDate,String format) { + Date start = strToDate(startDate,format); + Date end = strToDate(endDate,format); + + return start.compareTo(end); + } + + //获取当前日期年、月、日、时、分、秒 + public static int getCount(int type){ + Calendar calendar = Calendar.getInstance(); + + return calendar.get(type); + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/FRDepartmentUtils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRDepartmentUtils.java new file mode 100644 index 0000000..444e1c7 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRDepartmentUtils.java @@ -0,0 +1,106 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.base.constant.SoftRoleType; +import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; +import com.fr.decision.authority.data.BaseUserDataRecord; +import com.fr.decision.authority.data.Department; +import com.fr.decision.record.OperateMessage; +import com.fr.decision.webservice.bean.user.DepartmentPostBean; +import com.fr.decision.webservice.exception.general.DuplicatedNameException; +import com.fr.decision.webservice.utils.UserSourceFactory; +import com.fr.decision.webservice.v10.user.DepartmentService; +import com.fr.general.ComparatorUtils; +import com.fr.intelli.record.MetricRegistry; +import com.fr.stable.StableUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.condition.QueryCondition; +import com.fr.stable.query.restriction.Restriction; +import com.fr.stable.query.restriction.RestrictionFactory; + +import java.util.ArrayList; +import java.util.Collections; + +public class FRDepartmentUtils { + + /** + * 获取用户Service + * @return + */ + public static DepartmentService getDepartmentService(){ + return DepartmentService.getInstance(); + } + + /** + * 添加部门 + * @param pId 父节点id + * @param dpName 部门名称 + */ + public static DepartmentPostBean addDP(String pId, String dpName) throws Exception { + return getDepartmentService().addDepartment(pId,dpName); + } + + public static DepartmentPostBean addDP(String id,String pId, String orgName) throws Exception { + String pId2 = pId; + if (ComparatorUtils.equals(pId, "decision-dep-root") ) { + pId2 = null; + } + checkDuplicatedDepartmentName(pId2, orgName); + Department var4 = (new Department()).name(orgName).parentId(pId2).id(id).creationType(ManualOperationType.KEY).lastOperationType(ManualOperationType.KEY).enable(true); + if (pId2 != null) { + UserSourceFactory.getInstance().checkSource(var4, (BaseUserDataRecord)AuthorityContext.getInstance().getDepartmentController().getById(pId)); + } + + AuthorityContext.getInstance().getDepartmentController().add(var4); + deleteSoftData(getDepartmentService().getDepartmentFullPath(var4.getId()).replaceAll("/", "-")); + MetricRegistry.getMetric().submit(OperateMessage.build("Dec-Module-User_Manager", "Dec-Department", getDepartmentFullPath(pId, orgName, "/"), "Dec-Log_Add")); + return new DepartmentPostBean(var4.getId(), false, false, var4.getParentId(), "", var4.getName()); + } + + private static void checkDuplicatedDepartmentName(String var1, String var2) throws Exception { + QueryCondition var3 = QueryFactory.create().addRestriction(RestrictionFactory.and(new Restriction[]{RestrictionFactory.eq("name", var2), RestrictionFactory.eq("parentId", var1)})); + Department var4 = (Department)AuthorityContext.getInstance().getDepartmentController().findOne(var3); + if (var4 != null) { + throw new DuplicatedNameException(); + } + } + + private static void deleteSoftData(String var1) throws Exception { + QueryCondition var2 = QueryFactory.create().addRestriction(RestrictionFactory.and(new Restriction[]{RestrictionFactory.eq("deletedName", var1), RestrictionFactory.eq("type", SoftRoleType.DEP)})); + AuthorityContext.getInstance().getSoftDataController().remove(var2); + } + + private static String getDepartmentFullPath(String var1, String var2, String var3) throws Exception { + ArrayList var4 = new ArrayList(); + var4.add(var2); + + while(!ComparatorUtils.equals(var1, "decision-dep-root") && var1 != null) { + Department var5 = (Department)AuthorityContext.getInstance().getDepartmentController().getById(var1); + var4.add(var5.getName()); + var1 = var5.getParentId(); + } + + Collections.reverse(var4); + return StableUtils.join(var4.toArray(new String[0]), var3); + } + /** + * 修改组织 + * @param id + * @param dpName + */ + public static void updateDP(String id,String dpName) throws Exception { + getDepartmentService().editDepartment(id,dpName); + } + + /** + * 删除机构 + * @param id + * @return + */ + public static void deleteDepartment(String id) throws Exception { + getDepartmentService().deleteDepartment(id); + + } + + +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUserUtils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUserUtils.java new file mode 100644 index 0000000..c6f9644 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUserUtils.java @@ -0,0 +1,111 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.decision.authority.data.User; +import com.fr.decision.privilege.TransmissionTool; +import com.fr.decision.webservice.bean.user.UserBean; +import com.fr.decision.webservice.bean.user.UserUpdateBean; +import com.fr.decision.webservice.v10.user.UserService; + +public class FRUserUtils { + + /** + * 获取用户Service + * @return + */ + public static UserService getUserService(){ + return UserService.getInstance(); + } + + /** + * 添加用户 + * @param userBean + */ + public static void addUser(UserBean userBean) throws Exception { + userBean.setPassword(TransmissionTool.defaultEncrypt(userBean.getPassword())); + getUserService().addUser(userBean); + } + + /** + * 删除用户 + * @param userBean + */ + public static void updateUser(UserBean userBean) throws Exception { + getUserService().editUser(userBean); + } + + /** + * 删除用户 + * @param user + * @return + */ + public static int deleteUser(User user) throws Exception { + String userId = user.getId(); + + UserUpdateBean userUpdateBean = new UserUpdateBean(); + userUpdateBean.setRemoveUserIds(new String[]{userId}); + + return getUserService().deleteUsers(userUpdateBean); + } + + /** + * 根据用户名获取用户实体 + * @param userName + * @return + */ + public static User getUserByUserName(String userName) throws Exception { + return getUserService().getUserByUserName(userName); + } + + /** + * 根据id获取用户 + * @param id + * @return + * @throws Exception + */ + public static UserBean getUser(String id) throws Exception { + return getUserService().getUser(id); + } + + /** + * 判断是否是管理员 + * @param userId + * @return + */ + public static boolean isAdmin(String userId){ + return getUserService().isAdmin(userId); + } + + /** + * 禁用启用用户 + * @param userId + * @param state false 禁用 true 启用 + * @throws Exception 异常说明失败 + */ + public static void forbidUser(String userId,boolean state) throws Exception { + getUserService().forbidUser(userId,state); + } + + /** + * 修改用户部门 + * @param departmentId + * @param postId + * @param ud + * @throws Exception + */ + public static void updateDepartmentPostUsers(String departmentId, String postId, UserUpdateBean ud) throws Exception { + getUserService().updateDepartmentPostUsers(departmentId,postId,ud); + } + + +// /** +// * 验证密码是否正确 +// * @param psd 明文密码 +// * @param user 根据用户名获取得用户对象 +// * @return +// */ +// public static boolean checkPsd(String psd,User user){ +// String shaPsd = CipherUtils.jdksha256(psd); +// +// return shaPsd.equals(user.getPassword()); +// } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUtils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUtils.java new file mode 100644 index 0000000..958aef0 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/FRUtils.java @@ -0,0 +1,174 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.data.User; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.event.LogInOutEvent; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.event.EventDispatcher; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.List; + +public class FRUtils { + /** + * 判断用户是否存在 + * @param userName + * @return + */ + public static boolean isUserExist(String userName){ + if (StringUtils.isEmpty(userName)) { + return false; + } else { + try { + List var1 = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); + return var1 != null && !var1.isEmpty(); + } catch (Exception var2) { + FineLoggerFactory.getLogger().error(var2.getMessage()); + return false; + } + } + } + + /** + * 判断是否登录FR + * @param req + * @return + */ + public static boolean isLogin(HttpServletRequest req){ + return LoginService.getInstance().isLogged(req); + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param userName + * @param url + */ + public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ + + FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName); + FineLoggerFactory.getLogger().info("FRLOG:跳转链接:"+url); + + + //判断用户名是否为空 + if(!Utils.isNullStr(userName)){ + if(isUserExist(userName)){ + String FRToken = ""; + + try { + HttpSession session = httpServletRequest.getSession(true); + + FRToken = LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); + + httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,FRToken); + + session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, FRToken); + EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); + FineLoggerFactory.getLogger().info("FRLOG:登陆成功!"); + + if(!Utils.isNullStr(url)){ + httpServletResponse.sendRedirect(url); + } + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOG:登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!"); + FineLoggerFactory.getLogger().info("FRLOG:用户在报表系统中不存在!"); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); + FineLoggerFactory.getLogger().info("FRLOG:用户名不能为空!"); + } + } + + /** + * + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) + { + if(!isLogin(httpServletRequest)){ + return ; + } + + try { + LoginService.getInstance().logout(httpServletRequest,httpServletResponse); + } catch (Exception e) { +// ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOG:登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + } + + /** + * 打印FR日志 + * @param message + */ + public static void FRLogInfo(String message){ + FineLoggerFactory.getLogger().info("FRLOG:"+message); + } + + /** + * 打印FR日志-error + * @param message + */ + public static void FRLogError(String message){ + FineLoggerFactory.getLogger().error("FRLOG:"+message); + } + + + /** + * 根据用户名获取用户信息 + * @param userName + * @return + */ + public static User getFRUserByUserName(String userName){ + try { + return UserService.getInstance().getUserByUserName(userName); + } catch (Exception e) { + FRLogInfo("获取用户信息异常:"+e.getMessage()); + } + + return null; + } + + /** + * 解密FR密码 + * @param password + * @return + */ +// public static String decryptFRPsd(String password){ +// FRLogInfo("解密密码:"+password); +// return TransmissionTool.decrypt(password); +// } + + /** + * 获取带参数的访问链接 + * @return + */ + public static String getAllUrl(HttpServletRequest httpServletRequest,String domain){ + String url = WebUtils.getOriginalURL(httpServletRequest); + + if(Utils.isNullStr(domain)){ + return url; + } + + return domain + url.substring(url.indexOf("/webroot/decision"),url.length()); + + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/HttpUtils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/HttpUtils.java new file mode 100644 index 0000000..22cb8e8 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/HttpUtils.java @@ -0,0 +1,239 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpEntity; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.NameValuePair; +import com.fr.third.org.apache.http.client.CookieStore; +import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; +import com.fr.third.org.apache.http.client.methods.HttpGet; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.BasicCookieStore; +import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.cookie.BasicClientCookie; +import com.fr.third.org.apache.http.message.BasicNameValuePair; +import com.fr.third.org.apache.http.ssl.SSLContexts; +import com.fr.third.org.apache.http.ssl.TrustStrategy; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.servlet.http.Cookie; +import java.io.UnsupportedEncodingException; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class HttpUtils { + /** + * httpGet请求 + * @param url + * @return + */ + public static String get(String url,Cookie[] cookies,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--url:"+url); + + //创建httpClient + CloseableHttpClient httpclient = createHttpClient(cookies); + + HttpGet getMethod = new HttpGet(url); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + getMethod.setHeader(key,header.get(key)); + } + } + + try { + HttpResponse response = httpclient.execute(getMethod); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--status:"+response.getStatusLine().getStatusCode()); + + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--returnResult:"+returnResult); + + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--exception:"+e.getMessage()); + } + + return ""; + } + + /** + * HttpPost请求 + * @param postMethod + * @return + */ + private static String HttpPost(HttpPost postMethod){ + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:status:"+response.getStatusLine().getStatusCode()); + + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:returnResult:"+returnResult); + + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:exception:"+e.getMessage()); + } + + return ""; + } + + public static String HttpPostXML(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/html"); + HttpEntity entity2 = null; + try { + entity2 = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity2); + + return HttpPost(postMethod); + } + + public static String HttpPostJson(String url, String param,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:url:"+url); + FRUtils.FRLogInfo("param:"+param); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + if(header != null && header.size() > 0){ + FRUtils.FRLogInfo("header:"+header.toString()); + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(!Utils.isNullStr(param)){ + HttpEntity entity2 = null; + try { + entity2 = new StringEntity(param); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity2); + } + + return HttpPost(postMethod); + } + + public static String HttpPostWWWForm(String url, Map header,Map param){ + FineLoggerFactory.getLogger().info("FRLOG:HttpWWWForm:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(param != null && param.size() > 0){ + List params = new ArrayList(param.size()); + + for(Map.Entry map : param.entrySet()){ + params.add(new BasicNameValuePair(map.getKey(), map.getValue())); + } + + try { + postMethod.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpWWWForm:异常:"+e.getMessage()); + return ""; + } + } + + return HttpPost(postMethod); + } + + private static CloseableHttpClient createHttpClient(Cookie[] cookies){ + + SSLContext sslContext = null; + try { + sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(); + } catch (NoSuchAlgorithmException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } catch (KeyManagementException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } catch (KeyStoreException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } + + CloseableHttpClient httpclient = null; + + if(cookies != null && cookies.length > 0){ + CookieStore cookieStore = cookieToCookieStore(cookies); + + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).setDefaultCookieStore(cookieStore).build(); + } + else{ + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + } + + return httpclient; + } + + /** + * cookies转cookieStore + * @param cookies + * @return + */ + public static CookieStore cookieToCookieStore(Cookie[] cookies){ + CookieStore cookieStore = new BasicCookieStore(); + + if(cookies != null && cookies.length>0){ + for(Cookie cookie : cookies){ + BasicClientCookie cookie1 = new BasicClientCookie(cookie.getName(), cookie.getValue()); + cookieStore.addCookie(cookie1); + } + } + + return cookieStore; + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/ResponseUtils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/ResponseUtils.java new file mode 100644 index 0000000..738603f --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/ResponseUtils.java @@ -0,0 +1,80 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class ResponseUtils { + private static final int SUCCESS = 200; + private static final int FAILED = -1; + + public static void successResponse(HttpServletResponse res, String body) { + response(res, body, SUCCESS); + } + + public static void failedResponse(HttpServletResponse res, String body) { + response(res, body, FAILED); + } + + private static void response(HttpServletResponse res, String body, int code) { + JSONObject object = new JSONObject(); + PrintWriter pw; + try { + object.put("code", code); + object.put("data", body); + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = object.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void response(HttpServletResponse res,JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = json.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void setCSRFHeader(HttpServletResponse httpServletResponse){ + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH"); + httpServletResponse.setHeader("Access-Control-Max-Age", "36000"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization"); + } + + public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/javascript;charset=utf-8;charset=utf-8"); + String result = json.toString(); + + String jsonp=req.getParameter("callback"); + + pw.println(jsonp+"("+result+")"); + pw.flush(); + pw.close(); + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/Test.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/Test.java new file mode 100644 index 0000000..fbf05bc --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/Test.java @@ -0,0 +1,20 @@ +package com.fr.plugin.ztzzSSO.utils; + +public class Test { + public static void main(String[] args) { +// String tokenUrl = "https://tyrz.crec.cn/idp/oauth2/getToken?client_id=fanruan&client_secret=364c4775f2cf42f79e00cfa69157536c&code=0bfe69dbce3de295fa4c7402226b73a4&grant_type=authorization_code"; +// JSONObject tokenParam = new JSONObject(); +//// tokenParam.put("client_id",clientId); +//// tokenParam.put("client_secret",clientSecret); +//// tokenParam.put("code",code); +//// tokenParam.put("grant_type","authorization_code"); +// +// String tokenParamStr = tokenParam.toString(); +// +// String tokenResult = HttpUtils.HttpPostJson(tokenUrl,tokenParamStr,null); +// System.out.println(); + String url = "localhost:8075/webroot/decision/view"; + + System.out.println(url.substring(url.indexOf("/webroot/decision"),url.length())); + } +} diff --git a/src/main/java/com/fr/plugin/ztzzSSO/utils/Utils.java b/src/main/java/com/fr/plugin/ztzzSSO/utils/Utils.java new file mode 100644 index 0000000..6762ae9 --- /dev/null +++ b/src/main/java/com/fr/plugin/ztzzSSO/utils/Utils.java @@ -0,0 +1,95 @@ +package com.fr.plugin.ztzzSSO.utils; + +import com.fr.json.JSONObject; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.util.UUID; + +public class Utils { + + /** + * 判断字符串是否为空 + * @param str + * @return true 空字符串 false 非空字符串 + */ + public static boolean isNullStr(String str){ + return !(str != null && !str.isEmpty() && !"null".equals(str)); + } + + /** + * 判断字符串是否非空 + * @param str + * @return + */ + public static boolean isNotNullStr(String str){ + return !isNullStr(str); + } + + /** + * MD5加密 + * @param str + * @return + */ + public static String getMd5Str(String str) + { + return DigestUtils.md5Hex(str); + } + + + /** + * 获取完整的访问路径 + */ + public static String getAllUrl(HttpServletRequest req, String queryStr){ + String url = req.getRequestURL().toString(); + + if(isNullStr(queryStr)){ + return url; + } + + return url+"?"+queryStr; + } + + /** + * 帆软shaEncode加密 + */ + + public static String shaEncode(String str){ + return CodeUtils.sha256Encode(str); + } + + /** + * 获取uuid + */ + public static String uuid(){ + return UUID.randomUUID().toString(); + } + + public static String replaceNullStr(String str,String replace){ + if(isNullStr(str)){ + return replace; + } + + return str; + } + + public static JSONObject getRequestBody(HttpServletRequest req){ + StringBuffer sb = new StringBuffer(); + String line = null; + try { + BufferedReader reader = req.getReader(); + while ((line = reader.readLine()) != null) + sb.append(line); + } catch (Exception e) { + FRUtils.FRLogInfo("getRequestBody:exception:"+e.getMessage()); + } + //将空格和换行符替换掉避免使用反序列化工具解析对象时失败 + String jsonString = sb.toString().replaceAll("\\s","").replaceAll("\n",""); + + JSONObject json = new JSONObject(jsonString); + + return json; + } +} diff --git a/使用手册.docx b/使用手册.docx new file mode 100644 index 0000000000000000000000000000000000000000..9cd9296dc1095cd252b69497fc801c7b78f77090 GIT binary patch literal 124321 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≀B@(-P_H03-PD3t*YRzU^0l*+bT*c}?a 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
    l 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