From 4ac24005ffcab0c9d9feca3fbf0087f14b884875 Mon Sep 17 00:00:00 2001 From: pioneer Date: Thu, 22 Sep 2022 14:29:21 +0800 Subject: [PATCH] open --- README.md | 7 + doc/JSD-9844配置使用文档.docx | Bin 0 -> 95913 bytes plugin.xml | 19 ++ .../com/fr/plugin/xxx/zojj/sso/Constants.java | 9 + .../zojj/sso/CustomLogInOutEventProvider.java | 16 ++ .../java/com/fr/plugin/xxx/zojj/sso/LRGT.java | 28 +++ .../fr/plugin/xxx/zojj/sso/LoginFilter.java | 231 +++++++++++++++++ .../plugin/xxx/zojj/sso/conf/SsoConfig.java | 83 ++++++ .../plugin/xxx/zojj/sso/util/HttpClient.java | 238 ++++++++++++++++++ .../fr/plugin/xxx/zojj/sso/util/LogUtils.java | 121 +++++++++ 10 files changed, 752 insertions(+) create mode 100644 README.md create mode 100644 doc/JSD-9844配置使用文档.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/Constants.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/CustomLogInOutEventProvider.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/LRGT.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/LoginFilter.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/conf/SsoConfig.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/util/HttpClient.java create mode 100644 src/main/java/com/fr/plugin/xxx/zojj/sso/util/LogUtils.java diff --git a/README.md b/README.md new file mode 100644 index 0000000..8bf3af1 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ + +# open-JSD-9844 + +JSD-9844 和统一身份平台的单点登录和集成\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 \ No newline at end of file diff --git a/doc/JSD-9844配置使用文档.docx b/doc/JSD-9844配置使用文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..3e00c4e6a817dd11a869508e00b2b1703a1db259 GIT binary patch literal 95913 zcmb5V1F$9CvM#!8+qP}nwr$(C-K&>v+w5iAwr$=1_qjLDKKtDl@m@vLoMYz5$jZ#G zs^+N7uN0(#L7)Ks*}~=a1^)T|KO5xVfr-7bf|I?2GrhuJHI%;sh<~ZM7Mb^$0|Eee z0096X{JWZ=g9Dw1txdL~pxht>LKpE}IK|5!OChP~7BSL3NWo$-FOjrHTN%K|9T9R$7x9vhWnwbX9!I^-L zezN*PLm#KEcZeTW+Zdetw_ooTlnmim-W!ntpN1!Wz`9W8G23Hw=fc_^a_osZFDt|%o`3nl-zk_0I?_~N9D!xhj(t`{rLpz|o!eic<{1;)+ zw%}CWP6TcFuV_h~)vG0hkr&TbvYj<@DEK$LXW_8LZyR* z!5ueNwO$q0aoL3YB5)1FMqyTVLy`1$;V?22BfyH1i06IQE5Iot^MkOO+|$WW{JnWs z*S|dT)N8U_&*aHAEhD_A)b45Gt_!KfjW=2(xzCJ4K2dtBbM)RThl{VbrGTiINIx8P zv=H!APyjx8t_!;4@bFfoRTu^&WGrNEmR+XDQjqU+_M)vhb^vFphS4%z#x>SGht*o+ zr8s(_DmT*duH{1^sX^;7ziDI7&ilXpdC-zQCs#8{vJ`WsYxZ>kMA7>O@-O+61kIEE zE>}-0bAO6o{{sT?9@t&7zYxIug#h_~K;Y`^VsHBo2*rsLR(~%I(U;Kg;5ofCnh|)= zjeI{4DRfwtsqIlGqdF4eF-zgIUUfoQY4ok8i9I;;=}D7Hbw)4onyEY!I3RrBcdIEWY?%kkeGG3H==#W6duJ{L&4IyTii@dqcGEDKnMOm#;P_0$1nC6tCt z>Ln~=lXuy%UHBG{Vu!&0IkW%ocO}rjX?3@EGWm}?QqK(H=M*deK%Nx<0Q~<^adz>v zF?IeY>r1-*cAKM!-Qc7A2+mS)4J;XnCeV2FG;2{Ysi>yn+q}-Bc(Arfyo8)dN6raD zL?Zx_2$zJJ!U=<9zX-x{?%6eMpXrr!w+&*hV9e>6IIFz2bX99BGpE)^a=T)M zPBKU>`wqqoUJcB5>sAl^5cFliYU$)#@ZhpooQ-#2JtxV6wbS7EJns+id3!iz8aEP( z;V2>&21het&@@|kHn-)vL8CVx0reX&{IVWMoS55WYFdcdJsY*`JbAP_G#Q`=2s*d6 zx7OD1DOi1&G)V9AmFiJJ^#+vrWvkp4SDl$628|=22 zzO;r?A>d!{_DWr0T&HVQh3QJ1Bv@()+tjr*?Q1efZ;E7K;s`Wx-^1za4DmRc6Sgf* zIq-M@eIGjCU}kn!GDr`ZIwh7#yN3G9d1Mt&PvvKN2{K^nfFZW+a&|iM9V9|m*u$aA zA2hw8AD65xusDzh-+X^({(OG4?pxAVQ?L2mdtl!^^onxtx)rDH3hyc^V?yP{)$ZFc zt!{;L1evdWqLZI~Cky%=sCGg4JP!p8)hZnekCua%(m=@p@0b(8EOo2X(%N_-6pt%~FYx%6y&J^R}Q|!_@UoGAhng07bxRf?7{`5YzS_#ID8){Ipy6 zas(irMF&l-13@$x@xJCYSM1_D;W7JK>aIV`$tfRlj?Nus3+hs{9Bc0hI7U! zhmqXa{)%J^z%fnW5Mm<|JtvB+ zAjY4`NcFkN`FZJ=D3TE)eBtorb)9vtTc{HU^);cxuE6485xOeWYMErm6-LpZY1EmZ z#W7A!{*%iKvT3a3jPp;AAUjCkUXgG+sCkjXM8~bC&k2UJg9Y#;BahTh5QD zwwRe#y1`{Zvpd!zxwkv~0Si-YjBE41&{;ob3`HUJ9bn)M3j@2W@MMu$JUvW8;iof! z%+VP|@@Y@7eKyne*B2rqI$l#=?Vp{TK^?J#1xeedV`#?OxaqmS_?4Pg1y4S7mydfIZu$*GLyLle1G1m2KXQJx01mG&+> zE1NaM-K*0CvZ%_wO6MdboUqrhN3&zTs6}FZ3v~ijmb+AQfb}7mHpcSU3y&7v4y#D5 zFtNAPL9auax<4ABW#x%%DRK3Ib~Ozi_u;b?SuOf8*Qei%zuD^Y>}Z1dg!1t6&Q=70 zqzVY}j-#%Km2$|Jn@NN+{VNzljcL)kxva@RUcGT;vQc^k0l`Qz z#wh%2NbO3soj=SUu?W7@v?4-eW-R9SI`S*PS`Gcwi)0`un z%=te%6TG@&mXdaC!ymCin_M>JsgO1|&32Z%nWR2)SQIEFF-TBK;gFz|J3+zw-KJiW zGH`C9mR{;vh?ZWaGU$D)rnjZKxWQuJJc6M(3W<7RD5cAYAQbL`|NhD0bzJv`bF7Tz zoBD^6jW$x5hWZ&?qbY=$dd${1!^myugs{_zmff!iS)as*Zu11oOk$Gyu*_phjnph&oQ_6fk0I7=r@ElkmbSy(i?J=I1|r85GW;q7`D8hm|2`qf zEYJr{hnC5_gTbb-$<=G8DV6jIn#uCorP68PT#pJ}8CCIZw9fT5>8+n?JY4MLr1}cq zJ$yDqgc_u$c4<}p3204+xxM8)+&FU`Hm$+W>H~iL$(T#XmOsnZ)|&skv}Fh7(aJ}` zpV_r}_$JWu_DeMwNdM*eO)l&5mN%%*}t>OV6D z;Xq|Fe`me#$!hAjt_=>AK~RTG^0+*e6=jy^64_Csg|<~_tnW*JG?Up;M>D$01^%~r zq6Az|WkHHV*&!xJ;r?>dzbd~^^8u)m*%3!`x>)HKwOYw#%__{dRZx-x&ktoq88yYl z|JwTJ@c-K>6@q^=94X-T*Kfvpp?>Go$;>Fz{Vo)%82%UJKwh=|&1hvJqz6pqLHPMjc9Y$KPjOnJ`Ehe#p%Dxy`_qbJ0fkuu$uFuw{U@5a@e79U#E-~C$Fi)puL5(e$nl&m9Jf%|x{PIvhUvb3fbDQ1D z#J>%uuZq^Xc$~R5TCo||u#7#Nc9Mt2E2NVpXqt#pJ70Ve31l;CeRqWs^K21Qnz_m8 zGYhIt+=WyuK^EK%e8}&3wcBDZov(loo zqq(894cttU9MeRmNGHS`Y4vto&wF{=ttq*LsiLN&J}-4ZINiBb6@sVMsN}5ES?lW9 zeJ72l=&2KppLwA5*${UjyQ0zAUj}jCj6LeD!k(Z?o=Kz(iarIa;`IG<3dZq=mHpKL zZEXRpB#JgebWxoSe~}1&;<5dsOeD7uIJ!?nzDo135NcBQiFS5aC;DX_ctKkr;~>&L z%?eic#bWfTc z(Nlc**DMhQevBO{ve-{GwW$yr`fuP*uFd|)j(hGRN6h%gdq}_6d{qE3T6QtLD6xTF z7UQ!M80=5YZR?kl;~cz2FD<&wmF7kNeT^*MLo~cpe-t#at*U zyuLQC{b+|&u|d;!JEjD0vV>G&uWV+O8Z!Lnq)5ILOw>4*A72b7VFU-ehD$dYy#*b-ao^`{ho}BYElzC^Y;ycv03r$pkP*s^f!w z^tw@AZajz<#(_BFrceg)i2*b(FYMmz&ve{buW933sK^I zq#a9UUF-(ZcQcmzLD}YpjGy=OJks_dIjvHJlIc+m&&|4}@Aq%l^7`MmC;S}3C!M`t z-yilr^QR)?+-%3!bausuDk9UfL)ZQXc@GAQ=!sSgZnWToX2RmI!{W^_r;U6!JnK)O z1z1;!M;4V&MZf1{YFekY-(7r&^;w2=cr}N+FQScpX$*@Vs1>v)6SJaNv4u;$_Hj5X z_T9j^e+(xW{<^^#OoC++ea&r&I0ZEl6nu?Fjxq511dkYX6*u2lZZt97s4uo%0*h(i z$ZYv4BRcD*Et7>)or(2-J<+gcO?H<21NcA7 z9$Kf@+=nm#0R2q=RrdJT!=baOi;Jb5`M;k1nzc8aHiw&i<(J;TQFlxWZUCrVDr)PI z#~gp(-!XFlM@5){DPzP~yj?Uhpev%SycQ*Kc_Bu`UT=55tgl?ZJ?Q)C*6R6Q4(syU z*wy}FUs|fPYs5(VI{vy^nz_<6zRqWLC+pAOa-cW` z&^I~c<@oURF~!jGLLG1}d0J^7Shf>p_;r3}wh;?WarP_)+Sz~<%m+NoSFYWp^$ON+x4gZUr&(5IN~;p@FmZ+H8OF5 z<7iL01Gr(X3&ZegS5pjsKW7!`PAm54YdGoZj$6y~`MPkSlT!WnqeqWd3r^}Q*%iM_ zq0ZMj?dDE#{*NSJ$6hb?mM=k*5%lodhgxlqtj>{d!}s#cT{yU%mI?oB_k~Qq1>cpY z8~oB6c7^ftXv5x^t7qMpi$`gGUOcwDuJ4&ny4KFIn|C+l;hL}81;3@MIGW3jq@AYR zu&>9?o8BFoK;YgF!`_}7F`GM(zz2ffjPGrGx54nQ$$9l;yswR|Ibor`OgGpp{GFVx z?G3{<-M}XN5A+h3Ig}GX@Gj_wV!Iwa3xKSE(QAUd&a(w5sSO$TFZ=8rnjbLA=i5T? zqEB?3PekA?GqoxH-Jc!bb+=;cd{L3OAD>SDrd2>@(YLAxfJrR z7CN=WnuE$DPH?@lKkd&0!_X+n7s-i!q}c{V`#R!#Ogok;9s3`V!{j}36+urfrH}*1 z7ba)4D>`YK4wojNl(Vi;6?B)SWhSpSLlH8Hpc|D2QG@?8- zr3V?QtbbWkDXxv?QPh|g#-7aIH6SiZnIH_ztwsna-KCQjR!~g~veYQRQ$vR-XeWrS zMM;UP60xONt5P1kVdRGvTu>M$m3SyC8P`rq?Y`4rifd+DQ&}Im7;~&N!{n@IRoE6% zxTz?s{*J#(jmfgE4S{pv&riy+(gw|^pF~5jeDf<{;#saFK{TfTA6tbsZdgElLaBg2 zEthjOtrT#t2!-JRvNFsNSP?8@50z5Eo)oJuj7>ycf~Vk8f(9$gIyTOt{e3RJvc8fP zyuKLscjN%B0-c94bEFo`8D)KC=%NF?jdD%v8bDr}BSd~=b)M>4gVbt}z2{3Sj9L)C z`z?#UWisB}@8(fsgYdh`;37bYDHW~(p^~B^rjB(+JTU8&!(Pb}&ooBlGoMMIrO<=a zu*osXY9rt*tYAF7;?`zX;}`D5Q-eB;TE@m9pcHSt6vSmF6-vNl!{ELDBw&2&pHm zMd3Y<-G&8k?UW4?qoTh7a*9-fPJ2+JM@p$v2Ca?l3+g*f09R@xF;rE5MP7CF_l=q2=aGxabQkmm5`8a=< zPlZBd<5K~nR|`+A z1RCD;mv8 zHc9DdXTYxDw0p8>&=ufO(wO>KQB+60NfE&rB)8I3%)}^P5)ZBc9ugEubTnkEB*de_ zwU%uYa76C_nX?=s_Hq$}jshkbFHlMeHluT=SFqaFjKE`M61A6Mx`RQoq*~8*$&L|Y zH~}z+fK7E3Vvts`gFIp4VG2}&N`)Io>TgaU83*c#1A(J(OG+A6q!xq*-x4GPW&xO^ zFF-jVs)b4tCr@|YJ(AYG0y;!{c=sIyHyE$z3Ud z`#z_QWy~E)VR3z+I|I~b*-=Jt?V&5fdPz`jJxURFS3C$*#vc^>HI!pvk%l(xez`mY zZorx!Mg{Xd+sqm34%OZk515 z$?KOf_EV)D;O66OV3b%kn+Z}NVz8Eb=`iWm7`jq}9=A1&HX6SQcFEW2>UIww4PmZn zr^R*Ks@r;g*ADz}&HCO)_D9}J?K14J=lFx z*QDFWSMu(u-Q7u@d2;5*+jc+6_V)W8KD~X}`TM)$HTQ?U&`Y${e#gfj@a#P`dgR!V zeah`Su)fHC_!xF=bbY_s^-yhO+tKXkeLcT&eKW)lAI&a#u>W)wcyHLXj&N_k+zeeU zS@j^%9vdQmYweq(h4WwUOd!kRS-e`8;C@@6KbYM;of&@bzDCr_!Oz?*zGZv)h2taQ z^e)WYOul7%`kBw%+%m_PW{T@T;;DZf17Gvz;-9?04_dMExK7+m)7#hTb#X=9zO|C? zd_(`g_sgLFPczKL!qnFEKe}d%`UewvU;qHA*Z=^i|5Nc_>Wu&N&aO0N?UBVXdeqPT zF|Kfp$lW4{aZtF~EC~^Y!lDj5c(-wxIvX=E$zQ{EBUH+%syR@~&x^w=XptnURo>09 zq(saA=$~>kcV1+BY>^-+E+UCWx{JK3|Ipm$-Z&j14Yv zuioKp+$St|;Q13XQgkL8@km$Y``Yi>RUw3g2=ZXu9+jzArqa++N8pPwd`}}U0dpg! zBcjn?2!R#`bQ8Q8K}(}XH35xSQXg)F6S!Jgi1-BQ_546j-{X0^apiq`QEke_1%omq zbq<&tnX@dA6$!?@S#1@PHOhu;0pC~xejeu2D{n^$&q#yXW#NVTa6ns?t>0I9MpAM- zNjrIwk?W$zW!Tnf;Syz#Kwa%-9qWwU?gMOKg|>3$vYu^4Hv>?26I{BSRxqjMUc5eT zf+p~MP<826tXJOt8uVF=nTcJkR=F)Q^+rOf9arN8~ z%uW!kpVRL?!pFfdPpx~~!heS4Kqe;US8SK>X0tm4c!%fKS0yh~la z*Z=8}k*n?DaCcfB-2Db`^KA~w$;@`2gJRn2?aJJrw=4GB=ksaeLqFxf6!GT+{w3$@ z-IEhx-P~&Wfgbv) zhcPc4NnHK15>aoV5V)^tkY)z%NF16Yv4<{zZwerNoIMxVix8t)lgL9cgHwQZRwEjE zv0_`1E9$@|{)k|^6C>Te8^bpB!q#wo^3F5|;P&MByki$G(#WK3m~kjD5_0GxcaOA0 zq&qu>>wbr*Z$BwMrAu%DT1heC*+QVQ?1E$_OHh~0xKEf5cl}yNoK{w z8R_r~r1O9WVmxZxxX82PpD4iI7*!236MLdhq8egU6E1?7!s!GFO}3K?0Dox7-jKk0 zsfC^)vczbVsOz+`t{6^wBKB81?mvo3VOMh;G)DYMoeBjQw$7?xJNtIwr{<%;aVI4o zT%>Xx@n*r+EDkamXc2zQXr%335^c)8-H_OZMrB|UTYKjb!#^UMF+k4Ru%+Ug0;w~- zUK&O(olLk)Cq0c9I)ka>-9TzkJ?P zcuWlmEV|L_v27c#;*PI7#8c{XG8mjRGh$mqn$1^31$k$1cqILxq=jC~xG_;U+5`-k z!69q-@~JLEIRa(9mllM8en-KPNVSCw7GTn)R^Qd#sXv!#u7o2@;2>4f@-+=gdvS1E z9~#A|26E1tMWr6~t+rTlkWYpxCLK#DVm&_o(da;SCAd}Rrp5!R_svF9Kj}sTE z&a2KJ>IrN)ASo}aVH4L)>t-KQQtMx!32Yj?8r?T?Zos%=?-ui|zb3>dm$e5uF?q!x zO>ixLNlXWII60&?ocJC!W7FlEG9z}Lv<;%t@m+13;kdjNASzn#V`?fk)GH?KGpZh2 z@6`ye%Si(!wQ=F0PE*Un_-3Uhh_kaAvk>u7m2oo^8JXrQQ5heJiqPZO6bEKQcDVxvgGw zJJ=l4Wu*0&szI4}^*@f%liz(dv@B!Z9fYm#lW><>I1mcO(V&1V-$AW&WY`2;0($AZ z#fpNuE}!xje17!ba8?VmwB``0z{MgEG~`vvCosXb7*p9n9H=;3Hx+GANhmK1YGOk(pWEE+Bp%a>-Pk=m1JVO$!oRf3CG0fc&L3p}~wtzs!6<5Z#D3 zXwX9_wF?J%#$WfXxW{ZXu0dbs+XK8AwL1Y#3o{N@@gB3~K_Hvp<^X_A&TSDb8QqXC z+bYLpwPxfy&b_5`lW$->5tn>}492~a)qb9($20YpedT6kJ8~R`#pK;4YG{#yYa(Mb z*=jmu-|)IiM&bqB!;Ha9T5SWY^@06A%Yn*74yO)(scYuc|5gtCOJj4jHMMj3=kII_ zYeNZp?1@+PEu50~5H=(v&%mhu2sF4HA&TizI7g{kQ98qvh4&0oa+ka|GIourg_?2I z+Pm?{qjkAC6;!=Tva6+@pX_vC;ah0>ECo78FA_I5O6{NQ=b|oQ8H|;`e zT#JG`XQc?Bx(3khu0s&hq94&xf-lBJwMM2G{m6)Rab9kvyQU4bWo-9*QV@2UDKicDa?8!ek<718Wgqexp6uZD!d zA^i?qO*J}`{dE0f8XBFeYQIpRB}tD&jfojAVm>Wm80JH1=HSmWV>1&P$+_^HgeawR zQ)P|hAILwJS-$x>aTo2MtFu;(hl_*XU9;_{v$j*i;}fF53y2*+6ov;udFDn)U!SQq zrz8?bD0gSaSe-NE!xaQd$!uHk>pN&0lQSFSxm6G-wUfPqzQ*ln-8BL*ADp6DrfK9( za#ZyGSO_px0tzqr(~Z2hs1qG^<}O6X6cJF@;@3KHZZ(ldahJ)Vk=-Fry{^6&km$}N zJUDGexIK?{{KQJl_x=4gL$Ud~1vO@J=XO$p3lSX&F3;~NM7VF9mQ*v(AR9gy%uo?v zk$hnoBZ4Tx6u+=|4mCpSb>hJwxUkLEH$u{y4Q^1&3_{R}>9`pYBId2`t_XyF#6bPVc1&et0l* z1i<{jEF0b$yf5aE#!fQwqS!9YHt}tfO5bFlS*i;8FrOM8pOT@u91>u>y3S)FxFZJ*p%?EX{?H?0~5 z9d(?OiW8Vq0>^uchB|hzhV-0DES8oec$qm^Q=XpEHFFB!fJCY+t|iOGaC?6WX+bKh z5Go#wsHVEx%Pypsmx9BWwD+t^$Lhl)zhR*Y-8!au*VUX;u6CT>Zb$KI>WzEzmfor0 z-6r%4z$Mhv{ALdU2ik(9x*8R`rO_isM)>H^Awp<}J{{WvkeN6KOGhU}CAUxnm;5MbKEEk@Z9r%gGa={8oEj)&i z4vfE}q5G>fU?O2NGl#{Pm=JSgWQ7W5W2Q_<@bKkjWTdCL zX2oJg$Vv=Tq{PTZmV6{!sCAeZRt;utlEPCodwwc98ml9Hxe;t>(9t;@ok|#I_ITAm zMP}G|G>wKkF5D$At`L`;uC{ZNeOWREOIjNrt1bY5`#NMWvhQ-ytbwUlH|C(anj@F8 z0Y_N6fWnauU}9WeU&ewIXKBxMaSSco9EU()C1>-Z+i%V_-p1*MAY)+g9_c%xbg zZ73&Pj%6o=2=_D&xTZ=e(xLQaqVd4y^7jjJ5(gQo z!cH7XS=d?YtQce&%oV>8a3|X2O5i9Koxricp;L}naR3|zfXjkTi`ov~7t1JLSItII z6eL|H;CKPjUquvXEK!6BH0usGc(9}ncw>N9hU@V>cwz({G2k;MvbT+Vl}RvZ0$}Oa z$2qjQKOwO!gdQ=@)*L@SIxK`TO zrqP-j7Q2B!VL-Xfi;btSAhu#$g$ciHiRQ2$Q3Z=o*h1a5av|r}sm1lX^BnV*Zy~!| z(c7Wh`O$vb&J9c$kG&aZ$EW;wSD2(7TII?SsPzi*R=6_O1lL4`GZ8U-83BE!WLz#D zDsMj#dC{FlDS@Db{#>#DhS_lqof=^KBLi>Ic*XM|d|4KxAI5QsfwI9^O!NnP5SH4* z>xKfQZ2<%)rg>uqxRKwlg*rMY8Qt9)d`AkLlD|`nn+t?JG4SnhuUD?;+dE>??ane= z$s9A9&p-a$z5kXG4+_*<{l{}mrg5GI$J;5a80XR+8m{GCC#y>*fGL%o{%upCjyB^C zo^(C4T?uTGyvA@KZI`DxYLOYXfOY{W3wluTLUY6RLnyL+iwIb*K0^RP$ll7k1j+=Ma|Nj{ED?CWE=e%kMUWp@&%1a+jNr`*H0k4 zk9?!^NIQIKV@Kt=#`Wn`k0lif({D8Fj`_|fx?n98eAZkrf7mtYgx3lsG_`qXf4X@d0;5&g!`o@%s{+Wd&viWmdtcb{-iHz{}rKJZR znY14JYNU>4hDa|nl*o6GS-^4NyCl4`8M?bd%as5yO3l%8w|VK1n&*k;C=W z$}kx55vn;r8;&9x$4KIE)Q9v~YF$v-mu@Te*=Afh)Qq!3L1+F*TDNOtWxA0soUQA+O9(m+4f7UYEK!64v@+yRk^LLi z*k}kEBd#Ohg^B&(TB}R(@T%smxbB-=%zJbBP@h8Yo;Dah*OtFeY_~%sv#thZb!O{| z&Io0q&4hCwXsjm=p@DL%d54)exY_L>>-S@#Hb!I0y4Nx#9Z!y2h)QmX`-USl^W8`y z56Fqk@N2i10G`%QUfw~yy{T8M9!P$a(o7@M=EQ_{lr5#YTwej%zxfGVMZfFSeILBP zVE^Yj-PIefP3SL8UKJbw0O@aP{?)d(bG0=xb^6=5|7W2-r79c0&VbPUx9$`{^8_K; zlA<;jrV3h6P~k=S1vt#{N6UZAE$L|ad-*#t&KSv{alPTP7#-%hi`_oQeDZ25cvn$2 z)>P`40+*bkAgPQtxfAD0hh98a!2~x=dos0%b6q+5+RT1ulkIoapD-+lm;mARsyPzz zVrQ;sV`(X>I$UV6n1%`m;{uVYs31fv_HmnoOcL33`*jMTYS0|cG}e|=0rD^#DP_oZ zC{qwOx2j1xwAD>@FOW+t?iRzWc3ubag*dUJGA1T&2&|_d9unvvIO%YPV5*!^>;!00 zD#2oF=HW1>*}Nj!-+XC~wAd*cZb|1SQDvYv`&ij>U~lh9^zFf+{jfSii4FoUA($Hg zNIb8*H!mKQ@t6yT?M86y`;=a=za%(j)+iCv$8wIjtmURc6Fp@8{TVCfyK$!UMp}|y zcz@+iqEkqhTpebondyr#U~J)&E~AJBnN()0fZ20USj|fwawARcHuqs)z>r;glNL1U zSK7uUv59E4gf?P5;K(K)9S)vY1{uMlp}JpUS5xZWuwEH`X7*cl;tpiZc5(BN?>6%r z)V-SAF7+=C)GZS*lZ1;;x4~tB@pz3D!NdVSQ z_cFkV1h~9D;-bZH)w?aVYHb+r@{4%&&KR)Ad%r+fdlv%U;XPlY6or{X0kW|?;W9CACvzf3p)4n(1k@t`Y2{1QH%!xO|sx7%Y z$3|wvBGb8*^n!p_UZAcRD>rBhUnECshlA$Ml{3!SRRp*Jh|i@{{kQxFSz z$fC)f;T)_#XBc5b{}asji{rdwG+Z4SHy^BGFc&`e+)j2HW!iyAqT@WmOrG+q5usSw#ejT}R=3;460P2ft#EW#0~$VBF?~WfmTQxh zqOTBZ{P{j;;3Y6EgFKs5bz=!>li*>zd##dq0ITKV5St`-Xora73EME`&ueVQ{a zG;&qHw#MGSjqmkgtJO^9Ls5;i@<&}mVE_3lUW-rPcb>m8qWSYgyBm9G!S4L{Nuv=} zUVi(}O(jI&YA^(+6@1V#!Kta!{Jv#yWq{;1wxw(OSR-;g*!|1L3W7Z~L2>$rJ7_h> z5q?aU!0LF=H+JnM+BqjHeTwD+7X6Yfv|d_2Tb~U`&Rd;8@^Uq;j#hgwGIT9W(~^8X ztFnvUmXWd4c71U$yn_f}O5_4Fl5SE;7>3d|ku-`)|uamv+1YS;5w33b0$ixcSt1vN(;WN7?*fZ^3T zH>hpyXoNFy;Hdq4m`uDQd7Dkfhi4EgiIY(PrAnmHwKm}%Y<#i$pEmrI$RJo#hn7_P18dJ-)(*Bl&Bq$^g#Ttd!XorNN zN&scf)fx$*w@3pQbspkKt9;W7z=`z|(n1 z5+!wL3vDL(l$)`4L_L$NCol}*nKNbr!~+h>o%zaUrw+!3(LKP#DN`}l5m-93S#?oBk@3cY(SpklZ?Z3f<^v;j@mS{JqDJ$Nmk1x57FwCv4 zGq@4K{Wd;y{bepdd%iw8>WN>dZxT%N5X0A{3@%58GS6Dv$2ZAW@(NM85G2r|RjBY3 ziPP*GJIs-_KkX)GtRR_{!j|@O)+^K zO5gDw{{KT`$kx=v((pf)Uq=aFE6WUk09HbP|J@k+FGWjRLvvF`ItM#*n{H4QHSHJP zn1X;Nmr@t^@FErn3HEu)EeUq0dD5+|ErP$Fq+7Z>$2}|FH#ht}j^QhWcr%_kzR!Bz z)to08+!}gnIDly2Xh1+fg8SK{-VhP!E=S=uQNH#;320KtK66Pn-t4w z*LW-}X#qb_(izMpsCs$+#mi2jx58qP?+qBViOe_0M^9i;Dq%~bvc%2_7>LdyyXC9pI&4X~B%>>gV0p$doQw2Wle*cM-Vse0Ha56)QV-6>B$QuA2Ng zb!qqd!rIL`=bFX!B0rmo@~(RQ;RI(o7F@czQLULoG6qjYFfFG0yqZd$XftOLn5BbQ zlLxN0Nh$MDG$6v4FOU3)vAYQA%@8`qC@8*w#I&a1Tz4o$nt1sL2Cno&edmhnAX{ z4uaZoW7@Ck*S7`*la8svF|o8*kX|b}zb?w)%QY`(MSo?02f@Do;=RyX&szVNYTG)=sGlgneRxvp$ISsKO8tD^5b2hPr`9d+%mcX+~ys$o#xJldhb(2CLfEgIf0S$^LqB&Mc-EkK>X6F*S8d+`7(Dzr@pBR)!^-4 zD5CxG$%Ue7El4_CYR(60%0~Y3kob@ZO!0+c$!7BX6hX6 z@ERVtr1M3`R!KS?d#MWvn)AKv>vxv5)rUkH>iUIYz)F^Lmn3h!jOi-yAfvq{r8MAyBFQAL+39Hx&=Pd zo+h^wk7bG9Yhef4PYH?f7eFyz?BBdJHrYuNiGMxT3E4`Qb9f^(aKf_EYJI7F|4d%c zkxw?VgKVFj;jPpe6|P56b#^mV&Sb5r^d4S(9iwf8@IohN9$;bS&I`Lj&Qdq>HYZ({ z-VMROoq+je%}pN{_IiA2!)eCN!%zoTvMQTVv6hCMpO*{882jmlr5r*)Px^nP0L znXdB&CMQ)djNx2&BNt;jO3V#}<&-m`OTZfB_Z5H7@Fql=#zfQFGV>9SekF0yJX#>8 z9sKN^|6CBw@XmOYB%@K9X`-C?qX#QA_!vk%h5PHn#$2_slmBcl#UnH25axVnRtD_W z4Dfw6uw(;c7gobB$o|TJ0q-)XU2DdBno(UFSkJLv1i}W<`g4IWmW^wytO6glS|(DwWQ2DW6XA@ z447{WnKH;}macCbC&dK9b4UptY`0GeNLrJ!%!YkkII^Wwb!DdiS?f-+R8CT3@uP8TJtOBoY7C)wV=I08XUP#oE>^3r=)Ql7d*Rb3oaT9|(QJc=>9 z*s}#rUUI{^Who<)eb%q_%xwQ?faB|VDc8}z@&yn!Tk%`FylAa1_e+QY)uwY%1fd|N zf$2bGdVb^PB7KM4&zH=%UW_sI3>`oetsjXIecI*YTbo*6BorX)-UChacn6=c?EcGg zyHJKjoxrwPtFm^1|N7a?r{)Ig(s+XGiDGim2=T?N`>l%mnws8#8>(xF&}Y*($n> zF$-rXXqknO1c`zTE9n)H=a@=jPs)C!&Wp$D!1rO@yJqbBi*)^v$B*aln5`KRIDhT< z?>Rd6jjpvHetbcy{N}w?0i%avT$l?-a%7$e_wz&0nA@HN=0N77VW6JY6HdG4hIX_f zbsuutmM9QU>HZ8Jf3W%VlJ!18#J>!ErG_6bSpwGXa-h;=#pZ2@C9l&t`|fDv4cq9H zEh|7@__rO?bIRV}Deco4%=IN=qYd|1FWyO`6>(w7fdOQ9@AS>zzu-JwZ8=@Lc-cHb z-!$11&T}pOFDw5S082o$zu=4Sjl3lGE1mZO|HsN5)td7|^<_Mp0ky0+3ayzZa(8yq&y>HP z7RUc3r8h9G=mpWhe#X#v+tJ%?)nbeQBuVJD@sS@ar2`ZjHuQ0_)-=;7&&%XV8C><)=y>hAo{r)vH6`l>mLvgi+hy zXIJXcHvJk>;&6tJ($;G{3LTfSFmH1wVaqlv?;E;#t&biu_Uj%ORB;=|+^5ZNy#kJ0 zw>&;SuSjqFqFI{Dm@_0}q*lcVEYl`D?0|N-QU=|d`piB~o1mRU*PR`{b#%0~^P8*v z#|6Ks-OR=DcebW4?UwHS(w1D&jiU3j!++=5SbUI@U&Z|2bWGNI^Ob_T=^MR7UO`B= z#am@%sI&dx&+V;g3H^K6iuKpC{qMG;@V-rdI)M!i4JSEW*0cCP8v9#V&5>)WEzmv%4|RJ_zeCjGc!`T<(4OGh~)M!uCK!? z9>F=L7Bl6M4<7HiyiTz6GfA(&zHhrwbjsy)XLAyXR_S~Vm6OI3(%sMTB^e8|N+dP6 zy?^!NZr_gqVsdVuy5H~M*Gx#p49z5Ez3Ls1{JTHi9j7rYpWjf@mFk}d;QQ65h=>Lp zH@aEFN|F?{w0t(!P8t3z?83@^1NNb;r+uIOFvGg^;34v###zJIz2qv@V} z1>(jUO!@IvueSc`G;vn8J)$}ZL+SVUaE(iw$&XuKza|I^j{o4&{P9w;r_89+u?Pe1 zkU?{32Vstima5mN`Up%Es~H^yw1dXAM8vP({(eDsR}v(0_RbQoZ0Grn*&p4mEv=gM zFc!Een98gf(9jkij#v(w?{B_$V-Vu@g_bgWZz>1~&57vNXIIeB7>;IW?tffxWE=Sw z#%048`6Y}N>N&rc_t?qL@7;F}<`vJS_e^^*P53@+2BD$CIlicCw`SxY>{|I04wEbC z>Jz;0g2Qvlc0*o}_qN1nv6&(1ekL$KKR>gmB2j?Xh6UVe?!e3MvGLvvypI_tqQL3j z@95*1p}eCiV53m=(XUU!s7TuL>~P!Y3z3jPtN#b_y=udbR7olqLN3c2%410P z3VZzMUZk!3xJ5GNc^Oj|bfe1PgbxJ%vF1jXqukGMe(op%_f&Ivu%92KBe19}yz?_#*E*qCWItC@Z_1`jYXUkGZ|@ z;gsk-&n)T+%r6=mGl8dMg+fD&!Cn7`JI^;7(qB?`A?Q61n=-JP^Mb(J$Qx&mmVj}0 z)vkVde)Md6A?4Y2KE*seh+R4l+Y+AFxfEQBPDQ8&6leZ>ZP!KY=-?eS8Tg~plv3_Z8 zvG}!p>f(+l{;JKa|y z8OyK^WtLN(s~Mz>h2-26-J`$HSI%#ocd{?*Om!zv0A>aKP=Zfm1Vb{>uh^yPVhK(LBoitansZ* zk$Vabl#Ut5=NKbAkwB&ynVG$ps+- znMaWVUR>FCJV{akt>=OfbzAA^3f^%YdfJs!@NJB2(9537D&1Pjte%9jM6?F6{5PU` zSWrq6+aiHb9AAyGpxiD#R@&|o{IZ&F2M?30v$T+YV^`AT&84C(C~YsoBj)lcdn3kT zG2yMtN47@h3b2D?E?oubJX}+;Tg>ua7G^zNQ2zW*?~L-F18Eni@wI#QZ@ zODr31ZFJJow>Q=CGVpszJ-<>CC_{WE&C<*2!g_kdXpLAx#wMZ%jjF$!x{m0pDEr?Y zHU(V8zXRbf5h2M*@z6BudtTUHr#Pn#Wn>d+H}CB%bkX%EXvo_f+o9j>^B(;cpn`@v z-|ge89T1z^h*A1qLNm&rRrSH%xj~On|D8Yp{5x@FWvf)$VE~Dt+2ahoy zl(-p-3}Z9Q=ZRv5B3MicGOtJ?d!>lJj}}XjK-|0LR=5vhz?!i}eHIj48@!BTv{)y4 z-{=5qW?c}4lQPJKgE}^VS299X#EvyuOjTaDE$^+jFc2oqblianbqmWz|Jztkx*)-c z{rX4YNJ13BeD0V1MiwS`-&Y0!N73f={40*cj=0U^4J((>c_sPQy)bfCx=XAep7ys) z55%uPj@YLN*NbDZWC++TUHhF?mAvT^MSZ>be0e$D{U?pNdbRCu8{*NgEA23Z-bZEf z^xW38WZBAl0`YTI@}H%0(>gmNTL&gyJ;fY=My&XtxH^`$qwjo|8%C4PS$5aA}3hYhuK!yL&$0Ou!f!6AI z;p~+$HC<8t=4(e?%{ma-uU$E_aa;H?Cdf*Ipk*uf68@X-P4Qo82&Fk3rS^WfvfNRI7=kKWQ}Jh1p>^o7QYDjQi4D;%ag z3(U;Q)sl?H!$X60e|2v~feEzUrFvnEZ`6AreRHuhbojtfKiTzq-%_RLEiXd2CdaLN z&EAjYK_vd%qNWgm`%}>Z^Brf;gTQ&)@r~jOwI&Pvq*^vIe>kb10C0-uYe#c`fQXrt zX?{^?wj=ngaZvKIL?W5P_RZJVRu6|4=FZoH{#_#C$b_iDdfp}2#pK~IvAt<7(a4Q4 z$c-th6|gs14hG$`#V@KL^yn$Nv(dY{MVaYEuQpu}n6EVd7P}k&&jm~RPL%bg=O~IsI)A6k@WyWD%uv)OwC{H@9Z=%#Gx9kTWtP1B(PJ#31|%d*1Nam-g7^jF`K8S09j0@MJy)X|EfNbTLnpT zPt8nwDH6HlcN!EYvU5AtHcN-UUdqg(OMyf9o+nWc&na$3N90 z*nhjQ1yNl7E>)j?ocs(F2>%p(|381N^pb3v=}$fU^cdN`uT1(`7P@J%qcs6udLxK%%+ zA186;OxS`I!ce=Ly|{oeZ4Oy~`Tdq@5h3l1I2O+GWGZ<12s9y4^njT#+jEOON4K&} zls{wQBScj^>ZNq5l?OXL$I3_LNqhGI@!1P9~urFt*@=Y2|e z2yvKMIy)Fm*W*!?kAGhJDsASsUnXK2lb0X2*1zh=2MwBi6l`6D*qe^A9UD_qR(QAj zRmehGDXHto<1chjfF^LPA|%=>Zmb$r;#K+5z2K6fl_xRN*A-4YVu&lqXD272@3s^1 zs^YmD5WoI_9ATZ<=TSg1{LH}lvBenvC44Qe#}A^g^(uq`7SA`k_=*$B z?^L57A-DohWT$bYW+E9mw*P4Peuye=yhYjStF<(jWB*s2{U zm*Vp))7$%%<76nBjh!F>dg*eLU8~XS3-WEY$Lrlv^;j1ioai}6Y^i+qYOPK~M!W{`;`D=@FXey=-Ma_{}tAQLIBUjoDor-${Q)-Dbr zNsI|2f$&0v%#_n#|GZ`7Rrs--VBX65d@fN1c^UFHK?OAUwe`tHo&6~$EKYo4ONljeFGAr5uNzDoUJC6^|z@Um(?G6H_Z973h@ev1D<{U<0}CIx_qkcZ*-oZ2mIEzXs$ zg*qf9xQrUwYf+H0BvGM?F&*B^wVb>B^I?U8mQBauXGh-N=M|K+>ocLgK7d+Iwk3tR zf~1%iS3t|iAem(jV^=sdUCwqPwCR;mIq7K({V`;@qlQI@J7{TVl=eX*F(*1DTJGJu z-M2UWGzIDlQwYA{8jdy8yKL~j4L3I*<{b9Fy=%_>48moB`L6S=Z@2w^a@UHF5Wq>+ zbcggh7U)Sj7C;GyqF?(p897iwIib~r3JOYjvU(k#%8bBU`rprMZ*RFsItC0cz-P*E3hmvk??@@2`>V0!WSGiqefJDhWz)*d%ff3cKDWqc zs}@JK--uBz(yV+1QA<0s@(gx^yA# zJi~2jljiS8>x6_sc~qp`>R%B;{fqUID4EHFq@kqpP!Mq|g0P(jj-O}$^qNUgmRU1P zPw?R@3d&k$etvN;BRnsHwlq1qoG>XyWiSBVAYeoLkFM`Py4IUjfFHQDS z6J-JEBO8bht^}Z&b{dkhGWaF{r$OApd<|nFBIdVpeqF9U@Zvd6V#zaDuxl5^WeCH%jLS6?Oji z^ieoL!@8uzS=Uv45-M7HQeu9b#z{#9)0YJqx~wX)SNG4P3qq#0D2VA3cM`daKEUZ& z8TXf;!b$!9hBbGBN9u{!&F%GpaqGegUgS8Pa@yki4{sUo$ISr@>Rrv=w3MmZ__UXv6=rk~fYAYV|H~3~#OtPgU4iW5h`d z1cLOrsnvw5kmI0DajA{8wKbZtHhMOM`r#^aD=0ENBcmX|t{36s%+4T)FRs~+E2$bK zx|c1!Z+b*g0oFugP4|Y1KLDiCpiX!y8@wJ}2}?GSoUs$QK)va%B)Tygcwi;b;qmc+ zCymje1111LGB=|lK>XpBn#;wX_pFUhMAVUVt&Lb{kKOTLQ2*Vdc2o1R9m;Bky!;QI z_Z{IXTJIju2%0z#Ndpk}WZb3E*2IxkGrM(;wksT1S#PfTt*t0XXwRJEWZjV(O2$V< z-Z{tb*6m7@`-_zl7IubB>RY+2PO;*rbx)kcv%}*HbErqXpx}-bR~~V|FPyX=vlKlt zO_UXGjypoWZsi%boNkJ)IH4|SUG<55Y;-xKGg>ceNoFb7?r)e{eDL#^`fz&Hd3my< zL1;&L36mLcPD)Q61&W8Gwv?#~*G|Wl`Iu)B-5#5^pem)+cyfwcQoIK9-B527i0jdyR0(3TS&{N*RNhg zd?;6^HKN7nmuTfx{%Llm7^Zu|bZnVAlcH^*E9_kE7b2fvW=d+RwUn1>$IJJ%#|J)Sbz13~jw|(agkz_$Ay@rt z!z_6^!yhb-w$@L7_+HlBjhgT7JZSc3KG~LUXn+@s+w`Od-{r18Czwwk zidFUS6aW-^7i;f{3|sa2wB-j7oC5UZKPdPQnsx7+rD*nWjGU)hKL0t;c>Qt z!d)1L0NvU-N~&Ta-ucP*YRAgA4JFZF9)1$qb1INV##a$!f%&al%i5X-gY~;-^!C|8 z8=*IHp^p_7>rI`D0&{=1-_H&F96FXWp-9#CXH(o7A zZxkQoI_?e>a}4PB{d7P>!x$g=y@3?T+udbLTBrN7&R~(ZQ8>l^aP}J4(muVYDJmXd z`JHWBr;5s2{m_IAofhoTUlU|LDzhoGIed#%K_S>&&7IQmoZYgosZdXRcwib_<0kLv zttz^uR=8Eho>19i-(~tZ3E*G9={$p32$*uhB$GQ=6o7YiXci09Y0zOrwTuo;dGP7w zQc6nQEuBpo&=S+%nD_GAMzvYhrdBB_g5hvN#h<)^!|$EynF$YpH?JNV;~nt1$1Nq) zIdoWJ*6f&y%`d2*wAD9=c=VK3Rt6Yon(WmoydFE1`@I`yVg0%B^U4BUE6)TKbpL2~ z%qNmMX#D%`jcv5^h!TRywR-g=N5UL+F!YzjLg?*g*D7_#1Fp=uqWg>W(`&VIBUF`P z-ZX&s0qqPtE7^HTll_fpbv6V>W&NbHkzir@GlWhejz^e7_d35t(*>Y;;XL%H^1~h{ zKe=%W4GNDi{Lyyy!MbhG2zAK%O?b`z00jIHzCaWp&Qv|877 z{Ad`J5Ys;pn)AKjq`2Tu`9v(@#w4qN>sE1YG+QRV7%A~CD8<}Z3#N^1OYTP7a?%aQ zdC#kqfW>O&>*{-eYCT`J@g%nPDvK{P)`n;s;!E(G-UmSFCZ^NE4>!2DsIM+xa7&U$ z-!m(!e`xO+P)T{RCW{F^r>&t77$%7PLpj8Ku}&@B?cw)3ZjtxWdIeZ71AT<(5>o-Vyqb1d+_ z08V54Zao}ZF;Hr_wT_CjL&VNq@zH`gy07c=o+hFpq0#R){x0@7eB6M~AlMjL7FdIv z-G=Cvk?*~F+%F9DxYsE9q*TNu=PuhasG4|@G!rxLV^0l!VHm8x8eO#4%B?8C5Op06 zv1V@5XIi=G5s~~~4HpzK2=HH(Ev^;U#s$ZYJ_)j~mk1zk$g2uD3?4^o>wqeedj4exPo4NQu@FV?J%#uF zFx^k@Z`Swh#~)VuX)Ayy3g-P&6oS7Vf+!$~*7|oeVMbRZBLANYi2t7p^52;j|1&iJ zwvZa~e;$$1$pXy-0iHo&garixZxg>)nec1;umVb;O;Q~=c~Ae>H|UxXTD*rN7J&v= z@#}blQZ0l;m^dgCM7mTc20eNgs{fH=s}{syc)@kKl;e`Ww|M&b=iwvm0 z9`$Doy7K!B|K`;G`cBEu40Z8|Wuu1=bJN>HNxLGtPZl2iS!JN%m6Z8D&a8Kk754Qr zKrLsS_Iw3UZbt?)c{r|Q-uPRQIyfy3=lcb@?WsndnfjMXQ@&b!YL4LJstYORwOIx+eLhfGct4njeMzfLBT z@`|l>d#a9mwRF_9q-139ArfX>EM~s8$Hd86ViS=O)8mA84`j*>kkM7Mq@b(?h1s0W zn-e}|RkRpz+kB0nSkv7dy4U1%pam%XEH~1l`;LRB+hMqBajYY^#;AhDAi{D5jeUp` zRo;X~ai~p!2sgUphB@mMd_ZnIRq42kM{{IJ1>(ex-s%4j2XJciruzqYe z;D<<*A-~DWO{awQ^zznnyU4^9U!nvh$^FgQw--LYj{wtqdmx?au@6~LVD<{h$+o|m z1&jInrIXp=K9WFgT~#umpeJpoN;Ml_s^mozL%Nn5tsz2XUFxp=T6l99Vz78O43hZ% zC}rFPR!2$>EsxhgW@U8Vvp*2epBhqtGk}4rtXw_t=u8HZC=0H@yABk%9Q{;oBCHjOKL}>@Gi{y3XZ(VVoqp=l0?3=@7C>9m=G%>&m~K zo1mIe;I*$h#FI5vHrV*Z966Y{w4z$Ud=_zI0maFC&E3;$1*I5m5Q6BI8VryE^gwU~ zd)mZ-7AWQEb}Q{pj&AS0-<*i_=9qFnk&XZwx9eU|jK5vX<-IsdYC2h3GANIy0!hL5 zZ9tNI&X8AA^X=3FSvr_*J_|jm1{*j+hHI#Y|tO!@w;ItgUq~c zt*2kDS&wIGm_JQrQN4?eWtfy?UPk?L2%d00u%JMl8Hs?Lni*bH!G;ST)UpkZlHWD9 z-T)~7Rr%ZzE31CBIt-HCXtm<=l&IC|@-2v`=?s>wYLh!(Vu=AngVp!lfUvqx82RR` zl=;8mU# z!}>)08kv%0cyD*0ix#R-wWhGgS}8bm++MZbokoLv8!hhJC}}o}Ln_q6!!3`?!#R?v z$=OQT97JC6>Cu!|tB|eQ%Wwqkl6rR>5Mz9~uAh{e-8YtD1hbK3G#vWO30K`(Qwpk@ zJx>H$8$Vx}`rs2Zv$=@ta+kodJzj~M0F4A>8m{CK_>y8qh>y-Y4hQucuup}dbtxLF z%-UB9?X^xh6%b{R_-v%4R>kezciH##2LtxA>}5!JYQ3#eP`HwHy5^k(vH=5$Xt-s& zzcCKR`nc41^XqIeYJyt*Qw#(tJCM<~t&|-DC25Avq0+_P@MZuFJyC1f3%c*G(O>s? zrFtdB=h*=2xOoP6#RRA={>Ft12$85sjmzUPh0$jAv>dY z%{9>`OgSn#`ly+jf-Tj^S&yw;&*#lWr{&9A1sU?^pCPbskwAu=qoOVucr9;&1?6y# zFrahBl>lw`%C3>q>nG>U*`B956OPy^$2`S%%I^ievIOoxpX814-R^yd?Iq8b6e%Ii zC&qJx)oKn9?q{+*v!o}5$0h0qkUbpwT%*U`<uF#%83$GQ>lr$A3i@bY~ ztvUR;p1O1wDo)rG>V!#eJlL}jWMxuUM{COScBkkdN-^3FAh%4HA^cTz8T6*o0%hD_ zd-8JtNPvB$??#3vI5O1eF7NHzmY=J0s!bMrPuc;!1No=G=Pl3%h{<&yDuZ|1$?s~1 zf@#(2Kj;0h>4D!JUbhQSR8STc+a$JNH}B_+Ow3_16l4I&HJbd7KAJbkBh&R9p?NSI zAixl6aa;kRp7C$*MU#fbiaix1fyuEsb(rIO5LnF2_y7SaqV0KXs}pCw%Ll(V?(37m z{L6Z=8_3AsN$qzeBFqH`!x~?|V#k_XkTy+uE1f5#loz7Mdfs5CivDvKUK*D52EIa)mEFj^s~$ay zM2TB8-(EqGC6QkgfP1$Rf8_;8b{b^I5Ug6Aht><72ZhH+14gJ+T09ExKgdc>$?ge! zk+D~LQzB1s%ZxNu2?;I*0PxkRK-x;wDTQq}**Ilk(P~26lF?7U(PS3a-?dh~yXUrB z3=cx@_3X&w;NG1(T~=9WD9*8daWHjxN$6RTJhwGqRZqX7XGM#_ z0xE%r<8_)W$K5cV2?-!ZSka^Bzq9A^aLv(Y&OeirBV{HDljGNs5rkW|=L~{(s-z)> zW6Zl`MZrGk*+<*}5_& zNs}FCcH(;PWgx=vW+TCt2k=Q7ZXsu{6IT!j;?3B$5LmKw*YzRGbgUCV<3xTd zPvCOx55A=SZAr8JcCz2>XTTb!m1+)81ZQIN=raQ7WZjSRpwR$P>O)Z{Axv_^XCo+N zLd?O#!`7IkB`+F2H~WoEbK{fSTkDO_jhj{6hx?6}$3MKZ*JC&^k7g>WDJh$7eu+1o zY(9TD8#d;Qj}FwsYHHMdRY{*JsVV&?g@^1*?5w{-Qq5_g_O}f zJ%;ffZjyN3Nd|4Cc{K$BIg@u^)~Cxsl_!)F1q0(JNb8slW}S_safhc@AZH(aLJn!E zhyzmGDnVn5?piD#CFR*}ie#MZtAQpP6cE_2n)q+d4~80Kc=EvoyF(s8h^Hlm`=o!c zI;DTQ&qOfkblpd%{)U!j#px2+FtbU>{H2XbE^~_7KQ=ci* zlsiV54HO>`9NG@A8%kIc<9AI_amP zM&7^W{il9i*IC#onmWXY_gbo8ebqOzH&fi+BlD%5XKxo%FACO6kpb$}pK`
8Jw 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 T_M0AHg3Q0|>`uG4G6DI24)%9A literal 0 HcmV?d00001 diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..52b0f4c --- /dev/null +++ b/plugin.xml @@ -0,0 +1,19 @@ + + com.fr.plugin.xxx.zojj.sso + + yes + 1.0 + 10.0 + 2018-07-31 + fr.open + + + ]]> + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/Constants.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/Constants.java new file mode 100644 index 0000000..e741878 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/Constants.java @@ -0,0 +1,9 @@ +package com.fr.plugin.xxx.zojj.sso; + +/** + * @author xxx + * @date 2020/11/11 + */ +public class Constants { + public static final String PLUGIN_ID = "com.fr.plugin.xxx.zojj.sso"; +} diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/CustomLogInOutEventProvider.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/CustomLogInOutEventProvider.java new file mode 100644 index 0000000..7858434 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/CustomLogInOutEventProvider.java @@ -0,0 +1,16 @@ +package com.fr.plugin.xxx.zojj.sso; + +import com.fr.decision.fun.impl.AbstractLogInOutEventProvider; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.plugin.xxx.zojj.sso.conf.SsoConfig; + +/** + * @author xxx + * @date 2020/11/11 + */ +public class CustomLogInOutEventProvider extends AbstractLogInOutEventProvider { + @Override + public String logoutAction(LogInOutResultInfo result) { + return SsoConfig.getInstance().getLogout(); + } +} diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/LRGT.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/LRGT.java new file mode 100644 index 0000000..a0f379a --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/LRGT.java @@ -0,0 +1,28 @@ +package com.fr.plugin.xxx.zojj.sso; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.xxx.zojj.sso.conf.SsoConfig; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; + +/** + * 配置信息初始化 + */ + +public class LRGT extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + SsoConfig.getInstance(); + } + + @Override + public void beforeStop(PluginContext pluginContext) { + } + + @Override + public void beforeUninstall(PluginContext pluginContext) { + } + + @Override + public void afterInstall(PluginContext var1) { + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/LoginFilter.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/LoginFilter.java new file mode 100644 index 0000000..51d43b3 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/LoginFilter.java @@ -0,0 +1,231 @@ +package com.fr.plugin.xxx.zojj.sso;/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this + * file except in compliance with the License. You may obtain + * a copy of the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an + * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express + * or implied. See the License for the specific language governing + * rights and limitations under the License. + * + * + * The Original Code is OIOSAML Java Service Provider. + * + * The Initial Developer of the Original Code is Trifork A/S. Portions + * created by Trifork A/S are Copyright (C) 2008 Danish National IT + * and Telecom Agency (http://www.itst.dk). All Rights Reserved. + * + * Contributor(s): + * Joakim Recht + * Rolf Njor Jensen + * Aage Nielsen + * + */ + +import com.fr.data.NetworkHelper; +import com.fr.decision.authority.data.User; +import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; +import com.fr.decision.mobile.terminal.TerminalHandler; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.utils.WebServiceUtils; +import com.fr.decision.webservice.v10.config.ConfigService; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.TokenResource; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.json.JSONObject; +import com.fr.locale.InterProviderFactory; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.xxx.zojj.sso.conf.SsoConfig; +import com.fr.plugin.xxx.zojj.sso.util.HttpClient; +import com.fr.plugin.xxx.zojj.sso.util.LogUtils; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.record.analyzer.EnableMetrics; +import com.fr.stable.StringUtils; +import com.fr.stable.fun.Authorize; +import com.fr.stable.web.Device; +import com.fr.web.utils.WebUtils; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +/** + * @author xxx + * @date 2020/11/11 + */ +@FunctionRecorder +@Authorize(callSignKey = Constants.PLUGIN_ID) +@EnableMetrics +public class LoginFilter extends AbstractGlobalRequestFilterProvider { + + @Override + public String filterName() { + return "zojj"; + } + + @Override + @Focus(id = Constants.PLUGIN_ID, text = "域单点登录", source = Original.PLUGIN) + public String[] urlPatterns() { + if (PluginContexts.currentContext().isAvailable()) { + String servletPathName = "decision"; + try { + servletPathName = ConfigService.getInstance().getBasicParam().getServletPathName(); + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + return new String[]{ + "/" + servletPathName, + "/" + servletPathName + "/view/report", + "/" + servletPathName + "/view/form", + + }; + } else { + return new String[]{"/neverbeused"}; + } + } + + @Override + public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { + String ticket = req.getParameter("jwt_ticket"); + SsoConfig config = SsoConfig.getInstance(); + try { + if (isAccept(req) || isLogin(req)) { + next(req, res, filterChain); + return; + } + if (StringUtils.isNotBlank(ticket)) { + if (!config.isAccept()) { + setError(res, String.format("单点登录配置未完成")); + return; + } + String user = StringUtils.EMPTY; + Map queryParas = new HashMap<>(); + queryParas.put("jwt_ticket", ticket); + String json = HttpClient.get(config.getValidUrl(), queryParas, new HashMap<>()); + LogUtils.debug4plugin("vlalid token url is {} token is {} res is {}", config.getValidUrl(), ticket, json); + JSONObject object = new JSONObject(json); + boolean valid = object.getBoolean("isvalid"); + user = object.getString("user"); + user = user.substring(user.lastIndexOf("\\") + 1); + if (!valid || StringUtils.isBlank(user)) { + setError(res, "单点验证不通过"); + return; + } + if (!checkUser(user)) { + setError(res, "user: 【" + user + "】 not exist !"); + return; + } + loginFromToken(req, res, user); + } + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + String redirect = getUrl(req); + LogUtils.debug4plugin("current request {} not login send redirect login", redirect); + String sso = config.getSsoUrl(); + try { + res.sendRedirect(sso + "?redirecturl=" + URLEncoder.encode(redirect, "UTF-8")); + } catch (IOException e) { + LogUtils.error(e.getMessage(), e); + } + } + + private String getUrl(HttpServletRequest req) { + String requestURL = req.getRequestURL().toString(); + String queryString = req.getQueryString(); + if (StringUtils.isNotBlank(queryString)) { + requestURL += "?" + queryString; + } + return requestURL; + } + + private boolean isLogin(HttpServletRequest request) throws Exception { + String oldToken = TokenResource.COOKIE.getToken(request); + return oldToken != null && checkTokenValid(request, (String) oldToken); + } + + private boolean checkTokenValid(HttpServletRequest req, String token) { + try { + Device device = NetworkHelper.getDevice(req); + LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device)); + return true; + } catch (Exception ignore) { + } + return false; + } + + private boolean isAccept(HttpServletRequest req) { + if (req.getRequestURI().endsWith("/view/form") || req.getRequestURI().endsWith("/view/report")) { + return StringUtils.isBlank(WebUtils.getHTTPRequestParameter(req, "viewlet")) && StringUtils.isNotBlank(req.getParameter("samlToken")); + } + return false; + } + + private void next(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { + try { + chain.doFilter(request, response); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private boolean checkUser(String username) { + User user = null; + try { + user = UserService.getInstance().getUserByUserName(username); + LogUtils.debug4plugin("get user:" + user); + if (user != null) { + return true; + } + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + + + return false; + } + + private boolean loginFromToken(HttpServletRequest req, HttpServletResponse res, String username) throws Exception { + try { + if (StringUtils.isNotEmpty(username)) { + LogUtils.debug4plugin("current username:" + username); + String token = LoginService.getInstance().login(req, res, username); + LogUtils.debug4plugin("get login token:" + token); + req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); + LogUtils.debug4plugin("username:" + username + "login success"); + return true; + } else { + LogUtils.warn("username is null!"); + return false; + } + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + return false; + } + + private void setError(HttpServletResponse res, String reason) { + try { + PrintWriter printWriter = WebUtils.createPrintWriter(res); + Map map = new HashMap<>(); + map.put("result", InterProviderFactory.getProvider().getLocText("Fine-Engine_Error_Page_Result")); + map.put("reason", reason); + map.put("solution", InterProviderFactory.getProvider().getLocText("Fine-Engine_Please_Contact_Platform_Admin")); + String page = WebServiceUtils.parseWebPageResourceSafe("com/fr/web/controller/decision/entrance/resources/unavailable.html", map); + printWriter.write(page); + printWriter.flush(); + printWriter.close(); + } catch (Exception e) { + LogUtils.error(e.getMessage(), e); + } + } +} + diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/conf/SsoConfig.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/conf/SsoConfig.java new file mode 100644 index 0000000..3fb1e98 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/conf/SsoConfig.java @@ -0,0 +1,83 @@ +package com.fr.plugin.xxx.zojj.sso.conf; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; +import com.fr.stable.StringUtils; + + +/** + * @author xxx + * @since 2021/12/04 + */ +@Visualization(category = "域认证单点登录配置") +public class SsoConfig extends DefaultConfiguration { + + private static volatile SsoConfig config = null; + + public static SsoConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(SsoConfig.class); + } + return config; + } + + @Identifier(value = "debugSwitch", name = "插件调试开关", description = "日志调试模式", status = Status.SHOW) + private Conf debugSwitch = Holders.simple(true); + + public Boolean getDebugSwitch() { + return debugSwitch.get(); + } + + public void setDebugSwitch(Boolean debugSwitch) { + this.debugSwitch.set(debugSwitch); + } + + @Identifier(value = "ssoUrl", name = "sso服务器登录地址", description = "sso服务器", status = Status.SHOW) + private Conf ssoUrl = Holders.simple(StringUtils.EMPTY); + + public String getSsoUrl() { + return this.ssoUrl.get(); + } + + public void setSsoUrl(String url) { + this.ssoUrl.set(url); + } + + @Identifier(value = "validUrl", name = "验证jwt地址", description = "验证jwt地址", status = Status.SHOW) + private Conf validUrl = Holders.simple(StringUtils.EMPTY); + + public String getValidUrl() { + return validUrl.get(); + } + + public void setValidUrl(String key) { + validUrl.set(key); + } + + @Identifier(value = "logout", name = "logout", description = "登出地址", status = Status.SHOW) + private Conf logout = Holders.simple(StringUtils.EMPTY); + + public String getLogout() { + return logout.get(); + } + + public void setLogout(String key) { + logout.set(key); + } + + @Override + public Object clone() throws CloneNotSupportedException { + SsoConfig cloned = (SsoConfig) super.clone(); + cloned.debugSwitch = (Conf) debugSwitch.clone(); + cloned.logout = (Conf) logout.clone(); + cloned.ssoUrl = (Conf) ssoUrl.clone(); + cloned.validUrl = (Conf) validUrl.clone(); + return cloned; + } + + + public boolean isAccept() { + return StringUtils.isNotBlank(getSsoUrl()) && StringUtils.isNotBlank(getValidUrl()); + } +} diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/util/HttpClient.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/util/HttpClient.java new file mode 100644 index 0000000..6d65be2 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/util/HttpClient.java @@ -0,0 +1,238 @@ +package com.fr.plugin.xxx.zojj.sso.util; + +import javax.net.ssl.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Map; +import java.util.Map.Entry; + +/** + * + * @version V1.0 + * @ClassName: HttpClient + * @Description: HTTP + */ +public class HttpClient { + + /** + * https 域名校验 + */ + private class TrustAnyHostnameVerifier implements HostnameVerifier { + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + + /** + * https 证书管理 + */ + private class TrustAnyTrustManager implements X509TrustManager { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + } + + private static final String GET = "GET"; + private static final String POST = "POST"; + // private static final String CHARSET = "GBK"; + private static final String CHARSET = "UTF-8"; + + private static final SSLSocketFactory sslSocketFactory = initSSLSocketFactory(); + private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new HttpClient().new TrustAnyHostnameVerifier(); + + private static SSLSocketFactory initSSLSocketFactory() { + try { + TrustManager[] tm = { new HttpClient().new TrustAnyTrustManager() }; + SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE"); + sslContext.init(null, tm, new java.security.SecureRandom()); + return sslContext.getSocketFactory(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static HttpURLConnection getHttpConnection(String url, String method, Map headers) + throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { + URL _url = new URL(url); + HttpURLConnection conn = (HttpURLConnection) _url.openConnection(); + if (conn instanceof HttpsURLConnection) { + ((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory); + ((HttpsURLConnection) conn).setHostnameVerifier(trustAnyHostnameVerifier); + } + + conn.setRequestMethod(method); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setConnectTimeout(19000); + conn.setReadTimeout(19000); + + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36"); + + if (headers != null && !headers.isEmpty()) + for (Entry entry : headers.entrySet()) + conn.setRequestProperty(entry.getKey(), entry.getValue()); + + return conn; + } + + /** + * Send GET request + */ + public static String get(String url, Map queryParas, Map headers) { + HttpURLConnection conn = null; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), GET, headers); + conn.connect(); + return readResponseString(conn); + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + throw new RuntimeException(e); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + public static String get(String url, Map queryParas) { + return get(url, queryParas, null); + } + + public static String get(String url) { + return get(url, null, null); + } + + /** + * Send POST request + */ + public static String post(String url, Map queryParas, String data, Map headers) { + HttpURLConnection conn = null; + try { + conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), POST, headers); + conn.connect(); + + OutputStream out = conn.getOutputStream(); + out.write(data.getBytes(CHARSET)); + out.flush(); + out.close(); + + return readResponseString(conn); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + public static String post(String url, Map queryParas, String data) { + return post(url, queryParas, data, null); + } + + public static String post(String url, Map data) { + return post(url, data, "", null); + } + + public static String post(String url, String data, Map headers) { + return post(url, null, data, headers); + } + + public static String post(String url, String data) { + return post(url, null, data, null); + } + + private static String readResponseString(HttpURLConnection conn) { + StringBuilder sb = new StringBuilder(); + InputStream inputStream = null; + try { + inputStream = conn.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET)); + String line = null; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + return sb.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * Build queryString of the url + */ + private static String buildUrlWithQueryString(String url, Map queryParas) { + if (queryParas == null || queryParas.isEmpty()) + return url; + + StringBuilder sb = new StringBuilder(url); + boolean isFirst; + if (url.indexOf("?") == -1) { + isFirst = true; + sb.append("?"); + } else { + isFirst = false; + } + + for (Entry entry : queryParas.entrySet()) { + if (isFirst) + isFirst = false; + else + sb.append("&"); + + String key = entry.getKey(); + String value = entry.getValue(); + if (value != null && !"".equals(value)) + try { + value = URLEncoder.encode(value, CHARSET); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + sb.append(key).append("=").append(value); + } + return sb.toString(); + } + + public enum HttpContentType { + JSON("Content-Type", "application/json; charset=UTF-8"), TEXT("Content-Type", "application/text; charset=UTF-8"), XML("Content-Type", "text/xml; charset=UTF-8"); + private String type; + private String context; + + public String getType() { + return this.type; + } + + public String getContext() { + return this.context; + } + + private HttpContentType(String type, String context) { + this.type = type; + this.context = context; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/zojj/sso/util/LogUtils.java b/src/main/java/com/fr/plugin/xxx/zojj/sso/util/LogUtils.java new file mode 100644 index 0000000..31cc067 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/zojj/sso/util/LogUtils.java @@ -0,0 +1,121 @@ +package com.fr.plugin.xxx.zojj.sso.util; + +import com.fr.log.FineLoggerFactory; +import com.fr.log.FineLoggerProvider; +import com.fr.plugin.context.PluginContexts; +import com.fr.plugin.xxx.zojj.sso.conf.SsoConfig; +import com.fr.stable.StringUtils; + +/** + * @author xxx + * @since 2021/12/04 + */ +public final class LogUtils { + private static final String DEBUG_PREFIX = "[插件调试] "; + private static String LOG_PREFIX = "[单点登录] "; + private static final String PLUGIN_VERSION; + + private static final FineLoggerProvider LOGGER = FineLoggerFactory.getLogger(); + + static { + String version = PluginContexts.currentContext().getMarker().getVersion(); + if (StringUtils.isNotBlank(version)) { + PLUGIN_VERSION = "[v" + version + "] "; + } else { + PLUGIN_VERSION = "[unknown version] "; + } + + LOG_PREFIX = LOG_PREFIX + PLUGIN_VERSION; + } + + public static void setPrefix(String prefix) { + if (prefix != null) { + LOG_PREFIX = prefix; + } + } + + public static boolean isDebugEnabled() { + return LOGGER.isDebugEnabled(); + } + + public static void debug(String s) { + LOGGER.debug(LOG_PREFIX + s); + } + + public static void debug(String s, Object... objects) { + LOGGER.debug(LOG_PREFIX + s, objects); + } + + public static void debug(String s, Throwable throwable) { + LOGGER.debug(LOG_PREFIX + s, throwable); + } + + public static void debug4plugin(String s) { + if (SsoConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s); + } else { + LOGGER.debug(LOG_PREFIX + s); + } + } + + public static void debug4plugin(String s, Object... objects) { + if (SsoConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, objects); + } else { + LOGGER.debug(LOG_PREFIX + s, objects); + } + } + + public static void debug4plugin(String s, Throwable throwable) { + if (SsoConfig.getInstance().getDebugSwitch()) { + LOGGER.error(DEBUG_PREFIX + LOG_PREFIX + s, throwable); + } else { + LOGGER.debug(LOG_PREFIX + s, throwable); + } + } + + + public static boolean isInfoEnabled() { + return LOGGER.isInfoEnabled(); + } + + public static void info(String s) { + LOGGER.info(LOG_PREFIX + s); + } + + public static void info(String s, Object... objects) { + LOGGER.info(LOG_PREFIX + s, objects); + } + + public static void warn(String s) { + LOGGER.warn(LOG_PREFIX + s); + } + + public static void warn(String s, Object... objects) { + LOGGER.warn(LOG_PREFIX + s, objects); + } + + public static void warn(String s, Throwable throwable) { + LOGGER.warn(LOG_PREFIX + s, throwable); + } + + public static void warn(Throwable throwable, String s, Object... objects) { + LOGGER.warn(throwable, LOG_PREFIX + s, objects); + } + + public static void error(String s) { + LOGGER.error(LOG_PREFIX + s); + } + + public static void error(String s, Object... objects) { + LOGGER.error(LOG_PREFIX + s, objects); + } + + public static void error(String s, Throwable throwable) { + LOGGER.error(LOG_PREFIX + s, throwable); + } + + public static void error(Throwable throwable, String s, Object... objects) { + LOGGER.error(throwable, LOG_PREFIX + s, objects); + } +}